Fixed performance issue with Controllers turning off and on and Interfaces, fixes #1384
This commit is contained in:
@@ -6,6 +6,8 @@
|
|||||||
- Fixed more crashes relating to scrollbar in GUIs (raoulvdberge)
|
- Fixed more crashes relating to scrollbar in GUIs (raoulvdberge)
|
||||||
- Fixed crash with Detector (raoulvdberge)
|
- Fixed crash with Detector (raoulvdberge)
|
||||||
- Fixed bug where pattern create button wasn't visible when grid tabs were selected (raoulvdberge)
|
- Fixed bug where pattern create button wasn't visible when grid tabs were selected (raoulvdberge)
|
||||||
|
- Fixed performance issue with Controllers turning off and on and Interfaces (raoulvdberge)
|
||||||
|
- Fixed Interfaces exposing network inventory don't hide storages that are disconnected (raoulvdberge)
|
||||||
- A Solderer with Speed Upgrades is now 2 times faster (raoulvdberge)
|
- A Solderer with Speed Upgrades is now 2 times faster (raoulvdberge)
|
||||||
|
|
||||||
### 1.5.13
|
### 1.5.13
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.network;
|
|||||||
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
|
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a graph of all the nodes connected to a network.
|
* Represents a graph of all the nodes connected to a network.
|
||||||
@@ -13,6 +14,13 @@ public interface INetworkNodeGraph {
|
|||||||
*/
|
*/
|
||||||
void rebuild();
|
void rebuild();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a runnable that is run after the graph is rebuilt.
|
||||||
|
*
|
||||||
|
* @param action the action to run
|
||||||
|
*/
|
||||||
|
void schedulePostRebuildAction(Consumer<INetwork> action);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a collection of all connected nodes
|
* @return a collection of all connected nodes
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.util.IStackList;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This holds all stacks from all the connected storages from a {@link INetwork}.
|
* This holds all stacks from all the connected storages from a {@link INetwork}.
|
||||||
@@ -52,14 +51,14 @@ public interface IStorageCache<T> {
|
|||||||
*
|
*
|
||||||
* @param listener the listener
|
* @param listener the listener
|
||||||
*/
|
*/
|
||||||
void addListener(BiConsumer<T, Integer> listener);
|
void addListener(Runnable listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a listener from the storage cache.
|
* Removes a listener from the storage cache.
|
||||||
*
|
*
|
||||||
* @param listener the listener
|
* @param listener the listener
|
||||||
*/
|
*/
|
||||||
void removeListener(BiConsumer<T, Integer> listener);
|
void removeListener(Runnable listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resorts the storages in this cache according to their priority.
|
* Resorts the storages in this cache according to their priority.
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network;
|
|||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.raoulvdberge.refinedstorage.RSBlocks;
|
import com.raoulvdberge.refinedstorage.RSBlocks;
|
||||||
|
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
|
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeVisitor;
|
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeVisitor;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
|
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
|
||||||
@@ -16,16 +17,16 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import java.util.ArrayDeque;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
import java.util.function.Consumer;
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY;
|
import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY;
|
||||||
|
|
||||||
public class NetworkNodeGraph implements INetworkNodeGraph {
|
public class NetworkNodeGraph implements INetworkNodeGraph {
|
||||||
private TileController controller;
|
private TileController controller;
|
||||||
private Set<INetworkNode> nodes = Sets.newConcurrentHashSet();
|
private Set<INetworkNode> nodes = Sets.newConcurrentHashSet();
|
||||||
|
private Set<Consumer<INetwork>> postRebuildActions = new HashSet<>();
|
||||||
|
private boolean rebuilding = false;
|
||||||
|
|
||||||
public NetworkNodeGraph(TileController controller) {
|
public NetworkNodeGraph(TileController controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -41,6 +42,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rebuilding = true;
|
||||||
|
|
||||||
Operator operator = new Operator();
|
Operator operator = new Operator();
|
||||||
|
|
||||||
BlockPos controllerPos = controller.getPos();
|
BlockPos controllerPos = controller.getPos();
|
||||||
@@ -66,9 +69,23 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
node.onDisconnected(controller);
|
node.onDisconnected(controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
postRebuildActions.forEach(a -> a.accept(controller));
|
||||||
|
postRebuildActions.clear();
|
||||||
|
|
||||||
if (!operator.newNodes.isEmpty() || !operator.previousNodes.isEmpty()) {
|
if (!operator.newNodes.isEmpty() || !operator.previousNodes.isEmpty()) {
|
||||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rebuilding = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void schedulePostRebuildAction(Consumer<INetwork> action) {
|
||||||
|
if (rebuilding) {
|
||||||
|
postRebuildActions.add(action);
|
||||||
|
} else {
|
||||||
|
action.accept(controller);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
|
|||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
|
||||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskFluid;
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskFluid;
|
||||||
import com.raoulvdberge.refinedstorage.block.BlockFluidStorage;
|
import com.raoulvdberge.refinedstorage.block.BlockFluidStorage;
|
||||||
import com.raoulvdberge.refinedstorage.block.FluidStorageType;
|
import com.raoulvdberge.refinedstorage.block.FluidStorageType;
|
||||||
@@ -117,7 +118,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage,
|
|||||||
public void onConnectedStateChange(INetwork network, boolean state) {
|
public void onConnectedStateChange(INetwork network, boolean state) {
|
||||||
super.onConnectedStateChange(network, state);
|
super.onConnectedStateChange(network, state);
|
||||||
|
|
||||||
network.getFluidStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -23,11 +23,24 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
|||||||
|
|
||||||
private ItemHandlerBase importItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
|
private ItemHandlerBase importItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
|
||||||
|
|
||||||
private ItemHandlerBase exportSpecimenItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
|
private ItemHandlerBase exportSpecimenItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this)) {
|
||||||
|
@Override
|
||||||
|
protected void onContentsChanged(int slot) {
|
||||||
|
super.onContentsChanged(slot);
|
||||||
|
|
||||||
|
if (network != null) {
|
||||||
|
if (!isEmpty() && itemsStorage != null) {
|
||||||
|
removeItemStorage(network);
|
||||||
|
} else if (isEmpty() && itemsStorage == null) {
|
||||||
|
createItemStorage(network);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
private ItemHandlerBase exportItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
|
private ItemHandlerBase exportItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
|
||||||
|
|
||||||
private IItemHandler items = new ItemHandlerProxy(importItems, exportItems);
|
private IItemHandler items = new ItemHandlerProxy(importItems, exportItems);
|
||||||
private ItemHandlerInterface itemsNetwork;
|
private ItemHandlerInterface itemsStorage;
|
||||||
|
|
||||||
private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING);
|
private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING);
|
||||||
|
|
||||||
@@ -122,17 +135,25 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
|||||||
protected void onConnectedStateChange(INetwork network, boolean state) {
|
protected void onConnectedStateChange(INetwork network, boolean state) {
|
||||||
super.onConnectedStateChange(network, state);
|
super.onConnectedStateChange(network, state);
|
||||||
|
|
||||||
if (state) {
|
if (state && exportSpecimenItems.isEmpty()) {
|
||||||
itemsNetwork = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems);
|
createItemStorage(network);
|
||||||
|
} else if (itemsStorage != null) {
|
||||||
network.getItemStorageCache().addListener(itemsNetwork);
|
removeItemStorage(network);
|
||||||
} else if (itemsNetwork != null) {
|
|
||||||
network.getItemStorageCache().removeListener(itemsNetwork);
|
|
||||||
|
|
||||||
itemsNetwork = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createItemStorage(INetwork network) {
|
||||||
|
itemsStorage = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems);
|
||||||
|
|
||||||
|
network.getItemStorageCache().addListener(itemsStorage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeItemStorage(INetwork network) {
|
||||||
|
network.getItemStorageCache().removeListener(itemsStorage);
|
||||||
|
|
||||||
|
itemsStorage = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCompare() {
|
public int getCompare() {
|
||||||
return compare;
|
return compare;
|
||||||
@@ -204,8 +225,8 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
|||||||
return exportItems;
|
return exportItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IItemHandler getItemsOrNetworkItems() {
|
public IItemHandler getItemsOrStorage() {
|
||||||
return (itemsNetwork != null && exportSpecimenItems.isEmpty()) ? itemsNetwork : items;
|
return itemsStorage != null ? itemsStorage : items;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IItemHandler getItems() {
|
public IItemHandler getItems() {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
|
|||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
|
||||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskItem;
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskItem;
|
||||||
import com.raoulvdberge.refinedstorage.block.BlockStorage;
|
import com.raoulvdberge.refinedstorage.block.BlockStorage;
|
||||||
import com.raoulvdberge.refinedstorage.block.ItemStorageType;
|
import com.raoulvdberge.refinedstorage.block.ItemStorageType;
|
||||||
@@ -114,7 +115,7 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto
|
|||||||
public void onConnectedStateChange(INetwork network, boolean state) {
|
public void onConnectedStateChange(INetwork network, boolean state) {
|
||||||
super.onConnectedStateChange(network, state);
|
super.onConnectedStateChange(network, state);
|
||||||
|
|
||||||
network.getItemStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import com.raoulvdberge.refinedstorage.api.storage.*;
|
|||||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
|
||||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
||||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
|
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
|
||||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
|
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
|
||||||
@@ -132,8 +134,8 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS
|
|||||||
public void onConnectedStateChange(INetwork network, boolean state) {
|
public void onConnectedStateChange(INetwork network, boolean state) {
|
||||||
super.onConnectedStateChange(network, state);
|
super.onConnectedStateChange(network, state);
|
||||||
|
|
||||||
network.getItemStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||||
network.getFluidStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||||
|
|
||||||
WorldUtils.updateBlock(world, pos);
|
WorldUtils.updateBlock(world, pos);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
|
|||||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
|
||||||
|
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
|
||||||
import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy;
|
import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy;
|
||||||
import com.raoulvdberge.refinedstorage.integration.storagedrawers.StorageItemItemRepository;
|
import com.raoulvdberge.refinedstorage.integration.storagedrawers.StorageItemItemRepository;
|
||||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
||||||
@@ -224,8 +226,8 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
network.getItemStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||||
network.getFluidStorageCache().invalidate();
|
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
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.Consumer;
|
||||||
|
|
||||||
public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
||||||
|
public static final Consumer<INetwork> INVALIDATE = n -> n.getFluidStorageCache().invalidate();
|
||||||
|
|
||||||
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<>();
|
private List<Runnable> listeners = new LinkedList<>();
|
||||||
|
|
||||||
public StorageCacheFluid(INetwork network) {
|
public StorageCacheFluid(INetwork network) {
|
||||||
this.network = network;
|
this.network = network;
|
||||||
@@ -47,6 +49,8 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listeners.forEach(Runnable::run);
|
||||||
|
|
||||||
network.sendFluidStorageToClient();
|
network.sendFluidStorageToClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,9 +60,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));
|
listeners.forEach(Runnable::run);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -66,17 +70,17 @@ 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));
|
listeners.forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener(BiConsumer<FluidStack, Integer> listener) {
|
public void addListener(Runnable listener) {
|
||||||
listeners.add(listener);
|
listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeListener(BiConsumer<FluidStack, Integer> listener) {
|
public void removeListener(Runnable listener) {
|
||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
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.Consumer;
|
||||||
|
|
||||||
public class StorageCacheItem implements IStorageCache<ItemStack> {
|
public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||||
|
public static final Consumer<INetwork> INVALIDATE = network -> network.getItemStorageCache().invalidate();
|
||||||
|
|
||||||
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<>();
|
private List<Runnable> listeners = new LinkedList<>();
|
||||||
|
|
||||||
public StorageCacheItem(INetwork network) {
|
public StorageCacheItem(INetwork network) {
|
||||||
this.network = network;
|
this.network = network;
|
||||||
@@ -49,6 +51,8 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listeners.forEach(Runnable::run);
|
||||||
|
|
||||||
network.sendItemStorageToClient();
|
network.sendItemStorageToClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,9 +62,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));
|
listeners.forEach(Runnable::run);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -68,17 +72,17 @@ 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));
|
listeners.forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener(BiConsumer<ItemStack, Integer> listener) {
|
public void addListener(Runnable listener) {
|
||||||
listeners.add(listener);
|
listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
|
public void removeListener(Runnable listener) {
|
||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,11 @@ import javax.annotation.Nonnull;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
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<>();
|
private List<Runnable> listeners = new LinkedList<>();
|
||||||
|
|
||||||
public StorageCacheItemPortable(IPortableGrid portableGrid) {
|
public StorageCacheItemPortable(IPortableGrid portableGrid) {
|
||||||
this.portableGrid = portableGrid;
|
this.portableGrid = portableGrid;
|
||||||
@@ -36,6 +35,8 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
|||||||
portableGrid.getStorage().getStacks().forEach(list::add);
|
portableGrid.getStorage().getStacks().forEach(list::add);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listeners.forEach(Runnable::run);
|
||||||
|
|
||||||
portableGrid.getWatchers().forEach(this::sendUpdateTo);
|
portableGrid.getWatchers().forEach(this::sendUpdateTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,9 +46,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));
|
listeners.forEach(Runnable::run);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -55,17 +56,17 @@ 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));
|
listeners.forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener(BiConsumer<ItemStack, Integer> listener) {
|
public void addListener(Runnable listener) {
|
||||||
listeners.add(listener);
|
listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
|
public void removeListener(Runnable listener) {
|
||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ 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 ItemHandlerInterface implements IItemHandler, BiConsumer<ItemStack, Integer> {
|
public class ItemHandlerInterface implements IItemHandler, Runnable {
|
||||||
private INetwork network;
|
private INetwork network;
|
||||||
private IStorageCache<ItemStack> storageCache;
|
private IStorageCache<ItemStack> storageCache;
|
||||||
private IItemHandler importItems;
|
private IItemHandler importItems;
|
||||||
@@ -69,7 +68,7 @@ public class ItemHandlerInterface implements IItemHandler, BiConsumer<ItemStack,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ItemStack stack, Integer amount) {
|
public void run() {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ 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, Runnable {
|
||||||
private IStorage<ItemStack> storage;
|
private IStorage<ItemStack> storage;
|
||||||
private IStorageCache<ItemStack> storageCache;
|
private IStorageCache<ItemStack> storageCache;
|
||||||
private ItemStack[] storageCacheData;
|
private ItemStack[] storageCacheData;
|
||||||
@@ -52,7 +51,7 @@ public class ItemHandlerStorage implements IItemHandler, BiConsumer<ItemStack, I
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ItemStack stack, Integer amount) {
|
public void run() {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class TileInterface extends TileNode<NetworkNodeInterface> {
|
|||||||
@Override
|
@Override
|
||||||
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
|
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
|
||||||
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
|
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
|
||||||
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(getNode().getItemsOrNetworkItems());
|
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(getNode().getItemsOrStorage());
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.getCapability(capability, facing);
|
return super.getCapability(capability, facing);
|
||||||
|
|||||||
Reference in New Issue
Block a user