diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ClientPastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ClientPastelNetworkManager.java index 6810c1c939..f2843e5f0c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ClientPastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ClientPastelNetworkManager.java @@ -1,14 +1,12 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; import de.dafuqs.spectrum.blocks.pastel_network.*; -import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import net.fabricmc.api.*; import net.fabricmc.fabric.api.client.rendering.v1.*; import net.minecraft.client.*; import net.minecraft.client.util.math.*; import net.minecraft.util.math.*; import net.minecraft.world.*; -import org.jetbrains.annotations.*; import org.jgrapht.*; import org.jgrapht.graph.*; import org.joml.*; @@ -20,92 +18,10 @@ public class ClientPastelNetworkManager implements PastelNetworkManager { private final List networks = new ArrayList<>(); - @Override - public PastelNetwork joinOrCreateNetwork(PastelNodeBlockEntity node, UUID uuid) { - PastelNetwork foundNetwork = null; - for (int i = 0; i < this.networks.size(); i++) { - PastelNetwork network = this.networks.get(i); - if (network.getUUID().equals(uuid)) { - network.addNode(node); - foundNetwork = network; - } else { - if (network.removeNode(node, NodeRemovalReason.MOVED)) { - i--; - } - // network empty => delete - if (!network.hasNodes()) { - this.networks.remove(network); - } - } - } - if (foundNetwork != null) { - return foundNetwork; - } - - PastelNetwork network = createNetwork(node.getWorld(), uuid); - network.addNode(node); - return network; - } - @Override public Optional getNetwork(UUID uuid) { return networks.stream().filter(n -> n.uuid.equals(uuid)).findFirst(); } - - @Override - public void connectNodes(PastelNodeBlockEntity node, PastelNodeBlockEntity parent, @NotNull UUID id) { - PastelNetwork mainNetwork, yieldingNetwork; - - if (parent.getParentNetwork() != null) { - mainNetwork = parent.getParentNetwork(); - yieldingNetwork = node.getParentNetwork(); - - if (yieldingNetwork == null) { - mainNetwork.addNodeAndConnect(node, parent); - node.setParentNetwork(mainNetwork); - return; - } - } - else if (node.getParentNetwork() != null) { - mainNetwork = node.getParentNetwork(); - yieldingNetwork = parent.getParentNetwork(); - - if (yieldingNetwork == null) { - mainNetwork.addNodeAndConnect(parent, node); - parent.setParentNetwork(mainNetwork); - return; - } - } - else { - mainNetwork = createNetwork(node.getWorld(), id); - mainNetwork.addNode(parent); - parent.setParentNetwork(mainNetwork); - mainNetwork.addNodeAndConnect(node, parent); - node.setParentNetwork(mainNetwork); - return; - } - - if (mainNetwork == yieldingNetwork) { - return; - } - - mainNetwork.incorporate(yieldingNetwork, node, parent); - this.networks.remove(yieldingNetwork); - } - - @Override - public void removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) { - PastelNetwork network = node.getParentNetwork(); - if (network != null) { - network.removeNode(node, reason); - if (network.graph.vertexSet().isEmpty()) { - this.networks.remove(network); - } - else { - checkForNetworkSplit(network); - } - } - } @Override public PastelNetwork createNetwork(World world, UUID uuid) { @@ -131,7 +47,6 @@ public void renderLines(WorldRenderContext context) { matrices.push(); matrices.translate(-pos.x, -pos.y, -pos.z); PastelRenderHelper.renderLineTo(context.matrixStack(), context.consumers(), colors, source, target); - // PastelRenderHelper.renderLineTo(context.matrixStack(), context.consumers(), colors, target.getPos(), source.getPos()); if (client.options.debugEnabled) { Vec3d offset = Vec3d.ofCenter(target).subtract(Vec3d.of(source)); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java index 6deef66d5b..a70d51fec6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java @@ -1,14 +1,8 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import de.dafuqs.spectrum.helpers.ColorHelper; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.networking.*; -import net.minecraft.block.entity.*; import net.minecraft.nbt.*; -import net.minecraft.registry.*; -import net.minecraft.util.*; import net.minecraft.util.math.*; import net.minecraft.world.*; import org.jetbrains.annotations.*; @@ -16,20 +10,15 @@ import org.jgrapht.graph.*; import java.util.*; -import java.util.concurrent.*; import java.util.stream.*; public class PastelNetwork { - protected final Map> loadedNodes = new ConcurrentHashMap<>(); - protected final Set priorityNodes = new HashSet<>(); - protected final Set highPriorityNodes = new HashSet<>(); - protected @NotNull Graph graph = new SimpleGraph<>(DefaultEdge.class); + protected Graph graph = new SimpleGraph<>(DefaultEdge.class); protected final World world; protected final UUID uuid; - protected final SchedulerMap transmissions = new SchedulerMap<>(); - - public enum Priority { + + public enum NodePriority { GENERIC, MODERATE, HIGH @@ -38,243 +27,65 @@ public enum Priority { public PastelNetwork(World world, @Nullable UUID uuid) { this.world = world; this.uuid = uuid == null ? UUID.randomUUID() : uuid; - for (PastelNodeType type : PastelNodeType.values()) { - this.loadedNodes.put(type, new HashSet<>()); - } } - public void incorporate(PastelNetwork networkToIncorporate, PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { - for (Map.Entry> nodesToIncorporate : networkToIncorporate.getLoadedNodes().entrySet()) { - PastelNodeType type = nodesToIncorporate.getKey(); - for (PastelNodeBlockEntity nodeToIncorporate : nodesToIncorporate.getValue()) { - this.loadedNodes.get(type).add(nodeToIncorporate); - updateNodePriority(nodeToIncorporate, nodeToIncorporate.getPriority()); - } - } - networkToIncorporate.graph.vertexSet().forEach(pos -> { - if (this.world.getBlockEntity(pos) instanceof PastelNodeBlockEntity switchNode) - switchNode.setParentNetwork(this); - graph.addVertex(pos); - }); - networkToIncorporate.graph.edgeSet().forEach(edge -> { - graph.addEdge(networkToIncorporate.getGraph().getEdgeSource(edge), networkToIncorporate.getGraph().getEdgeTarget(edge)); - }); - addEdge(node, otherNode); - } - public World getWorld() { return this.world; } - - public @NotNull Graph getGraph() { + + public Graph getGraph() { return this.graph; } - - public void addNode(PastelNodeBlockEntity node) { - //If this node already has a vertex, then all we are doing it is loading it - if (graph.containsVertex(node.getPos())) { - loadedNodes.get(node.getNodeType()).add(node); - - } - else { - if (addNodeOrReturn(node)) - return; - - this.graph.addVertex(node.getPos()); - } - addPriorityNode(node); - } - - /** - * Note: this does not check if the nodes can connect, that should be done before calling this method. - */ - public void addNodeAndConnect(PastelNodeBlockEntity newNode, PastelNodeBlockEntity parent) { - if (addNodeOrReturn(newNode)) - return; - - this.graph.addVertex(newNode.getPos()); - getGraph().addEdge(newNode.getPos(), parent.getPos()); - - // check for priority - addPriorityNode(newNode); - } - public void addEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - if (!hasEdge(node, parent)) - graph.addEdge(node.getPos(), parent.getPos()); + + public boolean addEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { + return addEdge(node.getPos(), parent.getPos()); } - - public void removeEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - graph.removeEdge(node.getPos(), parent.getPos()); - } - - public boolean hasEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { - if (!graph.containsVertex(node.getPos()) || !graph.containsVertex(otherNode.getPos())) - return false; - - return graph.containsEdge(node.getPos(), otherNode.getPos()); - } - /** - * @return True = return - */ + public boolean addEdge(BlockPos pos1, BlockPos pos2) { + if (!hasEdge(pos1, pos2)) { + graph.addEdge(pos1, pos2); + return true; + } + return false; + } - private boolean addNodeOrReturn(PastelNodeBlockEntity node) { - return !this.loadedNodes.get(node.getNodeType()).add(node); - } - - private void addPriorityNode(PastelNodeBlockEntity node) { - switch (node.getPriority()) { - case MODERATE -> priorityNodes.add(node); - case HIGH -> highPriorityNodes.add(node); - } + public boolean removeEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { + return graph.removeEdge(node.getPos(), parent.getPos()) != null; } - - public void updateNodePriority(PastelNodeBlockEntity node, Priority oldPriority) { - removePriorityNode(node, oldPriority); - addPriorityNode(node); - } - - protected boolean removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) { - if (!graph.containsVertex(node.getPos())) { + + public boolean hasEdge(BlockPos pos1, BlockPos pos2) { + if (!graph.containsVertex(pos1) || !graph.containsVertex(pos2)) return false; - } - - // delete the now removed node from this networks graph - IF IT WASN'T UNLOADED - if (reason != NodeRemovalReason.UNLOADED) - graph.removeVertex(node.getPos()); - this.loadedNodes.get(node.getNodeType()).remove(node); - removePriorityNode(node, node.getPriority()); - - return true; - } - - private void removePriorityNode(PastelNodeBlockEntity node, Priority priority) { - switch (priority) { - case MODERATE -> priorityNodes.remove(node); - case HIGH -> highPriorityNodes.remove(node); - } - } - - public boolean hasNodes() { - for (Set nodeList : this.loadedNodes.values()) { - if (!nodeList.isEmpty()) { - return true; - } - } - return false; - } - - public Set getNodes(PastelNodeType type) { - return getNodes(type, Priority.GENERIC); - } - - public Set getNodes(PastelNodeType type, Priority priority) { - var nodeType = this.loadedNodes.get(type); - - if (priority == Priority.MODERATE) { - return nodeType.stream().filter(priorityNodes::contains).collect(Collectors.toSet()); - } - - if (priority == Priority.HIGH) { - return nodeType.stream().filter(highPriorityNodes::contains).collect(Collectors.toSet()); - } - - return nodeType; - } - - public Map> getLoadedNodes() { - return this.loadedNodes; - } - - public int getNodeCount() { - int nodes = 0; - for (Set nodeList : this.loadedNodes.values()) { - nodes += nodeList.size(); - } - return nodes; - } - - public List getAllNodes() { - List nodes = new ArrayList<>(); - for (Map.Entry> nodeList : this.loadedNodes.entrySet()) { - nodes.addAll(this.loadedNodes.get(nodeList.getKey())); - } - return nodes; - } - - public boolean canConnect(PastelNodeBlockEntity newNode) { - if (newNode.getWorld() != this.getWorld()) { - return false; - } - - for (Set nodeList : this.loadedNodes.values()) { - for (PastelNodeBlockEntity currentNode : nodeList) { - if (currentNode.canConnect(newNode)) { - return true; - } - } - } - return false; + return graph.containsEdge(pos1, pos2); } - - public void tick() { - transmissions.tick(); - } - - - - public UUID getUUID() { + + + public UUID getUUID() { return this.uuid; } - public void addTransmission(PastelTransmission transmission, int travelTime) { - transmission.setNetwork(this); - this.transmissions.put(transmission, travelTime); - } - public int getColor() { return ColorHelper.getRandomColor(this.uuid.hashCode()); } + + public void setGraph(Graph graph) { + this.graph = graph; + } @Override public boolean equals(Object other) { + if (other == this) { + return true; + } if (other instanceof PastelNetwork p) { return this.uuid.equals(p.uuid); } return false; } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(this.uuid.toString()); - for (PastelNodeType type : PastelNodeType.values()) { - builder.append("-").append(getNodes(type).size()); - } - return builder.toString(); - } - - public String getNodeDebugText() { - return "Prov: " + - getNodes(PastelNodeType.PROVIDER).size() + - " - Send: " + - getNodes(PastelNodeType.SENDER).size() + - " - Gath: " + - getNodes(PastelNodeType.GATHER).size() + - " - Stor: " + - getNodes(PastelNodeType.STORAGE).size() + - " - Buff: " + - getNodes(PastelNodeType.BUFFER).size() + - " - Conn: " + - getNodes(PastelNodeType.CONNECTION).size(); - } - public NbtCompound toNbt() { - NbtCompound compound = new NbtCompound(); - compound.putUuid("UUID", this.uuid); - compound.putString("World", this.getWorld().getRegistryKey().getValue().toString()); - + public NbtCompound graphToNbt() { var vertices = new ArrayList<>(graph.vertexSet()); var graphStorage = new NbtCompound(); graphStorage.putInt("Size", vertices.size()); @@ -302,55 +113,42 @@ public NbtCompound toNbt() { graphStorage.putIntArray("EdgeIndexes" + i, edgeIndexes); } - compound.put("Graph", graphStorage); + return graphStorage; + } + + public static Graph graphFromNbt(NbtCompound nbt) { + Graph graph = new SimpleGraph<>(DefaultEdge.class); - NbtList transmissionList = new NbtList(); - for (Map.Entry transmission : this.transmissions) { - NbtCompound transmissionCompound = new NbtCompound(); - transmissionCompound.putInt("Delay", transmission.getValue()); - transmissionCompound.put("Transmission", transmission.getKey().toNbt()); - transmissionList.add(transmissionCompound); + var size = nbt.getInt("Size"); + var vertices = new ArrayList(); + for (int i = 0; i < size; i++) { + var vertex = BlockPos.fromLong(nbt.getLong("Vertex" + i)); + vertices.add(vertex); + graph.addVertex(vertex); } - compound.put("Transmissions", transmissionList); - return compound; - } - - public void fromNbt(NbtCompound compound) { - if (compound.contains("Graph")) { - var graphStorage = compound.getCompound("Graph"); - var size = graphStorage.getInt("Size"); - var vertices = new ArrayList(); - for (int i = 0; i < size; i++) { - var vertex = BlockPos.fromLong(graphStorage.getLong("Vertex" + i)); - vertices.add(vertex); - graph.addVertex(vertex); - } - - for (int i = 0; i < size; i++) { - if (!graphStorage.contains("EdgeIndexes" + i)) - continue; - var edgeIndexes = graphStorage.getIntArray("EdgeIndexes" + i); - var source = vertices.get(edgeIndexes[0]); - for (int targetIndex = 1; targetIndex < edgeIndexes.length; targetIndex++) { - var target = vertices.get(edgeIndexes[targetIndex]); - if (!graph.containsEdge(source, target)) - graph.addEdge(source, target); - } + for (int i = 0; i < size; i++) { + if (!nbt.contains("EdgeIndexes" + i)) + continue; + var edgeIndexes = nbt.getIntArray("EdgeIndexes" + i); + var source = vertices.get(edgeIndexes[0]); + for (int targetIndex = 1; targetIndex < edgeIndexes.length; targetIndex++) { + var target = vertices.get(edgeIndexes[targetIndex]); + if (!graph.containsEdge(source, target)) + graph.addEdge(source, target); } } - } - - public PastelNodeBlockEntity getNodeAt(BlockPos blockPos) { - if (!this.getWorld().isChunkLoaded(blockPos)) { - return null; // hmmmmm - } - BlockEntity blockEntity = this.getWorld().getBlockEntity(blockPos); - if (blockEntity instanceof PastelNodeBlockEntity pastelNodeBlockEntity) { - return pastelNodeBlockEntity; - } - return null; - } + return graph; + } + + public String getNodeDebugText() { + return "UUID: " + + uuid.toString() + + " - Edges: " + + graph.edgeSet().size() + + " - Vertices: " + + graph.vertexSet().size(); + } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetworkManager.java index 6baa46cf00..0bba8272ab 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetworkManager.java @@ -1,98 +1,13 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; -import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; -import net.minecraft.util.math.*; import net.minecraft.world.*; -import org.jetbrains.annotations.*; -import org.jgrapht.alg.connectivity.*; -import org.jgrapht.graph.*; import java.util.*; public interface PastelNetworkManager { - - //PastelNetwork createNetwork(World world, UUID uuid); - - PastelNetwork joinOrCreateNetwork(PastelNodeBlockEntity node, @Nullable UUID uuid); - - void connectNodes(PastelNodeBlockEntity node, PastelNodeBlockEntity parent, @NotNull UUID id); - - default void connectNodes(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - connectNodes(node, parent, UUID.randomUUID()); - } - - //void removeEmptyNetwork(PastelNetwork network); - - void removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason); PastelNetwork createNetwork(World world, UUID uuid); Optional getNetwork(UUID uuid); - default boolean tryAddEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { - if (node.getParentNetwork() == null) { - throw new IllegalStateException("Attempted to add an edge to a null network"); - } - - if (node.getParentNetwork() != otherNode.getParentNetwork()) { - throw new IllegalArgumentException("Can't add an edge between nodes in different networks"); - } - - if (node == otherNode || node.getParentNetwork().hasEdge(node, otherNode)) - return false; - - node.getParentNetwork().addEdge(node, otherNode); - return true; - } - - default boolean tryRemoveEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { - if (node.getParentNetwork() == null) { - throw new IllegalStateException("Attempted to remove an edge from a null network"); - } - - if (node.getParentNetwork() != otherNode.getParentNetwork()) { - throw new IllegalArgumentException("Can't remove an edge between nodes in different networks - how did you even do this"); - } - var network = node.getParentNetwork(); - if (!network.hasEdge(node, otherNode)) - return false; - - node.getParentNetwork().removeEdge(node, otherNode); - checkForNetworkSplit(node.getParentNetwork()); - return true; - } - - default void checkForNetworkSplit(PastelNetwork network) { - ConnectivityInspector connectivityInspector = new ConnectivityInspector<>(network.getGraph()); - List> connectedSets = connectivityInspector.connectedSets(); - if (connectedSets.size() != 1) { - for (int i = 1; i < connectedSets.size(); i++) { - Set disconnectedNodes = connectedSets.get(i); - Map> transitiveEdges = new HashMap<>(); - PastelNetwork newNetwork = createNetwork(network.world, ((PastelNodeBlockEntity) (network.world.getBlockEntity(disconnectedNodes.iterator().next()))).getInitialID()); - for (BlockPos disconnectedNode : disconnectedNodes) { - for (DefaultEdge switchedEdge : network.getGraph().edgesOf(disconnectedNode)) { - var edgeList = transitiveEdges.computeIfAbsent(disconnectedNode, p -> new ArrayList<>()); - var target = network.graph.getEdgeTarget(switchedEdge); - if (!target.equals(disconnectedNode) && !edgeList.contains(target) && disconnectedNodes.contains(target)) - edgeList.add(target); - } - } - for (BlockPos disconnectedNode : disconnectedNodes) { - var switchedNode = network.getWorld().getBlockEntity(disconnectedNode); - if (switchedNode instanceof PastelNodeBlockEntity pastelNode) { - network.removeNode(pastelNode, NodeRemovalReason.DISCONNECT); - newNetwork.addNode(pastelNode); - pastelNode.setParentNetwork(newNetwork); - } - } - for (BlockPos node : transitiveEdges.keySet()) { - for (BlockPos target : transitiveEdges.get(node)) { - if (!newNetwork.graph.containsEdge(node, target)) - newNetwork.graph.addEdge(node, target); - } - } - } - } - } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java index 6149c6bbb0..b8faa2abc0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java @@ -14,8 +14,8 @@ import java.util.*; public class PastelTransmission implements SchedulerMap.Callback { - - private @Nullable PastelNetwork network; + + private @Nullable ServerPastelNetwork network; private final List nodePositions; private final ItemVariant variant; private final long amount; @@ -27,8 +27,8 @@ public PastelTransmission(List nodePositions, ItemVariant variant, lon this.amount = amount; this.vertexTime = vertexTime; } - - public void setNetwork(@NotNull PastelNetwork network) { + + public void setNetwork(@NotNull ServerPastelNetwork network) { this.network = network; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java index d46253b3f7..d915037a57 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java @@ -68,7 +68,7 @@ public void invalidateCache() { return path; } - public void tick(PastelNetwork.Priority priority) { + public void tick(PastelNetwork.NodePriority priority) { transferBetween(PastelNodeType.BUFFER, PastelNodeType.GATHER, TransferMode.PULL, priority); transferBetween(PastelNodeType.SENDER, PastelNodeType.GATHER, TransferMode.PUSH_PULL, priority); transferBetween(PastelNodeType.PROVIDER, PastelNodeType.GATHER, TransferMode.PULL, priority); @@ -81,7 +81,7 @@ public void tick(PastelNetwork.Priority priority) { transferBetween(PastelNodeType.SENDER, PastelNodeType.STORAGE, TransferMode.PUSH, priority); } - private void transferBetween(PastelNodeType sourceType, PastelNodeType destinationType, TransferMode transferMode, PastelNetwork.Priority priority) { + private void transferBetween(PastelNodeType sourceType, PastelNodeType destinationType, TransferMode transferMode, PastelNetwork.NodePriority priority) { for (PastelNodeBlockEntity sourceNode : this.network.getNodes(sourceType, priority)) { if (!sourceNode.canTransfer()) { continue; @@ -95,7 +95,7 @@ private void transferBetween(PastelNodeType sourceType, PastelNodeType destinati } private void tryTransferToType(PastelNodeBlockEntity sourceNode, Storage sourceStorage, PastelNodeType type, TransferMode transferMode) { - for (PastelNodeBlockEntity destinationNode : this.network.getNodes(type, PastelNetwork.Priority.GENERIC)) { + for (PastelNodeBlockEntity destinationNode : this.network.getNodes(type, PastelNetwork.NodePriority.GENERIC)) { if (!destinationNode.canTransfer()) { continue; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java index af5b4ab924..d14059ed5d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java @@ -1,18 +1,29 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.blocks.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.networking.SpectrumS2CPacketSender; +import de.dafuqs.spectrum.networking.*; +import net.minecraft.block.entity.*; import net.minecraft.nbt.*; import net.minecraft.registry.*; import net.minecraft.util.*; +import net.minecraft.util.math.*; import net.minecraft.world.*; import org.jetbrains.annotations.*; +import org.jgrapht.alg.connectivity.*; +import org.jgrapht.graph.*; import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; public class ServerPastelNetwork extends PastelNetwork { + + protected final Map> loadedNodes = new ConcurrentHashMap<>(); + protected final Set priorityNodes = new HashSet<>(); + protected final Set highPriorityNodes = new HashSet<>(); // new transfers are checked for every 10 ticks private final TickLooper transferLooper = new TickLooper(10); @@ -22,53 +33,299 @@ public class ServerPastelNetwork extends PastelNetwork { public ServerPastelNetwork(World world, @Nullable UUID uuid) { super(world, uuid); + for (PastelNodeType type : PastelNodeType.values()) { + this.loadedNodes.put(type, new HashSet<>()); + } this.transmissionLogic = new PastelTransmissionLogic(this); } - + + private boolean addNodeOrReturn(PastelNodeBlockEntity node) { + return !this.loadedNodes.get(node.getNodeType()).add(node); + } + + private void addPriorityNode(PastelNodeBlockEntity node) { + switch (node.getPriority()) { + case MODERATE -> priorityNodes.add(node); + case HIGH -> highPriorityNodes.add(node); + } + } + + public void updateNodePriority(PastelNodeBlockEntity node, NodePriority oldPriority) { + removePriorityNode(node, oldPriority); + addPriorityNode(node); + } + @Override - public void incorporate(PastelNetwork networkToIncorporate, PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { - super.incorporate(networkToIncorporate, node, otherNode); - this.transmissionLogic.invalidateCache(); + public String getNodeDebugText() { + return super.getNodeDebugText() + + " - Prov: " + + getNodes(PastelNodeType.PROVIDER).size() + + " - Send: " + + getNodes(PastelNodeType.SENDER).size() + + " - Gath: " + + getNodes(PastelNodeType.GATHER).size() + + " - Stor: " + + getNodes(PastelNodeType.STORAGE).size() + + " - Buff: " + + getNodes(PastelNodeType.BUFFER).size() + + " - Conn: " + + getNodes(PastelNodeType.CONNECTION).size(); } @Override + public String toString() { + StringBuilder builder = new StringBuilder(this.uuid.toString()); + for (PastelNodeType type : PastelNodeType.values()) { + builder.append("-").append(getNodes(type).size()); + } + return builder.toString(); + } + + public PastelNodeBlockEntity getNodeAt(BlockPos blockPos) { + if (!this.getWorld().isChunkLoaded(blockPos)) { + return null; // hmmmmm + } + + BlockEntity blockEntity = this.getWorld().getBlockEntity(blockPos); + if (blockEntity instanceof PastelNodeBlockEntity pastelNodeBlockEntity) { + return pastelNodeBlockEntity; + } + return null; + } + + private void removePriorityNode(PastelNodeBlockEntity node, NodePriority priority) { + switch (priority) { + case MODERATE -> priorityNodes.remove(node); + case HIGH -> highPriorityNodes.remove(node); + } + } + + public boolean hasNodes() { + for (Set nodeList : this.loadedNodes.values()) { + if (!nodeList.isEmpty()) { + return true; + } + } + return false; + } + + public Set getNodes(PastelNodeType type) { + return getNodes(type, NodePriority.GENERIC); + } + + public Set getNodes(PastelNodeType type, NodePriority priority) { + var nodeType = this.loadedNodes.get(type); + + if (priority == NodePriority.MODERATE) { + return nodeType.stream().filter(priorityNodes::contains).collect(Collectors.toSet()); + } + + if (priority == NodePriority.HIGH) { + return nodeType.stream().filter(highPriorityNodes::contains).collect(Collectors.toSet()); + } + + return nodeType; + } + + public Map> getLoadedNodes() { + return this.loadedNodes; + } + + public int getNodeCount() { + int nodes = 0; + for (Set nodeList : this.loadedNodes.values()) { + nodes += nodeList.size(); + } + return nodes; + } + + public List getAllNodes() { + List nodes = new ArrayList<>(); + for (Map.Entry> nodeList : this.loadedNodes.entrySet()) { + nodes.addAll(this.loadedNodes.get(nodeList.getKey())); + } + return nodes; + } + + public boolean canConnect(PastelNodeBlockEntity newNode) { + if (newNode.getWorld() != this.getWorld()) { + return false; + } + + for (Set nodeList : this.loadedNodes.values()) { + for (PastelNodeBlockEntity currentNode : nodeList) { + if (currentNode.canConnect(newNode)) { + return true; + } + } + } + return false; + } + + public void addNode(PastelNodeBlockEntity node) { + //If this node already has a vertex, then all we are doing it is loading it + if (graph.containsVertex(node.getPos())) { + loadedNodes.get(node.getNodeType()).add(node); + + } else { + if (addNodeOrReturn(node)) + return; + + this.graph.addVertex(node.getPos()); + } + addPriorityNode(node); + } + + /** + * Note: this does not check if the nodes can connect, that should be done before calling this method. + */ + public void addNodeAndConnect(PastelNodeBlockEntity newNode, PastelNodeBlockEntity parent) { + if (addNodeOrReturn(newNode)) + return; + + this.graph.addVertex(newNode.getPos()); + getGraph().addEdge(newNode.getPos(), parent.getPos()); + + // check for priority + addPriorityNode(newNode); + } + + void checkForNetworkSplit() { + ConnectivityInspector connectivityInspector = new ConnectivityInspector<>(getGraph()); + List> connectedSets = connectivityInspector.connectedSets(); + if (connectedSets.size() != 1) { + for (int i = 1; i < connectedSets.size(); i++) { + Set disconnectedNodes = connectedSets.get(i); + Map> transitiveEdges = new HashMap<>(); + ServerPastelNetwork newNetwork = Pastel.getServerInstance().createNetwork(world, ((PastelNodeBlockEntity) (world.getBlockEntity(disconnectedNodes.iterator().next()))).getNodeId()); + for (BlockPos disconnectedNode : disconnectedNodes) { + for (DefaultEdge switchedEdge : getGraph().edgesOf(disconnectedNode)) { + var edgeList = transitiveEdges.computeIfAbsent(disconnectedNode, p -> new ArrayList<>()); + var target = graph.getEdgeTarget(switchedEdge); + if (!target.equals(disconnectedNode) && !edgeList.contains(target) && disconnectedNodes.contains(target)) + edgeList.add(target); + } + } + for (BlockPos disconnectedNode : disconnectedNodes) { + var switchedNode = getWorld().getBlockEntity(disconnectedNode); + if (switchedNode instanceof PastelNodeBlockEntity pastelNode) { + removeNode(pastelNode, NodeRemovalReason.DISCONNECT); + newNetwork.addNode(pastelNode); + pastelNode.setNetworkUUID(newNetwork.getUUID()); + } + } + for (BlockPos node : transitiveEdges.keySet()) { + for (BlockPos target : transitiveEdges.get(node)) { + if (!newNetwork.graph.containsEdge(node, target)) + newNetwork.addEdge(node, target); + } + } + } + } + } + + public void incorporate(ServerPastelNetwork networkToIncorporate, PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { + for (Map.Entry> nodesToIncorporate : networkToIncorporate.getLoadedNodes().entrySet()) { + PastelNodeType type = nodesToIncorporate.getKey(); + for (PastelNodeBlockEntity nodeToIncorporate : nodesToIncorporate.getValue()) { + this.loadedNodes.get(type).add(nodeToIncorporate); + updateNodePriority(nodeToIncorporate, nodeToIncorporate.getPriority()); + } + } + networkToIncorporate.graph.vertexSet().forEach(pos -> { + if (this.world.getBlockEntity(pos) instanceof PastelNodeBlockEntity switchNode) { + switchNode.setNetworkUUID(this.uuid); + } + graph.addVertex(pos); + }); + networkToIncorporate.graph.edgeSet().forEach(edge -> { + graph.addEdge(networkToIncorporate.getGraph().getEdgeSource(edge), networkToIncorporate.getGraph().getEdgeTarget(edge)); + }); + addEdge(node, otherNode); + + this.transmissionLogic.invalidateCache(); + } + public boolean removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) { - boolean result = super.removeNode(node, reason); + if (!graph.containsVertex(node.getPos())) { + return false; + } + + // delete the now removed node from this networks graph - IF IT WASN'T UNLOADED + if (reason != NodeRemovalReason.UNLOADED) + graph.removeVertex(node.getPos()); + + this.loadedNodes.get(node.getNodeType()).remove(node); + removePriorityNode(node, node.getPriority()); + this.transmissionLogic.invalidateCache(); - return result; + SpectrumS2CPacketSender.syncPastelNetworkEdges(this, node.getPos()); + + return true; } @Override - public void removeEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - super.removeEdge(node, parent); - this.transmissionLogic.invalidateCache(); + public boolean removeEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { + Optional network = node.getServerNetwork(); + if (network.isEmpty()) { + throw new IllegalStateException("Attempted to remove an edge from a null network"); + } + + Optional otherNetwork = otherNode.getServerNetwork(); + if (otherNetwork.isEmpty() || !network.get().equals(otherNetwork.get())) { + throw new IllegalArgumentException("Can't remove an edge between nodes in different networks - how did you even do this"); + } + + boolean success = super.removeEdge(node, otherNode); + if (success) { + checkForNetworkSplit(); + this.transmissionLogic.invalidateCache(); + SpectrumS2CPacketSender.syncPastelNetworkEdges(this, node.getPos()); + } + + return success; } @Override - public void addEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - super.addEdge(node, parent); - this.transmissionLogic.invalidateCache(); + public boolean addEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity otherNode) { + Optional network = node.getServerNetwork(); + + if (network.isEmpty()) { + throw new IllegalStateException("Attempted to add an edge to a null network"); + } + + Optional otherNetwork = otherNode.getServerNetwork(); + if (otherNetwork.isEmpty() || !network.get().equals(otherNetwork.get())) { + throw new IllegalArgumentException("Can't add an edge between nodes in different networks"); + } + + if (node == otherNode || network.get().hasEdge(node.getPos(), otherNode.getPos())) + return false; + + boolean success = super.addEdge(node, otherNode); + if (success) { + this.transmissionLogic.invalidateCache(); + SpectrumS2CPacketSender.syncPastelNetworkEdges(this, node.getPos()); + } + return success; } - @Override public void tick() { this.transmissions.tick(); - var priority = Priority.GENERIC; + var priority = NodePriority.GENERIC; if (transferLooper.getTick() % 5 == 0) { - priority = Priority.MODERATE; + priority = NodePriority.MODERATE; } else if (transferLooper.getTick() % 2 == 0) { - priority = Priority.HIGH; + priority = NodePriority.HIGH; } this.transferLooper.tick(); var cap = transferLooper.reachedCap(); - if (cap || priority != Priority.GENERIC) { + if (cap || priority != NodePriority.GENERIC) { if (cap) { this.transferLooper.reset(); - // If someone complains about network usage I am going to fucking kill myself - SpectrumS2CPacketSender.syncPastelNetworkEdges(this, toNbt()); } try { this.transmissionLogic.tick(priority); @@ -110,31 +367,46 @@ private void tickNodeEffects() { SpectrumS2CPacketSender.sendPastelNodeStatusUpdate(nodeSync, false); } - @Override public void addTransmission(PastelTransmission transmission, int travelTime) { transmission.setNetwork(this); this.transmissions.put(transmission, travelTime); } - @Override public NbtCompound toNbt() { - NbtCompound compound = super.toNbt(); - compound.put("Looper", this.transferLooper.toNbt()); - return compound; - } + NbtCompound nbt = new NbtCompound(); + nbt.putUuid("UUID", this.uuid); + nbt.putString("World", this.getWorld().getRegistryKey().getValue().toString()); + nbt.put("Graph", graphToNbt()); + nbt.put("Looper", this.transferLooper.toNbt()); + + NbtList transmissionList = new NbtList(); + for (Map.Entry transmission : this.transmissions) { + NbtCompound transmissionCompound = new NbtCompound(); + transmissionCompound.putInt("Delay", transmission.getValue()); + transmissionCompound.put("Transmission", transmission.getKey().toNbt()); + transmissionList.add(transmissionCompound); + } + nbt.put("Transmissions", transmissionList); + return nbt; + } - @Override - public void fromNbt(NbtCompound compound) { - super.fromNbt(compound); - if (compound.contains("Looper", NbtElement.COMPOUND_TYPE)) { - transferLooper.readNbt(compound.getCompound("Looper")); + public static ServerPastelNetwork fromNbt(NbtCompound nbt) { + UUID uuid = nbt.getUuid("UUID"); + World world = SpectrumCommon.minecraftServer.getWorld(RegistryKey.of(RegistryKeys.WORLD, Identifier.tryParse(nbt.getString("World")))); + ServerPastelNetwork network = new ServerPastelNetwork(world, uuid); + network.graph = graphFromNbt(nbt.getCompound("Graph")); + + if (nbt.contains("Looper", NbtElement.COMPOUND_TYPE)) { + network.transferLooper.readNbt(nbt.getCompound("Looper")); } - for (NbtElement e : compound.getList("Transmissions", NbtElement.COMPOUND_TYPE)) { + for (NbtElement e : nbt.getList("Transmissions", NbtElement.COMPOUND_TYPE)) { NbtCompound t = (NbtCompound) e; int delay = t.getInt("Delay"); PastelTransmission transmission = PastelTransmission.fromNbt(t.getCompound("Transmission")); - addTransmission(transmission, delay); + network.addTransmission(transmission, delay); } + + return network; } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java index 74cbd19ce6..cf139b310d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java @@ -1,17 +1,11 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import de.dafuqs.spectrum.networking.*; import net.minecraft.nbt.*; -import net.minecraft.registry.*; import net.minecraft.server.world.*; -import net.minecraft.util.*; -import net.minecraft.util.math.*; import net.minecraft.world.*; import org.jetbrains.annotations.*; -import org.jgrapht.alg.connectivity.*; -import org.jgrapht.graph.*; import java.util.*; @@ -37,7 +31,7 @@ public static ServerPastelNetworkManager get(ServerWorld world) { } @Override - public Optional getNetwork(UUID uuid) { + public Optional getNetwork(UUID uuid) { return networks.stream().filter(n -> n.uuid.equals(uuid)).findFirst(); } @@ -45,8 +39,7 @@ public Optional getNetwork(UUID uuid) { public NbtCompound writeNbt(NbtCompound nbt) { NbtList networkList = new NbtList(); for (ServerPastelNetwork network : this.networks) { - NbtCompound compound = network.toNbt(); - networkList.add(compound); + networkList.add(network.toNbt()); } nbt.put("Networks", networkList); return nbt; @@ -55,18 +48,13 @@ public NbtCompound writeNbt(NbtCompound nbt) { public static ServerPastelNetworkManager fromNbt(NbtCompound nbt) { ServerPastelNetworkManager manager = new ServerPastelNetworkManager(); for (NbtElement element : nbt.getList("Networks", NbtElement.COMPOUND_TYPE)) { - var compound = (NbtCompound) element; - World world = SpectrumCommon.minecraftServer.getWorld(RegistryKey.of(RegistryKeys.WORLD, Identifier.tryParse(compound.getString("World")))); - UUID uuid = compound.getUuid("UUID"); - var network = new ServerPastelNetwork(world, uuid); - network.fromNbt(compound); - manager.networks.add(network); + manager.networks.add(ServerPastelNetwork.fromNbt((NbtCompound) element)); } return manager; } @Override - public ServerPastelNetwork createNetwork(World world, @Nullable UUID uuid) { + public ServerPastelNetwork createNetwork(World world, UUID uuid) { ServerPastelNetwork network = new ServerPastelNetwork(world, uuid); this.networks.add(network); return network; @@ -81,13 +69,12 @@ public void tick() { } } - @Override @Contract("_, null -> new") public PastelNetwork joinOrCreateNetwork(PastelNodeBlockEntity node, @Nullable UUID uuid) { if (uuid != null) { //noinspection ForLoopReplaceableByForEach for (int i = 0; i < this.networks.size(); i++) { - PastelNetwork network = this.networks.get(i); + ServerPastelNetwork network = this.networks.get(i); if (network.getUUID().equals(uuid)) { network.addNode(node); return network; @@ -99,63 +86,66 @@ public PastelNetwork joinOrCreateNetwork(PastelNodeBlockEntity node, @Nullable U network.addNode(node); return network; } - - @Override - public void connectNodes(PastelNodeBlockEntity node, PastelNodeBlockEntity parent, @NotNull UUID id) { - PastelNetwork mainNetwork, yieldingNetwork; - - if (parent.getParentNetwork() != null) { - mainNetwork = parent.getParentNetwork(); - yieldingNetwork = node.getParentNetwork(); - - if (yieldingNetwork == null) { - mainNetwork.addNodeAndConnect(node, parent); - node.setParentNetwork(mainNetwork); + + public void connectNodes(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { + Optional mainNetwork, yieldingNetwork; + + if (parent.getServerNetwork().isPresent()) { + mainNetwork = parent.getServerNetwork(); + yieldingNetwork = node.getServerNetwork(); + + if (yieldingNetwork.isEmpty()) { + mainNetwork.get().addNodeAndConnect(node, parent); + node.setNetworkUUID(mainNetwork.get().getUUID()); + SpectrumS2CPacketSender.syncPastelNetworkEdges(mainNetwork.get(), node.getPos()); return; } - } - else if (node.getParentNetwork() != null) { - mainNetwork = node.getParentNetwork(); - yieldingNetwork = parent.getParentNetwork(); - - if (yieldingNetwork == null) { - mainNetwork.addNodeAndConnect(parent, node); - parent.setParentNetwork(mainNetwork); + } else if (node.getServerNetwork().isPresent()) { + mainNetwork = node.getServerNetwork(); + yieldingNetwork = parent.getServerNetwork(); + + if (yieldingNetwork.isEmpty()) { + mainNetwork.get().addNodeAndConnect(parent, node); + parent.setNetworkUUID(mainNetwork.get().getUUID()); + SpectrumS2CPacketSender.syncPastelNetworkEdges(mainNetwork.get(), node.getPos()); return; } } else { - mainNetwork = createNetwork(node.getWorld(), id); - mainNetwork.addNode(parent); - parent.setParentNetwork(mainNetwork); - mainNetwork.addNodeAndConnect(node, parent); - node.setParentNetwork(mainNetwork); + ServerPastelNetwork newNetwork = createNetwork(node.getWorld(), node.getNodeId()); + newNetwork.addNode(parent); + parent.setNetworkUUID(newNetwork.getUUID()); + newNetwork.addNodeAndConnect(node, parent); + node.setNetworkUUID(newNetwork.getUUID()); + SpectrumS2CPacketSender.syncPastelNetworkEdges(newNetwork, node.getPos()); return; } - + if (mainNetwork == yieldingNetwork) { return; } - - mainNetwork.incorporate(yieldingNetwork, node, parent); + + mainNetwork.get().incorporate(yieldingNetwork.get(), node, parent); this.networks.remove(yieldingNetwork); } - @Override public void removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) { - ServerPastelNetwork network = (ServerPastelNetwork) node.getParentNetwork(); - if (network != null) { + Optional optional = node.getServerNetwork(); + if (optional.isPresent()) { + ServerPastelNetwork network = optional.get(); network.removeNode(node, reason); - if (reason == NodeRemovalReason.UNLOADED) + if (reason == NodeRemovalReason.UNLOADED) { return; + } if (network.hasNodes()) { // check if the removed node split the network into subnetworks - checkForNetworkSplit(network); + network.checkForNetworkSplit(); } else if (reason.destructive) { this.networks.remove(network); } + SpectrumS2CPacketSender.syncPastelNetworkEdges(network, node.getPos()); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java index 1643a92bab..0d3d2f2097 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java @@ -3,6 +3,7 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.decoration.*; +import de.dafuqs.spectrum.blocks.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.network.*; import de.dafuqs.spectrum.progression.*; import de.dafuqs.spectrum.registries.*; @@ -30,10 +31,10 @@ import java.util.*; public class PastelNodeBlock extends SpectrumFacingBlock implements BlockEntityProvider { - + public static final BooleanProperty LIT = Properties.LIT; public static final BooleanProperty EMITTING = Properties.POWERED; - + public static final Map SHAPES = new HashMap<>() {{ put(Direction.UP, Block.createCuboidShape(5.0D, 0.0D, 5.0D, 11.0D, 4.0D, 11.0D)); put(Direction.DOWN, Block.createCuboidShape(5.0D, 12.0D, 5.0D, 11.0D, 16.0D, 11.0D)); @@ -42,27 +43,27 @@ public class PastelNodeBlock extends SpectrumFacingBlock implements BlockEntityP put(Direction.EAST, Block.createCuboidShape(0.0D, 5.0D, 5.0D, 4.0D, 11.0D, 11.0D)); put(Direction.WEST, Block.createCuboidShape(12.0D, 5.0D, 5.0D, 16.0D, 11.0D, 11.0D)); }}; - + protected final PastelNodeType pastelNodeType; - + public PastelNodeBlock(Settings settings, PastelNodeType pastelNodeType) { super(settings.luminance(s -> s.get(LIT) ? 13 : 0)); this.pastelNodeType = pastelNodeType; setDefaultState(getDefaultState().with(LIT, false).with(EMITTING, false)); } - + @Override public BlockRenderType getRenderType(BlockState state) { return SpectrumCommon.CONFIG.MinimalNodes ? BlockRenderType.ENTITYBLOCK_ANIMATED : BlockRenderType.MODEL; } - + @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { Direction targetDirection = state.get(FACING).getOpposite(); BlockPos targetPos = pos.offset(targetDirection); return world.getBlockState(targetPos).isSolid(); } - + @Override @SuppressWarnings("deprecation") public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { @@ -77,60 +78,65 @@ public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockSt } super.onStateReplaced(state, world, pos, newState, moved); } - + @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Direction direction = ctx.getSide(); BlockState blockState = ctx.getWorld().getBlockState(ctx.getBlockPos().offset(direction.getOpposite())); return blockState.isOf(this) && blockState.get(FACING) == direction ? this.getDefaultState().with(FACING, direction.getOpposite()) : this.getDefaultState().with(FACING, direction); } - + @Nullable @Override public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { return ((w, p, s, b) -> PastelNodeBlockEntity.tick(w, p, s, (PastelNodeBlockEntity) b)); } - + @Override public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { super.onPlaced(world, pos, state, placer, itemStack); } - + @Override public void appendTooltip(ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { super.appendTooltip(stack, world, tooltip, options); tooltip.addAll(this.pastelNodeType.getTooltips()); tooltip.add(Text.translatable("block.spectrum.pastel_network_nodes.tooltip.range", PastelNodeBlockEntity.RANGE).formatted(Formatting.GRAY)); } - + @Override protected void appendProperties(StateManager.Builder builder) { super.appendProperties(builder); builder.add(LIT, EMITTING); } - + @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { return !state.canPlaceAt(world, pos) ? Blocks.AIR.getDefaultState() : state; } - + @Override @SuppressWarnings("deprecation") public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - // TODO: We do not handle the null possibility here! @Nullable PastelNodeBlockEntity blockEntity = getBlockEntity(world, pos); + if (blockEntity == null) { + return super.onUse(state, world, pos, player, hand, hit); + } + var stack = player.getStackInHand(hand); - + if (player.isSneaking() && stack.isEmpty()) { if (AdvancementHelper.hasAdvancement(player, SpectrumAdvancements.PASTEL_NODE_UPGRADING)) { - var removed = blockEntity.tryRemoveUpgrade(); - if (!removed.isEmpty()) { - if (!player.getAbilities().creativeMode) - player.getInventory().offerOrDrop(removed); - - blockEntity.updateUpgrades(); - return ActionResult.success(world.isClient()); + if (!world.isClient) { + var removed = blockEntity.tryRemoveUpgrade(); + if (!removed.isEmpty()) { + if (!player.getAbilities().creativeMode) + player.getInventory().offerOrDrop(removed); + + blockEntity.updateUpgrades(); + } } + return ActionResult.success(world.isClient()); } return ActionResult.FAIL; } else if (stack.isOf(SpectrumItems.TUNING_STAMP)) { @@ -138,14 +144,14 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt } else if (stack.isOf(SpectrumItems.PAINTBRUSH)) { return sendDebugMessage(world, player, blockEntity); } else if (AdvancementHelper.hasAdvancement(player, SpectrumAdvancements.PASTEL_NODE_UPGRADING) && stack.isIn(SpectrumItemTags.PASTEL_NODE_UPGRADES) && blockEntity.tryInteractRings(stack, pastelNodeType)) { - if (!world.isClient()) + if (!world.isClient()) { SpectrumAdvancementCriteria.PASTEL_NODE_UPGRADING.trigger((ServerPlayerEntity) player, stack); - - if (!player.getAbilities().creativeMode) - stack.decrement(1); - + if (!player.getAbilities().creativeMode) + stack.decrement(1); + blockEntity.updateUpgrades(); + } + world.playSoundAtBlockCenter(pos, SpectrumSoundEvents.MEDIUM_CRYSTAL_RING, SoundCategory.BLOCKS, 0.25F, 0.9F + world.getRandom().nextFloat() * 0.2F, true); - blockEntity.updateUpgrades(); return ActionResult.success(world.isClient()); } else if (this.pastelNodeType.usesFilters()) { if (world.isClient) { @@ -155,57 +161,45 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt return ActionResult.CONSUME; } } + return super.onUse(state, world, pos, player, hand, hit); } - + @Override public boolean emitsRedstonePower(BlockState state) { return true; } - + @Override public int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { return state.get(EMITTING) ? 15 : 0; } - + @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { world.setBlockState(pos, state.with(EMITTING, false)); } - + @NotNull private static ActionResult sendDebugMessage(World world, PlayerEntity player, PastelNodeBlockEntity blockEntity) { - if (world.isClient) { - if (blockEntity != null) { - PastelNetwork network = blockEntity.parentNetwork; - player.sendMessage(Text.translatable("block.spectrum.pastel_network_nodes.connection_debug")); - if (network == null) { - player.sendMessage(Text.literal("C: No connected network :(")); - } else { - player.sendMessage(Text.literal("C: " + network.getUUID().toString())); - player.sendMessage(Text.literal("C: " + network.getNodeDebugText())); - } - } - return ActionResult.SUCCESS; - } else { - if (blockEntity != null) { - PastelNetwork network = blockEntity.parentNetwork; - if (network == null) { - player.sendMessage(Text.literal("S: No connected network :(")); - } else { - player.sendMessage(Text.literal("S: " + network.getUUID().toString())); - player.sendMessage(Text.literal("S: " + network.getNodeDebugText())); - } + if (blockEntity != null) { + Optional network = blockEntity.networkUUID.isPresent() ? Pastel.getInstance(world.isClient).getNetwork(blockEntity.networkUUID.get()) : Optional.empty(); + String prefix = world.isClient ? "C" : "S"; + if (network.isEmpty()) { + player.sendMessage(Text.literal(prefix + ": No connected network :(")); + } else { + player.sendMessage(Text.literal(prefix + ": " + network.get().getNodeDebugText())); } - return ActionResult.CONSUME; } + + return ActionResult.success(world.isClient()); } - + @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { return SHAPES.get(state.get(FACING)); } - + public @Nullable PastelNodeBlockEntity getBlockEntity(WorldAccess world, BlockPos blockPos) { BlockEntity blockEntity = world.getBlockEntity(blockPos); if (blockEntity instanceof PastelNodeBlockEntity pastelNodeBlockEntity) { @@ -213,11 +207,11 @@ public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos po } return null; } - + @Nullable @Override public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { return new PastelNodeBlockEntity(pos, state); } - + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index 34046a3217..a23a37ad45 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -43,7 +43,6 @@ import java.util.Optional; import java.util.*; import java.util.function.Predicate; -import java.util.stream.*; @SuppressWarnings("UnstableApiUsage") public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigurable, ExtendedScreenHandlerFactory, Stampable, PastelUpgradeable { @@ -53,16 +52,14 @@ public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigur public static final int DEFAULT_FILTER_SLOT_ROWS = 1; public static final int RANGE = 12; - @Nullable - protected PastelNetwork parentNetwork; @NotNull - protected UUID initialID = UUID.randomUUID(); - protected Optional parentID = Optional.empty(); + protected UUID nodeId = UUID.randomUUID(); + protected Optional networkUUID = Optional.empty(); protected Optional outerRing, innerRing, redstoneRing; protected long lastTransferTick = 0; protected final long cachedRedstonePowerTick = 0; protected boolean cachedUnpowered = true; - protected PastelNetwork.Priority priority = PastelNetwork.Priority.GENERIC; + protected PastelNetwork.NodePriority priority = PastelNetwork.NodePriority.GENERIC; protected long itemCountUnderway = 0; // upgrade impl stuff @@ -118,7 +115,7 @@ public static void tick(@NotNull World world, BlockPos pos, BlockState state, Pa } if (world.isClient()) { - if (node.parentNetwork == null) { + if (node.networkUUID.isEmpty()) { node.changeState(State.DISCONNECTED); node.interpLength = 17; } else if (!node.canTransfer()) { @@ -161,8 +158,8 @@ public Optional getOuterRing() { public Optional getRedstoneRing() { return redstoneRing; } - - public PastelNetwork.Priority getPriority() { + + public PastelNetwork.NodePriority getPriority() { return priority; } @@ -221,8 +218,7 @@ public void updateUpgrades() { lit = false; lamp = false; sensor = false; - var oldPriority = priority; - priority = PastelNetwork.Priority.GENERIC; + priority = PastelNetwork.NodePriority.GENERIC; //First one processed can't compound because it has nothing to compound on outerRing.ifPresent(r -> apply(r, Collections.emptyList())); @@ -237,12 +233,11 @@ public void updateUpgrades() { if (lit && lamp) { lit = false; } - - if (parentNetwork != null) - parentNetwork.updateNodePriority(this, oldPriority); - - if (world != null && getCachedState().get(Properties.LIT) != lit) + + if (world != null && getCachedState().get(Properties.LIT) != lit) { + networkUUID.ifPresent(uuid -> ServerPastelNetworkManager.get((ServerWorld) world).getNetwork(uuid)); world.setBlockState(pos, getCachedState().with(Properties.LIT, lit)); + } if (filterSlotRows < oldFilterSlotCount) { for (int i = getDrawnSlots(); i < filterItems.size(); i++) { @@ -278,12 +273,9 @@ public void setWorld(World world) { if (creationStamp == -1) { creationStamp = (world.getTime() + world.getRandom().nextInt(7)) % 20; } - - if (!world.isClient) { - if (this.parentID.isPresent() && parentNetwork == null) { - this.parentNetwork = Pastel.getServerInstance().joinOrCreateNetwork(this, this.parentID.get()); - this.parentID = Optional.empty(); - } + + if (!world.isClient && this.networkUUID.isPresent()) { + this.networkUUID = Optional.of(Pastel.getServerInstance().joinOrCreateNetwork(this, this.networkUUID.get()).getUUID()); } } @@ -338,12 +330,8 @@ public void markTransferred() { @Override public void readNbt(NbtCompound nbt) { super.readNbt(nbt); - if (nbt.contains("Network")) { - UUID networkUUID = nbt.getUuid("Network"); - this.parentID = Optional.of(networkUUID); - if (this.getWorld() != null) { - this.parentNetwork = Pastel.getInstance(world.isClient).joinOrCreateNetwork(this, networkUUID); - } + if (nbt.contains("NetworkUUID")) { + this.networkUUID = Optional.of(nbt.getUuid("NetworkUUID")); } if (nbt.contains("Triggered")) { this.triggered = nbt.getBoolean("Triggered"); @@ -354,8 +342,8 @@ public void readNbt(NbtCompound nbt) { if (nbt.contains("creationStamp")) { this.creationStamp = nbt.getLong("creationStamp"); } - if (nbt.contains("InitialID")) { - this.initialID = nbt.getUuid("InitialID"); + if (nbt.contains("NodeID")) { + this.nodeId = nbt.getUuid("NodeID"); } if (nbt.contains("LastTransferTick", NbtElement.LONG_TYPE)) { this.lastTransferTick = nbt.getLong("LastTransferTick"); @@ -381,13 +369,13 @@ public void readNbt(NbtCompound nbt) { @Override protected void writeNbt(NbtCompound nbt) { super.writeNbt(nbt); - if (this.parentNetwork != null) { - nbt.putUuid("Network", this.parentNetwork.getUUID()); - } if (creationStamp != -1) { nbt.putLong("creationStamp", creationStamp); } - nbt.putUuid("InitialID", this.initialID); + if (this.networkUUID.isPresent()) { + nbt.putUuid("NetworkUUID", this.networkUUID.get()); + } + nbt.putUuid("NodeID", this.nodeId); nbt.putBoolean("Triggered", this.triggered); nbt.putBoolean("Waiting", this.waiting); nbt.putLong("LastTransferTick", this.lastTransferTick); @@ -418,40 +406,34 @@ public NbtCompound toInitialChunkDataNbt() { public void markRemoved() { super.markRemoved(); // Hanky jacks - if (world.isClient()) { - Pastel.getInstance(true).removeNode(this, world.getBlockState(pos).getBlock() instanceof PastelNodeBlock ? NodeRemovalReason.UNLOADED : NodeRemovalReason.BROKEN); - } - else { - Pastel.getInstance(false).removeNode(this, NodeRemovalReason.UNLOADED); + if (!world.isClient()) { + Pastel.getServerInstance().removeNode(this, NodeRemovalReason.UNLOADED); } } - public @NotNull UUID getInitialID() { - return initialID; + public @NotNull UUID getNodeId() { + return nodeId; } public void onBroken() { - Pastel.getInstance(world.isClient).removeNode(this, NodeRemovalReason.BROKEN); + if (!world.isClient) { + Pastel.getServerInstance().removeNode(this, NodeRemovalReason.BROKEN); + } } public boolean canConnect(PastelNodeBlockEntity node) { return this.pos.isWithinDistance(node.pos, RANGE); } - @Nullable - public PastelNetwork getParentNetwork() { - return this.parentNetwork; - } - public PastelNodeType getNodeType() { if (this.getCachedState().getBlock() instanceof PastelNodeBlock pastelNodeBlock) { return pastelNodeBlock.pastelNodeType; } return PastelNodeType.CONNECTION; } - - public void setParentNetwork(PastelNetwork parentNetwork) { - this.parentNetwork = parentNetwork; + + public void setNetworkUUID(UUID uuid) { + this.networkUUID = Optional.of(uuid); if (this.getWorld() != null && !this.getWorld().isClient()) { updateInClientWorld(); this.markDirty(); @@ -748,45 +730,44 @@ public StampData recordStampData(Optional user, BlockReference ref @Override public boolean handleImpression(Optional stamper, Optional user, BlockReference reference, World world) { - var sourceNode = (PastelNodeBlockEntity) reference.tryGetBlockEntity().orElseThrow(() -> new IllegalStateException("Attempted to connect a non-existent node - what did you do?!")); - var manager = Pastel.getInstance(world.isClient()); - - if (!sourceNode.canConnect(this)) + var otherNode = (PastelNodeBlockEntity) reference.tryGetBlockEntity().orElseThrow(() -> new IllegalStateException("Attempted to connect a non-existent node - what did you do?!")); + + if (otherNode == this) { return false; - - if (sourceNode.parentNetwork != null && sourceNode.parentNetwork == this.parentNetwork) { - if (manager.tryRemoveEdge(this, sourceNode)) - return true; - - return manager.tryAddEdge(this, sourceNode); } - - if (sourceNode.parentID.map(uuid -> uuid.equals(this.parentID.orElse(null))).orElse(false)) { + if (!otherNode.canConnect(this)) return false; + + boolean success; + if (otherNode.networkUUID.isPresent() && otherNode.networkUUID.equals(this.networkUUID)) { + var thisNetwork = getServerNetwork(); + success = thisNetwork.get().removeEdge(this, otherNode) || thisNetwork.get().addEdge(this, otherNode); + } else { + Pastel.getServerInstance().connectNodes(this, otherNode); + success = true; } - - manager.connectNodes(this, sourceNode, initialID); - - if (this.parentNetwork != null) { - user.filter(u -> u instanceof ServerPlayerEntity).ifPresent(p -> { - SpectrumAdvancementCriteria.PASTEL_NETWORK_CREATING.trigger((ServerPlayerEntity) p, (ServerPastelNetwork) parentNetwork); - }); + + if (success && this.networkUUID.isPresent() && user.isPresent() && user.get() instanceof ServerPlayerEntity serverPlayer) { + SpectrumAdvancementCriteria.PASTEL_NETWORK_CREATING.trigger(serverPlayer, Pastel.getServerInstance().getNetwork(this.networkUUID.get()).get()); } - - return true; + + return success; + } + + public Optional getServerNetwork() { + if (this.networkUUID.isPresent()) { + return Pastel.getServerInstance().getNetwork(this.networkUUID.get()); + } + return Optional.empty(); } @Override public void clearImpression() { - if (parentNetwork != null) { - Pastel.getInstance(world.isClient()).removeNode(this, NodeRemovalReason.DISCONNECT); - parentNetwork = null; - parentID = Optional.empty(); - initialID = UUID.randomUUID(); - if (!this.world.isClient()) { - updateInClientWorld(); - markDirty(); - } + Pastel.getServerInstance().removeNode(this, NodeRemovalReason.DISCONNECT); + networkUUID = Optional.empty(); + if (!this.world.isClient()) { + updateInClientWorld(); + markDirty(); } } @@ -874,10 +855,10 @@ public void applyCompounding(PastelUpgradeSignature upgrade) { @Override public void upgradePriority() { - if (priority == PastelNetwork.Priority.GENERIC) { - priority = PastelNetwork.Priority.MODERATE; + if (priority == PastelNetwork.NodePriority.GENERIC) { + priority = PastelNetwork.NodePriority.MODERATE; } else { - priority = PastelNetwork.Priority.HIGH; + priority = PastelNetwork.NodePriority.HIGH; } } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/TuningStampItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/TuningStampItem.java index 6ac72ea7a8..93b6de46e5 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/TuningStampItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/TuningStampItem.java @@ -1,29 +1,22 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.item.ExpandedStatTooltip; -import de.dafuqs.spectrum.api.item.Stampable; -import de.dafuqs.spectrum.helpers.BlockReference; -import de.dafuqs.spectrum.registries.SpectrumSoundEvents; -import net.minecraft.block.BlockState; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Optional; +import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.block.*; +import net.minecraft.client.gui.screen.*; +import net.minecraft.client.item.*; +import net.minecraft.entity.*; +import net.minecraft.entity.player.*; +import net.minecraft.item.*; +import net.minecraft.sound.*; +import net.minecraft.text.*; +import net.minecraft.util.*; +import net.minecraft.util.math.*; +import net.minecraft.world.*; +import org.jetbrains.annotations.*; + +import java.util.*; public class TuningStampItem extends Item implements ExpandedStatTooltip { @@ -56,39 +49,40 @@ public ActionResult useOnBlock(ItemUsageContext context) { } if (potentialData.isPresent()) { - var potentialTarget = getData(player, reference, world); - - if (potentialTarget.isEmpty()) - return ActionResult.PASS; - - var source = potentialData.get(); - var target = potentialTarget.get(); - - if (!source.verifyStampData(target) || !target.canUserStamp(player)) { - tryPlaySound(player, SpectrumSoundEvents.SHATTER_LIGHT, 0.75F); - return ActionResult.FAIL; - } - var interactable = target.source(); - - var targetChanged = interactable.handleImpression(source.stamper(), player, source.reference(), world); - source.notifySourceOfChange(target, targetChanged); - - if (!targetChanged) { - tryPlaySound(player, SpectrumSoundEvents.SHATTER_HEAVY, 0.45F); - return ActionResult.FAIL; - } - - //Allow for 'rolling' linking for flow. - player.ifPresent(user -> { - if (!user.isSneaking()) { - var newSource = target.source().recordStampData(player, reference, world); - saveToNbt(stack, newSource); - tryPlaySound(player, SoundEvents.BLOCK_AMETHYST_BLOCK_CHIME, 0.825F); - } - else { - tryPlaySound(player, SpectrumSoundEvents.BLOCK_ONYX_BLOCK_CHIME, 0.825F); - } - }); + if (!world.isClient) { + var potentialTarget = getData(player, reference, world); + + if (potentialTarget.isEmpty()) + return ActionResult.PASS; + + var source = potentialData.get(); + var target = potentialTarget.get(); + + if (!source.verifyStampData(target) || !target.canUserStamp(player)) { + tryPlaySound(player, SpectrumSoundEvents.SHATTER_LIGHT, 0.75F); + return ActionResult.FAIL; + } + var interactable = target.source(); + + var targetChanged = interactable.handleImpression(source.stamper(), player, source.reference(), world); + source.notifySourceOfChange(target, targetChanged); + + if (!targetChanged) { + tryPlaySound(player, SpectrumSoundEvents.SHATTER_HEAVY, 0.45F); + return ActionResult.FAIL; + } + + //Allow for 'rolling' linking for flow. + player.ifPresent(user -> { + if (!user.isSneaking()) { + var newSource = target.source().recordStampData(player, reference, world); + saveToNbt(stack, newSource); + tryPlaySound(player, SoundEvents.BLOCK_AMETHYST_BLOCK_CHIME, 0.825F); + } else { + tryPlaySound(player, SpectrumSoundEvents.BLOCK_ONYX_BLOCK_CHIME, 0.825F); + } + }); + } return ActionResult.success(world.isClient()); } @@ -98,7 +92,9 @@ public ActionResult useOnBlock(ItemUsageContext context) { //Blank an interactable if shift clicking without a saved reference if (player.map(Entity::isSneaking).orElse(false)) { if (candidate.map(d -> d.canUserStamp(player)).orElse(false)) { - candidate.get().source().clearImpression(); + if (!world.isClient) { + candidate.get().source().clearImpression(); + } tryPlaySound(player, SoundEvents.BLOCK_AMETHYST_BLOCK_BREAK, 0.825F); } return ActionResult.success(world.isClient()); diff --git a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketReceiver.java b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketReceiver.java index a244d25059..5c128044ea 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketReceiver.java +++ b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketReceiver.java @@ -32,6 +32,7 @@ import net.minecraft.entity.player.*; import net.minecraft.item.*; import net.minecraft.item.map.*; +import net.minecraft.nbt.*; import net.minecraft.network.*; import net.minecraft.network.packet.s2c.play.*; import net.minecraft.particle.*; @@ -547,14 +548,16 @@ public static void registerS2CReceivers() { ClientPlayNetworking.registerGlobalReceiver(SpectrumS2CPackets.PASTEL_NETWORK_EDGE_SYNC, (client, handler, buf, responseSender) -> { var uuid = buf.readUuid(); - var nbt = buf.readNbt(); + NbtCompound nbt = buf.readNbt(); client.execute(() -> { - Pastel.getInstance(true).getNetwork(uuid).ifPresentOrElse( - n -> n.fromNbt(nbt), - () -> { - - }); + Optional network = Pastel.getInstance(true).getNetwork(uuid); + if (network.isPresent()) { + network.get().setGraph(PastelNetwork.graphFromNbt(nbt)); + } else { + PastelNetwork pn = Pastel.getClientInstance().createNetwork(client.world, uuid); + pn.setGraph(PastelNetwork.graphFromNbt(nbt)); + } }); }); } diff --git a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketSender.java b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketSender.java index 5c204b863a..8d4740be64 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketSender.java +++ b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPacketSender.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.networking; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.block.*; import de.dafuqs.spectrum.api.color.*; import de.dafuqs.spectrum.api.energy.*; @@ -19,7 +18,6 @@ import net.minecraft.entity.*; import net.minecraft.entity.player.*; import net.minecraft.item.*; -import net.minecraft.nbt.*; import net.minecraft.network.*; import net.minecraft.particle.*; import net.minecraft.registry.*; @@ -489,14 +487,14 @@ public static void sendPastelNodeStatusUpdate(List nodes, ServerPlayNetworking.send(player, SpectrumS2CPackets.PASTEL_NODE_STATUS_UPDATE, buf); } } - - public static void syncPastelNetworkEdges(ServerPastelNetwork serverPastelNetwork, NbtCompound graphStorage) { + + public static void syncPastelNetworkEdges(ServerPastelNetwork serverPastelNetwork, BlockPos pos) { PacketByteBuf buf = PacketByteBufs.create(); buf.writeUuid(serverPastelNetwork.getUUID()); - buf.writeNbt(graphStorage); + buf.writeNbt(serverPastelNetwork.graphToNbt()); - assert SpectrumCommon.minecraftServer != null; //shhhh - for (ServerPlayerEntity player : PlayerLookup.all(SpectrumCommon.minecraftServer)) + for (ServerPlayerEntity player : PlayerLookup.tracking((ServerWorld) serverPastelNetwork.getWorld(), pos)) { ServerPlayNetworking.send(player, SpectrumS2CPackets.PASTEL_NETWORK_EDGE_SYNC, buf); + } } } \ No newline at end of file