Updated the Alchemy Table recipe system so that it can provide better custom recipes
This commit is contained in:
parent
a5dee50984
commit
86efa8b1a3
12 changed files with 212 additions and 218 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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--;
|
|
||||||
if (inputStack.stackSize <= 0)
|
|
||||||
{
|
|
||||||
setInventorySlotContents(i, null);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.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)
|
||||||
{
|
{
|
||||||
ItemStack filterStack = this.getFilterStack(side);
|
if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()))
|
||||||
|
|
||||||
if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider))
|
|
||||||
{
|
{
|
||||||
IItemFilter filter = new DefaultItemFilter();
|
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
|
||||||
filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), false);
|
ItemStack filterStack = this.getFilterStack(side);
|
||||||
return filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem();
|
if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider))
|
||||||
return filter.getInputItemFilter(filterStack, (IInventory) tile, side.getOpposite());
|
{
|
||||||
|
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;
|
return null;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
ItemStack filterStack = this.getFilterStack(side);
|
if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite()))
|
||||||
|
|
||||||
if (filterStack == null || !(filterStack.getItem() instanceof IItemFilterProvider))
|
|
||||||
{
|
{
|
||||||
IItemFilter filter = new DefaultItemFilter();
|
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
|
||||||
filter.initializeFilter(null, (IInventory) tile, side.getOpposite(), true);
|
ItemStack filterStack = this.getFilterStack(side);
|
||||||
return filter;
|
|
||||||
|
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;
|
return null;
|
||||||
|
|
|
@ -373,20 +373,8 @@ 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);
|
||||||
int numberOfSlots = handler.getSlots();
|
|
||||||
|
|
||||||
ItemStack copyStack = stack.copy();
|
return insertStackIntoTile(stack, handler);
|
||||||
|
|
||||||
for (int slot = 0; slot < numberOfSlots; slot++)
|
|
||||||
{
|
|
||||||
copyStack = handler.insertItem(slot, copyStack, false);
|
|
||||||
if (copyStack == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return copyStack;
|
|
||||||
} else if (tile instanceof IInventory)
|
} else if (tile instanceof IInventory)
|
||||||
{
|
{
|
||||||
return insertStackIntoInventory(stack, (IInventory) tile, dir);
|
return insertStackIntoInventory(stack, (IInventory) tile, dir);
|
||||||
|
@ -395,6 +383,24 @@ public class Utils
|
||||||
return stack;
|
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.
|
* Inserts the desired stack into the tile up to a limit for the tile.
|
||||||
* Respects capabilities.
|
* Respects capabilities.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue