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 com.raoulvdberge.refinedstorage.api.util.IStackList;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -48,11 +49,11 @@ public interface IStorageCache<T> {
void remove(@Nonnull T stack, int size); 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. * 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 net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.LinkedList; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -20,7 +20,8 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
private INetwork network; private INetwork network;
private CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>(); private CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<FluidStack> list = API.instance().createFluidStackList(); 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) { public StorageCacheFluid(INetwork network) {
this.network = network; this.network = network;
@@ -58,7 +59,9 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
if (!rebuilding) { if (!rebuilding) {
network.sendFluidStorageDeltaToClient(stack, size); 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)) { if (list.remove(stack, size)) {
network.sendFluidStorageDeltaToClient(stack, -size); network.sendFluidStorageDeltaToClient(stack, -size);
listeners.forEach(l -> l.accept(stack, -size)); if (listener != null) {
listener.accept(stack, -size);
}
} }
} }
@Override @Override
public void addListener(BiConsumer<FluidStack, Integer> listener) { public void setListener(@Nullable BiConsumer<FluidStack, Integer> listener) {
listeners.add(listener); this.listener = listener;
} }
@Override @Override

View File

@@ -11,7 +11,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.LinkedList; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -20,7 +20,8 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
private INetwork network; private INetwork network;
private CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>(); private CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<ItemStack> list = API.instance().createItemStackList(); 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) { public StorageCacheItem(INetwork network) {
this.network = network; this.network = network;
@@ -60,7 +61,9 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
if (!rebuilding) { if (!rebuilding) {
network.sendItemStorageDeltaToClient(stack, size); 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)) { if (list.remove(stack, size)) {
network.sendItemStorageDeltaToClient(stack, -size); network.sendItemStorageDeltaToClient(stack, -size);
listeners.forEach(l -> l.accept(stack, -size)); if (listener != null) {
listener.accept(stack, -size);
}
} }
} }
@Override @Override
public void addListener(BiConsumer<ItemStack, Integer> listener) { public void setListener(@Nullable BiConsumer<ItemStack, Integer> listener) {
listeners.add(listener); this.listener = listener;
} }
@Override @Override

View File

@@ -14,15 +14,16 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
public class StorageCacheItemPortable implements IStorageCache<ItemStack> { public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
private IPortableGrid portableGrid; private IPortableGrid portableGrid;
private IStackList<ItemStack> list = API.instance().createItemStackList(); 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) { public StorageCacheItemPortable(IPortableGrid portableGrid) {
this.portableGrid = portableGrid; this.portableGrid = portableGrid;
@@ -46,7 +47,9 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
if (!rebuilding) { if (!rebuilding) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w)); 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)) { if (list.remove(stack, size)) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), (EntityPlayerMP) w)); 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 @Override
public void addListener(BiConsumer<ItemStack, Integer> listener) { public void setListener(@Nullable BiConsumer<ItemStack, Integer> listener) {
listeners.add(listener); this.listener = listener;
} }
@Override @Override

View File

@@ -8,18 +8,17 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull; 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 IStorage<ItemStack> storage;
private IStorageCache<ItemStack> storageCache;
private ItemStack[] storageCacheData; private ItemStack[] storageCacheData;
public ItemHandlerStorage(IStorage<ItemStack> storage, IStorageCache<ItemStack> storageCache) { public ItemHandlerStorage(IStorage<ItemStack> storage, IStorageCache<ItemStack> storageCache) {
this.storage = storage; this.storage = storage;
this.storageCache = storageCache;
invalidate(); storageCache.setListener((stack, size) -> invalidate(storageCache));
invalidate(storageCache);
} }
@Override @Override
@@ -51,12 +50,7 @@ public class ItemHandlerStorage implements IItemHandler, BiConsumer<ItemStack, I
return 64; return 64;
} }
@Override private void invalidate(IStorageCache<ItemStack> storageCache) {
public void accept(ItemStack stack, Integer amount) {
invalidate();
}
private void invalidate() {
this.storageCacheData = storageCache.getList().getStacks().toArray(new ItemStack[0]); 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.invalidate();
cache.setListener(null);
if (storage == null) { if (storage == null) {
itemHandler = null; itemHandler = null;
} else { } else {
itemHandler = new ItemHandlerStorage(storage, cache); itemHandler = new ItemHandlerStorage(storage, cache);
cache.addListener(itemHandler);
} }
if (world != null) { if (world != null) {