From da41ae77316d0672046ed2c430f99f51ae7fd3e7 Mon Sep 17 00:00:00 2001 From: Ourten Date: Sun, 18 Dec 2016 21:34:01 +0100 Subject: [PATCH] Apply QuantumChest fixes to DigitalChest --- .../techreborn/tiles/TileDigitalChest.java | 156 ++++++++++++------ 1 file changed, 103 insertions(+), 53 deletions(-) diff --git a/src/main/java/techreborn/tiles/TileDigitalChest.java b/src/main/java/techreborn/tiles/TileDigitalChest.java index 8ad0e9aae..b8216fc54 100644 --- a/src/main/java/techreborn/tiles/TileDigitalChest.java +++ b/src/main/java/techreborn/tiles/TileDigitalChest.java @@ -6,79 +6,99 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.util.EnumFacing; + +import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; + import reborncore.api.IListInfoProvider; import reborncore.api.tile.IInventoryProvider; import reborncore.common.IWrenchable; import reborncore.common.tile.TileLegacyMachineBase; import reborncore.common.util.Inventory; import reborncore.common.util.ItemUtils; + import techreborn.init.ModBlocks; -import javax.annotation.Nonnull; import java.util.List; -public class TileDigitalChest extends TileLegacyMachineBase implements IInventoryProvider, IWrenchable, IListInfoProvider { +public class TileDigitalChest extends TileLegacyMachineBase + implements IInventoryProvider, IWrenchable, IListInfoProvider, IDeepStorageUnit { // Slot 0 = Input // Slot 1 = Output // Slot 2 = Fake Item - @Nonnull public ItemStack storedItem = ItemStack.EMPTY; - // TODO use long so we can have 9,223,372,036,854,775,807 items instead of - // 2,147,483,647 - int storage = 32767; + + int storage = Short.MAX_VALUE; public Inventory inventory = new Inventory(3, "TileDigitalChest", storage, this); @Override public void updateEntity() { if (!world.isRemote) { - if (storedItem != ItemStack.EMPTY) { - ItemStack fakeStack = storedItem.copy(); - fakeStack.setCount(1); - setInventorySlotContents(2, fakeStack); - } else if (storedItem == ItemStack.EMPTY && getStackInSlot(1) != ItemStack.EMPTY) { - ItemStack fakeStack = getStackInSlot(1).copy(); - fakeStack.setCount(1); - setInventorySlotContents(2, fakeStack); - } else { - setInventorySlotContents(2, ItemStack.EMPTY); - } + if (this.getStackInSlot(0) != ItemStack.EMPTY) { + if (this.getStoredItemType().isEmpty() || (this.storedItem.isEmpty() + && ItemUtils.isItemEqual(this.getStackInSlot(0), this.getStackInSlot(1), true, true))) { - if (getStackInSlot(0) != ItemStack.EMPTY) { - if (storedItem == ItemStack.EMPTY) { - storedItem = getStackInSlot(0); - setInventorySlotContents(0, ItemStack.EMPTY); - } else if (ItemUtils.isItemEqual(storedItem, getStackInSlot(0), true, true)) { - if (storedItem.getCount() <= storage - getStackInSlot(0).getCount()) { - storedItem.grow(getStackInSlot(0).getCount()); - decrStackSize(0, getStackInSlot(0).getCount()); - } + this.storedItem = this.getStackInSlot(0); + this.setInventorySlotContents(0, ItemStack.EMPTY); + this.syncWithAll(); + } else if (ItemUtils.isItemEqual(this.getStoredItemType(), this.getStackInSlot(0), true, true)) { + + this.setStoredItemCount(this.getStackInSlot(0).getCount()); + this.setInventorySlotContents(0, ItemStack.EMPTY); + this.syncWithAll(); } } - if (storedItem != ItemStack.EMPTY && getStackInSlot(1) == ItemStack.EMPTY) { - ItemStack itemStack = storedItem.copy(); - itemStack.setCount(itemStack.getMaxStackSize()); - setInventorySlotContents(1, itemStack); - storedItem.shrink(itemStack.getMaxStackSize()); - } else if (ItemUtils.isItemEqual(getStackInSlot(1), storedItem, true, true)) { - int wanted = getStackInSlot(1).getMaxStackSize() - getStackInSlot(1).getCount(); - if (storedItem.getCount() >= wanted) { - decrStackSize(1, -wanted); - storedItem.shrink(wanted); - } else { - decrStackSize(1, -storedItem.getCount()); - storedItem = ItemStack.EMPTY; + if (this.storedItem != ItemStack.EMPTY) { + if (this.getStackInSlot(1) == ItemStack.EMPTY) { + + ItemStack delivered = this.storedItem.copy(); + delivered.setCount(Math.min(this.storedItem.getCount(), delivered.getMaxStackSize())); + + this.storedItem.shrink(delivered.getCount()); + + if (this.storedItem.isEmpty()) + this.storedItem = ItemStack.EMPTY; + + this.setInventorySlotContents(1, delivered); + this.syncWithAll(); + } else if (ItemUtils.isItemEqual(this.storedItem, this.getStackInSlot(1), true, true) + && this.getStackInSlot(1).getCount() < this.getStackInSlot(1).getMaxStackSize()) { + + int wanted = Math.min(this.storedItem.getCount(), + this.getStackInSlot(1).getMaxStackSize() - this.getStackInSlot(1).getCount()); + + this.getStackInSlot(1).setCount(this.getStackInSlot(1).getCount() + wanted); + this.storedItem.shrink(wanted); + + if (this.storedItem.isEmpty()) + this.storedItem = ItemStack.EMPTY; + this.syncWithAll(); } } + + if (this.getStackInSlot(2) == ItemStack.EMPTY + && (!this.storedItem.isEmpty() || !this.getStackInSlot(1).isEmpty())) { + + ItemStack fake = storedItem.isEmpty() ? this.getStackInSlot(1).copy() : storedItem.copy(); + fake.setCount(1); + + this.setInventorySlotContents(2, fake); + } else if (!ItemUtils.isItemEqual(this.getStackInSlot(2), this.storedItem, true, true)) { + + ItemStack fake = storedItem.isEmpty() ? this.getStackInSlot(1).copy() : storedItem.copy(); + fake.setCount(1); + + this.setInventorySlotContents(2, fake); + } } } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { world.markBlockRangeForRenderUpdate(getPos().getX(), getPos().getY(), getPos().getZ(), getPos().getX(), - getPos().getY(), getPos().getZ()); + getPos().getY(), getPos().getZ()); readFromNBT(packet.getNbtCompound()); } @@ -112,8 +132,10 @@ public class TileDigitalChest extends TileLegacyMachineBase implements IInventor if (storedItem != ItemStack.EMPTY) { tagCompound.setTag("storedStack", storedItem.writeToNBT(new NBTTagCompound())); tagCompound.setInteger("storedQuantity", storedItem.getCount()); - } else + } else { tagCompound.setInteger("storedQuantity", 0); + } + return tagCompound; } @@ -152,19 +174,47 @@ public class TileDigitalChest extends TileLegacyMachineBase implements IInventor } @Override - public void addInfo(List info, boolean isRealTile) { - int size = 0; - String name = "of nothing"; - if (storedItem != ItemStack.EMPTY) { - name = storedItem.getDisplayName(); - size += storedItem.getCount(); - } - if (getStackInSlot(1) != ItemStack.EMPTY) { - name = getStackInSlot(1).getDisplayName(); - size += getStackInSlot(1).getCount(); - } - info.add(size + " " + name); + public ItemStack getStoredItemType() { + return this.storedItem.isEmpty() ? this.getStackInSlot(1) : this.storedItem; + } + @Override + public void setStoredItemCount(int amount) { + storedItem.grow(amount); + this.markDirty(); + } + + @Override + public void setStoredItemType(ItemStack type, int amount) { + this.storedItem = type; + storedItem.setCount(amount); + this.markDirty(); + } + + @Override + public int getMaxStoredCount() { + return this.storage; + } + + public int getStoredCount() { + return this.storedItem.getCount(); + } + + @Override + public void addInfo(List info, boolean isRealTile) { + if (isRealTile) { + int size = 0; + String name = "of nothing"; + if (storedItem != ItemStack.EMPTY) { + name = storedItem.getDisplayName(); + size += storedItem.getCount(); + } + if (getStackInSlot(1) != ItemStack.EMPTY) { + name = getStackInSlot(1).getDisplayName(); + size += getStackInSlot(1).getCount(); + } + info.add(size + " " + name); + } } @Override