From 393a3ffa3cb66f1ac4c56c14b6f3d987413be46e Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Fri, 5 May 2017 21:59:47 +0200 Subject: [PATCH] Fixes #1144 - "Refined Storage thinks that I have double of everything in my drawers when using two external storages busses" --- CHANGELOG.md | 1 + .../api/storage/IStorageCache.java | 18 ++++++++++-------- .../api/storage/IStorageProvider.java | 10 ++++------ .../apiimpl/network/node/NetworkNode.java | 6 +++++- .../network/node/NetworkNodeFluidStorage.java | 9 ++++----- .../network/node/NetworkNodeStorage.java | 11 ++++++----- .../node/diskdrive/NetworkNodeDiskDrive.java | 17 ++++++++--------- .../NetworkNodeExternalStorage.java | 10 +++++----- .../externalstorage/StorageFluidExternal.java | 5 +++++ .../externalstorage/StorageItemCyclops.java | 13 +++++++------ .../externalstorage/StorageItemDrawer.java | 4 ++-- .../StorageItemDrawerGroup.java | 4 ++-- .../externalstorage/StorageItemExternal.java | 10 ++++++++++ .../StorageItemItemHandler.java | 4 ++-- .../apiimpl/storage/StorageCacheFluid.java | 11 +++++++++-- .../apiimpl/storage/StorageCacheItem.java | 11 +++++++++-- 16 files changed, 89 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12339a9b4..435b1e4ac 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Fixed Crafting Tweaks buttons positioned wrongly (blay09) - Fixed Crafting Tweaks keybindings interfering with RS keybindings (blay09) - Fixed crash when updating storages (raoulvdberge) +- Fixed External Storage showing the wrong amount of items if you connect multiple External Storages to the same inventory (raoulvdberge) ### 1.4.4 - Updated Forge to 2284 (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java index bb5439122..276116a58 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java @@ -23,10 +23,6 @@ public interface IStorageCache { /** * Adds a stack to the cache. - *

- * Note that this doesn't modify any of the connected storages, but just modifies the cache. - * Use {@link IStorage#insert(T, int, boolean)} to add a stack to an actual storage. - *

* Will merge it with another stack if it already exists. * * @param stack the stack to add, do NOT modify @@ -37,9 +33,6 @@ public interface IStorageCache { /** * Removes a stack from the cache. - *

- * Note that this doesn't modify any of the connected storages, but just modifies the cache. - * Use {@link IStorage#extract(T, int, int, boolean)} to remove a stack from an actual storage. * * @param stack the stack to remove, do NOT modify * @param size the size to remove @@ -58,7 +51,16 @@ public interface IStorageCache { IStackList getList(); /** - * @return the storages connected to this network + * @return the storages in this cache, do NOT modify */ List> getStorages(); + + /** + * Adds a storage to the cache. + * Will not add duplicate storages, it checks this with Object#equals. + * + * @param storage the storage + * @return true if the storage was added successfully, false otherwise + */ + boolean addStorage(IStorage storage); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageProvider.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageProvider.java index b5557f38e..ac3ba3afb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageProvider.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageProvider.java @@ -3,19 +3,17 @@ package com.raoulvdberge.refinedstorage.api.storage; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import java.util.List; - /** * Represents a node that provides the network with storage. */ public interface IStorageProvider { /** - * @param storages the item storages + * @param cache the storage cache */ - void addItemStorages(List> storages); + void addItemStorages(IStorageCache cache); /** - * @param storages the fluid storages + * @param cache the storage cache */ - void addFluidStorages(List> storages); + void addFluidStorages(IStorageCache cache); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java index 08cac3ff2..ad037ba83 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java @@ -162,8 +162,12 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA } } + public BlockPos getFacingTilePosition() { + return holder.pos().offset(holder.getDirection()); + } + public TileEntity getFacingTile() { - return holder.world().getTileEntity(holder.pos().offset(holder.getDirection())); + return holder.world().getTileEntity(getFacingTilePosition()); } public IItemHandler getDrops() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java index 96bd51886..4b3aa39ff 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java @@ -5,7 +5,7 @@ import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; -import com.raoulvdberge.refinedstorage.api.storage.IStorage; +import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskFluid; @@ -22,7 +22,6 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, IStorageProvider, IComparable, IFilterable, IPrioritizable, IExcessVoidable, IAccessType { public static final String ID = "fluid_storage"; @@ -118,14 +117,14 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, } @Override - public void addItemStorages(List> storages) { + public void addItemStorages(IStorageCache cache) { // NO OP } @Override - public void addFluidStorages(List> storages) { + public void addFluidStorages(IStorageCache cache) { if (storage != null) { - storages.add(storage); + cache.addStorage(storage); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java index 905b67ad0..d36d8bff5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java @@ -5,7 +5,7 @@ import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; -import com.raoulvdberge.refinedstorage.api.storage.IStorage; +import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskItem; @@ -22,7 +22,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; -import java.util.List; public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, IStorageProvider, IComparable, IFilterable, IPrioritizable, IExcessVoidable, IAccessType { public static final String ID = "storage"; @@ -115,12 +114,14 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto } @Override - public void addItemStorages(List> storages) { - storages.add(storage); + public void addItemStorages(IStorageCache cache) { + if (storage != null) { + cache.addStorage(storage); + } } @Override - public void addFluidStorages(List> storages) { + public void addFluidStorages(IStorageCache cache) { // NO OP } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java index 4619088db..efac5e0c7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java @@ -21,7 +21,6 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.items.IItemHandler; -import java.util.List; import java.util.function.Predicate; public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IStorageProvider, IComparable, IFilterable, IPrioritizable, IType, IExcessVoidable, IAccessType { @@ -76,8 +75,8 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS private ItemHandlerBase itemFilters = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this)); private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, new ItemHandlerListenerNetworkNode(this)); - private IStorageDisk[] itemStorages = new IStorageDisk[8]; - private IStorageDisk[] fluidStorages = new IStorageDisk[8]; + private IStorageDisk[] itemStorages = new IStorageDisk[8]; + private IStorageDisk[] fluidStorages = new IStorageDisk[8]; private AccessType accessType = AccessType.INSERT_EXTRACT; private int priority = 0; @@ -136,19 +135,19 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS } @Override - public void addItemStorages(List> storages) { - for (IStorage storage : this.itemStorages) { + public void addItemStorages(IStorageCache cache) { + for (IStorage storage : itemStorages) { if (storage != null) { - storages.add(storage); + cache.addStorage(storage); } } } @Override - public void addFluidStorages(List> storages) { - for (IStorage storage : this.fluidStorages) { + public void addFluidStorages(IStorageCache cache) { + for (IStorage storage : fluidStorages) { if (storage != null) { - storages.add(storage); + cache.addStorage(storage); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java index 7cb78ded6..e6bd2e506 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java @@ -6,7 +6,7 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; -import com.raoulvdberge.refinedstorage.api.storage.IStorage; +import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage; @@ -229,13 +229,13 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP } @Override - public void addItemStorages(List> storages) { - storages.addAll(this.itemStorages); + public void addItemStorages(IStorageCache cache) { + itemStorages.removeIf(storage -> !cache.addStorage(storage)); } @Override - public void addFluidStorages(List> storages) { - storages.addAll(this.fluidStorages); + public void addFluidStorages(IStorageCache cache) { + fluidStorages.removeIf(storage -> !cache.addStorage(storage)); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageFluidExternal.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageFluidExternal.java index 8e6cd4bb2..464110425 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageFluidExternal.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageFluidExternal.java @@ -120,4 +120,9 @@ public class StorageFluidExternal implements IStorage { public void updateCacheForcefully() { cache = RSUtils.copyStack(getContents()); } + + @Override + public boolean equals(Object o) { + return o instanceof StorageFluidExternal && externalStorage.getFacingTilePosition().equals(((StorageFluidExternal) o).externalStorage.getFacingTilePosition()); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java index 76888d1e5..a3bf771e8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java @@ -22,13 +22,13 @@ import java.util.function.Supplier; import java.util.stream.Collectors; public class StorageItemCyclops extends StorageItemExternal { - private NetworkNodeExternalStorage externalStorage; private EnumFacing opposite; private Supplier cyclopsInv; private int oldInventoryHash = -1; public StorageItemCyclops(NetworkNodeExternalStorage externalStorage) { - this.externalStorage = externalStorage; + super(externalStorage); + this.opposite = externalStorage.getHolder().getDirection().getOpposite(); this.cyclopsInv = () -> { TileEntity f = externalStorage.getFacingTile(); @@ -40,6 +40,7 @@ public class StorageItemCyclops extends StorageItemExternal { @Override public void detectChanges(INetworkMaster network) { InventoryTileEntityBase inv = cyclopsInv.get(); + if (inv != null) { int inventoryHash = inv.getInventoryHash(); @@ -118,9 +119,9 @@ public class StorageItemCyclops extends StorageItemExternal { } } - public static boolean isValid(TileEntity facingTE, EnumFacing facing) { - return facingTE instanceof InventoryTileEntityBase - && (SlotlessItemHandlerHelper.isSlotless(facingTE, facing) - || ((InventoryTileEntityBase) facingTE).getInventory() instanceof SimpleInventory); + public static boolean isValid(TileEntity facingTile, EnumFacing facing) { + return facingTile instanceof InventoryTileEntityBase + && (SlotlessItemHandlerHelper.isSlotless(facingTile, facing) + || ((InventoryTileEntityBase) facingTile).getInventory() instanceof SimpleInventory); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java index 6882f525a..29da8c4dd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java @@ -15,11 +15,11 @@ import java.util.Collections; import java.util.function.Supplier; public class StorageItemDrawer extends StorageItemExternal { - private NetworkNodeExternalStorage externalStorage; private Supplier drawerSupplier; public StorageItemDrawer(NetworkNodeExternalStorage externalStorage, Supplier drawerSupplier) { - this.externalStorage = externalStorage; + super(externalStorage); + this.drawerSupplier = drawerSupplier; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java index 0de4e7284..8d3ef8eb8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java @@ -14,11 +14,11 @@ import java.util.List; import java.util.function.Supplier; public class StorageItemDrawerGroup extends StorageItemExternal { - private NetworkNodeExternalStorage externalStorage; private Supplier groupSupplier; public StorageItemDrawerGroup(NetworkNodeExternalStorage externalStorage, Supplier groupSupplier) { - this.externalStorage = externalStorage; + super(externalStorage); + this.groupSupplier = groupSupplier; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemExternal.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemExternal.java index b0c778ac7..39eae9da4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemExternal.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemExternal.java @@ -11,8 +11,13 @@ import java.util.ArrayList; import java.util.List; public abstract class StorageItemExternal implements IStorage { + protected NetworkNodeExternalStorage externalStorage; private List cache; + public StorageItemExternal(NetworkNodeExternalStorage externalStorage) { + this.externalStorage = externalStorage; + } + public abstract int getCapacity(); public void detectChanges(INetworkMaster network) { @@ -89,4 +94,9 @@ public abstract class StorageItemExternal implements IStorage { public int getCacheDelta(int storedPreInsertion, int size, @Nullable ItemStack remainder) { return remainder == null ? size : (size - remainder.getCount()); } + + @Override + public boolean equals(Object o) { + return o instanceof StorageItemExternal && externalStorage.getFacingTilePosition().equals(((StorageItemExternal) o).externalStorage.getFacingTilePosition()); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java index 94a0816b3..4ab9ea919 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java @@ -16,12 +16,12 @@ import java.util.List; import java.util.function.Supplier; public class StorageItemItemHandler extends StorageItemExternal { - private NetworkNodeExternalStorage externalStorage; private Supplier handlerSupplier; private AccessType lockedAccessType = AccessType.INSERT_EXTRACT; public StorageItemItemHandler(NetworkNodeExternalStorage externalStorage, Supplier handlerSupplier) { - this.externalStorage = externalStorage; + super(externalStorage); + this.handlerSupplier = handlerSupplier; if (externalStorage.getFacingTile().getBlockType().getUnlocalizedName().equals("tile.ExtraUtils2:TrashCan")) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java index 2c1bdf503..a2fb03447 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java @@ -27,9 +27,11 @@ public class StorageCacheFluid implements IStorageCache { public synchronized void invalidate() { storages.clear(); - network.getNodeGraph().all().stream() + network.getNodeGraph() + .all() + .stream() .filter(node -> node.canUpdate() && node instanceof IStorageProvider) - .forEach(node -> ((IStorageProvider) node).addFluidStorages(storages)); + .forEach(node -> ((IStorageProvider) node).addFluidStorages(this)); list.clear(); @@ -78,4 +80,9 @@ public class StorageCacheFluid implements IStorageCache { public List> getStorages() { return storages; } + + @Override + public boolean addStorage(IStorage storage) { + return !storages.contains(storage) && storages.add(storage); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java index 09344660a..5af2c492c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java @@ -27,9 +27,11 @@ public class StorageCacheItem implements IStorageCache { public synchronized void invalidate() { storages.clear(); - network.getNodeGraph().all().stream() + network.getNodeGraph() + .all() + .stream() .filter(node -> node.canUpdate() && node instanceof IStorageProvider) - .forEach(node -> ((IStorageProvider) node).addItemStorages(storages)); + .forEach(node -> ((IStorageProvider) node).addItemStorages(this)); list.clear(); @@ -80,4 +82,9 @@ public class StorageCacheItem implements IStorageCache { public List> getStorages() { return storages; } + + @Override + public boolean addStorage(IStorage storage) { + return !storages.contains(storage) && storages.add(storage); + } }