Implement equals/hashCode on nodes

This commit is contained in:
Raoul Van den Berge
2016-08-26 16:06:40 +02:00
parent 512f7149b2
commit 3913bbf815
6 changed files with 25 additions and 42 deletions

View File

@@ -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.
*/ */

View File

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

View File

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

View File

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

View File

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

View File

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