Updated the Alchemy Table recipe system so that it can provide better custom recipes
This commit is contained in:
parent
a5dee50984
commit
86efa8b1a3
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<ItemStack> filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput)
|
||||
public void initializeFilter(List<ItemStack> 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;
|
||||
}
|
||||
|
|
|
@ -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<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
|
||||
|
|
|
@ -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<ItemStack> 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<ItemStack> filteredList, IInventory inventory, EnumFacing side, boolean isFilterOutput)
|
||||
public void initializeFilter(List<ItemStack> 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<ItemStack> 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<ItemStack> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue