From 86efa8b1a3223e79d68055ee8817d57505cd600d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 4 May 2016 16:44:32 -0400 Subject: [PATCH] Updated the Alchemy Table recipe system so that it can provide better custom recipes --- changelog.txt | 2 + .../api/recipe/AlchemyTableRecipe.java | 42 ++++++- .../item/armour/ItemLivingArmour.java | 3 +- .../item/routing/IItemFilterProvider.java | 10 +- .../item/routing/ItemRouterFilter.java | 43 ++++--- .../bloodmagic/routing/DefaultItemFilter.java | 68 ++++------ .../bloodmagic/routing/IItemFilter.java | 10 +- .../bloodmagic/routing/TestItemFilter.java | 119 +++++------------- .../bloodmagic/tile/TileAlchemyTable.java | 48 ++++--- .../tile/routing/TileInputRoutingNode.java | 26 ++-- .../tile/routing/TileOutputRoutingNode.java | 27 ++-- .../java/WayofTime/bloodmagic/util/Utils.java | 32 +++-- 12 files changed, 212 insertions(+), 218 deletions(-) diff --git a/changelog.txt b/changelog.txt index 223fab02..6b613fbc 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,8 @@ Version 2.0.0-36 ------------------------------------------------------ - Added JEI compat for the Alchemy Table +- Changed the Item Routing system so that it used capabilities instead +- Updated the Alchemy Table recipe system so that it can provide better custom recipes. ------------------------------------------------------ Version 2.0.0-35 diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java index 4d642317..74415832 100644 --- a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -1,5 +1,9 @@ package WayofTime.bloodmagic.api.recipe; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -8,10 +12,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - public class AlchemyTableRecipe { protected ItemStack output = null; @@ -144,4 +144,38 @@ public class AlchemyTableRecipe { return this.input; } + + public ItemStack[] getRemainingItems(ItemStack[] inventory) + { + ItemStack[] ret = inventory.clone(); + for (int i = 0; i < ret.length; i++) + { + ret[i] = getContainerItem(inventory[i]); + } + + return ret; + } + + protected ItemStack getContainerItem(ItemStack stack) + { + if (stack == null) + { + return null; + } + + ItemStack copyStack = stack.copy(); + + if (copyStack.getItem().hasContainerItem(stack)) + { + return copyStack.getItem().getContainerItem(copyStack); + } + + copyStack.stackSize--; + if (copyStack.stackSize <= 0) + { + return null; + } + + return copyStack; + } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 5fd58b25..6add9151 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -450,7 +450,8 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag); } - public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack) + //TODO: Add the ability to have the armour give an upgrade with a higher level + public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack) { if (!armourMap.containsKey(stack)) { diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java index ec84ed57..57e1c19e 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.item.routing; -import WayofTime.bloodmagic.routing.IItemFilter; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.routing.IItemFilter; public interface IItemFilterProvider { - IItemFilter getInputItemFilter(ItemStack stack, IInventory inventory, EnumFacing syphonDirection); + IItemFilter getInputItemFilter(ItemStack stack, TileEntity tile, IItemHandler handler); - IItemFilter getOutputItemFilter(ItemStack stack, IInventory inventory, EnumFacing syphonDirection); + IItemFilter getOutputItemFilter(ItemStack stack, TileEntity tile, IItemHandler handler); } diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java index 9a470ec4..3ff83caa 100644 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java @@ -1,25 +1,32 @@ package WayofTime.bloodmagic.item.routing; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.IItemHandler; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.routing.*; +import WayofTime.bloodmagic.routing.DefaultItemFilter; +import WayofTime.bloodmagic.routing.IItemFilter; +import WayofTime.bloodmagic.routing.IgnoreNBTItemFilter; +import WayofTime.bloodmagic.routing.ModIdItemFilter; +import WayofTime.bloodmagic.routing.OreDictItemFilter; +import WayofTime.bloodmagic.routing.TestItemFilter; import WayofTime.bloodmagic.util.GhostItemHelper; import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; public class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider { @@ -58,7 +65,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari } @Override - public IItemFilter getInputItemFilter(ItemStack filterStack, IInventory inventory, EnumFacing syphonDirection) + public IItemFilter getInputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { IItemFilter testFilter = new TestItemFilter(); @@ -96,12 +103,12 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari filteredList.add(ghostStack); } - testFilter.initializeFilter(filteredList, inventory, syphonDirection, false); + testFilter.initializeFilter(filteredList, tile, handler, false); return testFilter; } @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, IInventory inventory, EnumFacing syphonDirection) + public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { IItemFilter testFilter = new TestItemFilter(); @@ -143,7 +150,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari filteredList.add(ghostStack); } - testFilter.initializeFilter(filteredList, inventory, syphonDirection, true); + testFilter.initializeFilter(filteredList, tile, handler, true); return testFilter; } diff --git a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java index 7ade0d12..5e220868 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java @@ -1,15 +1,13 @@ package WayofTime.bloodmagic.routing; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; +import java.util.List; + import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - -import java.util.List; +import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.util.Utils; /** * This particular implementation of IItemFilter allows any item to be drained @@ -21,8 +19,8 @@ import java.util.List; */ public class DefaultItemFilter implements IItemFilter { - private IInventory accessedInventory; - private EnumFacing accessedSide; + protected TileEntity accessedTile; + protected IItemHandler itemHandler; /** * Initializes the filter so that it knows what it wants to fulfill. @@ -41,10 +39,10 @@ public class DefaultItemFilter implements IItemFilter * initialized as an input filter. */ @Override - public void initializeFilter(List filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput) + public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { - accessedInventory = inventory; - accessedSide = side; + this.accessedTile = tile; + this.itemHandler = itemHandler; } /** @@ -70,15 +68,14 @@ public class DefaultItemFilter implements IItemFilter ItemStack testStack = inputStack.copy(); testStack.stackSize = allowedAmount; - ItemStack remainderStack = Utils.insertStackIntoInventory(testStack, accessedInventory, accessedSide); + ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); testStack = inputStack.copy(); testStack.stackSize -= changeAmount; - TileEntity tile = (TileEntity) accessedInventory; - World world = tile.getWorld(); - BlockPos pos = tile.getPos(); + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); return testStack; @@ -91,36 +88,15 @@ public class DefaultItemFilter implements IItemFilter @Override public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) { - boolean[] canAccessSlot = new boolean[accessedInventory.getSizeInventory()]; - if (accessedInventory instanceof ISidedInventory) + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - int[] slots = ((ISidedInventory) accessedInventory).getSlotsForFace(accessedSide); - for (int slot : slots) - { - canAccessSlot[slot] = true; - } - } else - { - for (int slot = 0; slot < accessedInventory.getSizeInventory(); slot++) - { - canAccessSlot[slot] = true; - } - } - - for (int slot = 0; slot < accessedInventory.getSizeInventory(); slot++) - { - if (!canAccessSlot[slot]) + ItemStack inputStack = itemHandler.getStackInSlot(slot); + if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) { continue; } - ItemStack inputStack = accessedInventory.getStackInSlot(slot); - if (inputStack == null || (accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) - { - continue; - } - - int allowedAmount = Math.min(inputStack.stackSize, maxTransfer); + int allowedAmount = Math.min(itemHandler.extractItem(slot, inputStack.stackSize, true).stackSize, maxTransfer); ItemStack testStack = inputStack.copy(); testStack.stackSize = allowedAmount; @@ -133,15 +109,13 @@ public class DefaultItemFilter implements IItemFilter continue; } - TileEntity tile = (TileEntity) accessedInventory; - World world = tile.getWorld(); - BlockPos pos = tile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - inputStack.stackSize -= changeAmount; maxTransfer -= changeAmount; - accessedInventory.setInventorySlotContents(slot, inputStack.stackSize <= 0 ? null : inputStack); //Sets the slot in the inventory + itemHandler.extractItem(slot, changeAmount, false); + + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); return changeAmount; } diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java index 94ab0c2b..872057ab 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java @@ -1,14 +1,14 @@ package WayofTime.bloodmagic.routing; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; - import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.items.IItemHandler; + public interface IItemFilter { - void initializeFilter(List filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput); + void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput); /** * This method is only called when the output inventory this filter is diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java index b750a9f4..f0905745 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java @@ -1,14 +1,15 @@ package WayofTime.bloodmagic.routing; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; - import java.util.Iterator; import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.items.IItemHandler; +import WayofTime.bloodmagic.util.Utils; + /** * This particular implementation of IItemFilter checks to make sure that a) as * an output filter it will fill until the requested amount and b) as an input @@ -26,17 +27,19 @@ public class TestItemFilter implements IItemFilter * filter, it keeps track of how many can be removed. */ protected List requestList; - protected IInventory accessedInventory; - protected EnumFacing accessedSide; + protected TileEntity accessedTile; + protected IItemHandler itemHandler; /** * Initializes the filter so that it knows what it wants to fulfill. * * @param filteredList * - The list of ItemStacks that the filter is set to. - * @param inventory + * @param tile * - The inventory that is being accessed. This inventory is either * being pulled from or pushed to. + * @param itemHandler + * - The item handler * @param side * - The side that the inventory is being accessed from. Used for * pulling/pushing from/to the inventory. @@ -46,37 +49,17 @@ public class TestItemFilter implements IItemFilter * initialized as an input filter. */ @Override - public void initializeFilter(List filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput) + public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { - this.accessedInventory = inventory; - this.accessedSide = side; + this.accessedTile = tile; + this.itemHandler = itemHandler; if (isFilterOutput) { requestList = filteredList; - boolean[] canAccessSlot = new boolean[inventory.getSizeInventory()]; - if (inventory instanceof ISidedInventory) - { - int[] slots = ((ISidedInventory) inventory).getSlotsForFace(side); - for (int slot : slots) - { - canAccessSlot[slot] = true; - } - } else - { - for (int slot = 0; slot < inventory.getSizeInventory(); slot++) - { - canAccessSlot[slot] = true; - } - } - for (int slot = 0; slot < inventory.getSizeInventory(); slot++) + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - if (!canAccessSlot[slot]) - { - continue; - } - - ItemStack checkedStack = inventory.getStackInSlot(slot); + ItemStack checkedStack = itemHandler.getStackInSlot(slot); if (checkedStack == null) { continue; @@ -105,30 +88,9 @@ public class TestItemFilter implements IItemFilter filterStack.stackSize *= -1; //Invert the stack size so that } - boolean[] canAccessSlot = new boolean[inventory.getSizeInventory()]; - if (inventory instanceof ISidedInventory) + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - int[] slots = ((ISidedInventory) inventory).getSlotsForFace(side); - for (int slot : slots) - { - canAccessSlot[slot] = true; - } - } else - { - for (int slot = 0; slot < inventory.getSizeInventory(); slot++) - { - canAccessSlot[slot] = true; - } - } - - for (int slot = 0; slot < inventory.getSizeInventory(); slot++) - { - if (!canAccessSlot[slot]) - { - continue; - } - - ItemStack checkedStack = inventory.getStackInSlot(slot); + ItemStack checkedStack = itemHandler.getStackInSlot(slot); if (checkedStack == null) { continue; @@ -144,7 +106,6 @@ public class TestItemFilter implements IItemFilter } } } - } Iterator iterator = requestList.iterator(); @@ -188,7 +149,7 @@ public class TestItemFilter implements IItemFilter ItemStack testStack = inputStack.copy(); testStack.stackSize = allowedAmount; - ItemStack remainderStack = Utils.insertStackIntoInventory(testStack, accessedInventory, accessedSide); + ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); testStack = inputStack.copy(); @@ -208,6 +169,10 @@ public class TestItemFilter implements IItemFilter } } + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + return testStack; } @@ -218,31 +183,10 @@ public class TestItemFilter implements IItemFilter @Override public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) { - boolean[] canAccessSlot = new boolean[accessedInventory.getSizeInventory()]; - if (accessedInventory instanceof ISidedInventory) + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - int[] slots = ((ISidedInventory) accessedInventory).getSlotsForFace(accessedSide); - for (int slot : slots) - { - canAccessSlot[slot] = true; - } - } else - { - for (int slot = 0; slot < accessedInventory.getSizeInventory(); slot++) - { - canAccessSlot[slot] = true; - } - } - - for (int slot = 0; slot < accessedInventory.getSizeInventory(); slot++) - { - if (!canAccessSlot[slot]) - { - continue; - } - - ItemStack inputStack = accessedInventory.getStackInSlot(slot); - if (inputStack == null || (accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) + ItemStack inputStack = itemHandler.getStackInSlot(slot); + if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) { continue; } @@ -252,7 +196,7 @@ public class TestItemFilter implements IItemFilter { if (doStacksMatch(filterStack, inputStack)) { - allowedAmount = Math.min(maxTransfer, Math.min(filterStack.stackSize, inputStack.stackSize)); + allowedAmount = Math.min(maxTransfer, Math.min(filterStack.stackSize, itemHandler.extractItem(slot, inputStack.stackSize, true).stackSize)); break; } } @@ -273,10 +217,9 @@ public class TestItemFilter implements IItemFilter continue; } - inputStack.stackSize -= changeAmount; maxTransfer -= changeAmount; - accessedInventory.setInventorySlotContents(slot, inputStack.stackSize <= 0 ? null : inputStack); //Sets the slot in the inventory + itemHandler.extractItem(slot, changeAmount, false); Iterator itr = requestList.iterator(); while (itr.hasNext()) @@ -292,6 +235,10 @@ public class TestItemFilter implements IItemFilter } } + World world = accessedTile.getWorld(); + BlockPos pos = accessedTile.getPos(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + return changeAmount; } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java index 969f6251..4b7a11bc 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java @@ -379,7 +379,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, currentOutputStack.stackSize += outputStack.stackSize; } - consumeInventory(); + consumeInventory(recipe); } } @@ -401,26 +401,38 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, return 0; } - public void consumeInventory() + public void consumeInventory(AlchemyTableRecipe recipe) { + ItemStack[] input = new ItemStack[6]; + for (int i = 0; i < 6; i++) { - ItemStack inputStack = getStackInSlot(i); - if (inputStack != null) - { - if (inputStack.getItem().hasContainerItem(inputStack)) - { - setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); - continue; - } - - inputStack.stackSize--; - if (inputStack.stackSize <= 0) - { - setInventorySlotContents(i, null); - continue; - } - } + input[i] = getStackInSlot(i); } + + ItemStack[] result = recipe.getRemainingItems(input); + for (int i = 0; i < 6; i++) + { + setInventorySlotContents(i, result[i]); + } +// for (int i = 0; i < 6; i++) +// { +// ItemStack inputStack = getStackInSlot(i); +// if (inputStack != null) +// { +// if (inputStack.getItem().hasContainerItem(inputStack)) +// { +// setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); +// continue; +// } +// +// inputStack.stackSize--; +// if (inputStack.stackSize <= 0) +// { +// setInventorySlotContents(i, null); +// continue; +// } +// } +// } } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java index dc69cc1b..6cee9f0b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -8,6 +8,8 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode { @@ -26,19 +28,23 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn public IItemFilter getInputFilterForSide(EnumFacing side) { TileEntity tile = worldObj.getTileEntity(pos.offset(side)); - if (tile instanceof IInventory) + if (tile != null) { - ItemStack filterStack = this.getFilterStack(side); - - if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite())) { - IItemFilter filter = new DefaultItemFilter(); - filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), false); - return filter; - } + IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()); + ItemStack filterStack = this.getFilterStack(side); - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - return filter.getInputItemFilter(filterStack, (IInventory) tile, side.getOpposite()); + if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + { + IItemFilter filter = new DefaultItemFilter(); + filter.initializeFilter(null, tile, handler, false); + return filter; + } + + IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); + return filter.getInputItemFilter(filterStack, tile, handler); + } } return null; diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index b4548574..79255d70 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -8,6 +8,8 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode { @@ -26,20 +28,23 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO public IItemFilter getOutputFilterForSide(EnumFacing side) { TileEntity tile = worldObj.getTileEntity(pos.offset(side)); - if (tile instanceof IInventory) + if (tile != null) { - ItemStack filterStack = this.getFilterStack(side); - - if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite())) { - IItemFilter filter = new DefaultItemFilter(); - filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), true); - return filter; + IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()); + ItemStack filterStack = this.getFilterStack(side); + + if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) + { + IItemFilter filter = new DefaultItemFilter(); + filter.initializeFilter(null, tile, handler, true); + return filter; + } + + IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); + return filter.getOutputItemFilter(filterStack, tile, handler); } - - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - - return filter.getOutputItemFilter(filterStack, (IInventory) tile, side.getOpposite()); } return null; diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 8a2eb716..ca982085 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -373,20 +373,8 @@ public class Utils if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); - int numberOfSlots = handler.getSlots(); - ItemStack copyStack = stack.copy(); - - for (int slot = 0; slot < numberOfSlots; slot++) - { - copyStack = handler.insertItem(slot, copyStack, false); - if (copyStack == null) - { - return null; - } - } - - return copyStack; + return insertStackIntoTile(stack, handler); } else if (tile instanceof IInventory) { return insertStackIntoInventory(stack, (IInventory) tile, dir); @@ -395,6 +383,24 @@ public class Utils return stack; } + public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler) + { + int numberOfSlots = handler.getSlots(); + + ItemStack copyStack = stack.copy(); + + for (int slot = 0; slot < numberOfSlots; slot++) + { + copyStack = handler.insertItem(slot, copyStack, false); + if (copyStack == null) + { + return null; + } + } + + return copyStack; + } + /** * Inserts the desired stack into the tile up to a limit for the tile. * Respects capabilities.