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 crash with Detector (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)
|
||||
|
||||
### 1.5.13
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.network;
|
||||
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Represents a graph of all the nodes connected to a network.
|
||||
@@ -13,6 +14,13 @@ public interface INetworkNodeGraph {
|
||||
*/
|
||||
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
|
||||
*/
|
||||
|
||||
@@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.util.IStackList;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
void addListener(BiConsumer<T, Integer> listener);
|
||||
void addListener(Runnable listener);
|
||||
|
||||
/**
|
||||
* Removes a listener from the storage cache.
|
||||
*
|
||||
* @param listener the listener
|
||||
*/
|
||||
void removeListener(BiConsumer<T, Integer> listener);
|
||||
void removeListener(Runnable listener);
|
||||
|
||||
/**
|
||||
* 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.raoulvdberge.refinedstorage.RSBlocks;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeVisitor;
|
||||
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.world.World;
|
||||
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Collection;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY;
|
||||
|
||||
public class NetworkNodeGraph implements INetworkNodeGraph {
|
||||
private TileController controller;
|
||||
private Set<INetworkNode> nodes = Sets.newConcurrentHashSet();
|
||||
private Set<Consumer<INetwork>> postRebuildActions = new HashSet<>();
|
||||
private boolean rebuilding = false;
|
||||
|
||||
public NetworkNodeGraph(TileController controller) {
|
||||
this.controller = controller;
|
||||
@@ -41,6 +42,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
||||
return;
|
||||
}
|
||||
|
||||
rebuilding = true;
|
||||
|
||||
Operator operator = new Operator();
|
||||
|
||||
BlockPos controllerPos = controller.getPos();
|
||||
@@ -66,9 +69,23 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
||||
node.onDisconnected(controller);
|
||||
}
|
||||
|
||||
postRebuildActions.forEach(a -> a.accept(controller));
|
||||
postRebuildActions.clear();
|
||||
|
||||
if (!operator.newNodes.isEmpty() || !operator.previousNodes.isEmpty()) {
|
||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
||||
}
|
||||
|
||||
rebuilding = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void schedulePostRebuildAction(Consumer<INetwork> action) {
|
||||
if (rebuilding) {
|
||||
postRebuildActions.add(action);
|
||||
} else {
|
||||
action.accept(controller);
|
||||
}
|
||||
}
|
||||
|
||||
@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.IStorageProvider;
|
||||
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.block.BlockFluidStorage;
|
||||
import com.raoulvdberge.refinedstorage.block.FluidStorageType;
|
||||
@@ -117,7 +118,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage,
|
||||
public void onConnectedStateChange(INetwork network, boolean state) {
|
||||
super.onConnectedStateChange(network, state);
|
||||
|
||||
network.getFluidStorageCache().invalidate();
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,11 +23,24 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
||||
|
||||
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 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);
|
||||
|
||||
@@ -122,17 +135,25 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
||||
protected void onConnectedStateChange(INetwork network, boolean state) {
|
||||
super.onConnectedStateChange(network, state);
|
||||
|
||||
if (state) {
|
||||
itemsNetwork = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems);
|
||||
|
||||
network.getItemStorageCache().addListener(itemsNetwork);
|
||||
} else if (itemsNetwork != null) {
|
||||
network.getItemStorageCache().removeListener(itemsNetwork);
|
||||
|
||||
itemsNetwork = null;
|
||||
if (state && exportSpecimenItems.isEmpty()) {
|
||||
createItemStorage(network);
|
||||
} else if (itemsStorage != null) {
|
||||
removeItemStorage(network);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
public int getCompare() {
|
||||
return compare;
|
||||
@@ -204,8 +225,8 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
|
||||
return exportItems;
|
||||
}
|
||||
|
||||
public IItemHandler getItemsOrNetworkItems() {
|
||||
return (itemsNetwork != null && exportSpecimenItems.isEmpty()) ? itemsNetwork : items;
|
||||
public IItemHandler getItemsOrStorage() {
|
||||
return itemsStorage != null ? itemsStorage : items;
|
||||
}
|
||||
|
||||
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.IStorageProvider;
|
||||
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.block.BlockStorage;
|
||||
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) {
|
||||
super.onConnectedStateChange(network, state);
|
||||
|
||||
network.getItemStorageCache().invalidate();
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,6 +6,8 @@ import com.raoulvdberge.refinedstorage.api.storage.*;
|
||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
|
||||
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.ItemHandlerFluid;
|
||||
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) {
|
||||
super.onConnectedStateChange(network, state);
|
||||
|
||||
network.getItemStorageCache().invalidate();
|
||||
network.getFluidStorageCache().invalidate();
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||
|
||||
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.apiimpl.network.node.IGuiStorage;
|
||||
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.integration.storagedrawers.StorageItemItemRepository;
|
||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
||||
@@ -224,8 +226,8 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
|
||||
}
|
||||
}
|
||||
|
||||
network.getItemStorageCache().invalidate();
|
||||
network.getFluidStorageCache().invalidate();
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
|
||||
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
||||
public static final Consumer<INetwork> INVALIDATE = n -> n.getFluidStorageCache().invalidate();
|
||||
|
||||
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<>();
|
||||
private List<Runnable> listeners = new LinkedList<>();
|
||||
|
||||
public StorageCacheFluid(INetwork network) {
|
||||
this.network = network;
|
||||
@@ -47,6 +49,8 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
||||
}
|
||||
}
|
||||
|
||||
listeners.forEach(Runnable::run);
|
||||
|
||||
network.sendFluidStorageToClient();
|
||||
}
|
||||
|
||||
@@ -56,9 +60,9 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
||||
|
||||
if (!rebuilding) {
|
||||
network.sendFluidStorageDeltaToClient(stack, size);
|
||||
}
|
||||
|
||||
listeners.forEach(l -> l.accept(stack, size));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,17 +70,17 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
|
||||
if (list.remove(stack, size)) {
|
||||
network.sendFluidStorageDeltaToClient(stack, -size);
|
||||
|
||||
listeners.forEach(l -> l.accept(stack, -size));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(BiConsumer<FluidStack, Integer> listener) {
|
||||
public void addListener(Runnable listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener(BiConsumer<FluidStack, Integer> listener) {
|
||||
public void removeListener(Runnable listener) {
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||
public static final Consumer<INetwork> INVALIDATE = network -> network.getItemStorageCache().invalidate();
|
||||
|
||||
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<>();
|
||||
private List<Runnable> listeners = new LinkedList<>();
|
||||
|
||||
public StorageCacheItem(INetwork network) {
|
||||
this.network = network;
|
||||
@@ -49,6 +51,8 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||
}
|
||||
}
|
||||
|
||||
listeners.forEach(Runnable::run);
|
||||
|
||||
network.sendItemStorageToClient();
|
||||
}
|
||||
|
||||
@@ -58,9 +62,9 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||
|
||||
if (!rebuilding) {
|
||||
network.sendItemStorageDeltaToClient(stack, size);
|
||||
}
|
||||
|
||||
listeners.forEach(l -> l.accept(stack, size));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -68,17 +72,17 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||
if (list.remove(stack, size)) {
|
||||
network.sendItemStorageDeltaToClient(stack, -size);
|
||||
|
||||
listeners.forEach(l -> l.accept(stack, -size));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(BiConsumer<ItemStack, Integer> listener) {
|
||||
public void addListener(Runnable listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
|
||||
public void removeListener(Runnable listener) {
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,12 +17,11 @@ import javax.annotation.Nonnull;
|
||||
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<>();
|
||||
private List<Runnable> listeners = new LinkedList<>();
|
||||
|
||||
public StorageCacheItemPortable(IPortableGrid portableGrid) {
|
||||
this.portableGrid = portableGrid;
|
||||
@@ -36,6 +35,8 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
||||
portableGrid.getStorage().getStacks().forEach(list::add);
|
||||
}
|
||||
|
||||
listeners.forEach(Runnable::run);
|
||||
|
||||
portableGrid.getWatchers().forEach(this::sendUpdateTo);
|
||||
}
|
||||
|
||||
@@ -45,9 +46,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));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,17 +56,17 @@ 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));
|
||||
listeners.forEach(Runnable::run);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(BiConsumer<ItemStack, Integer> listener) {
|
||||
public void addListener(Runnable listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
|
||||
public void removeListener(Runnable listener) {
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,9 +8,8 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
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 IStorageCache<ItemStack> storageCache;
|
||||
private IItemHandler importItems;
|
||||
@@ -69,7 +68,7 @@ public class ItemHandlerInterface implements IItemHandler, BiConsumer<ItemStack,
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(ItemStack stack, Integer amount) {
|
||||
public void run() {
|
||||
invalidate();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,9 +8,8 @@ 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, Runnable {
|
||||
private IStorage<ItemStack> storage;
|
||||
private IStorageCache<ItemStack> storageCache;
|
||||
private ItemStack[] storageCacheData;
|
||||
@@ -52,7 +51,7 @@ public class ItemHandlerStorage implements IItemHandler, BiConsumer<ItemStack, I
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(ItemStack stack, Integer amount) {
|
||||
public void run() {
|
||||
invalidate();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public class TileInterface extends TileNode<NetworkNodeInterface> {
|
||||
@Override
|
||||
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user