diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraph.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraph.java index 18c918c8a..66c9ccca6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraph.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraph.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.network; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.util.Action; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import java.util.Collection; import java.util.function.Consumer; @@ -14,11 +15,11 @@ public interface INetworkNodeGraph { /** * Rebuilds the network graph. * - * @deprecated Use {@link #invalidate(Action, BlockPos)} - needed to support simulating the calculation of network connections + * @deprecated Use {@link #invalidate(Action, World, BlockPos)} - needed to support simulating the calculation of network connections */ @Deprecated default void rebuild() { - invalidate(Action.PERFORM, getNetworkForBCReasons().getPosition()); + invalidate(Action.PERFORM, getNetworkForBCReasons().world(), getNetworkForBCReasons().getPosition()); } /** @@ -32,9 +33,10 @@ public interface INetworkNodeGraph { * Rebuilds the network graph. * * @param action whether to perform or simulate + * @param world the origin world * @param origin the origin, usually the network position */ - void invalidate(Action action, BlockPos origin); + void invalidate(Action action, World world, BlockPos origin); /** * Runs an action on the network. @@ -61,6 +63,11 @@ public interface INetworkNodeGraph { */ Collection all(); + /** + * @param listener the listener + */ + void addListener(INetworkNodeGraphListener listener); + /** * Disconnects and notifies all connected nodes. */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraphListener.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraphListener.java new file mode 100644 index 000000000..b468999df --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeGraphListener.java @@ -0,0 +1,11 @@ +package com.raoulvdberge.refinedstorage.api.network; + +/** + * A listener for the node graph. + */ +public interface INetworkNodeGraphListener { + /** + * Called when the graph changes. + */ + void onChanged(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeVisitor.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeVisitor.java index 0e08f1cba..5bf88b459 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeVisitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkNodeVisitor.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.api.network; +import com.raoulvdberge.refinedstorage.api.util.Action; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -7,13 +8,36 @@ import net.minecraft.world.World; import javax.annotation.Nullable; /** - * Allows the network nodes to implement more optimal or non-regular discovery of neighbor nodes. + * Allows the network nodes to implement more optimal or non-regular discovery of other (neighboring) nodes. */ public interface INetworkNodeVisitor { + /** + * Called by the network node graph when a {@link Operator} has requested this node to be visited. + * + * @param operator the operator + */ void visit(Operator operator); - @FunctionalInterface + /** + * An operator is passed to the {@link #visit(Operator)} method to allow the network node visitor to add positions of nodes to scan. + */ interface Operator { + /** + * Calling this method in {@link #visit(Operator)} will make the network graph scan the given world and position. + * If there is another {@link INetworkNodeVisitor} at that position, it will call that visitor. + * If there is no {@link INetworkNodeVisitor} at that position, it will use a default implementation which scans neighbors. + * + * @param world the world + * @param pos the position + * @param side the side + */ void apply(World world, BlockPos pos, @Nullable EnumFacing side); + + /** + * Returns whether the network graph is scanning in simulation mode. + * + * @return the action + */ + Action getAction(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 0e421b92f..48e4f41e8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -292,7 +292,7 @@ public class API implements IRSAPI { INetworkNode node = nodeProxy.getNode(); if (node.getNetwork() != null) { - node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().getPosition()); + node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().world(), node.getNetwork().getPosition()); return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java index 37f04efb3..b15dba5d6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java @@ -3,13 +3,13 @@ package com.raoulvdberge.refinedstorage.apiimpl.network; import com.google.common.collect.Sets; import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph; +import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraphListener; import com.raoulvdberge.refinedstorage.api.network.INetworkNodeVisitor; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; -import com.raoulvdberge.refinedstorage.tile.TileController; +import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; @@ -26,42 +26,35 @@ 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 INetwork network; private Set nodes = Sets.newConcurrentHashSet(); + private List listeners = new LinkedList<>(); private Set> actions = new HashSet<>(); private boolean invalidating = false; - public NetworkNodeGraph(TileController controller) { - this.controller = controller; + public NetworkNodeGraph(INetwork network) { + this.network = network; } @Override - public void invalidate(Action action, BlockPos origin) { + public void invalidate(Action action, World world, BlockPos origin) { this.invalidating = true; Operator operator = new Operator(action); - World controllerWorld = controller.getWorld(); + TileEntity tile = world.getTileEntity(origin); + if (tile != null && tile.hasCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, null)) { + INetworkNodeProxy proxy = tile.getCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, null); - for (EnumFacing facing : EnumFacing.VALUES) { - BlockPos pos = origin.offset(facing); + if (proxy != null) { + INetworkNode node = proxy.getNode(); - // Little hack to support not conducting through covers (if the cover is right next to the controller). - TileEntity tile = controllerWorld.getTileEntity(pos); - - if (tile != null && tile.hasCapability(NETWORK_NODE_PROXY_CAPABILITY, facing.getOpposite())) { - INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, facing.getOpposite())); - INetworkNode otherNode = otherNodeProxy.getNode(); - - if (otherNode instanceof ICoverable && ((ICoverable) otherNode).getCoverManager().hasCover(facing.getOpposite())) { - continue; + if (node instanceof INetworkNodeVisitor) { + ((INetworkNodeVisitor) node).visit(operator); } } - // End little hack. - - operator.apply(controllerWorld, pos, facing.getOpposite()); } Visitor currentVisitor; @@ -73,29 +66,30 @@ public class NetworkNodeGraph implements INetworkNodeGraph { if (action == Action.PERFORM) { for (INetworkNode node : operator.newNodes) { - node.onConnected(controller); + node.onConnected(network); } for (INetworkNode node : operator.previousNodes) { - node.onDisconnected(controller); + node.onDisconnected(network); } - actions.forEach(h -> h.accept(controller)); + actions.forEach(h -> h.accept(network)); actions.clear(); if (!operator.newNodes.isEmpty() || !operator.previousNodes.isEmpty()) { - controller.getDataManager().sendParameterToWatchers(TileController.NODES); + listeners.forEach(INetworkNodeGraphListener::onChanged); } } - invalidating = false; + this.invalidating = false; } @Override + @SuppressWarnings("deprecation") public INetwork getNetworkForBCReasons() { OneSixMigrationHelper.removalHook(); - return controller; + return network; } @Override @@ -103,7 +97,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { if (invalidating) { actions.add(handler); } else { - handler.accept(controller); + handler.accept(network); } } @@ -112,20 +106,25 @@ public class NetworkNodeGraph implements INetworkNodeGraph { return nodes; } + @Override + public void addListener(INetworkNodeGraphListener listener) { + listeners.add(listener); + } + @Override public void disconnectAll() { - nodes.forEach(n -> n.onDisconnected(controller)); + nodes.forEach(n -> n.onDisconnected(network)); nodes.clear(); - controller.getDataManager().sendParameterToWatchers(TileController.NODES); + listeners.forEach(INetworkNodeGraphListener::onChanged); } protected World getWorld() { - return controller.getWorld(); + return network.world(); } private void dropConflictingBlock(World world, BlockPos pos) { - if (!controller.getPos().equals(pos)) { + if (!network.getPosition().equals(pos)) { IBlockState state = world.getBlockState(pos); NonNullList drops = NonNullList.create(); @@ -162,7 +161,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { INetworkNode otherNode = otherNodeProxy.getNode(); // This will work for regular nodes and for controllers too since controllers are internally a INetworkNode (and return themselves in INetworkNode#getNetwork). - if (otherNode.getNetwork() != null && otherNode.getNetwork() != controller) { + if (otherNode.getNetwork() != null && otherNode.getNetwork() != network) { if (action == Action.PERFORM) { dropConflictingBlock(world, tile.getPos()); } @@ -184,6 +183,11 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } } } + + @Override + public Action getAction() { + return action; + } } private class Visitor implements INetworkNodeVisitor { 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 00075f394..af3a52427 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 @@ -40,7 +40,13 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor { private EnumFacing direction = EnumFacing.NORTH; - private boolean throttlingDisabled; + // Disable throttling for the first tick. + // This is to make sure couldUpdate is going to be correctly set. + // If we place 2 blocks next to each other, and disconnect the first one really fast, + // the second one would not realize it has been disconnected because couldUpdate == canUpdate. + // It would however still have the connected state, due to the initial block update packet. + // The couldUpdate/canUpdate system is separate from that. + private boolean throttlingDisabled = true; private boolean couldUpdate; private int ticksSinceUpdateChanged; @@ -125,7 +131,7 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor { public void update() { ++ticks; - boolean canUpdate = getNetwork() != null && canUpdate(); + boolean canUpdate = canUpdate(); if (couldUpdate != canUpdate) { ++ticksSinceUpdateChanged; @@ -143,7 +149,7 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor { onConnectedStateChange(network, canUpdate); if (shouldRebuildGraphOnChange()) { - network.getNodeGraph().invalidate(Action.PERFORM, network.getPosition()); + network.getNodeGraph().invalidate(Action.PERFORM, network.world(), network.getPosition()); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java index 0abb1ca89..0a839c79a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java @@ -84,7 +84,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, public void update() { super.update(); - if (network != null && canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { + if (canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { if (type == IType.ITEMS && !itemFilters.getStackInSlot(0).isEmpty()) { ItemStack item = itemFilters.getStackInSlot(0); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java index 0b1a27fe7..81a1e10df 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java @@ -90,7 +90,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I public void update() { super.update(); - if (network != null && canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { + if (canUpdate() && ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { BlockPos front = pos.offset(getDirection()); if (pickupItem && type == IType.ITEMS) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java index 74b670df1..b8b7a8d69 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java @@ -68,7 +68,7 @@ public class NetworkNodeDetector extends NetworkNode implements IComparable, ITy WorldUtils.updateBlock(world, pos); } - if (network != null && canUpdate() && ticks % SPEED == 0) { + if (canUpdate() && ticks % SPEED == 0) { if (type == IType.ITEMS) { ItemStack slot = itemFilters.getStackInSlot(0); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java index 5cc96d649..ca65a8225 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java @@ -63,7 +63,7 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy public void update() { super.update(); - if (network != null && canUpdate() && ticks % upgrades.getSpeed() == 0) { + if (canUpdate() && ticks % upgrades.getSpeed() == 0) { if (type == IType.ITEMS) { IItemHandler handler = WorldUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java index 881ae7637..e639f55db 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java @@ -71,7 +71,7 @@ public class NetworkNodeFluidInterface extends NetworkNode { public void update() { super.update(); - if (network != null && canUpdate()) { + if (canUpdate()) { ItemStack container = in.getStackInSlot(0); if (!container.isEmpty()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java index 8ce19d8e6..fb97bf45b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java @@ -68,7 +68,7 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IFi public void update() { super.update(); - if (network == null || !canUpdate()) { + if (!canUpdate()) { return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index 822d937ec..5281c0915 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -53,7 +53,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { public void update() { super.update(); - if (network == null || !canUpdate()) { + if (!canUpdate()) { return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeNetworkTransmitter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeNetworkTransmitter.java index 5c565b9b6..df0ab6ba4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeNetworkTransmitter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeNetworkTransmitter.java @@ -29,7 +29,7 @@ public class NetworkNodeNetworkTransmitter extends NetworkNode { super.onContentsChanged(slot); if (network != null) { - network.getNodeGraph().invalidate(Action.PERFORM, network.getPosition()); + network.getNodeGraph().invalidate(Action.PERFORM, network.world(), network.getPosition()); } } }; @@ -49,7 +49,7 @@ public class NetworkNodeNetworkTransmitter extends NetworkNode { } if (network != null) { - network.getNodeGraph().invalidate(Action.PERFORM, network.getPosition()); + network.getNodeGraph().invalidate(Action.PERFORM, network.world(), network.getPosition()); } } }; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java index dfbe445d1..6c8c67346 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java @@ -81,7 +81,7 @@ public class CoverManager { node.markDirty(); if (node.getNetwork() != null) { - node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().getPosition()); + node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().world(), node.getNetwork().getPosition()); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java index 327670f4d..bc31d921f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java @@ -135,7 +135,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab public void update() { super.update(); - if (network == null || !canUpdate() || ticks % upgrades.getSpeed() != 0) { + if (!canUpdate() || ticks % upgrades.getSpeed() != 0) { return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNode.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNode.java index 6ba0b5f7f..c3d1d37d8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNode.java @@ -53,7 +53,7 @@ public abstract class BlockNode extends BlockNodeProxy { manager.markForSaving(); if (node != null && node.getNetwork() != null) { - node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().getPosition()); + node.getNetwork().getNodeGraph().invalidate(Action.PERFORM, node.getNetwork().world(), node.getNetwork().getPosition()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java index e3cea3ea2..ed728e954 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java @@ -123,16 +123,4 @@ public abstract class TileBase extends TileEntity { world.markChunkDirty(pos, this); } } - - @Override - public boolean equals(Object o) { - return o instanceof TileBase && ((TileBase) o).getPos().equals(pos) && ((TileBase) o).world.provider.getDimension() == world.provider.getDimension(); - } - - @Override - public int hashCode() { - int result = pos.hashCode(); - result = 31 * result + world.provider.getDimension(); - return result; - } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 933e05b6f..7915cdabc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.energy.IEnergy; 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.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; @@ -21,12 +22,14 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageTracker; import com.raoulvdberge.refinedstorage.api.storage.externalstorage.IStorageExternal; import com.raoulvdberge.refinedstorage.api.util.Action; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.CraftingManager; import com.raoulvdberge.refinedstorage.apiimpl.energy.Energy; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeGraph; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.item.NetworkItemHandler; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterManager; import com.raoulvdberge.refinedstorage.apiimpl.network.security.SecurityManager; import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid; @@ -49,6 +52,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; @@ -66,7 +70,9 @@ import java.util.Comparator; import java.util.List; import java.util.function.Predicate; -public class TileController extends TileBase implements ITickable, INetwork, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy { +import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY; + +public class TileController extends TileBase implements ITickable, INetwork, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy, INetworkNodeVisitor { private static final Comparator CLIENT_NODE_COMPARATOR = (left, right) -> { if (left.getEnergyUsage() == right.getEnergyUsage()) { return 0; @@ -164,6 +170,8 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe markDirty(); } }); + + nodeGraph.addListener(() -> dataManager.sendParameterToWatchers(TileController.NODES)); } @Override @@ -231,7 +239,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe couldRun = canRun; throttlingDisabled = false; - nodeGraph.invalidate(Action.PERFORM, pos); + nodeGraph.invalidate(Action.PERFORM, world, pos); securityManager.invalidate(); } } else { @@ -682,4 +690,34 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe public TileController getNode() { return this; } + + @Override + public void visit(Operator operator) { + for (EnumFacing facing : EnumFacing.VALUES) { + BlockPos pos = this.pos.offset(facing); + + TileEntity tile = world.getTileEntity(pos); + + if (tile != null && tile.hasCapability(NETWORK_NODE_PROXY_CAPABILITY, facing.getOpposite())) { + INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, facing.getOpposite())); + INetworkNode otherNode = otherNodeProxy.getNode(); + + if (otherNode instanceof ICoverable && ((ICoverable) otherNode).getCoverManager().hasCover(facing.getOpposite())) { + continue; + } + } + + operator.apply(world, pos, facing.getOpposite()); + } + } + + @Override + public boolean equals(Object o) { + return API.instance().isNetworkNodeEqual(this, o); + } + + @Override + public int hashCode() { + return API.instance().getNetworkNodeHashCode(this); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java index 32e30c3ee..b520160a6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java @@ -86,7 +86,7 @@ public class TileDiskDrive extends TileNode { public NBTTagCompound writeUpdate(NBTTagCompound tag) { super.writeUpdate(tag); - writeDiskState(tag, 8, getNode().getNetwork() != null && getNode().canUpdate(), getNode().getItemDisks(), getNode().getFluidDisks()); + writeDiskState(tag, 8, getNode().canUpdate(), getNode().getItemDisks(), getNode().getFluidDisks()); return tag; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java index c0790d7f9..df08deacd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java @@ -40,7 +40,7 @@ public class TileDiskManipulator extends TileNode { public NBTTagCompound writeUpdate(NBTTagCompound tag) { super.writeUpdate(tag); - TileDiskDrive.writeDiskState(tag, 6, getNode().getNetwork() != null && getNode().canUpdate(), getNode().getItemDisks(), getNode().getFluidDisks()); + TileDiskDrive.writeDiskState(tag, 6, getNode().canUpdate(), getNode().getItemDisks(), getNode().getFluidDisks()); return tag; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index e34626ea7..2874df82d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -54,7 +54,7 @@ public abstract class TileNode extends TileBase implement tag.setTag(NBT_COVERS, ((ICoverable) getNode()).getCoverManager().writeToNbt()); } - tag.setBoolean(NBT_ACTIVE, getNode().getNetwork() != null && getNode().canUpdate()); + tag.setBoolean(NBT_ACTIVE, getNode().canUpdate()); return tag; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java index 5fa2e3966..43ca264d7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java @@ -73,7 +73,7 @@ public class TileReader extends TileNode { } } - if (reader.getNetwork() == null || !reader.canUpdate()) { + if (!reader.canUpdate()) { return (T) dummyCap; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java index 2e710bbd4..2415edf3f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java @@ -61,7 +61,7 @@ public class TileWriter extends TileNode { } } - if (writer.getNetwork() == null || !writer.canUpdate()) { + if (!writer.canUpdate()) { return (T) dummyCap; }