Implement equals/hashCode on nodes
This commit is contained in:
@@ -1,10 +1,8 @@
|
|||||||
package refinedstorage.api.network;
|
package refinedstorage.api.network;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A graph of all the nodes connected to a network.
|
* A graph of all the nodes connected to a network.
|
||||||
@@ -23,11 +21,6 @@ public interface INetworkNodeGraph {
|
|||||||
*/
|
*/
|
||||||
List<INetworkNode> all();
|
List<INetworkNode> all();
|
||||||
|
|
||||||
/**
|
|
||||||
* @return A set of hashes of all connected nodes, see {@link NetworkUtils#getNodeHashCode(World, INetworkNode)}
|
|
||||||
*/
|
|
||||||
Set<Integer> allHashes();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects and notifies all connected nodes.
|
* Disconnects and notifies all connected nodes.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package refinedstorage.api.network;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.fluids.FluidRegistry;
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||||
@@ -42,13 +41,7 @@ public final class NetworkUtils {
|
|||||||
return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1);
|
return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getNodeHashCode(World world, INetworkNode node) {
|
public static void writeItemStack(ByteBuf buf, INetworkMaster network, ItemStack stack) {
|
||||||
int result = node.getPosition().hashCode();
|
|
||||||
result = 31 * result + world.provider.getDimension();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void writeStack(ByteBuf buf, INetworkMaster network, ItemStack stack) {
|
|
||||||
buf.writeInt(Item.getIdFromItem(stack.getItem()));
|
buf.writeInt(Item.getIdFromItem(stack.getItem()));
|
||||||
buf.writeInt(stack.stackSize);
|
buf.writeInt(stack.stackSize);
|
||||||
buf.writeInt(stack.getItemDamage());
|
buf.writeInt(stack.getItemDamage());
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import net.minecraft.world.World;
|
|||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import refinedstorage.api.network.INetworkNode;
|
import refinedstorage.api.network.INetworkNode;
|
||||||
import refinedstorage.api.network.INetworkNodeGraph;
|
import refinedstorage.api.network.INetworkNodeGraph;
|
||||||
import refinedstorage.api.network.NetworkUtils;
|
|
||||||
import refinedstorage.tile.TileController;
|
import refinedstorage.tile.TileController;
|
||||||
import refinedstorage.tile.TileNetworkTransmitter;
|
import refinedstorage.tile.TileNetworkTransmitter;
|
||||||
|
|
||||||
@@ -17,7 +16,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
private TileController controller;
|
private TileController controller;
|
||||||
|
|
||||||
private List<INetworkNode> nodes = new ArrayList<>();
|
private List<INetworkNode> nodes = new ArrayList<>();
|
||||||
private Set<Integer> nodeHashes = new HashSet<>();
|
|
||||||
|
|
||||||
public NetworkNodeGraph(TileController controller) {
|
public NetworkNodeGraph(TileController controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -36,7 +34,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
World world = getWorld();
|
World world = getWorld();
|
||||||
|
|
||||||
List<INetworkNode> newNodes = new ArrayList<>();
|
List<INetworkNode> newNodes = new ArrayList<>();
|
||||||
Set<Integer> newNodeHashes = new HashSet<>();
|
|
||||||
|
|
||||||
Set<BlockPos> checked = new HashSet<>();
|
Set<BlockPos> checked = new HashSet<>();
|
||||||
Queue<BlockPos> toCheck = new ArrayDeque<>();
|
Queue<BlockPos> toCheck = new ArrayDeque<>();
|
||||||
@@ -66,7 +63,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
INetworkNode node = (INetworkNode) tile;
|
INetworkNode node = (INetworkNode) tile;
|
||||||
|
|
||||||
newNodes.add(node);
|
newNodes.add(node);
|
||||||
newNodeHashes.add(NetworkUtils.getNodeHashCode(world, node));
|
|
||||||
|
|
||||||
if (tile instanceof TileNetworkTransmitter) {
|
if (tile instanceof TileNetworkTransmitter) {
|
||||||
final TileNetworkTransmitter transmitter = (TileNetworkTransmitter) tile;
|
final TileNetworkTransmitter transmitter = (TileNetworkTransmitter) tile;
|
||||||
@@ -86,7 +82,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
dimensionGraph.rebuild(transmitter.getReceiver(), false);
|
dimensionGraph.rebuild(transmitter.getReceiver(), false);
|
||||||
|
|
||||||
newNodes.addAll(dimensionGraph.all());
|
newNodes.addAll(dimensionGraph.all());
|
||||||
newNodeHashes.addAll(dimensionGraph.allHashes());
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
BlockPos receiver = transmitter.getReceiver();
|
BlockPos receiver = transmitter.getReceiver();
|
||||||
@@ -109,34 +104,30 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<INetworkNode> oldNodes = new ArrayList<>(nodes);
|
boolean changed = false;
|
||||||
Set<Integer> oldNodeHashes = new HashSet<>(nodeHashes);
|
|
||||||
|
|
||||||
this.nodes = newNodes;
|
|
||||||
this.nodeHashes = newNodeHashes;
|
|
||||||
|
|
||||||
if (notify) {
|
if (notify) {
|
||||||
boolean changed = false;
|
for (INetworkNode newNode : newNodes) {
|
||||||
|
if (!nodes.contains(newNode)) {
|
||||||
for (INetworkNode newNode : nodes) {
|
|
||||||
if (!oldNodeHashes.contains(NetworkUtils.getNodeHashCode(newNode.getNodeWorld(), newNode))) {
|
|
||||||
newNode.onConnected(controller);
|
newNode.onConnected(controller);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (INetworkNode oldNode : oldNodes) {
|
for (INetworkNode oldNode : nodes) {
|
||||||
if (!nodeHashes.contains(NetworkUtils.getNodeHashCode(oldNode.getNodeWorld(), oldNode))) {
|
if (!newNodes.contains(oldNode)) {
|
||||||
oldNode.onDisconnected(controller);
|
oldNode.onDisconnected(controller);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (changed) {
|
this.nodes = newNodes;
|
||||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
|
||||||
}
|
if (changed) {
|
||||||
|
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,11 +136,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<Integer> allHashes() {
|
|
||||||
return nodeHashes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disconnectAll() {
|
public void disconnectAll() {
|
||||||
for (INetworkNode node : nodes) {
|
for (INetworkNode node : nodes) {
|
||||||
@@ -159,7 +145,6 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nodes.clear();
|
nodes.clear();
|
||||||
nodeHashes.clear();
|
|
||||||
|
|
||||||
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class MessageGridItemDelta implements IMessage, IMessageHandler<MessageGr
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void toBytes(ByteBuf buf) {
|
public void toBytes(ByteBuf buf) {
|
||||||
NetworkUtils.writeStack(buf, network, stack);
|
NetworkUtils.writeItemStack(buf, network, stack);
|
||||||
buf.writeInt(delta);
|
buf.writeInt(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class MessageGridItemUpdate implements IMessage, IMessageHandler<MessageG
|
|||||||
buf.writeInt(network.getItemStorage().getStacks().size());
|
buf.writeInt(network.getItemStorage().getStacks().size());
|
||||||
|
|
||||||
for (ItemStack stack : network.getItemStorage().getStacks()) {
|
for (ItemStack stack : network.getItemStorage().getStacks()) {
|
||||||
NetworkUtils.writeStack(buf, network, stack);
|
NetworkUtils.writeItemStack(buf, network, stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -165,4 +165,16 @@ public abstract class TileNode extends TileBase implements INetworkNode, IRedsto
|
|||||||
public boolean hasConnectivityState() {
|
public boolean hasConnectivityState() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return o instanceof TileNode && ((TileNode) o).getPosition().equals(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = pos.hashCode();
|
||||||
|
result = 31 * result + worldObj.provider.getDimension();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user