From aaa75992f43aa9a9168944be52a6490c17f46720 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Wed, 21 Jun 2017 19:27:22 +0200 Subject: [PATCH] Remove list, use single listener for storage cache listener --- .../api/storage/IStorageCache.java | 7 ++++--- .../apiimpl/storage/StorageCacheFluid.java | 17 +++++++++++------ .../apiimpl/storage/StorageCacheItem.java | 17 +++++++++++------ .../storage/StorageCacheItemPortable.java | 17 +++++++++++------ .../inventory/ItemHandlerStorage.java | 16 +++++----------- .../tile/grid/portable/TilePortableGrid.java | 3 +-- 6 files changed, 43 insertions(+), 34 deletions(-) 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 ddf87c690..d9804b6de 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java @@ -4,6 +4,7 @@ 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; @@ -48,11 +49,11 @@ public interface IStorageCache { void remove(@Nonnull T stack, int size); /** - * Adds a listener to be called when this storage cache changes. + * Sets a listener to be called when this storage cache changes. * - * @param listener the listener + * @param listener the listener, or null when no listener is needed */ - void addListener(BiConsumer listener); + void setListener(@Nullable BiConsumer listener); /** * Resorts the storages in this cache according to their priority. 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 d83fa85b0..0082c7642 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 java.util.LinkedList; +import javax.annotation.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.BiConsumer; @@ -20,7 +20,8 @@ public class StorageCacheFluid implements IStorageCache { private INetwork network; private CopyOnWriteArrayList> storages = new CopyOnWriteArrayList<>(); private IStackList list = API.instance().createFluidStackList(); - private List> listeners = new LinkedList<>(); + @Nullable + private BiConsumer listener; public StorageCacheFluid(INetwork network) { this.network = network; @@ -58,7 +59,9 @@ public class StorageCacheFluid implements IStorageCache { if (!rebuilding) { network.sendFluidStorageDeltaToClient(stack, size); - listeners.forEach(l -> l.accept(stack, size)); + if (listener != null) { + listener.accept(stack, size); + } } } @@ -67,13 +70,15 @@ public class StorageCacheFluid implements IStorageCache { if (list.remove(stack, size)) { network.sendFluidStorageDeltaToClient(stack, -size); - listeners.forEach(l -> l.accept(stack, -size)); + if (listener != null) { + listener.accept(stack, -size); + } } } @Override - public void addListener(BiConsumer listener) { - listeners.add(listener); + public void setListener(@Nullable BiConsumer listener) { + this.listener = 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 fe1e526b6..765b637a5 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 java.util.LinkedList; +import javax.annotation.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.BiConsumer; @@ -20,7 +20,8 @@ public class StorageCacheItem implements IStorageCache { private INetwork network; private CopyOnWriteArrayList> storages = new CopyOnWriteArrayList<>(); private IStackList list = API.instance().createItemStackList(); - private List> listeners = new LinkedList<>(); + @Nullable + private BiConsumer listener; public StorageCacheItem(INetwork network) { this.network = network; @@ -60,7 +61,9 @@ public class StorageCacheItem implements IStorageCache { if (!rebuilding) { network.sendItemStorageDeltaToClient(stack, size); - listeners.forEach(l -> l.accept(stack, size)); + if (listener != null) { + listener.accept(stack, size); + } } } @@ -69,13 +72,15 @@ public class StorageCacheItem implements IStorageCache { if (list.remove(stack, size)) { network.sendItemStorageDeltaToClient(stack, -size); - listeners.forEach(l -> l.accept(stack, -size)); + if (listener != null) { + listener.accept(stack, -size); + } } } @Override - public void addListener(BiConsumer listener) { - listeners.add(listener); + public void setListener(@Nullable BiConsumer listener) { + this.listener = 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 6af1b75b1..5e1f28122 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItemPortable.java @@ -14,15 +14,16 @@ 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(); - private List> listeners = new LinkedList<>(); + @Nullable + private BiConsumer listener; public StorageCacheItemPortable(IPortableGrid portableGrid) { this.portableGrid = portableGrid; @@ -46,7 +47,9 @@ public class StorageCacheItemPortable implements IStorageCache { if (!rebuilding) { portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w)); - listeners.forEach(l -> l.accept(stack, size)); + if (listener != null) { + listener.accept(stack, size); + } } } @@ -55,13 +58,15 @@ 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)); - listeners.forEach(l -> l.accept(stack, -size)); + if (listener != null) { + listener.accept(stack, -size); + } } } @Override - public void addListener(BiConsumer listener) { - listeners.add(listener); + public void setListener(@Nullable BiConsumer listener) { + this.listener = listener; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java index 98ab34627..011fa1217 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerStorage.java @@ -8,18 +8,17 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; -import java.util.function.BiConsumer; -public class ItemHandlerStorage implements IItemHandler, BiConsumer { +public class ItemHandlerStorage implements IItemHandler { private IStorage storage; - private IStorageCache storageCache; private ItemStack[] storageCacheData; public ItemHandlerStorage(IStorage storage, IStorageCache storageCache) { this.storage = storage; - this.storageCache = storageCache; - invalidate(); + storageCache.setListener((stack, size) -> invalidate(storageCache)); + + invalidate(storageCache); } @Override @@ -51,12 +50,7 @@ public class ItemHandlerStorage implements IItemHandler, BiConsumer storageCache) { this.storageCacheData = storageCache.getList().getStacks().toArray(new ItemStack[0]); } } 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 c29fd58a4..baaaafb6e 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 @@ -186,13 +186,12 @@ 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); } if (world != null) {