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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user