Remove list, use single listener for storage cache listener
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user