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