From f45a478d5906eaedd3cb0f00ae76925e67e42354 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Fri, 23 Jun 2017 21:01:21 +0200 Subject: [PATCH] The Interface now exposes the entire storage inventory (if no slots are set for exporting) for interaction with other mods or vanilla, fixes #1322 --- CHANGELOG.md | 2 + .../api/storage/IStorageCache.java | 14 +++- .../refinedstorage/apiimpl/API.java | 2 +- .../apiimpl/network/NetworkNodeGraph.java | 2 +- .../apiimpl/network/NetworkNodeListener.java | 2 +- .../network/node/NetworkNodeInterface.java | 28 +++++-- .../NetworkNodeExternalStorage.java | 2 +- .../apiimpl/storage/StorageCacheFluid.java | 22 +++--- .../apiimpl/storage/StorageCacheItem.java | 24 +++--- .../storage/StorageCacheItemPortable.java | 22 +++--- .../refinedstorage/block/BlockBase.java | 2 +- .../refinedstorage/block/BlockCable.java | 2 +- .../CapabilityNetworkNodeProxy.java | 2 +- .../inventory/ItemHandlerBase.java | 8 ++ .../inventory/ItemHandlerInterface.java | 79 +++++++++++++++++++ .../inventory/ItemHandlerStorage.java | 16 ++-- .../refinedstorage/proxy/ProxyCommon.java | 1 + .../refinedstorage/tile/TileController.java | 2 +- .../refinedstorage/tile/TileNode.java | 2 +- .../tile/grid/portable/TilePortableGrid.java | 7 +- 20 files changed, 180 insertions(+), 61 deletions(-) rename src/main/java/com/raoulvdberge/refinedstorage/{proxy => capability}/CapabilityNetworkNodeProxy.java (96%) mode change 100755 => 100644 create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerInterface.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0223c83a9..61a951261 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ - Fixed Solderer crashing (raoulvdberge) - Fixed Solderer being able to work with insufficient ingredients (raoulvdberge) - Fixed Interface extracting from itself when trying to keep items in stock (raoulvdberge) +- Fixed Quartz Enriched Iron recipe only giving 1 instead of 4 (jhjaggars) - The Portable Grid now exposes an inventory for interaction with other mods or vanilla (raoulvdberge) +- The Interface now exposes the entire storage inventory (if no slots are set for exporting) for interaction with other mods or vanilla (raoulvdberge) - The Relay now reacts instantly to a redstone signal again, removed throttling for it (raoulvdberge) ### 1.5.2 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 d9804b6de..4b3b42004 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java @@ -4,7 +4,6 @@ import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.util.IStackList; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.List; import java.util.function.BiConsumer; @@ -49,11 +48,18 @@ public interface IStorageCache { void remove(@Nonnull T stack, int size); /** - * Sets a listener to be called when this storage cache changes. + * Adds a listener to be called when this storage cache changes. * - * @param listener the listener, or null when no listener is needed + * @param listener the listener */ - void setListener(@Nullable BiConsumer listener); + void addListener(BiConsumer listener); + + /** + * Removes a listener from the storage cache. + * + * @param listener the listener + */ + void removeListener(BiConsumer listener); /** * Resorts the storages in this cache according to their priority. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 57cae9057..59e76b0cd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -31,7 +31,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskBehavior; import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer; import com.raoulvdberge.refinedstorage.apiimpl.util.StackListFluid; import com.raoulvdberge.refinedstorage.apiimpl.util.StackListItem; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java index f93e527cd..b3a75821f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java @@ -21,7 +21,7 @@ import java.util.Collection; import java.util.Queue; import java.util.Set; -import static com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY; +import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY; public class NetworkNodeGraph implements INetworkNodeGraph { private TileController controller; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java index c1538dfa9..7e24d91a5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java @@ -5,7 +5,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.event.world.BlockEvent; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index 1a5edbb4f..fe4cceecd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -2,13 +2,11 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage.StorageItemItemHandler; -import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; -import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; -import com.raoulvdberge.refinedstorage.inventory.ItemHandlerProxy; -import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; +import com.raoulvdberge.refinedstorage.inventory.*; import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import net.minecraft.item.ItemStack; @@ -28,7 +26,8 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { private ItemHandlerBase exportSpecimenItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this)); private ItemHandlerBase exportItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this)); - private ItemHandlerProxy items = new ItemHandlerProxy(importItems, exportItems); + private IItemHandler items = new ItemHandlerProxy(importItems, exportItems); + private ItemHandlerInterface itemsNetwork; private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING); @@ -119,6 +118,21 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { } } + @Override + protected void onConnectedStateChange(INetwork network, boolean state) { + super.onConnectedStateChange(network, state); + + if (state) { + itemsNetwork = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems); + + network.getItemStorageCache().addListener(itemsNetwork); + } else if (itemsNetwork != null) { + network.getItemStorageCache().removeListener(itemsNetwork); + + itemsNetwork = null; + } + } + @Override public int getCompare() { return compare; @@ -190,8 +204,8 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { return exportItems; } - public ItemHandlerProxy getItems() { - return items; + public IItemHandler getItems() { + return (itemsNetwork != null && exportSpecimenItems.isEmpty()) ? itemsNetwork : items; } public IItemHandler getUpgrades() { 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 c251d36b9..68ae704cc 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 @@ -11,10 +11,10 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.TileExternalStorage; import com.raoulvdberge.refinedstorage.tile.config.*; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; 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 0082c7642..f3b52a6e7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java @@ -11,7 +11,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API; import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.BiConsumer; @@ -20,8 +20,7 @@ public class StorageCacheFluid implements IStorageCache { private INetwork network; private CopyOnWriteArrayList> storages = new CopyOnWriteArrayList<>(); private IStackList list = API.instance().createFluidStackList(); - @Nullable - private BiConsumer listener; + private List> listeners = new LinkedList<>(); public StorageCacheFluid(INetwork network) { this.network = network; @@ -59,9 +58,7 @@ public class StorageCacheFluid implements IStorageCache { if (!rebuilding) { network.sendFluidStorageDeltaToClient(stack, size); - if (listener != null) { - listener.accept(stack, size); - } + listeners.forEach(l -> l.accept(stack, size)); } } @@ -70,15 +67,18 @@ public class StorageCacheFluid implements IStorageCache { if (list.remove(stack, size)) { network.sendFluidStorageDeltaToClient(stack, -size); - if (listener != null) { - listener.accept(stack, -size); - } + listeners.forEach(l -> l.accept(stack, -size)); } } @Override - public void setListener(@Nullable BiConsumer listener) { - this.listener = listener; + public void addListener(BiConsumer listener) { + listeners.add(listener); + } + + @Override + public void removeListener(BiConsumer listener) { + listeners.remove(listener); } @Override 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 765b637a5..8e2b54767 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java @@ -11,7 +11,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API; import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.BiConsumer; @@ -20,8 +20,7 @@ public class StorageCacheItem implements IStorageCache { private INetwork network; private CopyOnWriteArrayList> storages = new CopyOnWriteArrayList<>(); private IStackList list = API.instance().createItemStackList(); - @Nullable - private BiConsumer listener; + private List> listeners = new LinkedList<>(); public StorageCacheItem(INetwork network) { this.network = network; @@ -60,11 +59,9 @@ public class StorageCacheItem implements IStorageCache { if (!rebuilding) { network.sendItemStorageDeltaToClient(stack, size); - - if (listener != null) { - listener.accept(stack, size); - } } + + listeners.forEach(l -> l.accept(stack, size)); } @Override @@ -72,15 +69,18 @@ public class StorageCacheItem implements IStorageCache { if (list.remove(stack, size)) { network.sendItemStorageDeltaToClient(stack, -size); - if (listener != null) { - listener.accept(stack, -size); - } + listeners.forEach(l -> l.accept(stack, -size)); } } @Override - public void setListener(@Nullable BiConsumer listener) { - this.listener = listener; + public void addListener(BiConsumer listener) { + listeners.add(listener); + } + + @Override + public void removeListener(BiConsumer listener) { + listeners.remove(listener); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java index 5e1f28122..5ea2179f2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java @@ -14,16 +14,15 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.function.BiConsumer; public class StorageCacheItemPortable implements IStorageCache { private IPortableGrid portableGrid; private IStackList list = API.instance().createItemStackList(); - @Nullable - private BiConsumer listener; + private List> listeners = new LinkedList<>(); public StorageCacheItemPortable(IPortableGrid portableGrid) { this.portableGrid = portableGrid; @@ -47,9 +46,7 @@ public class StorageCacheItemPortable implements IStorageCache { if (!rebuilding) { portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w)); - if (listener != null) { - listener.accept(stack, size); - } + listeners.forEach(l -> l.accept(stack, size)); } } @@ -58,15 +55,18 @@ public class StorageCacheItemPortable implements IStorageCache { if (list.remove(stack, size)) { portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), (EntityPlayerMP) w)); - if (listener != null) { - listener.accept(stack, -size); - } + listeners.forEach(l -> l.accept(stack, -size)); } } @Override - public void setListener(@Nullable BiConsumer listener) { - this.listener = listener; + public void addListener(BiConsumer listener) { + listeners.add(listener); + } + + @Override + public void removeListener(BiConsumer listener) { + listeners.remove(listener); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java index 51ce09e8e..c9f4e483e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java @@ -5,11 +5,11 @@ import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.api.network.security.Permission; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.container.ContainerBase; import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP; import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon; import com.raoulvdberge.refinedstorage.item.ItemBlockBase; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.TileBase; import net.minecraft.block.Block; import net.minecraft.block.material.Material; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java index e0e6616e1..1c780c465 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java @@ -1,9 +1,9 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP; import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.TileCable; import com.raoulvdberge.refinedstorage.tile.TileNode; import net.minecraft.block.properties.PropertyBool; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/CapabilityNetworkNodeProxy.java b/src/main/java/com/raoulvdberge/refinedstorage/capability/CapabilityNetworkNodeProxy.java old mode 100755 new mode 100644 similarity index 96% rename from src/main/java/com/raoulvdberge/refinedstorage/proxy/CapabilityNetworkNodeProxy.java rename to src/main/java/com/raoulvdberge/refinedstorage/capability/CapabilityNetworkNodeProxy.java index 4747f9537..10ccf2e01 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/CapabilityNetworkNodeProxy.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/capability/CapabilityNetworkNodeProxy.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.proxy; +package com.raoulvdberge.refinedstorage.capability; import com.google.common.base.Preconditions; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBase.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBase.java index cc42a88a7..004c8afbe 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBase.java @@ -12,6 +12,8 @@ public class ItemHandlerBase extends ItemStackHandler { @Nullable private Consumer listener; + private boolean empty = true; + protected Predicate[] validators; public ItemHandlerBase(int size, @Nullable Consumer listener, Predicate... validators) { @@ -57,6 +59,12 @@ public class ItemHandlerBase extends ItemStackHandler { if (listener != null) { listener.accept(slot); } + + this.empty = stacks.stream().allMatch(ItemStack::isEmpty); + } + + public boolean isEmpty() { + return empty; } @Nonnull diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerInterface.java new file mode 100644 index 000000000..1631c1986 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerInterface.java @@ -0,0 +1,79 @@ +package com.raoulvdberge.refinedstorage.inventory; + +import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; +import com.raoulvdberge.refinedstorage.api.util.IComparer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +import javax.annotation.Nonnull; +import java.util.function.BiConsumer; + +public class ItemHandlerInterface implements IItemHandler, BiConsumer { + private INetwork network; + private IStorageCache storageCache; + private IItemHandler importItems; + private ItemStack[] storageCacheData; + + public ItemHandlerInterface(INetwork network, IStorageCache storageCache, IItemHandler importItems) { + this.network = network; + this.storageCache = storageCache; + this.importItems = importItems; + + invalidate(); + } + + @Override + public int getSlots() { + return importItems.getSlots() + storageCacheData.length; + } + + @Nonnull + @Override + public ItemStack getStackInSlot(int slot) { + if (slot < importItems.getSlots()) { + return importItems.getStackInSlot(slot); + } else if (slot < importItems.getSlots() + storageCacheData.length) { + return storageCacheData[slot - importItems.getSlots()]; + } + + return ItemStack.EMPTY; + } + + @Nonnull + @Override + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { + if (slot < importItems.getSlots()) { + return importItems.insertItem(slot, stack, simulate); + } + + return stack; + } + + @Nonnull + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot < importItems.getSlots()) { + return ItemStack.EMPTY; + } else if (slot < importItems.getSlots() + storageCacheData.length) { + return RSUtils.transformNullToEmpty(network.extractItem(storageCacheData[slot - importItems.getSlots()], amount, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, simulate)); + } + + return ItemStack.EMPTY; + } + + @Override + public int getSlotLimit(int slot) { + return 64; + } + + @Override + public void accept(ItemStack stack, Integer amount) { + invalidate(); + } + + private void invalidate() { + this.storageCacheData = storageCache.getList().getStacks().toArray(new ItemStack[0]); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java index 011fa1217..98ab34627 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java @@ -8,17 +8,18 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; +import java.util.function.BiConsumer; -public class ItemHandlerStorage implements IItemHandler { +public class ItemHandlerStorage implements IItemHandler, BiConsumer { private IStorage storage; + private IStorageCache storageCache; private ItemStack[] storageCacheData; public ItemHandlerStorage(IStorage storage, IStorageCache storageCache) { this.storage = storage; + this.storageCache = storageCache; - storageCache.setListener((stack, size) -> invalidate(storageCache)); - - invalidate(storageCache); + invalidate(); } @Override @@ -50,7 +51,12 @@ public class ItemHandlerStorage implements IItemHandler { return 64; } - private void invalidate(IStorageCache storageCache) { + @Override + public void accept(ItemStack stack, Integer amount) { + invalidate(); + } + + private void invalidate() { this.storageCacheData = storageCache.getList().getStacks().toArray(new ItemStack[0]); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index 1e15ede73..fc28727b4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -19,6 +19,7 @@ import com.raoulvdberge.refinedstorage.block.BlockBase; import com.raoulvdberge.refinedstorage.block.FluidStorageType; import com.raoulvdberge.refinedstorage.block.GridType; import com.raoulvdberge.refinedstorage.block.ItemStorageType; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.gui.GuiHandler; import com.raoulvdberge.refinedstorage.integration.craftingtweaks.IntegrationCraftingTweaks; import com.raoulvdberge.refinedstorage.integration.forgeenergy.ReaderWriterHandlerForgeEnergy; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 64121675e..469c34cb1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -33,12 +33,12 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem; import com.raoulvdberge.refinedstorage.block.BlockController; import com.raoulvdberge.refinedstorage.block.ControllerType; import com.raoulvdberge.refinedstorage.block.GridType; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor; import com.raoulvdberge.refinedstorage.container.ContainerGrid; import com.raoulvdberge.refinedstorage.container.ContainerReaderWriter; import com.raoulvdberge.refinedstorage.integration.forgeenergy.EnergyForge; import com.raoulvdberge.refinedstorage.network.*; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index 730c1cd14..d61995f4a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -5,7 +5,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.api.util.IWrenchable; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; -import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index baaaafb6e..6a119a3db 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -172,6 +172,10 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, super.onContentsChanged(slot); if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + if (itemHandler != null) { + cache.removeListener(itemHandler); + } + if (getStackInSlot(slot).isEmpty()) { storage = null; } else { @@ -186,12 +190,11 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, } cache.invalidate(); - cache.setListener(null); if (storage == null) { itemHandler = null; } else { - itemHandler = new ItemHandlerStorage(storage, cache); + cache.addListener(itemHandler = new ItemHandlerStorage(storage, cache)); } if (world != null) {