From 6c5a5fb45c4099535994493371cfbf9e731a88d5 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Thu, 7 Jul 2016 19:50:03 +0200 Subject: [PATCH] Fixed External Storage not updating correctly --- CHANGELOG.md | 3 ++- .../refinedstorage/RefinedStorageUtils.java | 12 ++++++++++ .../block/BlockExternalStorage.java | 8 +++++-- .../tile/controller/TileController.java | 9 +++++++ .../DeepStorageUnitStorage.java | 7 ++++++ .../tile/externalstorage/DrawerStorage.java | 7 ++++++ .../tile/externalstorage/ExternalStorage.java | 18 ++++++++++++++ .../externalstorage/ItemHandlerStorage.java | 15 ++++++++++++ .../externalstorage/TileExternalStorage.java | 24 ++++++++++--------- 9 files changed, 89 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5dec43f8..57363b69d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,9 @@ ### 0.8.6 **Bugfixes** - Fixed External Storage disconnecting on world reload +- Fixed External Storage not updating correctly - Fixed wireless signal starting from Controller instead of per Wireless Transmitter individually -- Huge performance improvements to large networks +- Huge performance improvements to large storage networks **Features** - Re-added Controllers exploding when two of them are connected to the same network diff --git a/src/main/java/refinedstorage/RefinedStorageUtils.java b/src/main/java/refinedstorage/RefinedStorageUtils.java index 55c0cce08..9e80a0172 100755 --- a/src/main/java/refinedstorage/RefinedStorageUtils.java +++ b/src/main/java/refinedstorage/RefinedStorageUtils.java @@ -327,4 +327,16 @@ public final class RefinedStorageUtils { public static boolean hasPattern(INetworkMaster network, ItemStack stack) { return RefinedStorageUtils.getPattern(network, stack) != null; } + + public static int getItemStackHashCode(ItemStack stack) { + return getItemStackHashCode(stack, stack == null ? 0 : stack.stackSize); + } + + public static int getItemStackHashCode(ItemStack stack, int stackSize) { + if (stack == null) { + return 0; + } + + return stack.getItem().hashCode() + Math.max(1, stackSize) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1); + } } diff --git a/src/main/java/refinedstorage/block/BlockExternalStorage.java b/src/main/java/refinedstorage/block/BlockExternalStorage.java index d4f9c091c..e2f81789d 100755 --- a/src/main/java/refinedstorage/block/BlockExternalStorage.java +++ b/src/main/java/refinedstorage/block/BlockExternalStorage.java @@ -36,8 +36,12 @@ public class BlockExternalStorage extends BlockNode { public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) { super.neighborChanged(state, world, pos, block); - if (!world.isRemote && ((TileExternalStorage) world.getTileEntity(pos)).isConnected()) { - ((TileExternalStorage) world.getTileEntity(pos)).updateStorage(); + if (!world.isRemote) { + TileExternalStorage externalStorage = (TileExternalStorage) world.getTileEntity(pos); + + if (externalStorage.getNetwork() != null) { + externalStorage.updateStorage(externalStorage.getNetwork()); + } } } diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 8f2a1ced6..34eecd5f1 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -50,6 +50,7 @@ import refinedstorage.tile.TileBase; import refinedstorage.tile.TileCrafter; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; +import refinedstorage.tile.externalstorage.ExternalStorage; import java.util.*; @@ -488,6 +489,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR for (IStorage storage : this.storage.getStorages()) { remainder = storage.insertItem(remainder, size, simulate); + if (storage instanceof ExternalStorage && !simulate) { + ((ExternalStorage) storage).setHash(); + } + if (remainder == null) { break; } else { @@ -524,6 +529,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR for (IStorage storage : this.storage.getStorages()) { ItemStack took = storage.extractItem(stack, requested - received, flags); + if (storage instanceof ExternalStorage) { + ((ExternalStorage) storage).setHash(); + } + if (took != null) { if (newStack == null) { newStack = took; diff --git a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java index 3ed8b7352..f3372e4b0 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java @@ -17,6 +17,8 @@ public class DeepStorageUnitStorage extends ExternalStorage { public DeepStorageUnitStorage(TileExternalStorage externalStorage, IDeepStorageUnit unit) { this.externalStorage = externalStorage; this.unit = unit; + + setHash(); } @Override @@ -24,6 +26,11 @@ public class DeepStorageUnitStorage extends ExternalStorage { return unit.getMaxStoredCount(); } + @Override + public int getHash() { + return RefinedStorageUtils.getItemStackHashCode(unit.getStoredItemType()); + } + @Override public List getItems() { if (unit.getStoredItemType() != null && unit.getStoredItemType().stackSize > 0) { diff --git a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java index c25924744..3f0666aab 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java @@ -17,6 +17,8 @@ public class DrawerStorage extends ExternalStorage { public DrawerStorage(TileExternalStorage externalStorage, IDrawer drawer) { this.externalStorage = externalStorage; this.drawer = drawer; + + setHash(); } @Override @@ -24,6 +26,11 @@ public class DrawerStorage extends ExternalStorage { return drawer.getMaxCapacity(); } + @Override + public int getHash() { + return RefinedStorageUtils.getItemStackHashCode(drawer.getStoredItemPrototype(), drawer.getStoredItemCount()); + } + @Override public List getItems() { if (!drawer.isEmpty() && drawer.getStoredItemCount() > 0) { diff --git a/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java index 2baeed82e..59b8a9b1e 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java @@ -3,5 +3,23 @@ package refinedstorage.tile.externalstorage; import refinedstorage.api.storage.IStorage; public abstract class ExternalStorage implements IStorage { + private int hash = -1; + public abstract int getCapacity(); + + public void setHash() { + this.hash = getHash(); + } + + public abstract int getHash(); + + public boolean isDirty() { + if (hash != -1 && hash != getHash()) { + hash = getHash(); + + return true; + } + + return false; + } } diff --git a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java index f56af7c1e..aa1309d80 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java @@ -16,6 +16,8 @@ public class ItemHandlerStorage extends ExternalStorage { public ItemHandlerStorage(TileExternalStorage externalStorage, IItemHandler handler) { this.externalStorage = externalStorage; this.handler = handler; + + setHash(); } @Override @@ -23,6 +25,19 @@ public class ItemHandlerStorage extends ExternalStorage { return handler.getSlots() * 64; } + @Override + public int getHash() { + int code = 0; + + for (int i = 0; i < handler.getSlots(); ++i) { + if (handler.getStackInSlot(i) != null && handler.getStackInSlot(i).getItem() != null) { + code += RefinedStorageUtils.getItemStackHashCode(handler.getStackInSlot(i)); + } + } + + return code; + } + @Override public List getItems() { List items = new ArrayList(); diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index 5fe2e3eca..381ecc4df 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -42,7 +42,6 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I private List storages = new ArrayList(); private int lastDrawerCount; - private boolean updatedOnce; @Override public int getEnergyUsage() { @@ -58,21 +57,23 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I super.onConnectionChange(network, state); network.getStorage().rebuild(); - - updatedOnce = false; } @Override public void update() { - if (isConnected()) { - if (!updatedOnce) { - updateStorage(); + if (!worldObj.isRemote && network != null) { + for (ExternalStorage storage : storages) { + if (storage.isDirty()) { + updateStorage(network); - updatedOnce = true; - } else if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) { + break; + } + } + + if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) { lastDrawerCount = ((IDrawerGroup) getFacingTile()).getDrawerCount(); - updateStorage(); + updateStorage(network); } } @@ -173,8 +174,9 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I markDirty(); } - // Called when the neighbor block changes or when a drawer is added or removed to a drawer group - public void updateStorage() { + public void updateStorage(INetworkMaster network) { + System.out.println("Updating storages"); + storages.clear(); TileEntity facing = getFacingTile();