Updated the Alchemy Table recipe system so that it can provide better custom recipes

This commit is contained in:
WayofTime 2016-05-04 16:44:32 -04:00
parent a5dee50984
commit 86efa8b1a3
12 changed files with 212 additions and 218 deletions

View file

@ -2,6 +2,8 @@
Version 2.0.0-36 Version 2.0.0-36
------------------------------------------------------ ------------------------------------------------------
- Added JEI compat for the Alchemy Table - 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 Version 2.0.0-35

View file

@ -1,5 +1,9 @@
package WayofTime.bloodmagic.api.recipe; package WayofTime.bloodmagic.api.recipe;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import lombok.Getter; import lombok.Getter;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -8,10 +12,6 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AlchemyTableRecipe public class AlchemyTableRecipe
{ {
protected ItemStack output = null; protected ItemStack output = null;
@ -144,4 +144,38 @@ public class AlchemyTableRecipe
{ {
return this.input; 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;
}
} }

View file

@ -450,6 +450,7 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP
tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag); tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag);
} }
//TODO: Add the ability to have the armour give an upgrade with a higher level
public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack) public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack)
{ {
if (!armourMap.containsKey(stack)) if (!armourMap.containsKey(stack))

View file

@ -1,13 +1,13 @@
package WayofTime.bloodmagic.item.routing; package WayofTime.bloodmagic.item.routing;
import WayofTime.bloodmagic.routing.IItemFilter;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; 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 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);
} }

View file

@ -1,25 +1,32 @@
package WayofTime.bloodmagic.item.routing; 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.BloodMagic;
import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.IVariantProvider;
import WayofTime.bloodmagic.item.inventory.ItemInventory; 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.GhostItemHelper;
import WayofTime.bloodmagic.util.helper.TextHelper; 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 public class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider
{ {
@ -58,7 +65,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari
} }
@Override @Override
public IItemFilter getInputItemFilter(ItemStack filterStack, IInventory inventory, EnumFacing syphonDirection) public IItemFilter getInputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler)
{ {
IItemFilter testFilter = new TestItemFilter(); IItemFilter testFilter = new TestItemFilter();
@ -96,12 +103,12 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari
filteredList.add(ghostStack); filteredList.add(ghostStack);
} }
testFilter.initializeFilter(filteredList, inventory, syphonDirection, false); testFilter.initializeFilter(filteredList, tile, handler, false);
return testFilter; return testFilter;
} }
@Override @Override
public IItemFilter getOutputItemFilter(ItemStack filterStack, IInventory inventory, EnumFacing syphonDirection) public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler)
{ {
IItemFilter testFilter = new TestItemFilter(); IItemFilter testFilter = new TestItemFilter();
@ -143,7 +150,7 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari
filteredList.add(ghostStack); filteredList.add(ghostStack);
} }
testFilter.initializeFilter(filteredList, inventory, syphonDirection, true); testFilter.initializeFilter(filteredList, tile, handler, true);
return testFilter; return testFilter;
} }

View file

@ -1,15 +1,13 @@
package WayofTime.bloodmagic.routing; package WayofTime.bloodmagic.routing;
import WayofTime.bloodmagic.util.Utils; import java.util.List;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandler;
import java.util.List; import WayofTime.bloodmagic.util.Utils;
/** /**
* This particular implementation of IItemFilter allows any item to be drained * This particular implementation of IItemFilter allows any item to be drained
@ -21,8 +19,8 @@ import java.util.List;
*/ */
public class DefaultItemFilter implements IItemFilter public class DefaultItemFilter implements IItemFilter
{ {
private IInventory accessedInventory; protected TileEntity accessedTile;
private EnumFacing accessedSide; protected IItemHandler itemHandler;
/** /**
* Initializes the filter so that it knows what it wants to fulfill. * 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. * initialized as an input filter.
*/ */
@Override @Override
public void initializeFilter(List<ItemStack> filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput) public void initializeFilter(List<ItemStack> filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput)
{ {
accessedInventory = inventory; this.accessedTile = tile;
accessedSide = side; this.itemHandler = itemHandler;
} }
/** /**
@ -70,15 +68,14 @@ public class DefaultItemFilter implements IItemFilter
ItemStack testStack = inputStack.copy(); ItemStack testStack = inputStack.copy();
testStack.stackSize = allowedAmount; testStack.stackSize = allowedAmount;
ItemStack remainderStack = Utils.insertStackIntoInventory(testStack, accessedInventory, accessedSide); ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler);
int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize);
testStack = inputStack.copy(); testStack = inputStack.copy();
testStack.stackSize -= changeAmount; testStack.stackSize -= changeAmount;
TileEntity tile = (TileEntity) accessedInventory; World world = accessedTile.getWorld();
World world = tile.getWorld(); BlockPos pos = accessedTile.getPos();
BlockPos pos = tile.getPos();
world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3);
return testStack; return testStack;
@ -91,36 +88,15 @@ public class DefaultItemFilter implements IItemFilter
@Override @Override
public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer)
{ {
boolean[] canAccessSlot = new boolean[accessedInventory.getSizeInventory()]; for (int slot = 0; slot < itemHandler.getSlots(); slot++)
if (accessedInventory instanceof ISidedInventory)
{ {
int[] slots = ((ISidedInventory) accessedInventory).getSlotsForFace(accessedSide); ItemStack inputStack = itemHandler.getStackInSlot(slot);
for (int slot : slots) if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide)))
{
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; continue;
} }
ItemStack inputStack = accessedInventory.getStackInSlot(slot); int allowedAmount = Math.min(itemHandler.extractItem(slot, inputStack.stackSize, true).stackSize, maxTransfer);
if (inputStack == null || (accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide)))
{
continue;
}
int allowedAmount = Math.min(inputStack.stackSize, maxTransfer);
ItemStack testStack = inputStack.copy(); ItemStack testStack = inputStack.copy();
testStack.stackSize = allowedAmount; testStack.stackSize = allowedAmount;
@ -133,15 +109,13 @@ public class DefaultItemFilter implements IItemFilter
continue; 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; 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; return changeAmount;
} }

View file

@ -1,14 +1,14 @@
package WayofTime.bloodmagic.routing; package WayofTime.bloodmagic.routing;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import java.util.List; import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.items.IItemHandler;
public interface IItemFilter public interface IItemFilter
{ {
void initializeFilter(List<ItemStack> filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput); void initializeFilter(List<ItemStack> filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput);
/** /**
* This method is only called when the output inventory this filter is * This method is only called when the output inventory this filter is

View file

@ -1,14 +1,15 @@
package WayofTime.bloodmagic.routing; 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.Iterator;
import java.util.List; 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 * 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 * 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. * filter, it keeps track of how many can be removed.
*/ */
protected List<ItemStack> requestList; protected List<ItemStack> requestList;
protected IInventory accessedInventory; protected TileEntity accessedTile;
protected EnumFacing accessedSide; protected IItemHandler itemHandler;
/** /**
* Initializes the filter so that it knows what it wants to fulfill. * Initializes the filter so that it knows what it wants to fulfill.
* *
* @param filteredList * @param filteredList
* - The list of ItemStacks that the filter is set to. * - The list of ItemStacks that the filter is set to.
* @param inventory * @param tile
* - The inventory that is being accessed. This inventory is either * - The inventory that is being accessed. This inventory is either
* being pulled from or pushed to. * being pulled from or pushed to.
* @param itemHandler
* - The item handler
* @param side * @param side
* - The side that the inventory is being accessed from. Used for * - The side that the inventory is being accessed from. Used for
* pulling/pushing from/to the inventory. * pulling/pushing from/to the inventory.
@ -46,37 +49,17 @@ public class TestItemFilter implements IItemFilter
* initialized as an input filter. * initialized as an input filter.
*/ */
@Override @Override
public void initializeFilter(List<ItemStack> filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput) public void initializeFilter(List<ItemStack> filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput)
{ {
this.accessedInventory = inventory; this.accessedTile = tile;
this.accessedSide = side; this.itemHandler = itemHandler;
if (isFilterOutput) if (isFilterOutput)
{ {
requestList = filteredList; 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]) ItemStack checkedStack = itemHandler.getStackInSlot(slot);
{
continue;
}
ItemStack checkedStack = inventory.getStackInSlot(slot);
if (checkedStack == null) if (checkedStack == null)
{ {
continue; continue;
@ -105,30 +88,9 @@ public class TestItemFilter implements IItemFilter
filterStack.stackSize *= -1; //Invert the stack size so that filterStack.stackSize *= -1; //Invert the stack size so that
} }
boolean[] canAccessSlot = new boolean[inventory.getSizeInventory()]; for (int slot = 0; slot < itemHandler.getSlots(); slot++)
if (inventory instanceof ISidedInventory)
{ {
int[] slots = ((ISidedInventory) inventory).getSlotsForFace(side); ItemStack checkedStack = itemHandler.getStackInSlot(slot);
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);
if (checkedStack == null) if (checkedStack == null)
{ {
continue; continue;
@ -144,7 +106,6 @@ public class TestItemFilter implements IItemFilter
} }
} }
} }
} }
Iterator<ItemStack> iterator = requestList.iterator(); Iterator<ItemStack> iterator = requestList.iterator();
@ -188,7 +149,7 @@ public class TestItemFilter implements IItemFilter
ItemStack testStack = inputStack.copy(); ItemStack testStack = inputStack.copy();
testStack.stackSize = allowedAmount; testStack.stackSize = allowedAmount;
ItemStack remainderStack = Utils.insertStackIntoInventory(testStack, accessedInventory, accessedSide); ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler);
int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize); int changeAmount = allowedAmount - (remainderStack == null ? 0 : remainderStack.stackSize);
testStack = inputStack.copy(); 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; return testStack;
} }
@ -218,31 +183,10 @@ public class TestItemFilter implements IItemFilter
@Override @Override
public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer)
{ {
boolean[] canAccessSlot = new boolean[accessedInventory.getSizeInventory()]; for (int slot = 0; slot < itemHandler.getSlots(); slot++)
if (accessedInventory instanceof ISidedInventory)
{ {
int[] slots = ((ISidedInventory) accessedInventory).getSlotsForFace(accessedSide); ItemStack inputStack = itemHandler.getStackInSlot(slot);
for (int slot : slots) if (inputStack == null || itemHandler.extractItem(slot, inputStack.stackSize, true) == null)//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide)))
{
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)))
{ {
continue; continue;
} }
@ -252,7 +196,7 @@ public class TestItemFilter implements IItemFilter
{ {
if (doStacksMatch(filterStack, inputStack)) 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; break;
} }
} }
@ -273,10 +217,9 @@ public class TestItemFilter implements IItemFilter
continue; continue;
} }
inputStack.stackSize -= changeAmount;
maxTransfer -= changeAmount; maxTransfer -= changeAmount;
accessedInventory.setInventorySlotContents(slot, inputStack.stackSize <= 0 ? null : inputStack); //Sets the slot in the inventory itemHandler.extractItem(slot, changeAmount, false);
Iterator<ItemStack> itr = requestList.iterator(); Iterator<ItemStack> itr = requestList.iterator();
while (itr.hasNext()) 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; return changeAmount;
} }

View file

@ -379,7 +379,7 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory,
currentOutputStack.stackSize += outputStack.stackSize; currentOutputStack.stackSize += outputStack.stackSize;
} }
consumeInventory(); consumeInventory(recipe);
} }
} }
@ -401,26 +401,38 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory,
return 0; return 0;
} }
public void consumeInventory() public void consumeInventory(AlchemyTableRecipe recipe)
{ {
ItemStack[] input = new ItemStack[6];
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
ItemStack inputStack = getStackInSlot(i); input[i] = getStackInSlot(i);
if (inputStack != null)
{
if (inputStack.getItem().hasContainerItem(inputStack))
{
setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack));
continue;
} }
inputStack.stackSize--; ItemStack[] result = recipe.getRemainingItems(input);
if (inputStack.stackSize <= 0) for (int i = 0; i < 6; i++)
{ {
setInventorySlotContents(i, null); setInventorySlotContents(i, result[i]);
continue; }
} // 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;
// }
// }
// }
} }
} }

View file

@ -8,6 +8,8 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode
{ {
@ -26,19 +28,23 @@ public class TileInputRoutingNode extends TileFilteredRoutingNode implements IIn
public IItemFilter getInputFilterForSide(EnumFacing side) public IItemFilter getInputFilterForSide(EnumFacing side)
{ {
TileEntity tile = worldObj.getTileEntity(pos.offset(side)); TileEntity tile = worldObj.getTileEntity(pos.offset(side));
if (tile instanceof IInventory) if (tile != null)
{ {
if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()))
{
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
ItemStack filterStack = this.getFilterStack(side); ItemStack filterStack = this.getFilterStack(side);
if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider))
{ {
IItemFilter filter = new DefaultItemFilter(); IItemFilter filter = new DefaultItemFilter();
filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), false); filter.initializeFilter(null, tile, handler, false);
return filter; return filter;
} }
IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem();
return filter.getInputItemFilter(filterStack, (IInventory) tile, side.getOpposite()); return filter.getInputItemFilter(filterStack, tile, handler);
}
} }
return null; return null;

View file

@ -8,6 +8,8 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode
{ {
@ -26,20 +28,23 @@ public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IO
public IItemFilter getOutputFilterForSide(EnumFacing side) public IItemFilter getOutputFilterForSide(EnumFacing side)
{ {
TileEntity tile = worldObj.getTileEntity(pos.offset(side)); TileEntity tile = worldObj.getTileEntity(pos.offset(side));
if (tile instanceof IInventory) if (tile != null)
{ {
if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()))
{
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
ItemStack filterStack = this.getFilterStack(side); ItemStack filterStack = this.getFilterStack(side);
if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider)) if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider))
{ {
IItemFilter filter = new DefaultItemFilter(); IItemFilter filter = new DefaultItemFilter();
filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), true); filter.initializeFilter(null, tile, handler, true);
return filter; return filter;
} }
IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem();
return filter.getOutputItemFilter(filterStack, tile, handler);
return filter.getOutputItemFilter(filterStack, (IInventory) tile, side.getOpposite()); }
} }
return null; return null;

View file

@ -373,6 +373,18 @@ public class Utils
if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir))
{ {
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir);
return insertStackIntoTile(stack, handler);
} else if (tile instanceof IInventory)
{
return insertStackIntoInventory(stack, (IInventory) tile, dir);
}
return stack;
}
public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler)
{
int numberOfSlots = handler.getSlots(); int numberOfSlots = handler.getSlots();
ItemStack copyStack = stack.copy(); ItemStack copyStack = stack.copy();
@ -387,12 +399,6 @@ public class Utils
} }
return copyStack; return copyStack;
} else if (tile instanceof IInventory)
{
return insertStackIntoInventory(stack, (IInventory) tile, dir);
}
return stack;
} }
/** /**