From cbf3bfeac0d7aa0db60e1b1af9585eccabad04fe Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 25 May 2017 18:25:21 +0200 Subject: [PATCH] Fixed bug where some network parts don't want to connect to the storage system + extra optimizations for the network graph --- CHANGELOG.md | 1 + .../refinedstorage/api/IRSAPI.java | 14 ++++++++ .../refinedstorage/apiimpl/API.java | 27 ++++++++++++++ .../apiimpl/network/NetworkNodeGraph.java | 36 +++++-------------- .../apiimpl/network/node/NetworkNode.java | 10 ++++++ .../refinedstorage/tile/TileNode.java | 4 +-- 6 files changed, 62 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77baccb52..d8e7c3258 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 1.4.10 - Improved performance of network scanning (raoulvdberge) - Fixed crash when attempting to get direction of a node (raoulvdberge) +- Fixed bug where some network parts don't want to connect to the storage system (raoulvdberge) ### 1.4.9 - Fixed bug where inventory data was lost sometimes upon opening the world (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 491fee5a7..195b71e74 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeRegistry; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; @@ -134,4 +135,17 @@ public interface IRSAPI { * @return a hashcode for the given stack */ int getFluidStackHashCode(FluidStack stack); + + /** + * @param node the node + * @return the hashcode + */ + int getNetworkNodeHashCode(INetworkNode node); + + /** + * @param left the first network node + * @param right the second network node + * @return true if the two network nodes are equal, false otherwise + */ + boolean isNetworkNodeEqual(INetworkNode left, Object right); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index fe95e98c2..57cae9057 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -23,6 +23,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPrev import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeManager; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeRegistry; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterChannel; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry; @@ -196,4 +197,30 @@ public class API implements IRSAPI { public int getFluidStackHashCode(FluidStack stack) { return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1); } + + @Override + public int getNetworkNodeHashCode(INetworkNode node) { + int result = node.getPos().hashCode(); + result = 31 * result + node.getWorld().provider.getDimension(); + return result; + } + + @Override + public boolean isNetworkNodeEqual(INetworkNode left, Object right) { + if (!(right instanceof INetworkNode)) { + return false; + } + + if (left == right) { + return true; + } + + NetworkNode rightNode = (NetworkNode) right; + + if (left.getWorld().provider.getDimension() != rightNode.getWorld().provider.getDimension()) { + return false; + } + + return left.getPos().equals(rightNode.getPos()); + } } 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 80d41f629..87ad584d8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java @@ -23,7 +23,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph { private TileController controller; private Set nodes = new HashSet<>(); - private Set nodeHashes = new HashSet<>(); public NetworkNodeGraph(TileController controller) { this.controller = controller; @@ -54,28 +53,19 @@ public class NetworkNodeGraph implements INetworkNodeGraph { currentNodeToCheck.walkNeighborhood(operator); } - for (INetworkNode node : nodes) { - if (operator.uncheckedHashesFromPrevious.contains(getNodeHash(node))) { - node.onDisconnected(controller); + for (INetworkNode node : operator.previousNodes) { + node.onDisconnected(controller); - operator.changed = true; - } + operator.changed = true; } this.nodes = operator.newNodes; - this.nodeHashes = operator.newNodeHashes; if (operator.changed) { controller.getDataManager().sendParameterToWatchers(TileController.NODES); } } - private static int getNodeHash(INetworkNode node) { - int result = node.getWorld().provider.getDimension(); - result = 31 * result + node.getPos().hashCode(); - return result; - } - @Override public Collection all() { return nodes; @@ -83,16 +73,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph { @Override public void disconnectAll() { - List oldNodes = new ArrayList<>(nodes); - + nodes.forEach(n -> n.onDisconnected(controller)); nodes.clear(); - nodeHashes.clear(); - - for (INetworkNode node : oldNodes) { - if (node.getNetwork() == controller) { - node.onDisconnected(controller); - } - } controller.getDataManager().sendParameterToWatchers(TileController.NODES); } @@ -121,8 +103,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { private class Operator implements INetworkNeighborhoodAware.Operator { private Set newNodes = new HashSet<>(); - private Set newNodeHashes = new HashSet<>(); - private Set uncheckedHashesFromPrevious = new HashSet<>(nodeHashes); + private Set previousNodes = new HashSet<>(nodes); private boolean changed; @@ -138,16 +119,15 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } else if (tile.hasCapability(NETWORK_NODE_PROXY_CAPABILITY, side)) { INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, side)); INetworkNode otherNode = otherNodeProxy.getNode(); - int otherNodeHash = getNodeHash(otherNode); - if (newNodes.add(otherNode) && newNodeHashes.add(otherNodeHash)) { - if (!nodeHashes.contains(otherNodeHash)) { + if (newNodes.add(otherNode)) { + if (!nodes.contains(otherNode)) { otherNode.onConnected(controller); changed = true; } - uncheckedHashesFromPrevious.remove(otherNodeHash); + previousNodes.remove(otherNode); toCheck.add(new NodeToCheck(otherNode, world, pos, side, tile)); } 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 a01acc5af..f3e0961e9 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 @@ -198,4 +198,14 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA public void setActive(boolean active) { this.active = active; } + + @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/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index 247078213..ea92ab756 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -104,8 +104,8 @@ public abstract class TileNode extends TileBase implement NetworkNode node = (NetworkNode) manager.getNode(pos); - // @TODO: This is a hack to support previous broken versions that have no nodes for some tiles due to a bug. - // This should actually be called in Block#onBlockAdded. + // @TODO: This is a hack to support previous broken versions that have no nodes for some tiles due to a bug + // This should actually be called in Block#onBlockAdded if (node == null) { RSUtils.debugLog("Creating node at " + pos);