From e7ab1b12ec4edd39ab5ecadacce0f62771fc88a5 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 28 Dec 2019 22:00:55 +0100 Subject: [PATCH] Add changes from the mc1.14 branch Fixed crash when loading a network. Fixes #2381 Experimental test for #2345 Fixed being able to drain energy from the Refined Storage Controller. Fixes #2361 Fixed the Grid crashing on a item/fluid update-heavy storage system. Fixes #2345 Fixed the Grid crashing on a item/fluid update-heavy storage system (PT. 2). Fixes #2345 Fixed the Grid crashing on a item/fluid update-heavy storage system (PT. 3, fix typo). Fixes #2345 Update changelog Fix issue in extractEnergyInternal Fixed crash with the Disk Manipulator and using item/fluid filters when inserting into the network. Fixes #2367 Rename IPortableGrid#isActive -> IPortableGrid#isGridActive, IGrid#isActive -> IGrid#isGridActive, ICraftingMonitor#isActive -> ICraftingMonitor#isActiveOnClient, CrafterManagerNetworkNode#isActive -> CrafterManagerNetworkNode#isActiveOnClient Fixed the network being able to run off 1 FE/t. Fixes #2369 Fixed the Grid displaying the old quantity when shift clicking an entire stack out. Update the storage stacker entry as well on the crafting stack. When pressing ESCAPE in the search box on the Grid or Crafter Manager, focus on the search bar will be lost first before closing the GUI immediately. Then on the next ESCAPE press, the GUI will be closed. Fix performance issue caused by getEnergyUsage calls. Optimize any call to getEnergyUsage. --- CHANGELOG.md | 11 +++++++ .../api/network/grid/IGrid.java | 2 +- .../api/network/node/INetworkNode.java | 6 ++-- .../api/storage/cache/IStorageCache.java | 6 ++++ .../apiimpl/autocrafting/CraftingManager.java | 5 ++- .../apiimpl/network/Network.java | 33 ++++++++++++------- .../grid/handler/PortableItemGridHandler.java | 6 ++-- .../network/item/NetworkItemManager.java | 3 +- .../node/CrafterManagerNetworkNode.java | 2 +- .../node/CraftingMonitorNetworkNode.java | 2 +- .../node/FluidInterfaceNetworkNode.java | 2 +- .../apiimpl/network/node/GridNetworkNode.java | 2 +- .../network/node/InterfaceNetworkNode.java | 2 +- .../apiimpl/network/node/NetworkNode.java | 12 ++++--- .../apiimpl/network/node/RootNetworkNode.java | 2 +- .../StorageDiskFluidManipulatorWrapper.java | 4 +++ .../StorageDiskItemManipulatorWrapper.java | 4 +++ .../network/security/SecurityManager.java | 2 +- .../storage/cache/FluidStorageCache.java | 7 +++- .../storage/cache/ItemStorageCache.java | 7 +++- .../cache/PortableFluidStorageCache.java | 5 +++ .../cache/PortableItemStorageCache.java | 5 +++ .../container/slot/CrafterManagerSlot.java | 2 +- .../energy/BaseEnergyStorage.java | 15 +++++++-- .../render/model/PortableGridBakedModel.java | 2 +- .../screen/CrafterManagerScreen.java | 12 ++----- .../screen/CraftingMonitorScreen.java | 6 ++-- .../screen/grid/GridScreen.java | 22 +++++-------- .../screen/grid/stack/FluidGridStack.java | 4 +++ .../screen/grid/stack/ItemGridStack.java | 4 +++ .../screen/grid/view/BaseGridView.java | 2 +- .../screen/grid/view/FluidGridView.java | 17 ++++++++-- .../screen/grid/view/ItemGridView.java | 17 ++++++++-- .../screen/widget/SearchWidget.java | 20 +++++++++++ .../refinedstorage/tile/ControllerTile.java | 2 +- .../craftingmonitor/ICraftingMonitor.java | 2 +- .../WirelessCraftingMonitor.java | 2 +- .../tile/grid/WirelessFluidGrid.java | 2 +- .../tile/grid/WirelessGrid.java | 2 +- .../tile/grid/portable/IPortableGrid.java | 2 +- .../tile/grid/portable/PortableGrid.java | 4 +-- .../tile/grid/portable/PortableGridTile.java | 8 ++--- 42 files changed, 195 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03541d739..368cefc73 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,18 @@ # Refined Storage Changelog +### 1.7.3 +- Fixed severe energy update lag introduced by version 1.7.2 (raoulvdberge) + ### 1.7.2 - Resource packs can now define the font colors that Refined Storage GUIs need to use (raoulvdberge) +- Patterns being added or removed from the network are now propagated as well to clients that are watching a Grid (raoulvdberge) +- When pressing ESCAPE in the search box on the Grid or Crafter Manager, focus on the search bar will be lost first before closing the GUI immediately. Then on the next ESCAPE press, the GUI will be closed (raoulvdberge) +- Fixed crash when loading a network (raoulvdberge, LezChap) +- Fixed being able to drain energy from the Refined Storage Controller (raoulvdberge) +- Fixed the Grid crashing on a item/fluid update-heavy storage system (raoulvdberge, Darkere, noobanidus) +- Fixed the Grid displaying the old quantity when shift clicking an entire stack out (raoulvdberge) +- Fixed crash with the Disk Manipulator and using item/fluid filters when inserting into the network (raoulvdberge) +- Fixed the network being able to run off 1 FE/t (raoulvdberge) ### 1.7.1 - Exact mode for processing patterns no longer exist, you can now define per-slot which item/fluid tags are allowed to be used by autocrafting, by using CTRL + click on the filter slot in the Pattern Grid (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java index e31b6a758..54fddf74f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java @@ -235,7 +235,7 @@ public interface IGrid { /** * @return true if the grid is active, false otherwise */ - boolean isActive(); + boolean isGridActive(); /** * @return the slot id where this grid is located, if applicable, otherwise -1 diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java index 15c60e067..837822b03 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java @@ -44,11 +44,11 @@ public interface INetworkNode { void onDisconnected(INetwork network); /** - * If a node can be updated typically depends on the redstone configuration. + * Whether this node is active, independent of the network. * - * @return true if this node can be treated as updatable, false otherwise + * @return true if this node is active, false otherwise */ - boolean canUpdate(); + boolean isActive(); /** * @return the network, or null if this node is not connected to any network diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/cache/IStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/cache/IStorageCache.java index 3c124fe55..e1cdf1c07 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/cache/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/cache/IStorageCache.java @@ -69,6 +69,12 @@ public interface IStorageCache { */ void removeListener(IStorageCacheListener listener); + /** + * Re-attaches all listeners. + * In practice this means that all listeners will get a {@link IStorageCacheListener#onAttached()} call. + */ + void reAttachListeners(); + /** * Resorts the storages in this cache according to their priority. * This needs to be called when the priority of a storage changes. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java index 5e0af264a..8bd2e9be8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java @@ -371,7 +371,7 @@ public class CraftingManager implements ICraftingManager { List containers = new ArrayList<>(); for (INetworkNode node : network.getNodeGraph().all()) { - if (node instanceof ICraftingPatternContainer && node.canUpdate()) { + if (node instanceof ICraftingPatternContainer && node.isActive()) { containers.add((ICraftingPatternContainer) node); } } @@ -396,6 +396,9 @@ public class CraftingManager implements ICraftingManager { this.containerInventories.computeIfAbsent(container.getName(), k -> new ArrayList<>()).add(handler); } } + + this.network.getItemStorageCache().reAttachListeners(); + this.network.getFluidStorageCache().reAttachListeners(); } @Nullable diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/Network.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/Network.java index a11be80e4..e5c9cd4c8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/Network.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/Network.java @@ -33,6 +33,7 @@ import com.raoulvdberge.refinedstorage.tile.ControllerTile; import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.util.StackUtils; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -65,13 +66,14 @@ public class Network implements INetwork, IRedstoneConfigurable { private final ItemStorageTracker itemStorageTracker = new ItemStorageTracker(this::markDirty); private final IStorageCache fluidStorage = new FluidStorageCache(this); private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(this::markDirty); - private final BaseEnergyStorage energy = new BaseEnergyStorage(RS.SERVER_CONFIG.getController().getCapacity(), RS.SERVER_CONFIG.getController().getMaxTransfer()); + private final BaseEnergyStorage energy = new BaseEnergyStorage(RS.SERVER_CONFIG.getController().getCapacity(), RS.SERVER_CONFIG.getController().getMaxTransfer(), 0); private final RootNetworkNode root; private final BlockPos pos; private final World world; private final NetworkType type; private ControllerBlock.EnergyType lastEnergyType = ControllerBlock.EnergyType.OFF; + private int lastEnergyUsage; private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private boolean throttlingDisabled = true; // Will be enabled after first update @@ -107,7 +109,7 @@ public class Network implements INetwork, IRedstoneConfigurable { @Override public boolean canRun() { - return this.energy.getEnergyStored() > 0 && redstoneMode.isEnabled(world, pos); + return energy.getEnergyStored() >= getEnergyUsage() && redstoneMode.isEnabled(world, pos); } @Override @@ -128,6 +130,8 @@ public class Network implements INetwork, IRedstoneConfigurable { @Override public void update() { if (!world.isRemote) { + updateEnergyUsage(); + if (canRun()) { craftingManager.update(); @@ -138,14 +142,12 @@ public class Network implements INetwork, IRedstoneConfigurable { if (type == NetworkType.NORMAL) { if (!RS.SERVER_CONFIG.getController().getUseEnergy()) { - this.energy.setStored(this.energy.getMaxEnergyStored()); - } else if (this.energy.extractEnergy(getEnergyUsage(), true) >= 0) { - this.energy.extractEnergy(getEnergyUsage(), false); + energy.setStored(this.energy.getMaxEnergyStored()); } else { - this.energy.setStored(0); + energy.extractEnergyBypassCanExtract(getEnergyUsage(), false); } } else if (type == NetworkType.CREATIVE) { - this.energy.setStored(this.energy.getMaxEnergyStored()); + energy.setStored(energy.getMaxEnergyStored()); } boolean canRun = canRun(); @@ -170,7 +172,10 @@ public class Network implements INetwork, IRedstoneConfigurable { if (lastEnergyType != energyType) { lastEnergyType = energyType; - world.setBlockState(pos, world.getBlockState(pos).with(ControllerBlock.ENERGY_TYPE, energyType)); + BlockState state = world.getBlockState(pos); + if (state.getBlock() instanceof ControllerBlock) { + world.setBlockState(pos, state.with(ControllerBlock.ENERGY_TYPE, energyType)); + } } } } @@ -513,17 +518,21 @@ public class Network implements INetwork, IRedstoneConfigurable { markDirty(); } - @Override - public int getEnergyUsage() { + private void updateEnergyUsage() { int usage = RS.SERVER_CONFIG.getController().getBaseUsage(); for (INetworkNode node : nodeGraph.all()) { - if (node.canUpdate()) { + if (node.isActive()) { usage += node.getEnergyUsage(); } } - return usage; + this.lastEnergyUsage = usage; + } + + @Override + public int getEnergyUsage() { + return lastEnergyUsage; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java index bf0bf7cff..b4ece766f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java @@ -29,7 +29,7 @@ public class PortableItemGridHandler implements IItemGridHandler { @Override public void onExtract(ServerPlayerEntity player, UUID id, int flags) { - if (portableGrid.getStorage() == null || !grid.isActive()) { + if (portableGrid.getStorage() == null || !grid.isGridActive()) { return; } @@ -108,7 +108,7 @@ public class PortableItemGridHandler implements IItemGridHandler { @Override @Nonnull public ItemStack onInsert(ServerPlayerEntity player, ItemStack stack) { - if (portableGrid.getStorage() == null || !grid.isActive()) { + if (portableGrid.getStorage() == null || !grid.isGridActive()) { return stack; } @@ -123,7 +123,7 @@ public class PortableItemGridHandler implements IItemGridHandler { @Override public void onInsertHeldItem(ServerPlayerEntity player, boolean single) { - if (player.inventory.getItemStack().isEmpty() || portableGrid.getStorage() == null || !grid.isActive()) { + if (player.inventory.getItemStack().isEmpty() || portableGrid.getStorage() == null || !grid.isGridActive()) { return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemManager.java index 10a137cf4..5e20ff0c4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemManager.java @@ -28,7 +28,8 @@ public class NetworkItemManager implements INetworkItemManager { for (INetworkNode node : network.getNodeGraph().all()) { if (node instanceof IWirelessTransmitter && - node.canUpdate() && + network.canRun() && + node.isActive() && ((IWirelessTransmitter) node).getDimension() == player.dimension) { IWirelessTransmitter transmitter = (IWirelessTransmitter) node; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java index 488f3dca5..3d74c5c1f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java @@ -73,7 +73,7 @@ public class CrafterManagerNetworkNode extends NetworkNode { this.searchBoxMode = searchBoxMode; } - public boolean isActive() { + public boolean isActiveOnClient() { BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof CrafterManagerBlock) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java index 31416e0ba..8374ba97d 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java @@ -77,7 +77,7 @@ public class CraftingMonitorNetworkNode extends NetworkNode implements ICrafting } @Override - public boolean isActive() { + public boolean isActiveOnClient() { BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof CraftingMonitorBlock) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/FluidInterfaceNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/FluidInterfaceNetworkNode.java index d9bdf8ba3..7c419ac78 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/FluidInterfaceNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/FluidInterfaceNetworkNode.java @@ -158,7 +158,7 @@ public class FluidInterfaceNetworkNode extends NetworkNode { INetworkNode facingNode = API.instance().getNetworkNodeManager((ServerWorld) world).getNode(pos.offset(facing)); if (facingNode instanceof ExternalStorageNetworkNode && - facingNode.canUpdate() && + facingNode.isActive() && ((ExternalStorageNetworkNode) facingNode).getDirection() == facing.getOpposite() && ((ExternalStorageNetworkNode) facingNode).getType() == IType.FLUIDS) { return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java index e0e8784d0..d7b84646a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java @@ -406,7 +406,7 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I } @Override - public boolean isActive() { + public boolean isGridActive() { BlockState state = world.getBlockState(pos); if (state.getBlock() instanceof GridBlock) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/InterfaceNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/InterfaceNetworkNode.java index 9b968ef91..769f77566 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/InterfaceNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/InterfaceNetworkNode.java @@ -132,7 +132,7 @@ public class InterfaceNetworkNode extends NetworkNode implements IComparable { INetworkNode facingNode = API.instance().getNetworkNodeManager((ServerWorld) world).getNode(pos.offset(facing)); if (facingNode instanceof ExternalStorageNetworkNode && - facingNode.canUpdate() && + facingNode.isActive() && ((ExternalStorageNetworkNode) facingNode).getDirection() == facing.getOpposite() && ((ExternalStorageNetworkNode) facingNode).getType() == IType.ITEMS) { return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java index ffb10dd2c..010a604f3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java @@ -102,11 +102,13 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor { } @Override - public boolean canUpdate() { - if (redstoneMode.isEnabled(world, pos)) { - if (network != null) { - return network.canRun(); - } + public boolean isActive() { + return redstoneMode.isEnabled(world, pos); + } + + protected boolean canUpdate() { + if (isActive() && network != null) { + return network.canRun(); } return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/RootNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/RootNetworkNode.java index bbf9a104e..60a2593c6 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/RootNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/RootNetworkNode.java @@ -69,7 +69,7 @@ public class RootNetworkNode implements INetworkNode, INetworkNodeVisitor { } @Override - public boolean canUpdate() { + public boolean isActive() { return false; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java index d0164d519..8ab0cd6a2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java @@ -68,6 +68,10 @@ public class StorageDiskFluidManipulatorWrapper implements IStorageDisk { storages.clear(); network.getNodeGraph().all().stream() - .filter(node -> node.canUpdate() && node instanceof IStorageProvider) + .filter(node -> node.isActive() && node instanceof IStorageProvider) .forEach(node -> ((IStorageProvider) node).addFluidStorages(storages)); list.clear(); @@ -110,6 +110,11 @@ public class FluidStorageCache implements IStorageCache { listeners.remove(listener); } + @Override + public void reAttachListeners() { + listeners.forEach(IStorageCacheListener::onAttached); + } + @Override public void sort() { storages.sort(IStorage.COMPARATOR); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/ItemStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/ItemStorageCache.java index b1e80e740..0adc0a672 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/ItemStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/ItemStorageCache.java @@ -37,7 +37,7 @@ public class ItemStorageCache implements IStorageCache { storages.clear(); network.getNodeGraph().all().stream() - .filter(node -> node.canUpdate() && node instanceof IStorageProvider) + .filter(node -> node.isActive() && node instanceof IStorageProvider) .forEach(node -> ((IStorageProvider) node).addItemStorages(storages)); list.clear(); @@ -110,6 +110,11 @@ public class ItemStorageCache implements IStorageCache { listeners.remove(listener); } + @Override + public void reAttachListeners() { + listeners.forEach(IStorageCacheListener::onAttached); + } + @Override public void sort() { storages.sort(IStorage.COMPARATOR); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableFluidStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableFluidStorageCache.java index b324f37d0..891cc5a6b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableFluidStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableFluidStorageCache.java @@ -69,6 +69,11 @@ public class PortableFluidStorageCache implements IStorageCache { listeners.remove(listener); } + @Override + public void reAttachListeners() { + listeners.forEach(IStorageCacheListener::onAttached); + } + @Override public void sort() { // NO OP diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableItemStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableItemStorageCache.java index b02e22152..409a16f35 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableItemStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/cache/PortableItemStorageCache.java @@ -69,6 +69,11 @@ public class PortableItemStorageCache implements IStorageCache { listeners.remove(listener); } + @Override + public void reAttachListeners() { + listeners.forEach(IStorageCacheListener::onAttached); + } + @Override public void sort() { // NO OP diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/CrafterManagerSlot.java b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/CrafterManagerSlot.java index c461378fe..7eb755f73 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/CrafterManagerSlot.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/CrafterManagerSlot.java @@ -19,6 +19,6 @@ public class CrafterManagerSlot extends BaseSlot { @Override public boolean isEnabled() { - return yPos >= display.getTopHeight() && yPos < display.getTopHeight() + 18 * display.getVisibleRows() && visible && crafterManager.isActive(); + return yPos >= display.getTopHeight() && yPos < display.getTopHeight() + 18 * display.getVisibleRows() && visible && crafterManager.isActiveOnClient(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/energy/BaseEnergyStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/energy/BaseEnergyStorage.java index a58637356..238522721 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/energy/BaseEnergyStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/energy/BaseEnergyStorage.java @@ -3,8 +3,19 @@ package com.raoulvdberge.refinedstorage.energy; import net.minecraftforge.energy.EnergyStorage; public class BaseEnergyStorage extends EnergyStorage { - public BaseEnergyStorage(int capacity, int maxTransfer) { - super(capacity, maxTransfer); + public BaseEnergyStorage(int capacity, int maxReceive, int maxExtract) { + super(capacity, maxReceive, maxExtract); + } + + // @Volatile: Impl from EnergyStorage#extractEnergy, without the canExtract check + public int extractEnergyBypassCanExtract(int maxExtract, boolean simulate) { + int energyExtracted = Math.min(energy, maxExtract); + + if (!simulate) { + energy -= energyExtracted; + } + + return energyExtracted; } public void setStored(int energy) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/model/PortableGridBakedModel.java b/src/main/java/com/raoulvdberge/refinedstorage/render/model/PortableGridBakedModel.java index a769d1f0c..22f9f9364 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/model/PortableGridBakedModel.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/model/PortableGridBakedModel.java @@ -124,7 +124,7 @@ public class PortableGridBakedModel extends DelegateBakedModel { break; } - if (portableGrid.isActive()) { + if (portableGrid.isGridActive()) { return new PortableGridItemBakedModel(baseConnected, myDisk); } else { return new PortableGridItemBakedModel(baseDisconnected, myDisk); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/CrafterManagerScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/CrafterManagerScreen.java index f690969a6..55d393b12 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/CrafterManagerScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/CrafterManagerScreen.java @@ -96,7 +96,7 @@ public class CrafterManagerScreen extends BaseScreen im blit(x, yy, 0, getTopHeight() + (18 * 3), xSize, getBottomHeight()); - if (crafterManager.isActive()) { + if (crafterManager.isActiveOnClient()) { for (Slot slot : container.inventorySlots) { if (slot instanceof CrafterManagerSlot && slot.isEnabled()) { blit(x + slot.xPos - 1, y + slot.yPos - 1, 0, 193, 18, 18); @@ -114,7 +114,7 @@ public class CrafterManagerScreen extends BaseScreen im renderString(7, 7, title.getFormattedText()); renderString(7, getYPlayerInventory() - 12, I18n.format("container.inventory")); - if (container != null && crafterManager.isActive()) { + if (container != null && crafterManager.isActiveOnClient()) { for (Map.Entry heading : container.getHeadings().entrySet()) { int y = heading.getValue(); @@ -152,12 +152,6 @@ public class CrafterManagerScreen extends BaseScreen im @Override public boolean keyPressed(int key, int scanCode, int modifiers) { - if (key == GLFW.GLFW_KEY_ESCAPE) { - minecraft.player.closeScreen(); - - return true; - } - if (searchField.keyPressed(key, scanCode, modifiers) || searchField.func_212955_f()) { return true; } @@ -220,7 +214,7 @@ public class CrafterManagerScreen extends BaseScreen im @Override public int getRows() { - return !crafterManager.isActive() ? 0 : container.getRows(); + return !crafterManager.isActiveOnClient() ? 0 : container.getRows(); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/CraftingMonitorScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/CraftingMonitorScreen.java index d860bafdf..dc255d819 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/CraftingMonitorScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/CraftingMonitorScreen.java @@ -141,7 +141,7 @@ public class CraftingMonitorScreen extends BaseScreen } public List getElements() { - if (!craftingMonitor.isActive()) { + if (!craftingMonitor.isActiveOnClient()) { return Collections.emptyList(); } @@ -236,7 +236,7 @@ public class CraftingMonitorScreen extends BaseScreen @Override public void renderBackground(int x, int y, int mouseX, int mouseY) { - if (craftingMonitor.isActive()) { + if (craftingMonitor.isActiveOnClient()) { tabs.drawBackground(x, y - tabs.getHeight()); } @@ -246,7 +246,7 @@ public class CraftingMonitorScreen extends BaseScreen scrollbar.render(); - tabs.drawForeground(x, y - tabs.getHeight(), mouseX, mouseY, craftingMonitor.isActive()); + tabs.drawForeground(x, y - tabs.getHeight(), mouseX, mouseY, craftingMonitor.isActiveOnClient()); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java index d3ee33670..342e130e2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java @@ -65,7 +65,7 @@ public class GridScreen extends BaseScreen implements IScreenInfo this.grid = grid; this.view = grid.getGridType() == GridType.FLUID ? new FluidGridView(this, getDefaultSorter(), getSorters()) : new ItemGridView(this, getDefaultSorter(), getSorters()); - this.wasConnected = this.grid.isActive(); + this.wasConnected = this.grid.isGridActive(); this.tabs = new TabListWidget(this, new ElementDrawers(this, font), grid::getTabs, grid::getTotalTabPages, grid::getTabPage, grid::getTabSelected, IGrid.TABS_PER_PAGE); this.tabs.addListener(new TabListWidget.ITabListListener() { @Override @@ -160,8 +160,8 @@ public class GridScreen extends BaseScreen implements IScreenInfo @Override public void tick(int x, int y) { - if (wasConnected != grid.isActive()) { - wasConnected = grid.isActive(); + if (wasConnected != grid.isGridActive()) { + wasConnected = grid.isGridActive(); view.sort(); } @@ -238,7 +238,7 @@ public class GridScreen extends BaseScreen implements IScreenInfo } private boolean isOverSlotWithStack() { - return grid.isActive() && isOverSlot() && slotNumber < view.getStacks().size(); + return grid.isGridActive() && isOverSlot() && slotNumber < view.getStacks().size(); } private boolean isOverSlot() { @@ -354,7 +354,7 @@ public class GridScreen extends BaseScreen implements IScreenInfo RenderSystem.setupGui3DDiffuseLighting(); for (int i = 0; i < 9 * getVisibleRows(); ++i) { - if (RenderUtils.inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isActive()) { + if (RenderUtils.inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isGridActive()) { this.slotNumber = slot; } @@ -362,8 +362,8 @@ public class GridScreen extends BaseScreen implements IScreenInfo view.getStacks().get(slot).draw(this, x, y); } - if (RenderUtils.inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isActive()) { - int color = grid.isActive() ? -2130706433 : 0xFF5B5B5B; + if (RenderUtils.inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isGridActive()) { + int color = grid.isGridActive() ? -2130706433 : 0xFF5B5B5B; RenderSystem.disableLighting(); RenderSystem.disableDepthTest(); @@ -435,7 +435,7 @@ public class GridScreen extends BaseScreen implements IScreenInfo RS.NETWORK_HANDLER.sendToServer(new GridPatternCreateMessage(((GridNetworkNode) grid).getPos())); return true; - } else if (grid.isActive()) { + } else if (grid.isGridActive()) { if (clickedClear) { minecraft.getSoundHandler().play(SimpleSound.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); @@ -538,12 +538,6 @@ public class GridScreen extends BaseScreen implements IScreenInfo @Override public boolean keyPressed(int key, int scanCode, int modifiers) { - if (key == GLFW.GLFW_KEY_ESCAPE) { - minecraft.player.closeScreen(); - - return true; - } - if (searchField.keyPressed(key, scanCode, modifiers) || searchField.func_212955_f()) { return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/FluidGridStack.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/FluidGridStack.java index 9adb15360..ae7d7e5a5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/FluidGridStack.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/FluidGridStack.java @@ -151,6 +151,10 @@ public class FluidGridStack implements IGridStack { @Override public String getFormattedFullQuantity() { + if (zeroed) { + return "0 mB"; + } + return API.instance().getQuantityFormatter().format(getQuantity()) + " mB"; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/ItemGridStack.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/ItemGridStack.java index 3ca9ec63f..91b2ff3c8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/ItemGridStack.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/stack/ItemGridStack.java @@ -164,6 +164,10 @@ public class ItemGridStack implements IGridStack { @Override public String getFormattedFullQuantity() { + if (zeroed) { + return "0"; + } + return API.instance().getQuantityFormatter().format(getQuantity()); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/BaseGridView.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/BaseGridView.java index f991d6d85..2829082a3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/BaseGridView.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/BaseGridView.java @@ -46,7 +46,7 @@ public abstract class BaseGridView implements IGridView { List stacks = new ArrayList<>(); - if (screen.getGrid().isActive()) { + if (screen.getGrid().isGridActive()) { stacks.addAll(map.values()); IGrid grid = screen.getGrid(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/FluidGridView.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/FluidGridView.java index df02b8941..5ab815f54 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/FluidGridView.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/FluidGridView.java @@ -27,12 +27,25 @@ public class FluidGridView extends BaseGridView { return; } + // COMMENT 1 (about this if check in general) // Update the other id reference if needed. // Taking a stack out - and then re-inserting it - gives the new stack a new ID // With that new id, the reference for the crafting stack would be outdated. + + // COMMENT 2 (about map.containsKey(stack.getOtherId())) + // This check is needed or the .updateOtherId() call will crash with a NPE in high-update environments. + // This is because we might have scenarios where we process "old" delta packets from another session when we haven't received any initial update packet from the new session. + // (This is because of the executeLater system) + // This causes the .updateOtherId() to fail with a NPE because the map is still empty or the IDs mismatch. + // We could use !map.isEmpty() here too. But if we have 2 "old" delta packets, it would rightfully ignore the first one. But this method mutates the map and would put an entry. + // This means that on the second delta packet it would still crash because the map wouldn't be empty anymore. if (!stack.isCraftable() && - stack.getOtherId() != null) { - map.get(stack.getOtherId()).updateOtherId(stack.getId()); + stack.getOtherId() != null && + map.containsKey(stack.getOtherId())) { + IGridStack craftingStack = map.get(stack.getOtherId()); + + craftingStack.updateOtherId(stack.getId()); + craftingStack.setTrackerEntry(stack.getTrackerEntry()); } FluidGridStack existing = (FluidGridStack) map.get(stack.getId()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/ItemGridView.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/ItemGridView.java index 762136b1f..2221db99f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/ItemGridView.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/view/ItemGridView.java @@ -27,12 +27,25 @@ public class ItemGridView extends BaseGridView { return; } + // COMMENT 1 (about this if check in general) // Update the other id reference if needed. // Taking a stack out - and then re-inserting it - gives the new stack a new ID // With that new id, the reference for the crafting stack would be outdated. + + // COMMENT 2 (about map.containsKey(stack.getOtherId())) + // This check is needed or the .updateOtherId() call will crash with a NPE in high-update environments. + // This is because we might have scenarios where we process "old" delta packets from another session when we haven't received any initial update packet from the new session. + // (This is because of the executeLater system) + // This causes the .updateOtherId() to fail with a NPE because the map is still empty or the IDs mismatch. + // We could use !map.isEmpty() here too. But if we have 2 "old" delta packets, it would rightfully ignore the first one. But this method mutates the map and would put an entry. + // This means that on the second delta packet it would still crash because the map wouldn't be empty anymore. if (!stack.isCraftable() && - stack.getOtherId() != null) { - map.get(stack.getOtherId()).updateOtherId(stack.getId()); + stack.getOtherId() != null && + map.containsKey(stack.getOtherId())) { + IGridStack craftingStack = map.get(stack.getOtherId()); + + craftingStack.updateOtherId(stack.getId()); + craftingStack.setTrackerEntry(stack.getTrackerEntry()); } ItemGridStack existing = (ItemGridStack) map.get(stack.getId()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java index a8c664ac2..90978f377 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java @@ -71,6 +71,26 @@ public class SearchWidget extends TextFieldWidget { } result = true; + } else if (keyCode == GLFW.GLFW_KEY_ESCAPE) { + saveHistory(); + + if (!canLoseFocus) { + // If we can't lose focus, + // and we press escape, + // we unfocus ourselves, + // and close the screen immediately. + setFocused(false); + + result = false; // Bubble the event up to the screen. + } else { + // If we can lose focus, + // and we press escape, + // we unfocus ourselves. + // On the next escape press, the screen will close. + setFocused(false); + + result = true; + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java index 78b2b9661..b7359514e 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java @@ -166,7 +166,7 @@ public class ControllerTile extends BaseTile implements INetworkNodeProxy nodes = new ArrayList<>(); for (INetworkNode node : tile.getNetwork().getNodeGraph().all()) { - if (node.canUpdate()) { + if (node.isActive()) { ItemStack stack = node.getItemStack(); if (stack.isEmpty()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java index dc1c46df8..961d5f499 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java @@ -26,7 +26,7 @@ public interface ICraftingMonitor { @Nullable ICraftingManager getCraftingManager(); - boolean isActive(); + boolean isActiveOnClient(); void onClosed(PlayerEntity player); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java index d0d678469..657ef332e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java @@ -111,7 +111,7 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { } @Override - public boolean isActive() { + public boolean isActiveOnClient() { return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java index cea0a15e5..3622063af 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java @@ -291,7 +291,7 @@ public class WirelessFluidGrid implements INetworkAwareGrid { } @Override - public boolean isActive() { + public boolean isGridActive() { return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java index ca72f1f3a..344782291 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java @@ -297,7 +297,7 @@ public class WirelessGrid implements INetworkAwareGrid { } @Override - public boolean isActive() { + public boolean isGridActive() { return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java index cb0665b0f..37f4cab98 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java @@ -45,7 +45,7 @@ public interface IPortableGrid { IStorageTracker getFluidStorageTracker(); - boolean isActive(); + boolean isGridActive(); PortableGridDiskState getDiskState(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java index 557243a4d..1890f04f6 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java @@ -427,7 +427,7 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer } @Override - public boolean isActive() { + public boolean isGridActive() { if (RS.SERVER_CONFIG.getPortableGrid().getUseEnergy() && ((PortableGridBlockItem) stack.getItem()).getType() != PortableGridBlockItem.Type.CREATIVE && stack.getCapability(CapabilityEnergy.ENERGY).orElse(null).getEnergyStored() <= RS.SERVER_CONFIG.getPortableGrid().getOpenUsage()) { @@ -469,7 +469,7 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer return PortableGridDiskState.NONE; } - if (!isActive()) { + if (!isGridActive()) { return PortableGridDiskState.DISCONNECTED; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGridTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGridTile.java index fe3b731eb..b82828781 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGridTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGridTile.java @@ -222,7 +222,7 @@ public class PortableGridTile extends BaseTile implements IGrid, IPortableGrid, this.loadStorage(); - active = isActive(); + active = isGridActive(); diskState = getDiskState(); } @@ -518,7 +518,7 @@ public class PortableGridTile extends BaseTile implements IGrid, IPortableGrid, } @Override - public boolean isActive() { + public boolean isGridActive() { if (world.isRemote) { BlockState state = world.getBlockState(pos); @@ -585,7 +585,7 @@ public class PortableGridTile extends BaseTile implements IGrid, IPortableGrid, return PortableGridDiskState.NONE; } - if (!isActive()) { + if (!isGridActive()) { return PortableGridDiskState.DISCONNECTED; } @@ -610,7 +610,7 @@ public class PortableGridTile extends BaseTile implements IGrid, IPortableGrid, world.setBlockState(pos, world.getBlockState(pos).with(PortableGridBlock.DISK_STATE, diskState)); } - boolean isActive = isActive(); + boolean isActive = isGridActive(); if (this.active != isActive) { this.active = isActive;