diff --git a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java new file mode 100755 index 000000000..c84f2dfb1 --- /dev/null +++ b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java @@ -0,0 +1,94 @@ +package refinedstorage.tile.externalstorage; + +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.tile.config.ModeFilter; + +import java.util.List; + +public class DrawerStorage extends ExternalStorage { + private TileExternalStorage externalStorage; + private IDrawer drawer; + + public DrawerStorage(TileExternalStorage externalStorage, IDrawer drawer) { + this.externalStorage = externalStorage; + this.drawer = drawer; + } + + @Override + public int getCapacity() { + return drawer.getMaxCapacity(); + } + + @Override + public void addItems(List items) { + if (!drawer.isEmpty()) { + items.add(drawer.getStoredItemCopy()); + } + } + + @Override + public ItemStack push(ItemStack stack, boolean simulate) { + if (ModeFilter.respectsMode(externalStorage.getFilters(), externalStorage, externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) { + if (drawer.isEmpty()) { + if (getStored() + stack.stackSize > getCapacity()) { + int remainingSpace = getCapacity() - getStored(); + + if (remainingSpace <= 0) { + return stack; + } + + if (!simulate) { + drawer.setStoredItem(stack, remainingSpace); + } + + return ItemHandlerHelper.copyStackWithSize(stack, stack.stackSize - remainingSpace); + } else { + if (!simulate) { + drawer.setStoredItem(stack, stack.stackSize); + } + + return null; + } + } else { + if (getStored() + stack.stackSize > getCapacity()) { + int remainingSpace = getCapacity() - getStored(); + + if (remainingSpace <= 0) { + return stack; + } + + if (!simulate) { + drawer.setStoredItemCount(drawer.getStoredItemCount() + remainingSpace); + } + + return ItemHandlerHelper.copyStackWithSize(stack, stack.stackSize - remainingSpace); + } else { + if (!simulate) { + drawer.setStoredItemCount(drawer.getStoredItemCount() + stack.stackSize); + } + + return null; + } + } + } + + return stack; + } + + @Override + public ItemStack take(ItemStack stack, int size, int flags) { + return null; + } + + @Override + public int getStored() { + return drawer.getStoredItemCount(); + } + + @Override + public int getPriority() { + return externalStorage.getPriority(); + } +} diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index 4057b9551..930d01fa9 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -1,5 +1,7 @@ package refinedstorage.tile.externalstorage; +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; import io.netty.buffer.ByteBuf; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; @@ -34,8 +36,6 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider private int compare = 0; private int mode = ModeConstants.WHITELIST; - private ExternalStorage storage; - private int stored; private int capacity; @@ -46,13 +46,6 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider @Override public void updateMachine() { - IItemHandler handler = RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); - - if (handler == null) { - storage = null; - } else if (storage == null) { - storage = new ItemHandlerStorage(this, handler); - } } @Override @@ -151,8 +144,40 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider @Override public void provide(List storages) { - if (storage != null) { + if (getFacingTile() instanceof IDrawerGroup) { + stored = 0; + capacity = 0; + + IDrawerGroup group = (IDrawerGroup) getFacingTile(); + + for (int i = 0; i < group.getDrawerCount(); ++i) { + if (group.isDrawerEnabled(i)) { + DrawerStorage storage = new DrawerStorage(this, group.getDrawer(i)); + + storages.add(storage); + + stored += storage.getStored(); + capacity += storage.getCapacity(); + } + } + } else if (getFacingTile() instanceof IDrawer) { + DrawerStorage storage = new DrawerStorage(this, (IDrawer) getFacingTile()); + storages.add(storage); + + stored = storage.getStored(); + capacity = storage.getCapacity(); + } else { + IItemHandler handler = RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); + + if (handler != null) { + ItemHandlerStorage storage = new ItemHandlerStorage(this, handler); + + storages.add(storage); + + stored = storage.getStored(); + capacity = storage.getCapacity(); + } } } @@ -178,12 +203,12 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider @Override public int getStored() { - return worldObj.isRemote ? stored : (storage != null ? storage.getStored() : 0); + return stored; } @Override public int getCapacity() { - return worldObj.isRemote ? capacity : (storage != null ? storage.getCapacity() : 0); + return capacity; } @Override