2022-03-04 18:30:18 +01:00
|
|
|
package com.simibubi.create.content.logistics.trains;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
import java.util.Objects;
|
|
|
|
import java.util.UUID;
|
|
|
|
|
2022-06-23 03:26:16 +02:00
|
|
|
import com.simibubi.create.Create;
|
2022-03-08 03:51:03 +01:00
|
|
|
import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData;
|
2022-03-04 18:30:18 +01:00
|
|
|
import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType;
|
2022-03-08 03:51:03 +01:00
|
|
|
import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint;
|
2022-03-04 18:30:18 +01:00
|
|
|
import com.simibubi.create.foundation.utility.Couple;
|
|
|
|
import com.simibubi.create.foundation.utility.Pair;
|
|
|
|
import com.simibubi.create.foundation.utility.VecHelper;
|
|
|
|
|
|
|
|
import net.minecraft.network.FriendlyByteBuf;
|
|
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
|
|
|
|
public class TrackGraphSyncPacket extends TrackGraphPacket {
|
|
|
|
|
|
|
|
Map<Integer, Pair<TrackNodeLocation, Vec3>> addedNodes;
|
2023-05-09 18:23:47 +02:00
|
|
|
List<Pair<Pair<Couple<Integer>, TrackMaterial>, BezierConnection>> addedEdges;
|
2022-03-04 18:30:18 +01:00
|
|
|
List<Integer> removedNodes;
|
|
|
|
List<TrackEdgePoint> addedEdgePoints;
|
|
|
|
List<UUID> removedEdgePoints;
|
2022-06-23 03:26:16 +02:00
|
|
|
Map<Integer, Pair<Integer, UUID>> splitSubGraphs;
|
2022-03-04 18:30:18 +01:00
|
|
|
Map<Couple<Integer>, Pair<Integer, List<UUID>>> updatedEdgeData;
|
|
|
|
|
2022-06-23 03:26:16 +02:00
|
|
|
boolean fullWipe;
|
|
|
|
|
2022-03-04 18:30:18 +01:00
|
|
|
static final int NULL_GROUP = 0, PASSIVE_GROUP = 1, GROUP = 2;
|
|
|
|
|
2022-06-23 03:26:16 +02:00
|
|
|
public TrackGraphSyncPacket(UUID graphId, int netId) {
|
2022-03-04 18:30:18 +01:00
|
|
|
this.graphId = graphId;
|
2022-06-23 03:26:16 +02:00
|
|
|
this.netId = netId;
|
2022-03-04 18:30:18 +01:00
|
|
|
addedNodes = new HashMap<>();
|
|
|
|
addedEdges = new ArrayList<>();
|
|
|
|
removedNodes = new ArrayList<>();
|
|
|
|
addedEdgePoints = new ArrayList<>();
|
|
|
|
removedEdgePoints = new ArrayList<>();
|
|
|
|
updatedEdgeData = new HashMap<>();
|
|
|
|
splitSubGraphs = new HashMap<>();
|
|
|
|
packetDeletesGraph = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public TrackGraphSyncPacket(FriendlyByteBuf buffer) {
|
|
|
|
int size;
|
|
|
|
|
|
|
|
graphId = buffer.readUUID();
|
2022-06-23 03:26:16 +02:00
|
|
|
netId = buffer.readInt();
|
2022-03-04 18:30:18 +01:00
|
|
|
packetDeletesGraph = buffer.readBoolean();
|
2022-06-23 03:26:16 +02:00
|
|
|
fullWipe = buffer.readBoolean();
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
if (packetDeletesGraph)
|
|
|
|
return;
|
|
|
|
|
2022-05-15 21:19:02 +02:00
|
|
|
DimensionPalette dimensions = DimensionPalette.receive(buffer);
|
|
|
|
|
2022-03-04 18:30:18 +01:00
|
|
|
addedNodes = new HashMap<>();
|
|
|
|
addedEdges = new ArrayList<>();
|
|
|
|
addedEdgePoints = new ArrayList<>();
|
|
|
|
removedEdgePoints = new ArrayList<>();
|
|
|
|
removedNodes = new ArrayList<>();
|
|
|
|
splitSubGraphs = new HashMap<>();
|
|
|
|
updatedEdgeData = new HashMap<>();
|
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
|
removedNodes.add(buffer.readVarInt());
|
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
|
addedNodes.put(buffer.readVarInt(),
|
2022-05-15 21:19:02 +02:00
|
|
|
Pair.of(TrackNodeLocation.receive(buffer, dimensions), VecHelper.read(buffer)));
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
2022-05-15 21:19:02 +02:00
|
|
|
addedEdges.add(
|
2023-05-09 18:23:47 +02:00
|
|
|
Pair.of(Pair.of(Couple.create(buffer::readVarInt), TrackMaterial.deserialize(buffer.readUtf())), buffer.readBoolean() ? new BezierConnection(buffer) : null));
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
2022-05-15 21:19:02 +02:00
|
|
|
addedEdgePoints.add(EdgePointType.read(buffer, dimensions));
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
|
removedEdgePoints.add(buffer.readUUID());
|
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
ArrayList<UUID> list = new ArrayList<>();
|
|
|
|
Couple<Integer> key = Couple.create(buffer::readInt);
|
|
|
|
Pair<Integer, List<UUID>> entry = Pair.of(buffer.readVarInt(), list);
|
|
|
|
int size2 = buffer.readVarInt();
|
|
|
|
for (int j = 0; j < size2; j++)
|
|
|
|
list.add(buffer.readUUID());
|
|
|
|
updatedEdgeData.put(key, entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
size = buffer.readVarInt();
|
|
|
|
for (int i = 0; i < size; i++)
|
2022-06-23 03:26:16 +02:00
|
|
|
splitSubGraphs.put(buffer.readVarInt(), Pair.of(buffer.readInt(), buffer.readUUID()));
|
2022-03-04 18:30:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void write(FriendlyByteBuf buffer) {
|
|
|
|
buffer.writeUUID(graphId);
|
2022-06-23 03:26:16 +02:00
|
|
|
buffer.writeInt(netId);
|
2022-03-04 18:30:18 +01:00
|
|
|
buffer.writeBoolean(packetDeletesGraph);
|
2022-06-23 03:26:16 +02:00
|
|
|
buffer.writeBoolean(fullWipe);
|
2022-05-15 21:19:02 +02:00
|
|
|
|
2022-03-04 18:30:18 +01:00
|
|
|
if (packetDeletesGraph)
|
|
|
|
return;
|
|
|
|
|
2022-05-15 21:19:02 +02:00
|
|
|
// Populate and send palette ahead of time
|
|
|
|
DimensionPalette dimensions = new DimensionPalette();
|
|
|
|
addedNodes.forEach((node, loc) -> dimensions.encode(loc.getFirst().dimension));
|
|
|
|
addedEdgePoints.forEach(ep -> ep.edgeLocation.forEach(loc -> dimensions.encode(loc.dimension)));
|
|
|
|
dimensions.send(buffer);
|
|
|
|
|
2022-03-04 18:30:18 +01:00
|
|
|
buffer.writeVarInt(removedNodes.size());
|
|
|
|
removedNodes.forEach(buffer::writeVarInt);
|
|
|
|
|
|
|
|
buffer.writeVarInt(addedNodes.size());
|
|
|
|
addedNodes.forEach((node, loc) -> {
|
|
|
|
buffer.writeVarInt(node);
|
2022-05-15 21:19:02 +02:00
|
|
|
loc.getFirst()
|
|
|
|
.send(buffer, dimensions);
|
2022-03-04 18:30:18 +01:00
|
|
|
VecHelper.write(loc.getSecond(), buffer);
|
|
|
|
});
|
|
|
|
|
|
|
|
buffer.writeVarInt(addedEdges.size());
|
|
|
|
addedEdges.forEach(pair -> {
|
2023-05-09 18:23:47 +02:00
|
|
|
pair.getFirst().getFirst()
|
2022-03-04 18:30:18 +01:00
|
|
|
.forEach(buffer::writeVarInt);
|
2023-05-09 18:23:47 +02:00
|
|
|
buffer.writeUtf(pair.getFirst().getSecond().id.toString());
|
2022-05-15 21:19:02 +02:00
|
|
|
BezierConnection turn = pair.getSecond();
|
|
|
|
buffer.writeBoolean(turn != null);
|
|
|
|
if (turn != null)
|
|
|
|
turn.write(buffer);
|
2022-03-04 18:30:18 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
buffer.writeVarInt(addedEdgePoints.size());
|
2022-05-15 21:19:02 +02:00
|
|
|
addedEdgePoints.forEach(ep -> ep.write(buffer, dimensions));
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
buffer.writeVarInt(removedEdgePoints.size());
|
|
|
|
removedEdgePoints.forEach(buffer::writeUUID);
|
|
|
|
|
|
|
|
buffer.writeVarInt(updatedEdgeData.size());
|
|
|
|
for (Entry<Couple<Integer>, Pair<Integer, List<UUID>>> entry : updatedEdgeData.entrySet()) {
|
|
|
|
entry.getKey()
|
|
|
|
.forEach(buffer::writeInt);
|
|
|
|
Pair<Integer, List<UUID>> pair = entry.getValue();
|
|
|
|
buffer.writeVarInt(pair.getFirst());
|
|
|
|
List<UUID> list = pair.getSecond();
|
|
|
|
buffer.writeVarInt(list.size());
|
|
|
|
list.forEach(buffer::writeUUID);
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer.writeVarInt(splitSubGraphs.size());
|
2022-06-23 03:26:16 +02:00
|
|
|
splitSubGraphs.forEach((node, p) -> {
|
2022-03-04 18:30:18 +01:00
|
|
|
buffer.writeVarInt(node);
|
2022-06-23 03:26:16 +02:00
|
|
|
buffer.writeInt(p.getFirst());
|
|
|
|
buffer.writeUUID(p.getSecond());
|
2022-03-04 18:30:18 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void handle(GlobalRailwayManager manager, TrackGraph graph) {
|
|
|
|
if (packetDeletesGraph) {
|
|
|
|
manager.removeGraph(graph);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-06-23 03:26:16 +02:00
|
|
|
if (fullWipe) {
|
|
|
|
manager.removeGraph(graph);
|
|
|
|
graph = Create.RAILWAYS.sided(null)
|
|
|
|
.getOrCreateGraph(graphId, netId);
|
|
|
|
}
|
|
|
|
|
2022-03-04 18:30:18 +01:00
|
|
|
for (int nodeId : removedNodes) {
|
|
|
|
TrackNode node = graph.getNode(nodeId);
|
|
|
|
if (node != null)
|
|
|
|
graph.removeNode(null, node.getLocation());
|
|
|
|
}
|
|
|
|
|
|
|
|
for (Entry<Integer, Pair<TrackNodeLocation, Vec3>> entry : addedNodes.entrySet()) {
|
|
|
|
Integer nodeId = entry.getKey();
|
|
|
|
Pair<TrackNodeLocation, Vec3> nodeLocation = entry.getValue();
|
|
|
|
graph.loadNode(nodeLocation.getFirst(), nodeId, nodeLocation.getSecond());
|
|
|
|
}
|
|
|
|
|
2023-05-09 18:23:47 +02:00
|
|
|
for (Pair<Pair<Couple<Integer>, TrackMaterial>, BezierConnection> pair : addedEdges) {
|
|
|
|
Couple<TrackNode> nodes = pair.getFirst().getFirst()
|
2022-03-04 18:30:18 +01:00
|
|
|
.map(graph::getNode);
|
2022-04-25 17:53:45 +02:00
|
|
|
TrackNode node1 = nodes.getFirst();
|
|
|
|
TrackNode node2 = nodes.getSecond();
|
2022-05-15 21:19:02 +02:00
|
|
|
if (node1 != null && node2 != null)
|
2023-05-09 18:23:47 +02:00
|
|
|
graph.putConnection(node1, node2, new TrackEdge(node1, node2, pair.getSecond(), pair.getFirst().getSecond()));
|
2022-03-04 18:30:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for (TrackEdgePoint edgePoint : addedEdgePoints)
|
|
|
|
graph.edgePoints.put(edgePoint.getType(), edgePoint);
|
|
|
|
|
|
|
|
for (UUID uuid : removedEdgePoints)
|
|
|
|
for (EdgePointType<?> type : EdgePointType.TYPES.values())
|
|
|
|
graph.edgePoints.remove(type, uuid);
|
|
|
|
|
|
|
|
handleEdgeData(manager, graph);
|
|
|
|
|
|
|
|
if (!splitSubGraphs.isEmpty())
|
2022-05-15 21:19:02 +02:00
|
|
|
graph.findDisconnectedGraphs(null, splitSubGraphs)
|
2022-03-04 18:30:18 +01:00
|
|
|
.forEach(manager::putGraph);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void handleEdgeData(GlobalRailwayManager manager, TrackGraph graph) {
|
|
|
|
for (Entry<Couple<Integer>, Pair<Integer, List<UUID>>> entry : updatedEdgeData.entrySet()) {
|
|
|
|
List<UUID> idList = entry.getValue()
|
|
|
|
.getSecond();
|
|
|
|
int groupType = entry.getValue()
|
|
|
|
.getFirst();
|
|
|
|
|
|
|
|
Couple<TrackNode> nodes = entry.getKey()
|
|
|
|
.map(graph::getNode);
|
|
|
|
if (nodes.either(Objects::isNull))
|
|
|
|
continue;
|
|
|
|
TrackEdge edge = graph.getConnectionsFrom(nodes.getFirst())
|
|
|
|
.get(nodes.getSecond());
|
|
|
|
if (edge == null)
|
|
|
|
continue;
|
|
|
|
|
2022-04-25 17:53:45 +02:00
|
|
|
EdgeData edgeData = new EdgeData(edge);
|
2022-03-04 18:30:18 +01:00
|
|
|
if (groupType == NULL_GROUP)
|
2022-04-25 17:53:45 +02:00
|
|
|
edgeData.setSingleSignalGroup(null, null);
|
2022-03-04 18:30:18 +01:00
|
|
|
else if (groupType == PASSIVE_GROUP)
|
2022-04-25 17:53:45 +02:00
|
|
|
edgeData.setSingleSignalGroup(null, EdgeData.passiveGroup);
|
2022-03-04 18:30:18 +01:00
|
|
|
else
|
2022-04-25 17:53:45 +02:00
|
|
|
edgeData.setSingleSignalGroup(null, idList.get(0));
|
2022-03-04 18:30:18 +01:00
|
|
|
|
|
|
|
List<TrackEdgePoint> points = edgeData.getPoints();
|
|
|
|
edge.edgeData = edgeData;
|
|
|
|
|
|
|
|
for (int i = groupType == GROUP ? 1 : 0; i < idList.size(); i++) {
|
|
|
|
UUID uuid = idList.get(i);
|
|
|
|
for (EdgePointType<?> type : EdgePointType.TYPES.values()) {
|
|
|
|
TrackEdgePoint point = graph.edgePoints.get(type, uuid);
|
|
|
|
if (point == null)
|
|
|
|
continue;
|
|
|
|
points.add(point);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void syncEdgeData(TrackNode node1, TrackNode node2, TrackEdge edge) {
|
|
|
|
Couple<Integer> key = Couple.create(node1.getNetId(), node2.getNetId());
|
|
|
|
List<UUID> list = new ArrayList<>();
|
|
|
|
EdgeData edgeData = edge.getEdgeData();
|
|
|
|
int groupType = edgeData.hasSignalBoundaries() ? NULL_GROUP
|
2022-04-25 17:53:45 +02:00
|
|
|
: EdgeData.passiveGroup.equals(edgeData.getSingleSignalGroup()) ? PASSIVE_GROUP : GROUP;
|
2022-03-04 18:30:18 +01:00
|
|
|
if (groupType == GROUP)
|
2022-04-25 17:53:45 +02:00
|
|
|
list.add(edgeData.getSingleSignalGroup());
|
2022-03-04 18:30:18 +01:00
|
|
|
for (TrackEdgePoint point : edgeData.getPoints())
|
|
|
|
list.add(point.getId());
|
|
|
|
updatedEdgeData.put(key, Pair.of(groupType, list));
|
|
|
|
}
|
|
|
|
|
2023-05-09 18:23:47 +02:00
|
|
|
}
|