From 1b476ea65d025160a1cccd795e143bb3cb806bf2 Mon Sep 17 00:00:00 2001 From: "Joseph C. Sible" Date: Thu, 22 Nov 2018 12:44:31 -0500 Subject: [PATCH] Fix #1583 --- changelog.txt | 3 +++ .../StorageScannerTileEntity.java | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/changelog.txt b/changelog.txt index 514dc4f1f..79eaaf1e8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +7.59: +- Joseph fixed the storage scanner double-counting the contents of double chests. + 7.58: - This release requires that you also upgrade all other mods that add screen modules (RFTools Control, RFTools Dimensions, Deep Resonance) - Fully fixed the bug where the screen block could let players set arbitrary NBT on items diff --git a/src/main/java/mcjty/rftools/blocks/storagemonitor/StorageScannerTileEntity.java b/src/main/java/mcjty/rftools/blocks/storagemonitor/StorageScannerTileEntity.java index d2f8aa419..f4b0a3b72 100644 --- a/src/main/java/mcjty/rftools/blocks/storagemonitor/StorageScannerTileEntity.java +++ b/src/main/java/mcjty/rftools/blocks/storagemonitor/StorageScannerTileEntity.java @@ -682,14 +682,18 @@ public Stream findInventories() { // First remove all inventories that are either out of range or no longer an inventory: List old = inventories; Set oldAdded = new HashSet<>(); + Set seenItemHandlers = new HashSet<>(); inventories = new ArrayList<>(); for (BlockPos p : old) { if (xnetAccess.containsKey(p) || inRange(p)) { TileEntity te = getWorld().getTileEntity(p); if (InventoryHelper.isInventory(te) && !(te instanceof StorageScannerTileEntity)) { - inventories.add(p); - oldAdded.add(p); + IItemHandler handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + if (handler == null || seenItemHandlers.add(handler)) { + inventories.add(p); + oldAdded.add(p); + } } } } @@ -699,12 +703,12 @@ public Stream findInventories() { for (int z = getPos().getZ() - radius; z <= getPos().getZ() + radius; z++) { for (int y = getPos().getY() - radius; y <= getPos().getY() + radius; y++) { BlockPos p = new BlockPos(x, y, z); - inventoryAddNew(oldAdded, p); + inventoryAddNew(oldAdded, seenItemHandlers, p); } } } for (BlockPos p : xnetAccess.keySet()) { - inventoryAddNew(oldAdded, p); + inventoryAddNew(oldAdded, seenItemHandlers, p); inventoriesFromXNet.add(p); } @@ -716,12 +720,15 @@ public Stream getAllInventories() { .filter(this::isValid); } - private void inventoryAddNew(Set oldAdded, BlockPos p) { + private void inventoryAddNew(Set oldAdded, Set seenItemHandlers, BlockPos p) { if (!oldAdded.contains(p)) { TileEntity te = getWorld().getTileEntity(p); if (InventoryHelper.isInventory(te) && !(te instanceof StorageScannerTileEntity)) { if (!inventories.contains(p)) { - inventories.add(p); + IItemHandler handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + if (handler == null || seenItemHandlers.add(handler)) { + inventories.add(p); + } } } }