From 48e44f83be2a929092b39a9f53b590c255c4985e Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sun, 10 Jul 2016 19:31:25 +0200 Subject: [PATCH] Fixed caching issues with External Storage --- CHANGELOG.md | 1 + .../refinedstorage/RefinedStorageUtils.java | 12 ------- .../refinedstorage/tile/TileSolderer.java | 2 +- .../tile/controller/TileController.java | 10 +++--- .../DeepStorageUnitStorage.java | 7 ----- .../tile/externalstorage/DrawerStorage.java | 7 ----- .../tile/externalstorage/ExternalStorage.java | 31 +++++++++++++------ .../externalstorage/ItemHandlerStorage.java | 15 --------- .../externalstorage/TileExternalStorage.java | 16 +++++++--- 9 files changed, 41 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e984f323..45c7e14a6 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ **Bugfixes** - Several models / texture tweaks - Fixed bug where Grid doesn't handle remainder sometimes +- Fixed caching issues with External Storage ### 0.8.8 **Bugfixes** diff --git a/src/main/java/refinedstorage/RefinedStorageUtils.java b/src/main/java/refinedstorage/RefinedStorageUtils.java index 9e80a0172..55c0cce08 100755 --- a/src/main/java/refinedstorage/RefinedStorageUtils.java +++ b/src/main/java/refinedstorage/RefinedStorageUtils.java @@ -327,16 +327,4 @@ 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/tile/TileSolderer.java b/src/main/java/refinedstorage/tile/TileSolderer.java index 723aef9a7..417260a9d 100755 --- a/src/main/java/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/refinedstorage/tile/TileSolderer.java @@ -78,7 +78,7 @@ public class TileSolderer extends TileNode { recipe = null; progress = 0; - // Don't set working to false yet, wait till the next update because we may have another stack waiting. + // Don't set working to false yet, wait till the next shouldUpdateCache because we may have another stack waiting. markDirty(); } diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 22f6a9ee7..e81337459 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -493,7 +493,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR remainder = storage.insertItem(remainder, size, simulate); if (storage instanceof ExternalStorage && !simulate) { - ((ExternalStorage) storage).setHash(); + ((ExternalStorage) storage).updateCacheForcefully(); } if (remainder == null) { @@ -532,11 +532,11 @@ 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 (storage instanceof ExternalStorage) { + ((ExternalStorage) storage).updateCacheForcefully(); + } + if (newStack == null) { newStack = took; } else { diff --git a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java index f3372e4b0..3ed8b7352 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java @@ -17,8 +17,6 @@ public class DeepStorageUnitStorage extends ExternalStorage { public DeepStorageUnitStorage(TileExternalStorage externalStorage, IDeepStorageUnit unit) { this.externalStorage = externalStorage; this.unit = unit; - - setHash(); } @Override @@ -26,11 +24,6 @@ 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 3f0666aab..c25924744 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java @@ -17,8 +17,6 @@ public class DrawerStorage extends ExternalStorage { public DrawerStorage(TileExternalStorage externalStorage, IDrawer drawer) { this.externalStorage = externalStorage; this.drawer = drawer; - - setHash(); } @Override @@ -26,11 +24,6 @@ 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 59b8a9b1e..1c14f3428 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java @@ -1,25 +1,38 @@ package refinedstorage.tile.externalstorage; +import net.minecraft.item.ItemStack; +import refinedstorage.RefinedStorageUtils; import refinedstorage.api.storage.IStorage; +import java.util.ArrayList; +import java.util.List; + public abstract class ExternalStorage implements IStorage { - private int hash = -1; + private List cache = new ArrayList(); public abstract int getCapacity(); - public void setHash() { - this.hash = getHash(); - } + public boolean updateCache() { + List items = getItems(); - public abstract int getHash(); - - public boolean isDirty() { - if (hash != -1 && hash != getHash()) { - hash = getHash(); + if (items.size() != cache.size()) { + cache = items; return true; + } else { + for (int i = 0; i < items.size(); ++i) { + if (!RefinedStorageUtils.compareStack(items.get(i), cache.get(i))) { + cache = items; + + return true; + } + } } return false; } + + public void updateCacheForcefully() { + cache = getItems(); + } } diff --git a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java index aa1309d80..f56af7c1e 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java @@ -16,8 +16,6 @@ public class ItemHandlerStorage extends ExternalStorage { public ItemHandlerStorage(TileExternalStorage externalStorage, IItemHandler handler) { this.externalStorage = externalStorage; this.handler = handler; - - setHash(); } @Override @@ -25,19 +23,6 @@ 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 e7044a3ee..d9cf2d2d8 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -64,11 +64,19 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I @Override public void update() { if (!worldObj.isRemote && network != null) { - for (ExternalStorage storage : storages) { - if (storage.isDirty()) { - updateStorage(network); + if (ticks % (20 * 4) == 0) { + boolean shouldRebuild = false; - break; + for (ExternalStorage storage : storages) { + if (storage.updateCache()) { + shouldRebuild = true; + } + } + + if (shouldRebuild) { + System.out.println("Rebuilding ext storage"); + + network.getStorage().rebuild(); } }