Compare commits

..
6 Commits
Author SHA1 Message Date
mezz a3a1f7720e Fix #1371 IC2 Rubber farm does not harvest rubber properly 2016-08-03 02:21:27 -07:00
bdew 89cfbfca9c Allow overriding climate when checking for mutations (#1373)
* Allow overriding climate when checking for mutations
2016-08-02 14:22:05 -07:00
mezz e0676030d6 Update Forge 2016-08-01 18:17:28 -07:00
mezz 0c76e22b8a Fix #1368 Update Tesla API 2016-08-01 18:16:51 -07:00
mezz 1a8f1751d9 Fix #1366 Alveary in the Nether does not have Hellish temperature 2016-07-31 17:24:18 -07:00
Nedelosk b95bb8315f Fix #1363 [MC 1.10.2] Crash on camouflaging greenhouse bricks 2016-07-24 12:49:17 +02:00
30 changed files with 220 additions and 133 deletions

No files matched your search

+4 -4
View File
@@ -1,11 +1,11 @@
mcversion=1.10.2
forgeversion=12.18.0.2005-1.10.0
forgeversion=12.18.1.2044
mcp_mappings=snapshot_20160525
tesla_version=1.9.4-1.1.0.24
tesla_version=1.10.2-1.2.1.41
jei_version=3.7.3.221
ic2_version=2.6.5-ex110
ic2_version=2.6.15-ex110
version_major=5
version_minor=2
version_patch=3
version_patch=6
@@ -7,6 +7,7 @@ package forestry.api.apiculture;
import javax.annotation.Nonnull;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
@@ -18,7 +19,7 @@ import forestry.api.core.EnumTemperature;
import forestry.api.core.IErrorLogicSource;
import forestry.api.genetics.IHousing;
public interface IBeeHousing extends IHousing, IErrorLogicSource {
public interface IBeeHousing extends IHousing, IErrorLogicSource, IClimateProvider {
/**
* Used by BeeManager.beeRoot.createBeeHousingModifier(IBeeHousing housing)
@@ -39,10 +40,6 @@ public interface IBeeHousing extends IHousing, IErrorLogicSource {
IBeekeepingLogic getBeekeepingLogic();
EnumTemperature getTemperature();
EnumHumidity getHumidity();
int getBlockLightValue();
boolean canBlockSeeTheSky();
@@ -50,8 +47,6 @@ public interface IBeeHousing extends IHousing, IErrorLogicSource {
/** Must not be named "getWorld" to avoid SpecialSource issue https://github.com/md-5/SpecialSource/issues/12 */
World getWorldObj();
Biome getBiome();
GameProfile getOwner();
/**
@@ -3,7 +3,7 @@
*
* This work (the API) is licensed under the "MIT" License, see LICENSE.txt for details.
******************************************************************************/
@API(apiVersion = "4.8.0", owner = "ForestryAPI|core", provides = "ForestryAPI|apiculture")
@API(apiVersion = "5.0.0", owner = "ForestryAPI|core", provides = "ForestryAPI|apiculture")
package forestry.api.apiculture;
import net.minecraftforge.fml.common.API;
@@ -13,5 +13,7 @@ public interface IClimateManager {
float getTemperature(World world, BlockPos pos);
float getHumidity(World world, BlockPos pos);
IClimateProvider getDefaultClimate(World world, BlockPos pos);
}
@@ -0,0 +1,11 @@
package forestry.api.core;
import net.minecraft.world.biome.Biome;
public interface IClimateProvider {
Biome getBiome();
EnumTemperature getTemperature();
EnumHumidity getHumidity();
}
@@ -9,6 +9,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.EnumFacing;
@@ -38,7 +39,7 @@ public interface IModelBaker {
void addModel(@Nonnull AxisAlignedBB renderBounds, @Nonnull TextureAtlasSprite texture, int colorIndex);
void addBakedModel(@Nonnull IBakedModel model);
void addBakedModel(@Nullable IBlockState state, @Nonnull IBakedModel model);
void addFace(@Nonnull EnumFacing facing, @Nonnull TextureAtlasSprite sprite);
@@ -5,6 +5,7 @@
******************************************************************************/
package forestry.api.genetics;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -15,7 +16,7 @@ public interface IMutationCondition {
* Most will return 1 if the condition is met and 0 otherwise,
* but the float offers flexibility for more advanced conditions.
*/
float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1);
float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate);
/**
* A localized description of the mutation condition. (i.e. "A temperature of HOT is required.")
@@ -5,10 +5,11 @@
******************************************************************************/
package forestry.api.lepidopterology;
import forestry.api.core.IClimateProvider;
import forestry.api.genetics.IHousing;
import forestry.api.genetics.IIndividual;
public interface IButterflyNursery extends IHousing {
public interface IButterflyNursery extends IHousing, IClimateProvider {
IButterfly getCaterpillar();
@@ -45,7 +45,7 @@ public class BeeMutation extends Mutation implements IBeeMutation, IBeeMutationB
World world = housing.getWorldObj();
BlockPos housingPos = housing.getCoordinates();
float processedChance = super.getChance(world, housingPos, allele0, allele1, genome0, genome1);
float processedChance = super.getChance(world, housingPos, allele0, allele1, genome0, genome1, housing);
if (processedChance <= 0) {
return 0;
}
@@ -15,21 +15,13 @@ import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeHousingInventory;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.core.BiomeHelper;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
@@ -48,6 +40,13 @@ import forestry.core.network.DataOutputStreamForestry;
import forestry.core.proxy.Proxies;
import forestry.core.utils.BlockUtil;
import forestry.core.utils.Translator;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
public class AlvearyController extends RectangularMultiblockControllerBase implements IAlvearyControllerInternal, IClimateControlled {
@@ -355,8 +354,11 @@ public class AlvearyController extends RectangularMultiblockControllerBase imple
@Override
public EnumTemperature getTemperature() {
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(this);
if (beeModifier.isHellish() && tempChange >= 0) {
return EnumTemperature.HELLISH;
Biome biome = getBiome();
if (beeModifier.isHellish() || BiomeHelper.isBiomeHellish(biome)) {
if (tempChange >= 0) {
return EnumTemperature.HELLISH;
}
}
return EnumTemperature.getFromValue(getExactTemperature());
@@ -10,6 +10,8 @@
******************************************************************************/
package forestry.arboriculture.genetics;
import forestry.api.core.ForestryAPI;
import forestry.core.DefaultClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -40,7 +42,7 @@ public class TreeMutation extends Mutation implements ITreeMutation, ITreeMutati
@Override
public float getChance(World world, BlockPos pos, IAlleleTreeSpecies allele0, IAlleleTreeSpecies allele1, ITreeGenome genome0, ITreeGenome genome1) {
float processedChance = super.getChance(world, pos, allele0, allele1, genome0, genome1);
float processedChance = super.getChance(world, pos, allele0, allele1, genome0, genome1, ForestryAPI.climateManager.getDefaultClimate(world, pos));
if (processedChance <= 0) {
return 0;
}
@@ -27,6 +27,9 @@ import forestry.api.arboriculture.ITree;
import forestry.api.arboriculture.ITreeGenome;
import forestry.api.arboriculture.ITreekeepingMode;
import forestry.api.arboriculture.TreeManager;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IEffectData;
@@ -55,6 +58,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.common.EnumPlantType;
public class TileLeaves extends TileTreeContainer implements IPollinatable, IFruitBearer, IButterflyNursery, IRipeningPacketReceiver {
@@ -495,4 +499,19 @@ public class TileLeaves extends TileTreeContainer implements IPollinatable, IFru
ITree tree = getTree();
return !isDestroyed(tree, damage) && caterpillar == null;
}
@Override
public Biome getBiome() {
return worldObj.getBiome(pos);
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromBiome(worldObj.getBiome(pos), worldObj, pos);
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(ForestryAPI.climateManager.getHumidity(worldObj, pos));
}
}
@@ -10,6 +10,7 @@
******************************************************************************/
package forestry.core;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
@@ -42,4 +43,8 @@ public class ClimateManager implements IClimateManager{
return biome.getRainfall();
}
@Override
public IClimateProvider getDefaultClimate(World world, BlockPos pos) {
return new DefaultClimateProvider(world, pos);
}
}
@@ -0,0 +1,34 @@
package forestry.core;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
public class DefaultClimateProvider implements IClimateProvider {
private World world;
private BlockPos pos;
public DefaultClimateProvider(World world, BlockPos pos) {
this.world = world;
this.pos = pos;
}
@Override
public Biome getBiome() {
return world.getBiome(pos);
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromBiome(world.getBiome(pos), world, pos);
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(ForestryAPI.climateManager.getHumidity(world, pos));
}
}
@@ -23,6 +23,8 @@ public class Constants implements IForestryConstants {
public static final String VERSION = "@VERSION@";
public static final String BUILD_NUMBER = "@BUILD_NUMBER@";
public static final String TESLA_MOD_ID = "tesla";
public static final int FLAG_BLOCK_UPDATE = 1;
public static final int FLAG_BLOCK_SYNC = 2;
@@ -16,6 +16,7 @@ import java.util.List;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.IClimateProvider;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IGenome;
@@ -124,10 +125,10 @@ public abstract class Mutation implements IMutation, IMutationBuilder {
return this;
}
protected float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
protected float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
float mutationChance = chance;
for (IMutationCondition mutationCondition : mutationConditions) {
mutationChance *= mutationCondition.getChance(world, pos, allele0, allele1, genome0, genome1);
mutationChance *= mutationCondition.getChance(world, pos, allele0, allele1, genome0, genome1, climate);
if (mutationChance == 0) {
return 0;
}
@@ -14,6 +14,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
@@ -34,8 +35,8 @@ public class MutationConditionBiome implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
Biome biome = world.getBiome(pos);
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
Biome biome = climate.getBiome();
for (BiomeDictionary.Type type : validBiomeTypes) {
if (BiomeDictionary.isBiomeOfType(biome, type)) {
return 1;
@@ -10,6 +10,7 @@
******************************************************************************/
package forestry.core.genetics.mutations;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -27,7 +28,7 @@ public class MutationConditionDaytime implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
if (world.isDaytime() == daytime) {
return 1;
}
@@ -10,6 +10,7 @@
******************************************************************************/
package forestry.core.genetics.mutations;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -31,8 +32,8 @@ public class MutationConditionHumidity implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
EnumHumidity biomeHumidity = EnumHumidity.getFromValue(ForestryAPI.climateManager.getHumidity(world, pos));
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
EnumHumidity biomeHumidity = climate.getHumidity();
if (biomeHumidity.ordinal() < minHumidity.ordinal() || biomeHumidity.ordinal() > maxHumidity.ordinal()) {
return 0;
@@ -15,6 +15,7 @@ import java.util.HashSet;
import java.util.Set;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.core.IClimateProvider;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IGenome;
import forestry.api.genetics.IMutationCondition;
@@ -54,7 +55,7 @@ public class MutationConditionRequiresResource implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
TileEntity tile;
do {
pos = pos.down();
@@ -10,6 +10,7 @@
******************************************************************************/
package forestry.core.genetics.mutations;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
@@ -32,9 +33,9 @@ public class MutationConditionTemperature implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
Biome biome = world.getBiomeProvider().getBiome(pos);
EnumTemperature biomeTemperature = EnumTemperature.getFromBiome(biome, world, pos);
EnumTemperature biomeTemperature = climate.getTemperature();
if (biomeTemperature.ordinal() < minTemperature.ordinal() || biomeTemperature.ordinal() > maxTemperature.ordinal()) {
return 0;
@@ -12,6 +12,7 @@ package forestry.core.genetics.mutations;
import java.util.Calendar;
import forestry.api.core.IClimateProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -32,7 +33,7 @@ public class MutationConditionTimeLimited implements IMutationCondition {
}
@Override
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
public float getChance(World world, BlockPos pos, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1, IClimateProvider climate) {
DayMonth now = new DayMonth();
// If we are equal to start day, return 1.
@@ -13,6 +13,7 @@ package forestry.core.models.baker;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.util.vector.Vector3f;
import java.util.ArrayList;
@@ -48,7 +49,7 @@ public class ModelBaker implements IModelBaker {
private static final float quadsUV[] = new float[]{0, 0, 1, 1, 0, 0, 1, 1};
private final List<ModelBakerFace> faces = new ArrayList<>();
private final List<IBakedModel> bakedModels = new ArrayList<>();
private final List<Pair<IBlockState, IBakedModel>> bakedModels = new ArrayList<>();
protected AxisAlignedBB renderBounds;
@@ -126,8 +127,10 @@ public class ModelBaker implements IModelBaker {
}
@Override
public void addBakedModel(@Nonnull IBakedModel model) {
this.bakedModels.add(model);
public void addBakedModel(@Nullable IBlockState state, @Nonnull IBakedModel model) {
if(model != null){
this.bakedModels.add(Pair.of(state, model));
}
}
protected static float[] getFaceUvs(final EnumFacing face, final Vector3f to_16, final Vector3f from_16) {
@@ -217,7 +220,7 @@ public class ModelBaker implements IModelBaker {
}
//Add baked models to the current model.
for(IBakedModel bakedModel : bakedModels){
for(Pair<IBlockState, IBakedModel> bakedModel : bakedModels){
currentModel.addModelQuads(bakedModel);
}
@@ -49,7 +49,7 @@ public class ModelBakerModel implements IModelBakerModel {
private final Map<EnumFacing, List<BakedQuad>> faceQuads;
private final List<BakedQuad> generalQuads;
private final List<IBakedModel> models;
private final List<Pair<IBlockState, IBakedModel>> models;
private float[] rotation = getDefaultRotation();
private float[] translation = getDefaultTranslation();
@@ -68,7 +68,7 @@ public class ModelBakerModel implements IModelBakerModel {
}
}
private ModelBakerModel(List<IBakedModel> models, Map<EnumFacing, List<BakedQuad>> faceQuads, List<BakedQuad> generalQuads, boolean isGui3d, boolean isAmbientOcclusion, IModelState modelState, float[] rotation, float[] translation, float[] scale, TextureAtlasSprite particleSprite) {
private ModelBakerModel(List<Pair<IBlockState, IBakedModel>> models, Map<EnumFacing, List<BakedQuad>> faceQuads, List<BakedQuad> generalQuads, boolean isGui3d, boolean isAmbientOcclusion, IModelState modelState, float[] rotation, float[] translation, float[] scale, TextureAtlasSprite particleSprite) {
this.models = models;
this.faceQuads = faceQuads;
this.generalQuads = generalQuads;
@@ -178,8 +178,10 @@ public class ModelBakerModel implements IModelBakerModel {
return modelState;
}
public void addModelQuads(IBakedModel model) {
this.models.add(model);
public void addModelQuads(Pair<IBlockState, IBakedModel> model) {
if(model != null){
this.models.add(model);
}
}
@Override
@@ -194,8 +196,11 @@ public class ModelBakerModel implements IModelBakerModel {
@Override
public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
List<BakedQuad> quads = new ArrayList<>();
for (IBakedModel model : this.models) {
quads.addAll(model.getQuads(state, side, rand));
for (Pair<IBlockState, IBakedModel> model : this.models) {
List<BakedQuad> modelQuads = model.getRight().getQuads(model.getLeft(), side, rand);
if(modelQuads != null && !modelQuads.isEmpty()){
quads.addAll(modelQuads);
}
}
if(side != null){
quads.addAll(faceQuads.get(side));
@@ -64,15 +64,15 @@ public class CamouflageUtil {
}
TileEntity tile = world.getTileEntity(pos);
if(tile instanceof ICamouflageHandler){
return (ICamouflageHandler) tile;
}
if(tile instanceof IMultiblockComponent){
IMultiblockComponent component = (IMultiblockComponent) tile;
if(component.getMultiblockLogic().getController() instanceof ICamouflageHandler){
return (ICamouflageHandler) component.getMultiblockLogic().getController();
}
}
if(tile instanceof ICamouflageHandler){
return (ICamouflageHandler) tile;
}
return null;
}
@@ -2,6 +2,7 @@ package forestry.energy;
import java.io.IOException;
import forestry.core.config.Constants;
import net.darkhax.tesla.api.ITeslaConsumer;
import net.darkhax.tesla.api.ITeslaHolder;
import net.darkhax.tesla.api.ITeslaProducer;
@@ -14,7 +15,6 @@ import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.IStreamable;
import forestry.core.tiles.TileEngine;
import forestry.core.utils.BlockUtil;
import cofh.api.energy.IEnergyProvider;
import cofh.api.energy.IEnergyReceiver;
@@ -23,9 +23,9 @@ import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.fml.common.Optional;
@Optional.InterfaceList({
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaConsumer", modid = "Tesla"),
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaProducer", modid = "Tesla"),
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaHolder", modid = "Tesla")
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaConsumer", modid = Constants.TESLA_MOD_ID),
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaProducer", modid = Constants.TESLA_MOD_ID),
@Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaHolder", modid = Constants.TESLA_MOD_ID)
})
public class EnergyManager implements IEnergyReceiver, ITeslaConsumer, ITeslaProducer, ITeslaHolder, IEnergyProvider, IStreamable {
@CapabilityInject(ITeslaConsumer.class)
@@ -259,13 +259,13 @@ public class EnergyManager implements IEnergyReceiver, ITeslaConsumer, ITeslaPro
return null;
}
@Optional.Method(modid = "Tesla")
@Optional.Method(modid = Constants.TESLA_MOD_ID)
public static int sendEnergyTesla(TileEntity tile, EnumFacing side, int amount, boolean simulate) {
ITeslaConsumer consumer = tile.getCapability(TESLA_CONSUMER, side);
return (int) consumer.givePower(amount, simulate);
}
@Optional.Method(modid = "Tesla")
@Optional.Method(modid = Constants.TESLA_MOD_ID)
@Override
public long givePower(long power, boolean simulated) {
if (!canReceive()) {
@@ -274,7 +274,7 @@ public class EnergyManager implements IEnergyReceiver, ITeslaConsumer, ITeslaPro
return energyStorage.receiveEnergy(power, simulated);
}
@Optional.Method(modid = "Tesla")
@Optional.Method(modid = Constants.TESLA_MOD_ID)
@Override
public long takePower(long power, boolean simulated) {
if (!canExtract()) {
@@ -283,13 +283,13 @@ public class EnergyManager implements IEnergyReceiver, ITeslaConsumer, ITeslaPro
return energyStorage.extractEnergy(power, simulated);
}
@Optional.Method(modid = "Tesla")
@Optional.Method(modid = Constants.TESLA_MOD_ID)
@Override
public long getStoredPower() {
return energyStorage.getEnergyStored();
}
@Optional.Method(modid = "Tesla")
@Optional.Method(modid = Constants.TESLA_MOD_ID)
@Override
public long getCapacity() {
return energyStorage.getMaxEnergyStored();
@@ -10,20 +10,25 @@
******************************************************************************/
package forestry.farming.logic;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableCollection;
import forestry.core.config.Constants;
import forestry.core.network.packets.PacketFXSignal;
import forestry.core.proxy.Proxies;
import forestry.core.utils.ItemStackUtil;
import forestry.plugins.compat.PluginIC2;
import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.core.config.Constants;
import forestry.core.network.packets.PacketFXSignal;
import forestry.core.proxy.Proxies;
import forestry.plugins.compat.PluginIC2;
public class CropRubber extends CropDestroy {
public CropRubber(World world, IBlockState blockState, BlockPos position) {
@@ -34,10 +39,44 @@ public class CropRubber extends CropDestroy {
* Convert a "wet" rubber log blockstate into the dry version.
* Total hack since we don't have access to the blockstates.
*/
private static IBlockState getReplantState(IBlockState sappyState) {
Block block = sappyState.getBlock();
int sappyMeta = block.getMetaFromState(sappyState);
return block.getStateFromMeta(sappyMeta - 4);
private static <T extends Comparable<T>> IBlockState getReplantState(IBlockState sappyState) {
if (hasRubberToHarvest(sappyState)) {
for (Map.Entry<IProperty<?>, Comparable<?>> wetPropertyEntry : sappyState.getProperties().entrySet()) {
String valueWetString = wetPropertyEntry.getValue().toString();
String valueDryString = valueWetString.replace("wet", "dry");
IProperty<?> property = wetPropertyEntry.getKey();
IBlockState baseState = sappyState.getBlock().getBlockState().getBaseState();
IBlockState dryState = getStateWithValue(baseState, property, valueDryString);
if (dryState != null) {
return dryState;
}
}
}
return sappyState.getBlock().getDefaultState();
}
public static boolean hasRubberToHarvest(IBlockState blockState) {
Block block = blockState.getBlock();
if (ItemStackUtil.equals(block, PluginIC2.rubberWood)) {
ImmutableCollection<Comparable<?>> propertyValues = blockState.getProperties().values();
for (Comparable<?> propertyValue : propertyValues) {
if (propertyValue.toString().contains("wet")) {
return true;
}
}
}
return false;
}
@Nullable
private static <T extends Comparable<T>> IBlockState getStateWithValue(IBlockState baseState, IProperty<T> property, String valueString) {
Optional<T> value = property.parseValue(valueString);
if (value.isPresent()) {
return baseState.withProperty(property, value.get());
}
return null;
}
@Override
@@ -10,27 +10,22 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmHousing;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.Log;
import forestry.plugins.compat.PluginIC2;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class FarmLogicRubber extends FarmLogic {
@@ -114,63 +109,24 @@ public class FarmLogicRubber extends FarmLogic {
}
private Collection<ICrop> getHarvestBlocks(World world, BlockPos position) {
Set<BlockPos> seen = new HashSet<>();
Stack<ICrop> crops = new Stack<>();
// Determine what type we want to harvest.
IBlockState blockState = world.getBlockState(position);
Block block = blockState.getBlock();
if (!ItemStackUtil.equals(block, PluginIC2.rubberWood)) {
return crops;
}
for (int j = 0; j < 10; j++) {
BlockPos candidate = position.add(0, j, 0);
int meta = block.getMetaFromState(blockState);
if (meta >= 7 && meta <= 10) {
crops.push(new CropDestroy(world, blockState, position, null));
}
List<BlockPos> candidates = processHarvestBlock(world, crops, seen, position);
List<BlockPos> temp = new ArrayList<>();
while (!candidates.isEmpty() && crops.size() < 100) {
for (BlockPos candidate : candidates) {
temp.addAll(processHarvestBlock(world, crops, seen, candidate));
IBlockState blockState = world.getBlockState(candidate);
Block block = blockState.getBlock();
if (!ItemStackUtil.equals(block, PluginIC2.rubberWood)) {
break;
}
if (CropRubber.hasRubberToHarvest(blockState)) {
crops.push(new CropRubber(world, blockState, candidate));
break;
}
candidates.clear();
candidates.addAll(temp);
temp.clear();
}
return crops;
}
private List<BlockPos> processHarvestBlock(World world, Stack<ICrop> crops, Set<BlockPos> seen, BlockPos position) {
List<BlockPos> candidates = new ArrayList<>();
// Get additional candidates to return
for (int j = 0; j < 2; j++) {
BlockPos candidate = position.add(0, j, 0);
if (candidate.equals(position)) {
continue;
}
// See whether the given position has already been processed
if (seen.contains(candidate)) {
continue;
}
IBlockState blockState = world.getBlockState(candidate);
Block block = blockState.getBlock();
if (ItemStackUtil.equals(block, PluginIC2.rubberWood)) {
int meta = block.getMetaFromState(blockState);
if (meta >= 7 && meta <= 10) {
crops.push(new CropRubber(world, blockState, candidate));
}
candidates.add(candidate);
seen.add(candidate);
}
}
return candidates;
}
}
@@ -14,6 +14,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockModelShapes;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
@@ -51,8 +52,9 @@ public class ModelGreenhouse extends ModelBlockDefault<BlockGreenhouse> {
private static void bakeBlockModel(@Nonnull BlockGreenhouse block, @Nullable IBlockAccess world, @Nullable BlockPos pos, @Nullable IExtendedBlockState stateExtended, @Nonnull IModelBaker baker, @Nullable ItemStack camouflageStack) {
if (camouflageStack != null) {
BlockModelShapes modelShapes = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes();
IBlockState state = Block.getBlockFromItem(camouflageStack.getItem()).getStateFromMeta(camouflageStack.getItemDamage());
baker.addBakedModel(modelShapes.getModelForState(Block.getBlockFromItem(camouflageStack.getItem()).getStateFromMeta(camouflageStack.getItemDamage())));
baker.addBakedModel(state, modelShapes.getModelForState(state));
baker.setParticleSprite(modelShapes.getModelForState(Block.getBlockFromItem(camouflageStack.getItem()).getStateFromMeta(camouflageStack.getItemDamage())).getParticleTexture());
}
@@ -35,7 +35,7 @@ public class ButterflyMutation extends Mutation implements IButterflyMutation, I
@Override
public float getChance(World world, IButterflyNursery housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
float processedChance = super.getChance(world, housing.getCoordinates(), allele0, allele1, genome0, genome1);
float processedChance = super.getChance(world, housing.getCoordinates(), allele0, allele1, genome0, genome1, housing);
if (processedChance <= 0) {
return 0;
}