Remove list, use single listener for storage cache listener

This commit is contained in:
raoulvdberge
2017-06-21 19:27:22 +02:00
parent ca1cf2a6ef
commit aaa75992f4
6 changed files with 43 additions and 34 deletions

View File

@@ -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<T> {
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<T, Integer> listener);
void setListener(@Nullable BiConsumer<T, Integer> listener);
/**
* Resorts the storages in this cache according to their priority.

View File

@@ -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<FluidStack> {
private INetwork network;
private CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<FluidStack> list = API.instance().createFluidStackList();
private List<BiConsumer<FluidStack, Integer>> listeners = new LinkedList<>();
@Nullable
private BiConsumer<FluidStack, Integer> listener;
public StorageCacheFluid(INetwork network) {
this.network = network;
@@ -58,7 +59,9 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
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<FluidStack> {
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<FluidStack, Integer> listener) {
listeners.add(listener);
public void setListener(@Nullable BiConsumer<FluidStack, Integer> listener) {
this.listener = listener;
}
@Override

View File

@@ -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<ItemStack> {
private INetwork network;
private CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<ItemStack> list = API.instance().createItemStackList();
private List<BiConsumer<ItemStack, Integer>> listeners = new LinkedList<>();
@Nullable
private BiConsumer<ItemStack, Integer> listener;
public StorageCacheItem(INetwork network) {
this.network = network;
@@ -60,7 +61,9 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
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<ItemStack> {
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<ItemStack, Integer> listener) {
listeners.add(listener);
public void setListener(@Nullable BiConsumer<ItemStack, Integer> listener) {
this.listener = listener;
}
@Override

View File

@@ -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<ItemStack> {
private IPortableGrid portableGrid;
private IStackList<ItemStack> list = API.instance().createItemStackList();
private List<BiConsumer<ItemStack, Integer>> listeners = new LinkedList<>();
@Nullable
private BiConsumer<ItemStack, Integer> listener;
public StorageCacheItemPortable(IPortableGrid portableGrid) {
this.portableGrid = portableGrid;
@@ -46,7 +47,9 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
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<ItemStack> {
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<ItemStack, Integer> listener) {
listeners.add(listener);
public void setListener(@Nullable BiConsumer<ItemStack, Integer> listener) {
this.listener = listener;
}
@Override

View File

@@ -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<ItemStack, Integer> {
public class ItemHandlerStorage implements IItemHandler {
private IStorage<ItemStack> storage;
private IStorageCache<ItemStack> storageCache;
private ItemStack[] storageCacheData;
public ItemHandlerStorage(IStorage<ItemStack> storage, IStorageCache<ItemStack> 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<ItemStack, I
return 64;
}
@Override
public void accept(ItemStack stack, Integer amount) {
invalidate();
}
private void invalidate() {
private void invalidate(IStorageCache<ItemStack> storageCache) {
this.storageCacheData = storageCache.getList().getStacks().toArray(new ItemStack[0]);
}
}

View File

@@ -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) {