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
|
### 1.4.10
|
||||||
- Improved performance of network scanning (raoulvdberge)
|
- Improved performance of network scanning (raoulvdberge)
|
||||||
- Fixed crash when attempting to get direction of a node (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
|
### 1.4.9
|
||||||
- Fixed bug where inventory data was lost sometimes upon opening the world (raoulvdberge)
|
- 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.preview.ICraftingPreviewElementRegistry;
|
||||||
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
|
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
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.INetworkNodeManager;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeRegistry;
|
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeRegistry;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel;
|
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel;
|
||||||
@@ -134,4 +135,17 @@ public interface IRSAPI {
|
|||||||
* @return a hashcode for the given stack
|
* @return a hashcode for the given stack
|
||||||
*/
|
*/
|
||||||
int getFluidStackHashCode(FluidStack 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.autocrafting.registry.CraftingTaskRegistry;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeManager;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeManager;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeRegistry;
|
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.ReaderWriterChannel;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry;
|
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry;
|
||||||
import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry;
|
import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry;
|
||||||
@@ -196,4 +197,30 @@ public class API implements IRSAPI {
|
|||||||
public int getFluidStackHashCode(FluidStack stack) {
|
public int getFluidStackHashCode(FluidStack stack) {
|
||||||
return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1);
|
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 TileController controller;
|
||||||
|
|
||||||
private Set<INetworkNode> nodes = new HashSet<>();
|
private Set<INetworkNode> nodes = new HashSet<>();
|
||||||
private Set<Integer> nodeHashes = new HashSet<>();
|
|
||||||
|
|
||||||
public NetworkNodeGraph(TileController controller) {
|
public NetworkNodeGraph(TileController controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -54,28 +53,19 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
currentNodeToCheck.walkNeighborhood(operator);
|
currentNodeToCheck.walkNeighborhood(operator);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (INetworkNode node : nodes) {
|
for (INetworkNode node : operator.previousNodes) {
|
||||||
if (operator.uncheckedHashesFromPrevious.contains(getNodeHash(node))) {
|
node.onDisconnected(controller);
|
||||||
node.onDisconnected(controller);
|
|
||||||
|
|
||||||
operator.changed = true;
|
operator.changed = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.nodes = operator.newNodes;
|
this.nodes = operator.newNodes;
|
||||||
this.nodeHashes = operator.newNodeHashes;
|
|
||||||
|
|
||||||
if (operator.changed) {
|
if (operator.changed) {
|
||||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
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
|
@Override
|
||||||
public Collection<INetworkNode> all() {
|
public Collection<INetworkNode> all() {
|
||||||
return nodes;
|
return nodes;
|
||||||
@@ -83,16 +73,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disconnectAll() {
|
public void disconnectAll() {
|
||||||
List<INetworkNode> oldNodes = new ArrayList<>(nodes);
|
nodes.forEach(n -> n.onDisconnected(controller));
|
||||||
|
|
||||||
nodes.clear();
|
nodes.clear();
|
||||||
nodeHashes.clear();
|
|
||||||
|
|
||||||
for (INetworkNode node : oldNodes) {
|
|
||||||
if (node.getNetwork() == controller) {
|
|
||||||
node.onDisconnected(controller);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
||||||
}
|
}
|
||||||
@@ -121,8 +103,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
|
|
||||||
private class Operator implements INetworkNeighborhoodAware.Operator {
|
private class Operator implements INetworkNeighborhoodAware.Operator {
|
||||||
private Set<INetworkNode> newNodes = new HashSet<>();
|
private Set<INetworkNode> newNodes = new HashSet<>();
|
||||||
private Set<Integer> newNodeHashes = new HashSet<>();
|
private Set<INetworkNode> previousNodes = new HashSet<>(nodes);
|
||||||
private Set<Integer> uncheckedHashesFromPrevious = new HashSet<>(nodeHashes);
|
|
||||||
|
|
||||||
private boolean changed;
|
private boolean changed;
|
||||||
|
|
||||||
@@ -138,16 +119,15 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
} else if (tile.hasCapability(NETWORK_NODE_PROXY_CAPABILITY, side)) {
|
} else if (tile.hasCapability(NETWORK_NODE_PROXY_CAPABILITY, side)) {
|
||||||
INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, side));
|
INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, side));
|
||||||
INetworkNode otherNode = otherNodeProxy.getNode();
|
INetworkNode otherNode = otherNodeProxy.getNode();
|
||||||
int otherNodeHash = getNodeHash(otherNode);
|
|
||||||
|
|
||||||
if (newNodes.add(otherNode) && newNodeHashes.add(otherNodeHash)) {
|
if (newNodes.add(otherNode)) {
|
||||||
if (!nodeHashes.contains(otherNodeHash)) {
|
if (!nodes.contains(otherNode)) {
|
||||||
otherNode.onConnected(controller);
|
otherNode.onConnected(controller);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uncheckedHashesFromPrevious.remove(otherNodeHash);
|
previousNodes.remove(otherNode);
|
||||||
|
|
||||||
toCheck.add(new NodeToCheck(otherNode, world, pos, side, tile));
|
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) {
|
public void setActive(boolean active) {
|
||||||
this.active = 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);
|
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.
|
// @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.
|
// This should actually be called in Block#onBlockAdded
|
||||||
if (node == null) {
|
if (node == null) {
|
||||||
RSUtils.debugLog("Creating node at " + pos);
|
RSUtils.debugLog("Creating node at " + pos);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user