diff --git a/CHANGELOG.md b/CHANGELOG.md index c15b704d8..6f18d6826 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### 1.0.3 - Fixed item loading issue (raoulvdberge) +- Solderer now accepts items from any side, allowing easier automation (raoulvdberge) +- Solderer is now intelligent about items in slots, and will only accept an item if it is part of a recipe (raoulvdberge) ### 1.0.2 - Fixed processing patterns not handling item insertion sometimes (raoulvdberge) diff --git a/src/main/java/refinedstorage/container/ContainerSolderer.java b/src/main/java/refinedstorage/container/ContainerSolderer.java index f27a565ab..0b36f779e 100755 --- a/src/main/java/refinedstorage/container/ContainerSolderer.java +++ b/src/main/java/refinedstorage/container/ContainerSolderer.java @@ -21,7 +21,7 @@ public class ContainerSolderer extends ContainerBase { y += 18; } - addSlotToContainer(new SlotOutput(solderer.getItems(), 3, 127, 38)); + addSlotToContainer(new SlotOutput(solderer.getResult(), 0, 127, 38)); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(solderer.getUpgrades(), i, 187, 6 + (i * 18))); diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerProxy.java b/src/main/java/refinedstorage/inventory/ItemHandlerProxy.java deleted file mode 100755 index 4b1a6d37b..000000000 --- a/src/main/java/refinedstorage/inventory/ItemHandlerProxy.java +++ /dev/null @@ -1,50 +0,0 @@ -package refinedstorage.inventory; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; - -public class ItemHandlerProxy implements IItemHandler, IItemHandlerModifiable, INBTSerializable { - private ItemHandlerBasic proxy; - - public ItemHandlerProxy(ItemHandlerBasic proxy) { - this.proxy = proxy; - } - - @Override - public NBTTagCompound serializeNBT() { - return proxy.serializeNBT(); - } - - @Override - public void deserializeNBT(NBTTagCompound nbt) { - proxy.deserializeNBT(nbt); - } - - @Override - public void setStackInSlot(int slot, ItemStack stack) { - proxy.setStackInSlot(slot, stack); - } - - @Override - public int getSlots() { - return proxy.getSlots(); - } - - @Override - public ItemStack getStackInSlot(int slot) { - return proxy.getStackInSlot(slot); - } - - @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - return proxy.insertItem(slot, stack, simulate); - } - - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - return proxy.extractItem(slot, amount, simulate); - } -} diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java b/src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java deleted file mode 100755 index b66af4a65..000000000 --- a/src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java +++ /dev/null @@ -1,41 +0,0 @@ -package refinedstorage.inventory; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import refinedstorage.tile.TileSolderer; - -public class ItemHandlerSolderer extends ItemHandlerProxy { - private TileSolderer solderer; - private EnumFacing side; - - public ItemHandlerSolderer(TileSolderer solderer, EnumFacing side) { - super(solderer.getItems()); - - this.solderer = solderer; - this.side = side; - } - - @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - if (solderer.getDirection() == EnumFacing.DOWN || solderer.getDirection() == EnumFacing.UP) { - if (((side == EnumFacing.WEST || side == EnumFacing.SOUTH) && slot == 0) || ((side == EnumFacing.NORTH || side == EnumFacing.EAST) && slot == 2) || (side == EnumFacing.UP && slot == 1)) { - return super.insertItem(slot, stack, simulate); - } - } else { - if ((side == solderer.getDirection().rotateY() && slot == 0) || (side == solderer.getDirection().rotateYCCW() && slot == 2) || (side == EnumFacing.UP && slot == 1)) { - return super.insertItem(slot, stack, simulate); - } - } - - return stack; - } - - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (side == EnumFacing.DOWN && slot == 3) { - return super.extractItem(slot, amount, simulate); - } - - return null; - } -} diff --git a/src/main/java/refinedstorage/tile/TileSolderer.java b/src/main/java/refinedstorage/tile/TileSolderer.java index 557788179..17859cc3e 100755 --- a/src/main/java/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/refinedstorage/tile/TileSolderer.java @@ -1,5 +1,6 @@ package refinedstorage.tile; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; @@ -13,12 +14,14 @@ import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.solderer.ISoldererRecipe; import refinedstorage.api.storage.CompareUtils; import refinedstorage.inventory.ItemHandlerBasic; -import refinedstorage.inventory.ItemHandlerSolderer; import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; import refinedstorage.tile.data.ITileDataProducer; import refinedstorage.tile.data.TileDataParameter; +import java.util.HashSet; +import java.util.Set; + public class TileSolderer extends TileNode { public static final TileDataParameter DURATION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { @Override @@ -37,9 +40,29 @@ public class TileSolderer extends TileNode { private static final String NBT_WORKING = "Working"; private static final String NBT_PROGRESS = "Progress"; - private ItemHandlerBasic items = new ItemHandlerBasic(4, this); + private ItemHandlerBasic items = new ItemHandlerBasic(3, this) { + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + Set possibleSlots = new HashSet<>(); + + for (ISoldererRecipe recipe : RefinedStorageAPI.instance().getSoldererRegistry().getRecipes()) { + for (int i = 0; i < 3; ++i) { + if (CompareUtils.compareStackNoQuantity(recipe.getRow(i), stack)) { + possibleSlots.add(i); + } + } + } + + return possibleSlots.contains(slot) ? super.insertItem(slot, stack, simulate) : stack; + } + }; + private ItemHandlerBasic result = new ItemHandlerBasic(1, this) { + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + return stack; + } + }; private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); - private ItemHandlerSolderer[] itemsFacade = new ItemHandlerSolderer[EnumFacing.values().length]; private ISoldererRecipe recipe; @@ -60,7 +83,7 @@ public class TileSolderer extends TileNode { public void updateNode() { boolean wasWorking = working; - if (items.getStackInSlot(1) == null && items.getStackInSlot(2) == null && items.getStackInSlot(3) == null) { + if (items.getStackInSlot(1) == null && items.getStackInSlot(2) == null && result.getStackInSlot(0) == null) { stop(); } else { ISoldererRecipe newRecipe = RefinedStorageAPI.instance().getSoldererRegistry().getRecipe(items); @@ -68,9 +91,9 @@ public class TileSolderer extends TileNode { if (newRecipe == null) { stop(); } else if (newRecipe != recipe) { - boolean sameItem = items.getStackInSlot(3) != null ? CompareUtils.compareStackNoQuantity(items.getStackInSlot(3), newRecipe.getResult()) : false; + boolean sameItem = result.getStackInSlot(0) != null ? CompareUtils.compareStackNoQuantity(result.getStackInSlot(0), newRecipe.getResult()) : false; - if (items.getStackInSlot(3) == null || (sameItem && ((items.getStackInSlot(3).stackSize + newRecipe.getResult().stackSize) <= items.getStackInSlot(3).getMaxStackSize()))) { + if (result.getStackInSlot(0) == null || (sameItem && ((result.getStackInSlot(0).stackSize + newRecipe.getResult().stackSize) <= result.getStackInSlot(0).getMaxStackSize()))) { recipe = newRecipe; progress = 0; working = true; @@ -81,10 +104,10 @@ public class TileSolderer extends TileNode { progress += 1 + upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED); if (progress >= recipe.getDuration()) { - if (items.getStackInSlot(3) != null) { - items.getStackInSlot(3).stackSize += recipe.getResult().stackSize; + if (result.getStackInSlot(0) != null) { + result.getStackInSlot(0).stackSize += recipe.getResult().stackSize; } else { - items.setStackInSlot(3, recipe.getResult().copy()); + result.setStackInSlot(0, recipe.getResult().copy()); } for (int i = 0; i < 3; ++i) { @@ -130,6 +153,7 @@ public class TileSolderer extends TileNode { readItems(items, 0, tag); readItems(upgrades, 1, tag); + readItems(result, 2, tag); recipe = RefinedStorageAPI.instance().getSoldererRegistry().getRecipe(items); @@ -148,6 +172,7 @@ public class TileSolderer extends TileNode { writeItems(items, 0, tag); writeItems(upgrades, 1, tag); + writeItems(result, 2, tag); tag.setBoolean(NBT_WORKING, working); tag.setInteger(NBT_PROGRESS, progress); @@ -179,6 +204,10 @@ public class TileSolderer extends TileNode { return items; } + public ItemHandlerBasic getResult() { + return result; + } + public IItemHandler getUpgrades() { return upgrades; } @@ -191,17 +220,7 @@ public class TileSolderer extends TileNode { @Override public T getCapability(Capability capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - if (facing == null) { - return (T) items; - } - - int i = facing.ordinal(); - - if (itemsFacade[i] == null) { - itemsFacade[i] = new ItemHandlerSolderer(this, facing); - } - - return (T) itemsFacade[i]; + return facing == EnumFacing.DOWN ? (T) result : (T) items; } return super.getCapability(capability, facing);