Fixed bug where some network parts don't want to connect to the storage system + extra optimizations for the network graph

This commit is contained in:
raoulvdberge
2017-05-25 18:25:21 +02:00
parent 6f8daec55d
commit cbf3bfeac0
6 changed files with 62 additions and 30 deletions

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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());
}
}

View File

@@ -23,7 +23,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
private TileController controller;
private Set<INetworkNode> nodes = new HashSet<>();
private Set<Integer> 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))) {
for (INetworkNode node : operator.previousNodes) {
node.onDisconnected(controller);
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<INetworkNode> all() {
return nodes;
@@ -83,16 +73,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
@Override
public void disconnectAll() {
List<INetworkNode> 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<INetworkNode> newNodes = new HashSet<>();
private Set<Integer> newNodeHashes = new HashSet<>();
private Set<Integer> uncheckedHashesFromPrevious = new HashSet<>(nodeHashes);
private Set<INetworkNode> 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));
}

View File

@@ -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);
}
}

View File

@@ -104,8 +104,8 @@ public abstract class TileNode<N extends NetworkNode> 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);