From fd787c0d0fcc1a0750ccf76f195d7afcabe43748 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sat, 19 Dec 2015 12:11:00 +0100 Subject: [PATCH] importer / exporter should respect sided inventories --- .../java/storagecraft/tile/TileExporter.java | 40 ++++++++++++++++++- .../java/storagecraft/tile/TileImporter.java | 33 +++++++++++++-- .../storagecraft/util/InventoryUtils.java | 24 +++++++++++ 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/src/main/java/storagecraft/tile/TileExporter.java b/src/main/java/storagecraft/tile/TileExporter.java index 9de3167d6..826c5185f 100644 --- a/src/main/java/storagecraft/tile/TileExporter.java +++ b/src/main/java/storagecraft/tile/TileExporter.java @@ -3,13 +3,14 @@ package storagecraft.tile; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import storagecraft.inventory.InventorySimple; import storagecraft.util.InventoryUtils; -public class TileExporter extends TileMachine implements IInventory { +public class TileExporter extends TileMachine implements IInventory, ISidedInventory { public static final String NBT_COMPARE_FLAGS = "CompareFlags"; private InventorySimple inventory = new InventorySimple("exporter", 9); @@ -40,7 +41,27 @@ public class TileExporter extends TileMachine implements IInventory { ItemStack took = getController().take(toTake, compareFlags); if (took != null) { - if (InventoryUtils.canPushToInventory(connectedInventory, took)) { + if (connectedInventory instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) connectedInventory; + + boolean pushedAny = false; + + for (int si = 0; si < connectedInventory.getSizeInventory(); ++si) { + if (sided.canInsertItem(si, took, getDirection().getOpposite().ordinal())) { + if (InventoryUtils.canPushToInventorySlot(connectedInventory, si, took)) { + InventoryUtils.pushToInventorySlot(connectedInventory, si, took); + + pushedAny = true; + + break; + } + } + } + + if (!pushedAny) { + getController().push(took); + } + } else if (InventoryUtils.canPushToInventory(connectedInventory, took)) { InventoryUtils.pushToInventory(connectedInventory, took); } else { getController().push(took); @@ -120,6 +141,21 @@ public class TileExporter extends TileMachine implements IInventory { return inventory.isItemValidForSlot(slot, stack); } + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return false; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return false; + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/storagecraft/tile/TileImporter.java b/src/main/java/storagecraft/tile/TileImporter.java index 58610af9d..c626a2e19 100644 --- a/src/main/java/storagecraft/tile/TileImporter.java +++ b/src/main/java/storagecraft/tile/TileImporter.java @@ -3,13 +3,14 @@ package storagecraft.tile; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import storagecraft.inventory.InventorySimple; import storagecraft.util.InventoryUtils; -public class TileImporter extends TileMachine implements IInventory { +public class TileImporter extends TileMachine implements IInventory, ISidedInventory { public static final String NBT_COMPARE_FLAGS = "CompareFlags"; public static final String NBT_MODE = "Mode"; @@ -33,7 +34,7 @@ public class TileImporter extends TileMachine implements IInventory { IInventory connectedInventory = (IInventory) tile; if (ticks % 5 == 0) { - ItemStack slot; + ItemStack slot = connectedInventory.getStackInSlot(currentSlot); while ((slot = connectedInventory.getStackInSlot(currentSlot)) == null) { currentSlot++; @@ -44,10 +45,19 @@ public class TileImporter extends TileMachine implements IInventory { } if (slot != null && canImport(slot)) { - if (getController().push(slot.copy())) { + if (connectedInventory instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) connectedInventory; + + if (sided.canExtractItem(currentSlot, slot.copy(), getDirection().getOpposite().ordinal())) { + if (getController().push(slot.copy())) { + connectedInventory.setInventorySlotContents(currentSlot, null); + } + } + } else if (getController().push(slot.copy())) { connectedInventory.setInventorySlotContents(currentSlot, null); - connectedInventory.markDirty(); } + + connectedInventory.markDirty(); } currentSlot++; @@ -161,6 +171,21 @@ public class TileImporter extends TileMachine implements IInventory { return inventory.isItemValidForSlot(slot, stack); } + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return false; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return false; + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/storagecraft/util/InventoryUtils.java b/src/main/java/storagecraft/util/InventoryUtils.java index dc13e1021..53911979a 100644 --- a/src/main/java/storagecraft/util/InventoryUtils.java +++ b/src/main/java/storagecraft/util/InventoryUtils.java @@ -88,6 +88,30 @@ public class InventoryUtils { } } + public static void pushToInventorySlot(IInventory inventory, int i, ItemStack stack) { + ItemStack slot = inventory.getStackInSlot(i); + + if (slot == null) { + inventory.setInventorySlotContents(i, stack); + } else if (compareStackNoQuantity(slot, stack)) { + slot.stackSize += stack.stackSize; + } + } + + public static boolean canPushToInventorySlot(IInventory inventory, int i, ItemStack stack) { + ItemStack slot = inventory.getStackInSlot(i); + + if (slot == null) { + return true; + } + + if (!compareStackNoQuantity(slot, stack)) { + return false; + } + + return slot.stackSize + stack.stackSize < slot.getMaxStackSize(); + } + public static void pushToInventory(IInventory inventory, ItemStack stack) { int toGo = stack.stackSize;