From 8f55352330f2debba491300260db6fb4969b6071 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Thu, 11 Aug 2016 23:32:05 +0200 Subject: [PATCH] Fixed item duplication bug with External Storage --- CHANGELOG.md | 5 +++++ .../storage/item/GroupedItemStorage.java | 2 +- .../ItemStorageItemHandler.java | 22 ++++++++++++++----- .../externalstorage/TileExternalStorage.java | 16 ++++++-------- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49886caeb..35e043950 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Refined Storage Changelog +### 0.8.19 +**Bugfixes** +- Fixed item duplication bug with External Storage +- Fixed External Storage taking too long to update storage + ### 0.8.18 **Bugfixes** - Fixed Detector mode not persisting diff --git a/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java index 4c751672e..8977c1ff5 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java @@ -81,7 +81,7 @@ public class GroupedItemStorage implements IGroupedItemStorage { if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { otherStack.stackSize -= stack.stackSize; - if (otherStack.stackSize == 0) { + if (otherStack.stackSize <= 0) { if (!NetworkUtils.hasPattern(network, stack)) { stacks.remove(otherStack.getItem(), otherStack); } diff --git a/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java index 3a7227cd7..a1dac4773 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java @@ -47,21 +47,33 @@ public class ItemStorageItemHandler extends ItemStorageExternal { @Override public ItemStack extractItem(ItemStack stack, int size, int flags) { + int remaining = size; + + ItemStack received = null; + for (int i = 0; i < handler.getSlots(); ++i) { ItemStack slot = handler.getStackInSlot(i); if (slot != null && CompareUtils.compareStack(slot, stack, flags)) { - size = Math.min(size, slot.stackSize); + ItemStack got = handler.extractItem(i, remaining, false); - ItemStack took = ItemHandlerHelper.copyStackWithSize(slot, size); + if (got != null) { + if (received == null) { + received = got; + } else { + received.stackSize += got.stackSize; + } - handler.extractItem(i, size, false); + remaining -= got.stackSize; - return took; + if (remaining == 0) { + break; + } + } } } - return null; + return received; } @Override diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index 421fa3373..2409535d7 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -102,18 +102,16 @@ public class TileExternalStorage extends TileMultipartNode implements IStoragePr @Override public void update() { if (!worldObj.isRemote && network != null) { - if (ticks % (20 * 4) == 0) { - boolean shouldRebuild = false; + boolean changeDetected = false; - for (ItemStorageExternal storage : storages) { - if (storage.updateCache()) { - shouldRebuild = true; - } + for (ItemStorageExternal storage : storages) { + if (storage.updateCache()) { + changeDetected = true; } + } - if (shouldRebuild) { - network.getItemStorage().rebuild(); - } + if (changeDetected) { + network.getItemStorage().rebuild(); } if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) {