Compare commits

...
17 Commits
60 changed files with 685 additions and 556 deletions

No files matched your search

+5 -5
View File
@@ -1,11 +1,11 @@
mcversion=1.10.2
forgeversion=12.18.1.2080
forgeversion=12.18.1.2094
mcp_mappings=snapshot_20160525
tesla_version=1.10.2-1.2.1.42
jei_version=3.8.1.242
ic2_version=2.6.38-ex110
tesla_version=1.10.2-1.2.1.49
jei_version=3.12.2.290
ic2_version=2.6.76-ex110
version_major=5
version_minor=2
version_patch=12
version_patch=14
+14 -15
View File
@@ -12,20 +12,6 @@ package forestry;
import java.io.File;
import forestry.plugins.compat.PluginIC2;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
import forestry.api.core.ForestryAPI;
import forestry.core.EventHandlerCore;
import forestry.core.climate.ClimateEventHandler;
@@ -40,6 +26,19 @@ import forestry.core.network.PacketHandler;
import forestry.core.proxy.Proxies;
import forestry.core.worldgen.WorldGenerator;
import forestry.plugins.PluginManager;
import forestry.plugins.compat.PluginIC2;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
/**
* Forestry Minecraft Mod
@@ -53,7 +52,7 @@ import forestry.plugins.PluginManager;
guiFactory = "forestry.core.config.ForestryGuiConfigFactory",
acceptedMinecraftVersions = "[1.10]",
dependencies = "required-after:Forge@[12.18.1.2080,);"
+ "after:JEI@[3.8.0,);"
+ "after:JEI@[3.11.2.278,);"
+ "after:" + PluginIC2.modId + ";")
public class Forestry {
@@ -0,0 +1,13 @@
package forestry.api.apiculture;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
public class ApicultureCapabilities {
/**
* Capability for {@link IArmorApiarist}.
* The {@link Capability#getDefaultInstance()} will always protect the wearer with no side effects.
*/
@CapabilityInject(IArmorApiarist.class)
public static Capability<IArmorApiarist> ARMOR_APIARIST;
}
@@ -5,21 +5,24 @@
******************************************************************************/
package forestry.api.apiculture;
import javax.annotation.Nullable;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
/**
* When implemented by armor piece items, allows them to act as apiarist's armor.
* When implemented as a capability by armor items, protects the wearer from negative bee effects.
* @see ApicultureCapabilities#ARMOR_APIARIST
*/
public interface IArmorApiarist {
/**
* Called when the apiarist's armor acts as protection against an attack.
*
* @param entity Entity being attacked
* @param armor Armor item
* @param cause Optional cause of attack, such as a bee effect identifier
* @param entity Entity being attacked
* @param armor Armor item
* @param cause Optional cause of attack, such as a bee effect identifier
* @param doProtect Whether or not to actually do the side effects of protection
* @return Whether or not the armor should protect the player from that attack
*/
boolean protectEntity(EntityLivingBase entity, ItemStack armor, String cause, boolean doProtect);
boolean protectEntity(EntityLivingBase entity, ItemStack armor, @Nullable String cause, boolean doProtect);
}
@@ -5,33 +5,29 @@
******************************************************************************/
package forestry.api.apiculture;
import javax.annotation.Nonnull;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import com.mojang.authlib.GameProfile;
import forestry.api.climate.IClimateProvider;
import forestry.api.core.IErrorLogicSource;
import forestry.api.core.ILocatable;
import forestry.api.genetics.IHousing;
import net.minecraft.util.math.Vec3d;
public interface IBeeHousing extends IHousing, IErrorLogicSource, IClimateProvider {
public interface IBeeHousing extends IHousing, IErrorLogicSource, IClimateProvider, ILocatable {
/**
* Used by BeeManager.beeRoot.createBeeHousingModifier(IBeeHousing housing)
* Used by {@link IBeeRoot#createBeeHousingModifier(IBeeHousing)}
* to combine bee modifiers from several sources that can change over time.
* @return IBeeModifiers from the housing, frames, etc.
*/
Iterable<IBeeModifier> getBeeModifiers();
/**
* Used by BeeManager.beeRoot.createBeeHousingListener(IBeeHousing housing)
* Used by {@link IBeeRoot#createBeeHousingListener(IBeeHousing)}
* to combine bee listeners from several sources that can change over time.
* @return IBeeListeners from the housing, multiblock parts, etc.
*/
Iterable<IBeeListener> getBeeListeners();
@Nonnull
IBeeHousingInventory getBeeInventory();
IBeekeepingLogic getBeekeepingLogic();
@@ -40,14 +36,11 @@ public interface IBeeHousing extends IHousing, IErrorLogicSource, IClimateProvid
boolean canBlockSeeTheSky();
/** Must not be named "getWorld" to avoid SpecialSource issue https://github.com/md-5/SpecialSource/issues/12 */
World getWorldObj();
GameProfile getOwner();
/**
* @since Forestry 4.2
* @return exact coordinates where bee FX should spawn from
* @return exact coordinates where bee particle FX should spawn from
*/
Vec3d getBeeFXCoordinates();
}
@@ -0,0 +1,14 @@
package forestry.api.arboriculture;
import forestry.api.core.IArmorNaturalist;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
public class ArboricultureCapabilities {
/**
* Capability for {@link IArmorNaturalist}.
* The {@link Capability#getDefaultInstance()} will always show pollination with no side effects.
*/
@CapabilityInject(IArmorNaturalist.class)
public static Capability<IArmorNaturalist> ARMOR_NATURALIST;
}
@@ -60,15 +60,15 @@ public enum EnumTemperature {
}
}
public static EnumTemperature getFromBiome(Biome Biome) {
if (BiomeHelper.isBiomeHellish(Biome)) {
public static EnumTemperature getFromBiome(Biome biome) {
if (BiomeHelper.isBiomeHellish(biome)) {
return HELLISH;
}
return getFromValue(Biome.getTemperature());
return getFromValue(biome.getTemperature());
}
public static EnumTemperature getFromBiome(Biome Biome, World world, BlockPos pos) {
if (BiomeHelper.isBiomeHellish(Biome)) {
public static EnumTemperature getFromBiome(Biome biome, World world, BlockPos pos) {
if (BiomeHelper.isBiomeHellish(biome)) {
return HELLISH;
}
float temperature = ForestryAPI.climateManager.getTemperature(world, pos);
@@ -5,20 +5,23 @@
******************************************************************************/
package forestry.api.core;
import forestry.api.arboriculture.ArboricultureCapabilities;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
/**
* Naturalist armor allows players to see pollinated tree leaves.
*
* @see ArboricultureCapabilities#ARMOR_NATURALIST
*/
public interface IArmorNaturalist {
/**
* Called when the naturalist's armor acts as spectacles for seeing pollinated tree leaves/flowers.
* Called to see if this naturalist's armor allows for seeing pollinated tree leaves/flowers.
*
* @param player
* Player doing the viewing
* @param armor
* Armor item
* @param doSee
* Whether or not to actually do the side effects of viewing
* @param player Player doing the viewing
* @param armor Armor item
* @param doSee Whether or not to actually do the side effects of viewing
* @return true if the armor actually allows the player to see pollination.
*/
boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee);
@@ -8,7 +8,6 @@ package forestry.api.recipes;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public interface ICarpenterRecipe extends IForestryRecipe {
@@ -5,6 +5,9 @@
******************************************************************************/
package forestry.api.recipes;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
/**
@@ -30,4 +33,7 @@ public interface IDescriptiveRecipe extends IRecipe {
*/
Object[] getIngredients();
@Nonnull
@Override
ItemStack getRecipeOutput();
}
@@ -10,13 +10,13 @@
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.ApicultureCapabilities;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.apiculture.IArmorApiaristHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.apiculture.IArmorApiaristHelper;
public class ArmorApiaristHelper implements IArmorApiaristHelper {
@Override
@@ -25,12 +25,16 @@ public class ArmorApiaristHelper implements IArmorApiaristHelper {
return false;
}
Item item = stack.getItem();
if (!(item instanceof IArmorApiarist)) {
final Item item = stack.getItem();
final IArmorApiarist armorApiarist;
if (item instanceof IArmorApiarist) { // legacy
armorApiarist = (IArmorApiarist) item;
} else if (stack.hasCapability(ApicultureCapabilities.ARMOR_APIARIST, null)) {
armorApiarist = stack.getCapability(ApicultureCapabilities.ARMOR_APIARIST, null);
} else {
return false;
}
IArmorApiarist armorApiarist = (IArmorApiarist) item;
return armorApiarist.protectEntity(entity, stack, cause, doProtect);
}
@@ -22,6 +22,7 @@ import forestry.Forestry;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.FlowerManager;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.apiculture.IBeekeepingMode;
import forestry.api.apiculture.hives.HiveManager;
import forestry.api.apiculture.hives.IHiveRegistry.HiveType;
@@ -36,6 +37,7 @@ import forestry.api.storage.StorageManager;
import forestry.apiculture.blocks.BlockAlvearyType;
import forestry.apiculture.blocks.BlockCandle;
import forestry.apiculture.blocks.BlockRegistryApiculture;
import forestry.apiculture.capabilities.ArmorApiarist;
import forestry.apiculture.commands.CommandBee;
import forestry.apiculture.entities.EntityMinecartApiary;
import forestry.apiculture.entities.EntityMinecartBeehouse;
@@ -72,6 +74,7 @@ import forestry.apiculture.worldgen.HiveRegistry;
import forestry.core.ISaveEventHandler;
import forestry.core.PluginCore;
import forestry.core.PluginFluids;
import forestry.core.capabilities.NullStorage;
import forestry.core.config.Config;
import forestry.core.config.Constants;
import forestry.core.config.LocalizedConfiguration;
@@ -106,6 +109,7 @@ import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler;
@@ -161,6 +165,9 @@ public class PluginApiculture extends BlankForestryPlugin {
BeeManager.beeRoot.registerBeekeepingMode(BeekeepingMode.hard);
BeeManager.beeRoot.registerBeekeepingMode(BeekeepingMode.hardcore);
BeeManager.beeRoot.registerBeekeepingMode(BeekeepingMode.insane);
// Capabilities
CapabilityManager.INSTANCE.register(IArmorApiarist.class, new NullStorage<>(), () -> ArmorApiarist.INSTANCE);
}
@Override
@@ -286,6 +286,11 @@ public class BlockCandle extends BlockTorch implements IItemModelRegister, ITile
boolean isLit = isLit(stack);
tileCandle.setColour(colour);
tileCandle.setLit(isLit);
if (tileCandle.isLit()) {
world.theProfiler.startSection("checkLight");
world.checkLight(pos);
world.theProfiler.endSection();
}
}
@Override
@@ -322,19 +327,11 @@ public class BlockCandle extends BlockTorch implements IItemModelRegister, ITile
}
public ItemStack getUnlitCandle(int amount) {
ItemStack itemStack = new ItemStack(this, amount, 0);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger(BlockCandle.colourTagName, 0xffffff);
itemStack.setTagCompound(tag);
return itemStack;
return new ItemStack(this, amount, 0);
}
public ItemStack getLitCandle(int amount) {
ItemStack itemStack = new ItemStack(this, amount, 1);
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger(BlockCandle.colourTagName, 0xffffff);
itemStack.setTagCompound(tag);
return itemStack;
return new ItemStack(this, amount, 1);
}
@Override
@@ -60,10 +60,11 @@ public class BlockStump extends BlockTorch implements IItemModelRegister {
if (heldItem != null && BlockCandle.lightingItems.contains(heldItem.getItem())) {
IBlockState blockState = worldIn.getBlockState(pos);
Block block = blockState.getBlock();
IBlockState activatedState = PluginApiculture.blocks.candle.getStateFromMeta(block.getMetaFromState(blockState) | 0x08);
IBlockState activatedState = PluginApiculture.blocks.candle.getStateFromMeta(block.getMetaFromState(blockState));
worldIn.setBlockState(pos, activatedState, Constants.FLAG_BLOCK_SYNC);
TileCandle tc = new TileCandle();
tc.setColour(0); // default to white
tc.setColour(16777215); // default to white
tc.setLit(true);
worldIn.setTileEntity(pos, tc);
return true;
}
@@ -0,0 +1,20 @@
package forestry.apiculture.capabilities;
import javax.annotation.Nullable;
import forestry.api.apiculture.IArmorApiarist;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
public class ArmorApiarist implements IArmorApiarist {
public static final ArmorApiarist INSTANCE = new ArmorApiarist();
protected ArmorApiarist() {
}
@Override
public boolean protectEntity(EntityLivingBase entity, ItemStack armor, @Nullable String cause, boolean doProtect) {
return true;
}
}
@@ -248,7 +248,6 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public Set<IErrorState> getCanWork(IBeeHousing housing) {
World world = housing.getWorldObj();
Biome biome = housing.getBiome();
BlockPos housingCoords = housing.getCoordinates();
Set<IErrorState> errorStates = new HashSet<>();
@@ -282,7 +281,7 @@ public class Bee extends IndividualLiving implements IBee {
}
// / Check for the sky, except if in hell
if (biome != null && !BiomeHelper.isBiomeHellish(biome)) {
if (!world.provider.getHasNoSky()) {
if (!housing.canBlockSeeTheSky() && !canWorkUnderground(beeModifier)) {
errorStates.add(EnumErrorCode.NO_SKY);
}
@@ -10,26 +10,29 @@
******************************************************************************/
package forestry.apiculture.items;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.core.IArmorNaturalist;
import forestry.api.apiculture.ApicultureCapabilities;
import forestry.api.arboriculture.ArboricultureCapabilities;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.api.core.Tabs;
import forestry.apiculture.PluginApiculture;
import forestry.core.config.Constants;
import net.minecraft.entity.Entity;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ItemArmorApiarist extends ItemArmor implements IArmorApiarist, IArmorNaturalist, IItemModelRegister {
public class ItemArmorApiarist extends ItemArmor implements IItemModelRegister {
public ItemArmorApiarist(EntityEquipmentSlot equipmentSlotIn) {
super(ArmorMaterial.LEATHER, 0, equipmentSlotIn);
@@ -57,14 +60,28 @@ public class ItemArmorApiarist extends ItemArmor implements IArmorApiarist, IArm
return false;
}
@Nonnull
@Override
public boolean protectEntity(EntityLivingBase entity, ItemStack armor, String cause, boolean doProtect) {
return true;
}
public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) {
return new ICapabilityProvider() {
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
if (capability == ArboricultureCapabilities.ARMOR_NATURALIST) {
return armorType == EntityEquipmentSlot.HEAD;
}
return capability == ApicultureCapabilities.ARMOR_APIARIST;
}
@Override
public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee) {
return armorType == EntityEquipmentSlot.HEAD;
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == ApicultureCapabilities.ARMOR_APIARIST) {
return capability.getDefaultInstance();
} else if (capability == ArboricultureCapabilities.ARMOR_NATURALIST &&
armorType == EntityEquipmentSlot.HEAD) {
return capability.getDefaultInstance();
}
return null;
}
};
}
}
@@ -1,6 +1,9 @@
package forestry.apiculture.items;
import forestry.api.apiculture.IArmorApiarist;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import forestry.api.apiculture.ApicultureCapabilities;
import forestry.api.apiculture.IHiveTile;
import forestry.api.core.Tabs;
import forestry.core.items.ItemForestry;
@@ -9,6 +12,7 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
@@ -18,8 +22,10 @@ import net.minecraft.util.EnumHandSide;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
public class ItemSmoker extends ItemForestry implements IArmorApiarist {
public class ItemSmoker extends ItemForestry {
public ItemSmoker() {
super(Tabs.tabApiculture);
setMaxStackSize(1);
@@ -102,8 +108,22 @@ public class ItemSmoker extends ItemForestry implements IArmorApiarist {
return 32;
}
@Nonnull
@Override
public boolean protectEntity(EntityLivingBase entity, ItemStack armor, String cause, boolean doProtect) {
return true;
public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) {
return new ICapabilityProvider() {
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
return capability == ApicultureCapabilities.ARMOR_APIARIST;
}
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == ApicultureCapabilities.ARMOR_APIARIST) {
return capability.getDefaultInstance();
}
return null;
}
};
}
}
@@ -54,7 +54,6 @@ public class AlvearyController extends RectangularMultiblockControllerBase imple
private final InventoryBeeHousing inventory;
private final IBeekeepingLogic beekeepingLogic;
private Biome cachedBiome;
private float tempChange = 0.0f;
private float humidChange = 0.0f;
@@ -381,11 +380,8 @@ public class AlvearyController extends RectangularMultiblockControllerBase imple
@Override
public Biome getBiome() {
if (cachedBiome == null) {
BlockPos coords = getReferenceCoord();
cachedBiome = worldObj.getBiome(coords);
}
return cachedBiome;
BlockPos coords = getReferenceCoord();
return worldObj.getBiome(coords);
}
@Override
@@ -38,7 +38,6 @@ import net.minecraft.world.biome.Biome;
public abstract class TileBeeHousingBase extends TileBase implements IBeeHousing, IOwnedTile, IClimatised, IGuiBeeHousingInventory, IStreamableGui {
private final OwnerHandler ownerHandler = new OwnerHandler();
private final IBeekeepingLogic beeLogic;
private Biome cachedBiome;
// CLIENT
private int breedingProgressPercent = 0;
@@ -164,10 +163,7 @@ public abstract class TileBeeHousingBase extends TileBase implements IBeeHousing
// / IBEEHOUSING
@Override
public Biome getBiome() {
if (cachedBiome == null) {
cachedBiome = worldObj.getBiome(getPos());
}
return cachedBiome;
return worldObj.getBiome(getPos());
}
@Override
@@ -15,8 +15,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;
import forestry.api.arboriculture.EnumForestryWoodType;
import forestry.api.arboriculture.EnumGermlingType;
@@ -30,6 +30,7 @@ import forestry.api.arboriculture.TreeManager;
import forestry.api.arboriculture.WoodBlockKind;
import forestry.api.core.CamouflageManager;
import forestry.api.core.ForestryAPI;
import forestry.api.core.IArmorNaturalist;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.ILeafTranslator;
import forestry.api.genetics.ISaplingTranslator;
@@ -41,6 +42,7 @@ import forestry.arboriculture.blocks.BlockPile;
import forestry.arboriculture.blocks.BlockRegistryArboriculture;
import forestry.arboriculture.blocks.log.BlockArbLog;
import forestry.arboriculture.blocks.slab.BlockArbSlab;
import forestry.arboriculture.capabilities.ArmorNaturalist;
import forestry.arboriculture.commands.CommandTree;
import forestry.arboriculture.genetics.TreeBranchDefinition;
import forestry.arboriculture.genetics.TreeDefinition;
@@ -64,6 +66,7 @@ import forestry.arboriculture.tiles.TileLeaves;
import forestry.arboriculture.tiles.TilePile;
import forestry.arboriculture.tiles.TileSapling;
import forestry.core.PluginCore;
import forestry.core.capabilities.NullStorage;
import forestry.core.config.Config;
import forestry.core.config.Constants;
import forestry.core.fluids.Fluids;
@@ -98,6 +101,7 @@ import net.minecraft.world.World;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.IFuelHandler;
import net.minecraftforge.fml.common.SidedProxy;
@@ -140,6 +144,9 @@ public class PluginArboriculture extends BlankForestryPlugin {
TreeManager.treeRoot.registerTreekeepingMode(TreekeepingMode.hard);
TreeManager.treeRoot.registerTreekeepingMode(TreekeepingMode.hardcore);
TreeManager.treeRoot.registerTreekeepingMode(TreekeepingMode.insane);
// Capabilities
CapabilityManager.INSTANCE.register(IArmorNaturalist.class, new NullStorage<>(), () -> ArmorNaturalist.INSTANCE);
}
@Override
@@ -0,0 +1,18 @@
package forestry.arboriculture.capabilities;
import forestry.api.core.IArmorNaturalist;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
public class ArmorNaturalist implements IArmorNaturalist {
public static final ArmorNaturalist INSTANCE = new ArmorNaturalist();
protected ArmorNaturalist() {
}
@Override
public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee) {
return true;
}
}
@@ -36,6 +36,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidUtil;
@@ -0,0 +1,17 @@
package forestry.core.capabilities;
import net.minecraft.nbt.NBTBase;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
public class NullStorage<T> implements Capability.IStorage<T> {
@Override
public NBTBase writeNBT(Capability<T> capability, T instance, EnumFacing side) {
return null;
}
@Override
public void readNBT(Capability<T> capability, T instance, EnumFacing side, NBTBase nbt) {
}
}
@@ -10,23 +10,27 @@
******************************************************************************/
package forestry.core.items;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IArmorNaturalist;
import forestry.api.arboriculture.ArboricultureCapabilities;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.core.CreativeTabForestry;
import forestry.core.config.Constants;
import net.minecraft.entity.Entity;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ItemArmorNaturalist extends ItemArmor implements IArmorNaturalist, IItemModelRegister {
public class ItemArmorNaturalist extends ItemArmor implements IItemModelRegister {
public ItemArmorNaturalist() {
super(ArmorMaterial.LEATHER, 0, EntityEquipmentSlot.HEAD);
@@ -34,6 +38,7 @@ public class ItemArmorNaturalist extends ItemArmor implements IArmorNaturalist,
setCreativeTab(CreativeTabForestry.tabForestry);
}
@Nonnull
@Override
public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) {
return Constants.MOD_ID + ":" + Constants.TEXTURE_NATURALIST_ARMOR_PRIMARY;
@@ -50,9 +55,25 @@ public class ItemArmorNaturalist extends ItemArmor implements IArmorNaturalist,
return false;
}
@Nonnull
@Override
public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee) {
return armorType == EntityEquipmentSlot.HEAD;
public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) {
return new ICapabilityProvider() {
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
return capability == ArboricultureCapabilities.ARMOR_NATURALIST &&
armorType == EntityEquipmentSlot.HEAD;
}
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == ArboricultureCapabilities.ARMOR_NATURALIST &&
armorType == EntityEquipmentSlot.HEAD) {
return capability.getDefaultInstance();
}
return null;
}
};
}
}
@@ -14,17 +14,8 @@ import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import com.mojang.authlib.GameProfile;
import forestry.api.arboriculture.ArboricultureCapabilities;
import forestry.api.arboriculture.EnumGermlingType;
import forestry.api.arboriculture.ITree;
import forestry.api.arboriculture.TreeManager;
@@ -43,6 +34,14 @@ import forestry.api.lepidopterology.IButterflyNursery;
import forestry.arboriculture.genetics.pollination.CheckPollinatableTree;
import forestry.core.config.Config;
import forestry.core.genetics.ItemGE;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class GeneticsUtil {
@@ -56,12 +55,16 @@ public class GeneticsUtil {
return false;
}
Item armorItem = armorItemStack.getItem();
if (!(armorItem instanceof IArmorNaturalist)) {
final Item armorItem = armorItemStack.getItem();
final IArmorNaturalist armorNaturalist;
if (armorItem instanceof IArmorNaturalist) { // legacy
armorNaturalist = (IArmorNaturalist) armorItem;
} else if (armorItemStack.hasCapability(ArboricultureCapabilities.ARMOR_NATURALIST, null)) {
armorNaturalist = armorItemStack.getCapability(ArboricultureCapabilities.ARMOR_NATURALIST, null);
} else {
return false;
}
IArmorNaturalist armorNaturalist = (IArmorNaturalist) armorItem;
return armorNaturalist.canSeePollination(player, armorItemStack, true);
}
@@ -1,5 +1,8 @@
package forestry.core.utils;
import java.util.ArrayList;
import java.util.List;
import mezz.jei.api.IModRegistry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
@@ -8,9 +11,12 @@ import net.minecraftforge.oredict.OreDictionary;
public class JeiUtil {
public static void addDescription(IModRegistry registry, String itemKey, Item... items) {
List<ItemStack> itemStacks = new ArrayList<>();
for (Item item : items) {
addDescription(registry, item, itemKey);
itemStacks.add(new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE));
}
registry.addDescription(itemStacks, "for.jei.description." + itemKey);
}
public static void addDescription(IModRegistry registry, Block... blocks) {
@@ -14,8 +14,6 @@ import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -155,14 +153,6 @@ public class TileEngineClockwork extends TileEngine {
return fromClockwork;
}
@Override
public void getGUINetworkData(int i, int j) {
}
@Override
public void sendGUINetworkData(Container containerEngine, IContainerListener iCrafting) {
}
@Override
public Object getGui(EntityPlayer player, int data) {
@@ -11,10 +11,13 @@
package forestry.factory.gui;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import forestry.core.gui.ContainerSocketed;
import forestry.core.gui.slots.SlotFiltered;
import forestry.core.gui.slots.SlotLocked;
import forestry.core.gui.slots.SlotOutput;
import forestry.core.network.packets.PacketItemStackDisplay;
import forestry.factory.tiles.TileCentrifuge;
public class ContainerCentrifuge extends ContainerSocketed<TileCentrifuge> {
@@ -23,14 +26,34 @@ public class ContainerCentrifuge extends ContainerSocketed<TileCentrifuge> {
super(tile, player, 8, 84);
// Resource
this.addSlotToContainer(new SlotFiltered(tile, 0, 30, 37));
this.addSlotToContainer(new SlotFiltered(tile, 0, 16, 37));
// Craft Preview display
addSlotToContainer(new SlotLocked(tile.getCraftPreviewInventory(), 0, 49, 37));
// Product Inventory
for (int l = 0; l < 3; l++) {
for (int k = 0; k < 3; k++) {
addSlotToContainer(new SlotOutput(tile, 1 + k + l * 3, 98 + k * 18, 19 + l * 18));
addSlotToContainer(new SlotOutput(tile, 1 + k + l * 3, 112 + k * 18, 19 + l * 18));
}
}
}
private ItemStack oldCraftPreview;
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
IInventory craftPreviewInventory = tile.getCraftPreviewInventory();
ItemStack newCraftPreview = craftPreviewInventory.getStackInSlot(0);
if (!ItemStack.areItemStacksEqual(oldCraftPreview, newCraftPreview)) {
oldCraftPreview = newCraftPreview;
PacketItemStackDisplay packet = new PacketItemStackDisplay(tile, newCraftPreview);
sendPacketToListeners(packet);
}
}
}
@@ -21,7 +21,7 @@ public class GuiCentrifuge extends GuiForestryTitled<ContainerCentrifuge, TileCe
public GuiCentrifuge(InventoryPlayer inventory, TileCentrifuge tile) {
super(Constants.TEXTURE_PATH_GUI + "/centrifugesocket.png", new ContainerCentrifuge(inventory, tile), tile);
widgetManager.add(new SocketWidget(this.widgetManager, 71, 37, tile, 0));
widgetManager.add(new SocketWidget(this.widgetManager, 79, 37, tile, 0));
}
@Override
@@ -29,6 +29,7 @@ public class GuiCentrifuge extends GuiForestryTitled<ContainerCentrifuge, TileCe
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
int progress = inventory.getProgressScaled(16);
drawTexturedModalRect(guiLeft + 58, guiTop + 36 + 17 - progress, 176, 17 - progress, 4, progress);
drawTexturedModalRect(guiLeft + 43, guiTop + 36 + 17 - progress, 176, 17 - progress, 4, progress);
drawTexturedModalRect(guiLeft + 67, guiTop + 36 + 17 - progress, 176, 17 - progress, 4, progress);
}
}
@@ -10,15 +10,17 @@
******************************************************************************/
package forestry.factory.recipes;
import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
import forestry.api.recipes.ISqueezerRecipe;
import net.minecraft.item.ItemStack;
public interface ISqueezerContainerRecipe {
ItemStack getEmptyContainer();
int getProcessingTime();
@Nullable
ItemStack getRemnants();
float getRemnantsChance();
@@ -10,22 +10,23 @@
******************************************************************************/
package forestry.factory.recipes;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import javax.annotation.Nullable;
import forestry.api.recipes.ISqueezerRecipe;
import forestry.core.utils.ItemStackUtil;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
public class SqueezerContainerRecipe implements ISqueezerContainerRecipe {
private final ItemStack emptyContainer;
private final int processingTime;
@Nullable
private final ItemStack remnants;
private final float remnantsChance;
public SqueezerContainerRecipe(ItemStack emptyContainer, int processingTime, ItemStack remnants, float remnantsChance) {
public SqueezerContainerRecipe(ItemStack emptyContainer, int processingTime, @Nullable ItemStack remnants, float remnantsChance) {
this.emptyContainer = emptyContainer;
this.processingTime = processingTime;
this.remnants = remnants;
@@ -42,6 +43,7 @@ public class SqueezerContainerRecipe implements ISqueezerContainerRecipe {
return processingTime;
}
@Nullable
@Override
public ItemStack getRemnants() {
return remnants;
@@ -2,7 +2,7 @@ package forestry.factory.recipes.jei;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.awt.*;
import java.awt.Rectangle;
import java.util.List;
import forestry.core.gui.GuiForestry;
@@ -53,14 +53,17 @@ import mezz.jei.api.IJeiHelpers;
import mezz.jei.api.IModRegistry;
import mezz.jei.api.JEIPlugin;
import mezz.jei.api.gui.IAdvancedGuiHandler;
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
import mezz.jei.api.recipe.transfer.IRecipeTransferRegistry;
import net.minecraft.item.ItemStack;
@JEIPlugin
public class FactoryJeiPlugin extends BlankModPlugin {
public static IJeiHelpers jeiHelpers;
@Override
public void register(@Nonnull IModRegistry registry) {
IJeiHelpers jeiHelpers = registry.getJeiHelpers();
jeiHelpers = registry.getJeiHelpers();
IGuiHelper guiHelper = jeiHelpers.getGuiHelper();
registry.addRecipeCategories(
@@ -101,7 +104,8 @@ public class FactoryJeiPlugin extends BlankModPlugin {
registry.addRecipeClickArea(GuiBottler.class, 80, 37, 26, 22, ForestryRecipeCategoryUid.BOTTLER);
registry.addRecipeClickArea(GuiCarpenter.class, 98, 48, 21, 26, ForestryRecipeCategoryUid.CARPENTER);
registry.addRecipeClickArea(GuiCentrifuge.class, 52, 22, 16, 48, ForestryRecipeCategoryUid.CENTRIFUGE);
registry.addRecipeClickArea(GuiCentrifuge.class, 38, 22, 38, 14, ForestryRecipeCategoryUid.CENTRIFUGE);
registry.addRecipeClickArea(GuiCentrifuge.class, 38, 54, 38, 14, ForestryRecipeCategoryUid.CENTRIFUGE);
registry.addRecipeClickArea(GuiFabricator.class, 121, 53, 18, 18, ForestryRecipeCategoryUid.FABRICATOR);
registry.addRecipeClickArea(GuiFermenter.class, 72, 40, 32, 18, ForestryRecipeCategoryUid.FERMENTER);
registry.addRecipeClickArea(GuiMoistener.class, 123, 35, 19, 21, ForestryRecipeCategoryUid.MOISTENER);
@@ -119,6 +123,7 @@ public class FactoryJeiPlugin extends BlankModPlugin {
registry.addRecipeCategoryCraftingItem(new ItemStack(blocks.rainmaker), ForestryRecipeCategoryUid.RAINMAKER);
registry.addRecipeCategoryCraftingItem(new ItemStack(blocks.squeezer), ForestryRecipeCategoryUid.SQUEEZER);
registry.addRecipeCategoryCraftingItem(new ItemStack(blocks.still), ForestryRecipeCategoryUid.STILL);
registry.addRecipeCategoryCraftingItem(new ItemStack(blocks.worktable), VanillaRecipeCategoryUid.CRAFTING);
IRecipeTransferRegistry transferRegistry = registry.getRecipeTransferRegistry();
transferRegistry.addRecipeTransferHandler(new WorktableRecipeTransferHandler());
@@ -2,13 +2,9 @@ package forestry.factory.recipes.jei.bottler;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
@@ -16,9 +12,11 @@ import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class BottlerRecipeCategory extends ForestryRecipeCategory {
public class BottlerRecipeCategory extends ForestryRecipeCategory<BottlerRecipeWrapper> {
private static final int emptySlot = 0;
private static final int outputSlot = 1;
@@ -50,7 +48,7 @@ public class BottlerRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull BottlerRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
@@ -58,11 +56,9 @@ public class BottlerRecipeCategory extends ForestryRecipeCategory {
guiItemStacks.init(outputSlot, false, 63, 38);
guiFluidStacks.init(inputTank, true, 1, 1, 16, 58, 10000, false, tankOverlay);
guiItemStacks.setFromRecipe(emptySlot, recipeWrapper.getInputs());
guiItemStacks.setFromRecipe(outputSlot, recipeWrapper.getOutputs());
guiFluidStacks.set(inputTank, recipeWrapper.getFluidInputs());
guiItemStacks.set(ingredients);
guiFluidStacks.set(ingredients);
}
}
@@ -2,14 +2,12 @@ package forestry.factory.recipes.jei.bottler;
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import forestry.factory.recipes.BottlerRecipe;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class BottlerRecipeWrapper extends ForestryRecipeWrapper<BottlerRecipe> {
@@ -17,22 +15,13 @@ public class BottlerRecipeWrapper extends ForestryRecipeWrapper<BottlerRecipe> {
super(recipe);
}
@Nonnull
@Override
public List<FluidStack> getFluidInputs() {
return Collections.singletonList(getRecipe().input);
}
public void getIngredients(@Nonnull IIngredients ingredients) {
BottlerRecipe recipe = getRecipe();
@Nonnull
@Override
public List<ItemStack> getInputs() {
return Collections.singletonList(getRecipe().empty);
}
ingredients.setInputs(ItemStack.class, Collections.singletonList(recipe.empty));
ingredients.setInputs(FluidStack.class, Collections.singletonList(recipe.input));
@Nonnull
@Override
public List getOutputs() {
return Collections.singletonList(getRecipe().filled);
ingredients.setOutput(ItemStack.class, recipe.filled);
}
}
@@ -1,17 +1,15 @@
package forestry.factory.recipes.jei.carpenter;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import forestry.api.recipes.ICarpenterRecipe;
import forestry.api.recipes.IDescriptiveRecipe;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import forestry.factory.recipes.jei.FactoryJeiPlugin;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.ICraftingGridHelper;
import mezz.jei.api.gui.IDrawable;
@@ -20,9 +18,14 @@ import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.IStackHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
public class CarpenterRecipeCategory extends ForestryRecipeCategory {
public class CarpenterRecipeCategory extends ForestryRecipeCategory<CarpenterRecipeWrapper> {
private static final int boxSlot = 0;
private static final int craftOutputSlot = 1;
@@ -59,7 +62,7 @@ public class CarpenterRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull CarpenterRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
@@ -75,17 +78,27 @@ public class CarpenterRecipeCategory extends ForestryRecipeCategory {
}
guiFluidStacks.init(inputTank, true, 141, 1, 16, 58, 10000, false, tankOverlay);
CarpenterRecipeWrapper wrapper = (CarpenterRecipeWrapper) recipeWrapper;
guiItemStacks.set(boxSlot, wrapper.getRecipe().getBox());
craftingGridHelper.setOutput(guiItemStacks, wrapper.getOutputs());
List<Object> inputs = new ArrayList<>();
Collections.addAll(inputs, wrapper.getRecipe().getCraftingGridRecipe().getIngredients());
craftingGridHelper.setInput(guiItemStacks, inputs, wrapper.getRecipe().getCraftingGridRecipe().getWidth(), wrapper.getRecipe().getCraftingGridRecipe().getHeight());
guiFluidStacks.set(inputTank, wrapper.getFluidInputs());
ICarpenterRecipe recipe = recipeWrapper.getRecipe();
ItemStack box = recipe.getBox();
if (box != null) {
guiItemStacks.set(boxSlot, box);
}
List<ItemStack> outputs = ingredients.getOutputs(ItemStack.class);
craftingGridHelper.setOutput(guiItemStacks, outputs);
IDescriptiveRecipe craftingGridRecipe = recipe.getCraftingGridRecipe();
List<Object> inputs = Arrays.asList(craftingGridRecipe.getIngredients());
IStackHelper stackHelper = FactoryJeiPlugin.jeiHelpers.getStackHelper();
List<List<ItemStack>> craftInputs = stackHelper.expandRecipeItemStackInputs(inputs);
craftingGridHelper.setInputStacks(guiItemStacks, craftInputs, craftingGridRecipe.getWidth(), craftingGridRecipe.getHeight());
List<List<FluidStack>> fluidInputs = ingredients.getInputs(FluidStack.class);
if (!fluidInputs.isEmpty()) {
guiFluidStacks.set(inputTank, fluidInputs.get(0));
}
}
}
@@ -1,16 +1,18 @@
package forestry.factory.recipes.jei.carpenter;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import forestry.api.recipes.ICarpenterRecipe;
import forestry.api.recipes.IDescriptiveRecipe;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import forestry.factory.recipes.jei.FactoryJeiPlugin;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.IStackHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class CarpenterRecipeWrapper extends ForestryRecipeWrapper<ICarpenterRecipe> {
@@ -18,25 +20,26 @@ public class CarpenterRecipeWrapper extends ForestryRecipeWrapper<ICarpenterReci
super(recipe);
}
@Nonnull
@Override
public List getInputs() {
List<Object> inputs = new ArrayList<>();
Collections.addAll(inputs, getRecipe().getCraftingGridRecipe().getIngredients());
inputs.add(getRecipe().getBox());
return inputs;
}
public void getIngredients(@Nonnull IIngredients ingredients) {
ICarpenterRecipe recipe = getRecipe();
IDescriptiveRecipe craftingGridRecipe = recipe.getCraftingGridRecipe();
Object[] inputs = craftingGridRecipe.getIngredients();
IStackHelper stackHelper = FactoryJeiPlugin.jeiHelpers.getStackHelper();
@Nonnull
@Override
public List<FluidStack> getFluidInputs() {
return Collections.singletonList(getRecipe().getFluidResource());
}
List<List<ItemStack>> inputStacks = stackHelper.expandRecipeItemStackInputs(Arrays.asList(inputs));
ItemStack box = recipe.getBox();
if (box != null) {
inputStacks.add(Collections.singletonList(box));
}
ingredients.setInputLists(ItemStack.class, inputStacks);
@Nonnull
@Override
public List<ItemStack> getOutputs() {
return Collections.singletonList(getRecipe().getCraftingGridRecipe().getRecipeOutput());
}
FluidStack fluidResource = recipe.getFluidResource();
if (fluidResource != null) {
ingredients.setInputs(FluidStack.class, Collections.singletonList(fluidResource));
}
ItemStack recipeOutput = craftingGridRecipe.getRecipeOutput();
ingredients.setOutput(ItemStack.class, recipeOutput);
}
}
@@ -2,29 +2,28 @@ package forestry.factory.recipes.jei.centrifuge;
import javax.annotation.Nonnull;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Set;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.recipes.jei.ForestryTooltipCallback;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawableAnimated;
import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
public class CentrifugeRecipeCategory extends ForestryRecipeCategory<CentrifugeRecipeWrapper> {
private static final int[][] OUTPUTS = new int[][]{{0, 0}, {1, 0}, {2, 0}, {0, 1}, {1, 1}, {2, 1}, {0, 2}, {1, 2}, {2, 2}};
@@ -43,7 +42,7 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
private final IDrawableAnimated arrow;
public CentrifugeRecipeCategory(IGuiHelper guiHelper) {
super(guiHelper.createDrawable(guiTexture, 25, 18, 126, 54), "tile.for.centrifuge.name");
super(guiHelper.createDrawable(guiTexture, 11, 18, 154, 54), "tile.for.centrifuge.name");
IDrawableStatic arrowDrawable = guiHelper.createDrawable(guiTexture, 176, 0, 4, 17);
this.arrow = guiHelper.createAnimatedDrawable(arrowDrawable, 80, IDrawableAnimated.StartDirection.BOTTOM, false);
@@ -57,18 +56,21 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
@Override
public void drawAnimations(@Nonnull Minecraft minecraft) {
arrow.draw(minecraft, 33, 18);
arrow.draw(minecraft, 32, 18);
arrow.draw(minecraft, 56, 18);
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull CentrifugeRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
guiItemStacks.init(inputSlot, true, 4, 18);
guiItemStacks.setFromRecipe(inputSlot, recipeWrapper.getInputs());
CentrifugeRecipeWrapper centrifugeWrapper = (CentrifugeRecipeWrapper) recipeWrapper;
List<List<ItemStack>> inputs = ingredients.getInputs(ItemStack.class);
guiItemStacks.set(inputSlot, inputs.get(0));
ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
setResults(tooltip, centrifugeWrapper.getRecipe().getAllProducts(), guiItemStacks);
Map<ItemStack, Float> products = recipeWrapper.getRecipe().getAllProducts();
setResults(tooltip, products, guiItemStacks);
guiItemStacks.addTooltipCallback(tooltip);
}
@@ -86,7 +88,7 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
if (i >= OUTPUTS.length) {
return;
}
int x = 72 + OUTPUTS[i][0] * 18;
int x = 100 + OUTPUTS[i][0] * 18;
int y = OUTPUTS[i][1] * 18;
int slotIndex = outputSlot + i;
guiItemStacks.init(slotIndex, false, x, y);
@@ -1,11 +1,14 @@
package forestry.factory.recipes.jei.centrifuge;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import forestry.api.recipes.ICentrifugeRecipe;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
public class CentrifugeRecipeWrapper extends ForestryRecipeWrapper<ICentrifugeRecipe> {
@@ -13,16 +16,13 @@ public class CentrifugeRecipeWrapper extends ForestryRecipeWrapper<ICentrifugeRe
super(recipe);
}
@Nonnull
@Override
public List getInputs() {
return Collections.singletonList(getRecipe().getInput());
}
public void getIngredients(@Nonnull IIngredients ingredients) {
ICentrifugeRecipe recipe = getRecipe();
@Nonnull
@Override
public List getOutputs() {
return Collections.singletonList(getRecipe().getAllProducts().keySet());
}
ingredients.setInputs(ItemStack.class, Collections.singletonList(recipe.getInput()));
Set<ItemStack> outputs = recipe.getAllProducts().keySet();
ingredients.setOutputs(ItemStack.class, new ArrayList<>(outputs));
}
}
@@ -2,30 +2,28 @@ package forestry.factory.recipes.jei.fabricator;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
import forestry.api.recipes.IFabricatorRecipe;
import forestry.api.recipes.IFabricatorSmeltingRecipe;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import forestry.factory.recipes.FabricatorSmeltingRecipeManager;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.ICraftingGridHelper;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
public class FabricatorRecipeCategory extends ForestryRecipeCategory {
public class FabricatorRecipeCategory extends ForestryRecipeCategory<FabricatorRecipeWrapper> {
private static final int planSlot = 0;
private static final int smeltingInputSlot = 1;
@@ -51,7 +49,7 @@ public class FabricatorRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull FabricatorRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
@@ -69,25 +67,33 @@ public class FabricatorRecipeCategory extends ForestryRecipeCategory {
}
guiFluidStacks.init(inputTank, true, 6, 32, 16, 16, 2000, false, null);
FabricatorRecipeWrapper wrapper = (FabricatorRecipeWrapper) recipeWrapper;
guiItemStacks.set(planSlot, wrapper.getRecipe().getPlan());
IFabricatorRecipe recipe = recipeWrapper.getRecipe();
ItemStack plan = recipe.getPlan();
if (plan != null) {
guiItemStacks.set(planSlot, plan);
}
List<ItemStack> smeltingInput = new ArrayList<>();
for (IFabricatorSmeltingRecipe s : getSmeltingInputs().get(wrapper.getRecipe().getLiquid().getFluid())) {
Fluid recipeFluid = recipe.getLiquid().getFluid();
for (IFabricatorSmeltingRecipe s : getSmeltingInputs().get(recipeFluid)) {
smeltingInput.add(s.getResource());
}
if (!smeltingInput.isEmpty()) {
guiItemStacks.set(smeltingInputSlot, smeltingInput);
}
craftingGridHelper.setOutput(guiItemStacks, wrapper.getOutputs());
List<Object> inputs = new ArrayList<>();
Collections.addAll(inputs, wrapper.getRecipe().getIngredients());
craftingGridHelper.setInput(guiItemStacks, inputs, wrapper.getRecipe().getWidth(), wrapper.getRecipe().getHeight());
guiFluidStacks.set(inputTank, wrapper.getFluidInputs());
List<ItemStack> itemOutputs = ingredients.getOutputs(ItemStack.class);
craftingGridHelper.setOutput(guiItemStacks, itemOutputs);
List<List<ItemStack>> itemStackInputs = ingredients.getInputs(ItemStack.class);
craftingGridHelper.setInputStacks(guiItemStacks, itemStackInputs, recipe.getWidth(), recipe.getHeight());
List<List<FluidStack>> fluidInputs = ingredients.getInputs(FluidStack.class);
if (!fluidInputs.isEmpty()) {
guiFluidStacks.set(inputTank, fluidInputs.get(0));
}
}
private static Map<Fluid, List<IFabricatorSmeltingRecipe>> getSmeltingInputs() {
@@ -1,16 +1,17 @@
package forestry.factory.recipes.jei.fabricator;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import forestry.api.recipes.IFabricatorRecipe;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import forestry.factory.recipes.jei.FactoryJeiPlugin;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.IStackHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class FabricatorRecipeWrapper extends ForestryRecipeWrapper<IFabricatorRecipe> {
@@ -18,25 +19,17 @@ public class FabricatorRecipeWrapper extends ForestryRecipeWrapper<IFabricatorRe
super(recipe);
}
@Nonnull
@Override
public List getInputs() {
List<Object> inputs = new ArrayList<>();
Collections.addAll(inputs, getRecipe().getIngredients());
inputs.add(getRecipe().getPlan());
return inputs;
}
public void getIngredients(@Nonnull IIngredients ingredients) {
IFabricatorRecipe recipe = getRecipe();
IStackHelper stackHelper = FactoryJeiPlugin.jeiHelpers.getStackHelper();
@Nonnull
@Override
public List<FluidStack> getFluidInputs() {
return Collections.singletonList(getRecipe().getLiquid());
}
Object[] itemInputs = recipe.getIngredients();
List<List<ItemStack>> itemStackInputs = stackHelper.expandRecipeItemStackInputs(Arrays.asList(itemInputs));
ingredients.setInputLists(ItemStack.class, itemStackInputs);
@Nonnull
@Override
public List<ItemStack> getOutputs() {
return Collections.singletonList(getRecipe().getRecipeOutput());
}
ingredients.setInputs(FluidStack.class, Collections.singletonList(getRecipe().getLiquid()));
ingredients.setOutput(ItemStack.class, recipe.getRecipeOutput());
}
}
@@ -1,19 +1,10 @@
package forestry.factory.recipes.jei.fermenter;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import forestry.api.fuels.FermenterFuel;
import forestry.api.fuels.FuelManager;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
@@ -21,6 +12,9 @@ import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class FermenterRecipeCategory extends ForestryRecipeCategory<FermenterRecipeWrapper> {
@@ -61,7 +55,7 @@ public class FermenterRecipeCategory extends ForestryRecipeCategory<FermenterRec
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull FermenterRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull FermenterRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
@@ -70,16 +64,9 @@ public class FermenterRecipeCategory extends ForestryRecipeCategory<FermenterRec
guiFluidStacks.init(inputTank, true, 1, 1, 16, 58, 3000, false, tankOverlay);
guiFluidStacks.init(outputTank, false, 91, 1, 16, 58, 3000, false, tankOverlay);
guiItemStacks.set(resourceSlot, recipeWrapper.getFermentable());
List<ItemStack> fuels = new ArrayList<>();
for (FermenterFuel fuel : FuelManager.fermenterFuel.values()) {
fuels.add(fuel.getItem());
}
guiItemStacks.set(fuelSlot, fuels);
guiFluidStacks.set(inputTank, recipeWrapper.getFluidInputs());
guiFluidStacks.set(outputTank, recipeWrapper.getFluidOutputs());
guiItemStacks.set(ingredients);
guiFluidStacks.set(ingredients);
}
}
@@ -2,18 +2,18 @@ package forestry.factory.recipes.jei.fermenter;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import forestry.api.fuels.FermenterFuel;
import forestry.api.fuels.FuelManager;
import forestry.api.recipes.IFermenterRecipe;
import forestry.api.recipes.IVariableFermentable;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class FermenterRecipeWrapper extends ForestryRecipeWrapper<IFermenterRecipe> {
@@ -25,39 +25,32 @@ public class FermenterRecipeWrapper extends ForestryRecipeWrapper<IFermenterReci
this.fermentable = fermentable;
}
@Nonnull
@Override
public List getInputs() {
List<ItemStack> inputs = new ArrayList<>();
public void getIngredients(@Nonnull IIngredients ingredients) {
List<ItemStack> fuelInputs = new ArrayList<>();
for (FermenterFuel fuel : FuelManager.fermenterFuel.values()) {
inputs.add(fuel.getItem());
fuelInputs.add(fuel.getItem());
}
inputs.add(fermentable);
return inputs;
ingredients.setInputLists(ItemStack.class, Arrays.asList(
Collections.singletonList(fermentable),
fuelInputs
));
FluidStack fluidInput = getRecipe().getFluidResource().copy();
fluidInput.amount = getRecipe().getFermentationValue();
ingredients.setInput(FluidStack.class, fluidInput);
int amount = Math.round(getRecipe().getFermentationValue() * getRecipe().getModifier());
if (fermentable.getItem() instanceof IVariableFermentable) {
amount *= ((IVariableFermentable) fermentable.getItem()).getFermentationModifier(fermentable);
}
FluidStack fluidOutput = new FluidStack(getRecipe().getOutput(), amount);
ingredients.setOutput(FluidStack.class, fluidOutput);
}
@Nonnull
public ItemStack getFermentable() {
return fermentable;
}
@Nonnull
@Override
public List<FluidStack> getFluidInputs() {
FluidStack input = getRecipe().getFluidResource().copy();
input.amount = getRecipe().getFermentationValue();
return Collections.singletonList(input);
}
@Nonnull
@Override
public List<FluidStack> getFluidOutputs() {
int amount = Math.round(getRecipe().getFermentationValue() * getRecipe().getModifier());
if (fermentable.getItem() instanceof IVariableFermentable) {
amount *= ((IVariableFermentable) fermentable.getItem()).getFermentationModifier(fermentable);
}
FluidStack output = new FluidStack(getRecipe().getOutput(), amount);
return Collections.singletonList(output);
}
}
@@ -2,15 +2,9 @@ package forestry.factory.recipes.jei.moistener;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidRegistry;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
@@ -18,9 +12,11 @@ import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class MoistenerRecipeCategory extends ForestryRecipeCategory {
public class MoistenerRecipeCategory extends ForestryRecipeCategory<MoistenerRecipeWrapper> {
private static final int resourceSlot = 0;
private static final int productSlot = 1;
@@ -60,7 +56,7 @@ public class MoistenerRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull MoistenerRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
@@ -71,16 +67,9 @@ public class MoistenerRecipeCategory extends ForestryRecipeCategory {
guiItemStacks.init(fuelProductSlot, false, 89, 21);
guiFluidStacks.init(inputTank, true, 1, 1, 16, 58, 10000, false, tankOverlay);
MoistenerRecipeWrapper wrapper = (MoistenerRecipeWrapper) recipeWrapper;
guiItemStacks.set(resourceSlot, wrapper.getRecipe().getResource());
guiItemStacks.set(fuelItemSlot, wrapper.getFuel().getItem());
guiItemStacks.set(productSlot, wrapper.getRecipe().getProduct());
guiItemStacks.set(fuelProductSlot, wrapper.getFuel().getProduct());
guiFluidStacks.set(inputTank, FluidRegistry.getFluidStack("water", 10000));
guiItemStacks.set(ingredients);
guiFluidStacks.set(ingredients);
}
}
@@ -4,11 +4,13 @@ import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.item.ItemStack;
import forestry.api.fuels.MoistenerFuel;
import forestry.api.recipes.IMoistenerRecipe;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
public class MoistenerRecipeWrapper extends ForestryRecipeWrapper<IMoistenerRecipe> {
@@ -20,26 +22,27 @@ public class MoistenerRecipeWrapper extends ForestryRecipeWrapper<IMoistenerReci
this.fuel = fuel;
}
@Nonnull
@Override
public List<ItemStack> getInputs() {
List<ItemStack> inputs = new ArrayList<>();
inputs.add(getRecipe().getResource());
if (fuel.getItem() != null) {
inputs.add(fuel.getItem());
}
return inputs;
}
public void getIngredients(@Nonnull IIngredients ingredients) {
IMoistenerRecipe recipe = getRecipe();
@Nonnull
@Override
public List<ItemStack> getOutputs() {
List<ItemStack> outputs = new ArrayList<>();
outputs.add(getRecipe().getProduct());
if (fuel.getProduct() != null) {
outputs.add(fuel.getProduct());
List<ItemStack> itemStackInputs = new ArrayList<>();
itemStackInputs.add(recipe.getResource());
ItemStack fuelItem = fuel.getItem();
if (fuelItem != null) {
itemStackInputs.add(fuelItem);
}
return outputs;
ingredients.setInputs(ItemStack.class, itemStackInputs);
List<ItemStack> itemStackOutputs = new ArrayList<>();
itemStackOutputs.add(recipe.getProduct());
ItemStack fuelProduct = fuel.getProduct();
if (fuelProduct != null) {
itemStackOutputs.add(fuelProduct);
}
ingredients.setOutputs(ItemStack.class, itemStackOutputs);
ingredients.setInput(FluidStack.class, new FluidStack(FluidRegistry.WATER, recipe.getTimePerItem() / 4));
}
@Nonnull
@@ -1,21 +1,17 @@
package forestry.factory.recipes.jei.rainmaker;
import javax.annotation.Nonnull;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
public class RainmakerRecipeCategory extends ForestryRecipeCategory {
public class RainmakerRecipeCategory extends ForestryRecipeCategory<RainmakerRecipeWrapper> {
private static final int SLOT_INPUT_INDEX = 0;
private final IDrawable slot;
@@ -37,13 +33,9 @@ public class RainmakerRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull RainmakerRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
guiItemStacks.init(SLOT_INPUT_INDEX, true, 0, 0);
if (recipeWrapper instanceof RainmakerRecipeWrapper) {
RainmakerRecipeWrapper rainmakerRecipeWrapper = (RainmakerRecipeWrapper) recipeWrapper;
List<ItemStack> input = rainmakerRecipeWrapper.getInputs().get(SLOT_INPUT_INDEX);
guiItemStacks.set(SLOT_INPUT_INDEX, input);
}
guiItemStacks.set(ingredients);
}
}
@@ -34,6 +34,6 @@ public class RainmakerRecipeHandler implements IRecipeHandler<RainmakerRecipeWra
@Override
public boolean isRecipeValid(@Nonnull RainmakerRecipeWrapper wrapper) {
return !wrapper.getInputs().isEmpty();
return true;
}
}
@@ -3,15 +3,13 @@ package forestry.factory.recipes.jei.rainmaker;
import javax.annotation.Nonnull;
import java.awt.Color;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import forestry.api.fuels.RainSubstrate;
import forestry.core.utils.Translator;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.BlankRecipeWrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
public class RainmakerRecipeWrapper extends BlankRecipeWrapper {
@Nonnull
@@ -21,10 +19,9 @@ public class RainmakerRecipeWrapper extends BlankRecipeWrapper {
this.substrate = substrate;
}
@Nonnull
@Override
public List<List<ItemStack>> getInputs() {
return Collections.singletonList(Collections.singletonList(substrate.getItem()));
public void getIngredients(@Nonnull IIngredients ingredients) {
ingredients.setInputs(ItemStack.class, Collections.singletonList(substrate.getItem()));
}
@Override
@@ -1,11 +1,6 @@
package forestry.factory.recipes.jei.squeezer;
import javax.annotation.Nonnull;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
@@ -14,18 +9,6 @@ public abstract class AbstractSqueezerRecipeWrapper<R> extends ForestryRecipeWra
super(recipe);
}
@Nonnull
@Override
public abstract List<ItemStack> getInputs();
@Nonnull
@Override
public abstract List<FluidStack> getFluidOutputs();
@Nonnull
@Override
public abstract List<ItemStack> getOutputs();
/**
* @return Chance remnants will be produced by a single recipe cycle, from 0 to 1.
*/
@@ -2,14 +2,12 @@ package forestry.factory.recipes.jei.squeezer;
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import forestry.factory.recipes.ISqueezerContainerRecipe;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
public class SqueezerContainerRecipeWrapper extends AbstractSqueezerRecipeWrapper<ISqueezerContainerRecipe> {
@@ -21,22 +19,19 @@ public class SqueezerContainerRecipeWrapper extends AbstractSqueezerRecipeWrappe
this.filledContainer = filledContainer;
}
@Nonnull
@Override
public List<ItemStack> getInputs() {
return Collections.singletonList(filledContainer);
}
public void getIngredients(@Nonnull IIngredients ingredients) {
ingredients.setInputs(ItemStack.class, Collections.singletonList(filledContainer));
@Nonnull
@Override
public List<FluidStack> getFluidOutputs() {
return Collections.singletonList(FluidContainerRegistry.getFluidForFilledItem(filledContainer));
}
ItemStack remnants = getRecipe().getRemnants();
if (remnants != null) {
ingredients.setOutput(ItemStack.class, remnants);
}
@Nonnull
@Override
public List<ItemStack> getOutputs() {
return Collections.singletonList(getRecipe().getRemnants());
FluidStack fluidContained = FluidUtil.getFluidContained(filledContainer);
if (fluidContained != null) {
ingredients.setOutput(FluidStack.class, fluidContained);
}
}
@Override
@@ -1,17 +1,11 @@
package forestry.factory.recipes.jei.squeezer;
import javax.annotation.Nonnull;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.recipes.jei.ForestryTooltipCallback;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
@@ -19,9 +13,11 @@ import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class SqueezerRecipeCategory extends ForestryRecipeCategory {
public class SqueezerRecipeCategory extends ForestryRecipeCategory<AbstractSqueezerRecipeWrapper> {
private static final int[][] INPUTS = new int[][]{{0, 0}, {1, 0}, {2, 0}, {0, 1}, {1, 1}, {2, 1}, {0, 2}, {1, 2}, {2, 2}};
@@ -56,33 +52,22 @@ public class SqueezerRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull AbstractSqueezerRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
AbstractSqueezerRecipeWrapper<?> wrapper = (AbstractSqueezerRecipeWrapper) recipeWrapper;
float chance = wrapper.getRemnantsChance();
guiFluidStacks.init(outputTank, false, 113, 2, 16, 58, 10000, false, tankOverlay);
guiFluidStacks.set(outputTank, wrapper.getFluidOutputs());
guiItemStacks.init(craftOutputSlot, false, 87, 43);
guiItemStacks.set(craftOutputSlot, wrapper.getOutputs());
ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
tooltip.addChanceTooltip(craftOutputSlot, chance);
setIngredients(guiItemStacks, wrapper.getInputs());
guiItemStacks.addTooltipCallback(tooltip);
}
private static void setIngredients(@Nonnull IGuiItemStackGroup guiItemStacks, @Nonnull List<ItemStack> inputs) {
int i = 0;
for (ItemStack stack : inputs) {
for (int i = 0; i < INPUTS.length; i++) {
guiItemStacks.init(craftInputSlot + i, true, 7 + INPUTS[i][0] * 18, 4 + INPUTS[i][1] * 18);
guiItemStacks.set(craftInputSlot + i, stack);
i++;
}
}
guiItemStacks.init(craftOutputSlot, false, 87, 43);
guiFluidStacks.init(outputTank, false, 113, 2, 16, 58, 10000, false, tankOverlay);
ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
float chance = recipeWrapper.getRemnantsChance();
tooltip.addChanceTooltip(craftOutputSlot, chance);
guiItemStacks.addTooltipCallback(tooltip);
guiItemStacks.set(ingredients);
guiFluidStacks.set(ingredients);
}
}
@@ -7,7 +7,7 @@ import forestry.core.recipes.jei.ForestryRecipeWrapper;
import mezz.jei.api.recipe.IRecipeHandler;
import mezz.jei.api.recipe.IRecipeWrapper;
public class SqueezerRecipeHandler<R extends ForestryRecipeWrapper> implements IRecipeHandler<R> {
public class SqueezerRecipeHandler<R extends AbstractSqueezerRecipeWrapper> implements IRecipeHandler<R> {
@Nonnull
private final Class<R> recipeClass;
@@ -42,12 +42,6 @@ public class SqueezerRecipeHandler<R extends ForestryRecipeWrapper> implements I
@Override
public boolean isRecipeValid(@Nonnull R wrapper) {
if (wrapper.getFluidOutputs() == null || wrapper.getFluidOutputs().isEmpty()) {
return false;
}
if (wrapper.getInputs() == null || wrapper.getInputs().isEmpty()) {
return false;
}
return true;
}
@@ -1,41 +1,30 @@
package forestry.factory.recipes.jei.squeezer;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import java.util.Arrays;
import forestry.api.recipes.ISqueezerRecipe;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class SqueezerRecipeWrapper extends AbstractSqueezerRecipeWrapper<ISqueezerRecipe> {
public SqueezerRecipeWrapper(@Nonnull ISqueezerRecipe recipe) {
super(recipe);
}
@Nonnull
@Override
public List<ItemStack> getInputs() {
List<ItemStack> inputs = new ArrayList<>();
Collections.addAll(inputs, getRecipe().getResources());
return inputs;
}
@Nonnull
@Override
public List<FluidStack> getFluidOutputs() {
return Collections.singletonList(getRecipe().getFluidOutput());
}
@Nonnull
@Override
public List<ItemStack> getOutputs() {
public void getIngredients(@Nonnull IIngredients ingredients) {
ItemStack[] resources = getRecipe().getResources();
ingredients.setInputs(ItemStack.class, Arrays.asList(resources));
ItemStack remnants = getRecipe().getRemnants();
return remnants == null ? Collections.emptyList() : Collections.singletonList(remnants);
if (remnants != null) {
ingredients.setOutput(ItemStack.class, remnants);
}
ingredients.setOutput(FluidStack.class, getRecipe().getFluidOutput());
}
@Override
@@ -2,20 +2,19 @@ package forestry.factory.recipes.jei.still;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import forestry.core.recipes.jei.ForestryRecipeCategory;
import forestry.core.recipes.jei.ForestryRecipeCategoryUid;
import forestry.core.render.ForestryResource;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.IRecipeWrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class StillRecipeCategory extends ForestryRecipeCategory {
@@ -49,14 +48,13 @@ public class StillRecipeCategory extends ForestryRecipeCategory {
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper) {
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) {
IGuiFluidStackGroup guiFluidStacks = recipeLayout.getFluidStacks();
guiFluidStacks.init(inputTank, true, 1, 1, 16, 58, 10000, false, tankOverlay);
guiFluidStacks.init(outputTank, false, 91, 1, 16, 58, 10000, false, tankOverlay);
guiFluidStacks.set(inputTank, recipeWrapper.getFluidInputs());
guiFluidStacks.set(outputTank, recipeWrapper.getFluidOutputs());
guiFluidStacks.set(ingredients);
}
}
@@ -2,12 +2,11 @@ package forestry.factory.recipes.jei.still;
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.List;
import net.minecraftforge.fluids.FluidStack;
import forestry.api.recipes.IStillRecipe;
import forestry.core.recipes.jei.ForestryRecipeWrapper;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraftforge.fluids.FluidStack;
public class StillRecipeWrapper extends ForestryRecipeWrapper<IStillRecipe> {
@@ -15,16 +14,9 @@ public class StillRecipeWrapper extends ForestryRecipeWrapper<IStillRecipe> {
super(recipe);
}
@Nonnull
@Override
public List<FluidStack> getFluidInputs() {
return Collections.singletonList(getRecipe().getInput());
public void getIngredients(@Nonnull IIngredients ingredients) {
ingredients.setInputs(FluidStack.class, Collections.singletonList(getRecipe().getInput()));
ingredients.setOutput(FluidStack.class, getRecipe().getOutput());
}
@Nonnull
@Override
public List<FluidStack> getFluidOutputs() {
return Collections.singletonList(getRecipe().getOutput());
}
}
@@ -55,7 +55,7 @@ public class TileCarpenter extends TilePowered implements ISidedInventory, ILiqu
private final FilteredTank resourceTank;
private final TankManager tankManager;
private final InventoryAdapterTile craftingInventory;
private final InventoryAdapterTile craftingInventory;
private final InventoryCraftResult craftPreviewInventory;
@Nullable
@@ -16,11 +16,12 @@ import java.util.Collection;
import java.util.Stack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.inventory.InventoryCraftResult;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import forestry.api.circuits.ChipsetManager;
import forestry.api.circuits.CircuitSocketType;
import forestry.api.circuits.ICircuitBoard;
@@ -34,6 +35,7 @@ import forestry.core.inventory.IInventoryAdapter;
import forestry.core.inventory.InventoryAdapter;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.tiles.IItemStackDisplay;
import forestry.core.tiles.TilePowered;
import forestry.core.utils.InventoryUtil;
import forestry.factory.gui.ContainerCentrifuge;
@@ -41,12 +43,13 @@ import forestry.factory.gui.GuiCentrifuge;
import forestry.factory.inventory.InventoryCentrifuge;
import forestry.factory.recipes.CentrifugeRecipeManager;
public class TileCentrifuge extends TilePowered implements ISocketable, ISidedInventory {
public class TileCentrifuge extends TilePowered implements ISocketable, ISidedInventory, IItemStackDisplay {
private static final int TICKS_PER_RECIPE_TIME = 1;
private static final int ENERGY_PER_WORK_CYCLE = 3200;
private static final int ENERGY_PER_RECIPE_TIME = ENERGY_PER_WORK_CYCLE / 20;
private final InventoryAdapter sockets = new InventoryAdapter(1, "sockets");
private final InventoryCraftResult craftPreviewInventory;
private ICentrifugeRecipe currentRecipe;
@@ -55,6 +58,7 @@ public class TileCentrifuge extends TilePowered implements ISocketable, ISidedIn
public TileCentrifuge() {
super("centrifuge", 800, Constants.MACHINE_MAX_ENERGY);
setInternalInventory(new InventoryCentrifuge(this));
craftPreviewInventory = new InventoryCraftResult();
}
/* LOADING & SAVING */
@@ -113,13 +117,13 @@ public class TileCentrifuge extends TilePowered implements ISocketable, ISidedIn
@Override
public boolean workCycle() {
// If we add pending products, we skip to the next work cycle.
if (tryAddPending()) {
setCurrentPreviewItem();
return true;
}
if (!pendingProducts.isEmpty()) {
setCurrentPreviewItem();
return false;
}
@@ -132,8 +136,8 @@ public class TileCentrifuge extends TilePowered implements ISocketable, ISidedIn
pendingProducts.addAll(products);
getInternalInventory().decrStackSize(InventoryCentrifuge.SLOT_RESOURCE, 1);
tryAddPending();
setCurrentPreviewItem();
return true;
}
@@ -257,4 +261,21 @@ public class TileCentrifuge extends TilePowered implements ISocketable, ISidedIn
public Object getContainer(EntityPlayer player, int data) {
return new ContainerCentrifuge(player.inventory, this);
}
public IInventory getCraftPreviewInventory() {
return craftPreviewInventory;
}
private void setCurrentPreviewItem(){
if(!pendingProducts.isEmpty()){
craftPreviewInventory.setInventorySlotContents(0, pendingProducts.peek());
}else{
craftPreviewInventory.setInventorySlotContents(0, null);
}
}
@Override
public void handleItemStackForDisplay(ItemStack itemStack) {
craftPreviewInventory.setInventorySlotContents(0, itemStack);
}
}
@@ -31,6 +31,7 @@ import forestry.factory.recipes.MemorizedRecipe;
import forestry.factory.recipes.RecipeMemory;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.nbt.NBTTagCompound;
@@ -118,39 +119,47 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
}
private boolean canCraftCurrentRecipe() {
if (currentRecipe == null) {
return false;
}
ItemStack[] recipeItems = InventoryUtil.getStacks(currentRecipe.getCraftMatrix());
ItemStack[] inventory = InventoryUtil.getStacks(this);
InventoryCraftingForestry crafting = RecipeUtil.getCraftRecipe(recipeItems, inventory, worldObj, currentRecipe.getRecipeOutput());
return crafting != null;
return craftRecipe(true);
}
@Override
public boolean onCraftingStart(EntityPlayer player) {
return craftRecipe(false);
}
private boolean craftRecipe(boolean simulate) {
if (currentRecipe == null) {
return false;
}
ItemStack[] recipeItems = InventoryUtil.getStacks(currentRecipe.getCraftMatrix());
ItemStack[] inventory = InventoryUtil.getStacks(this);
InventoryCraftingForestry crafting = RecipeUtil.getCraftRecipe(recipeItems, inventory, worldObj, currentRecipe.getRecipeOutput());
ItemStack[] inventoryStacks = InventoryUtil.getStacks(this);
InventoryCraftingForestry crafting = RecipeUtil.getCraftRecipe(recipeItems, inventoryStacks, worldObj, currentRecipe.getRecipeOutput());
if (crafting == null) {
return false;
}
recipeItems = InventoryUtil.getStacks(crafting);
IInventory inventory;
if (simulate) {
inventory = new InventoryBasic("copy", false, this.getSizeInventory());
InventoryUtil.deepCopyInventoryContents(this, inventory);
} else {
inventory = this;
}
// craft recipe should exactly match ingredients here, so no oreDict or tool matching
ItemStack[] removed = InventoryUtil.removeSets(this, 1, recipeItems, player, false, false, false);
ItemStack[] removed = InventoryUtil.removeSets(inventory, 1, recipeItems, null, false, false, false);
if (removed == null) {
return false;
}
// update crafting display to match the ingredients that were actually used
setCraftingDisplay(crafting);
if (!simulate) {
// update crafting display to match the ingredients that were actually used
setCraftingDisplay(crafting);
}
return true;
}
@@ -10,18 +10,21 @@
******************************************************************************/
package forestry.farming.tiles;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper;
import javax.annotation.Nonnull;
import forestry.api.multiblock.IFarmComponent;
import forestry.core.inventory.AdjacentInventoryCache;
import forestry.core.tiles.AdjacentTileCache;
import forestry.core.utils.InventoryUtil;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper;
import net.minecraftforge.items.wrapper.SidedInvWrapper;
// TODO: Buildcraft for 1.9
//@Optional.Interface(iface = "buildcraft.api.statements.ITriggerProvider", modid = "BuildCraftAPI|statements")
@@ -64,6 +67,20 @@ public class TileFarmHatch extends TileFarm implements ISidedInventory, IFarmCom
}
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nonnull EnumFacing facing) {
return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(@Nonnull Capability<T> capability, @Nonnull EnumFacing facing) {
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
SidedInvWrapper sidedInvWrapper = new SidedInvWrapper(this, facing);
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(sidedInvWrapper);
}
return super.getCapability(capability, facing);
}
// TODO: Buildcraft for 1.9
// @Optional.Method(modid = "BuildCraftAPI|statements")
// @Override
Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 3.6 KiB