Skip to content

Commit 7996fb0

Browse files
committed
Improve data persistence and history tracking logic
Closes #602 and #604
1 parent 2f5e1c3 commit 7996fb0

File tree

7 files changed

+204
-164
lines changed

7 files changed

+204
-164
lines changed

neoforge-main/src/main/java/dev/compactmods/machines/CompactMachinesCommon.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import dev.compactmods.machines.dimension.WorldBorderFixer;
1010
import dev.compactmods.machines.machine.Machines;
1111
import dev.compactmods.machines.network.CMNetworks;
12+
import dev.compactmods.machines.player.PlayerEventHandler;
1213
import dev.compactmods.machines.room.Rooms;
1314
import dev.compactmods.machines.room.block.ProtectedBlockEventHandler;
1415
import dev.compactmods.machines.room.upgrade.RoomUpgrades;
@@ -54,6 +55,7 @@ private static void registerEvents(IEventBus modBus) {
5455
Rooms.registerEvents(modBus);
5556
RoomUpgrades.registerEvents(modBus);
5657
WorldBorderFixer.registerEvents();
58+
PlayerEventHandler.registerEvents();
5759

5860
modBus.addListener(CompactMachinesCommon::commonSetup);
5961
modBus.addListener(CMFeaturePacks::addFeaturePacks);
Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package dev.compactmods.machines.data.manager;
22

33
import dev.compactmods.machines.LoggingUtil;
4+
import dev.compactmods.machines.api.room.data.CMRoomDataLocations;
45
import dev.compactmods.machines.data.CMDataFile;
56
import dev.compactmods.machines.data.CodecHolder;
67
import dev.compactmods.machines.data.DataFileUtil;
8+
import dev.compactmods.machines.player.PlayerEntryPointHistoryManager;
79
import net.minecraft.nbt.CompoundTag;
810
import net.minecraft.nbt.NbtIo;
911
import net.minecraft.nbt.NbtOps;
@@ -14,47 +16,58 @@
1416

1517
/**
1618
* A codec-backed file that stores a single data instance.
19+
*
1720
* @param <T>
1821
*/
1922
public class CMSingletonDataFileManager<T extends CMDataFile & CodecHolder<T>> implements IDataFileManager<T> {
2023

21-
protected final MinecraftServer server;
22-
private final String dataKey;
23-
private final T instance;
24-
25-
public CMSingletonDataFileManager(MinecraftServer server, String dataKey, T instance) {
26-
this.server = server;
27-
this.dataKey = dataKey;
28-
this.instance = instance;
29-
}
30-
31-
public T data() {
32-
return this.instance;
33-
}
34-
35-
private void ensureFileReady() {
36-
var dir = instance.getDataLocation(server);
37-
DataFileUtil.ensureDirExists(dir);
38-
}
39-
40-
public void save() {
41-
if (instance != null) {
42-
ensureFileReady();
43-
44-
var fullData = new CompoundTag();
45-
fullData.putString("version", instance.getDataVersion());
46-
47-
var fileData = instance.codec()
48-
.encodeStart(NbtOps.INSTANCE, instance)
49-
.getOrThrow();
50-
51-
fullData.put("data", fileData);
52-
53-
try {
54-
IOUtilities.writeNbtCompressed(fullData, instance.getDataLocation(server).resolve(dataKey + ".dat"));
55-
} catch (IOException e) {
56-
LoggingUtil.modLog().error("Failed to write data: " + e.getMessage(), e);
57-
}
58-
}
59-
}
24+
protected final MinecraftServer server;
25+
private final String dataKey;
26+
private T instance;
27+
28+
public CMSingletonDataFileManager(MinecraftServer server, String dataKey, T instance) {
29+
this.server = server;
30+
this.dataKey = dataKey;
31+
this.instance = instance;
32+
}
33+
34+
public void load() {
35+
final var file = instance.getDataLocation(server)
36+
.resolve(dataKey + ".dat")
37+
.toFile();
38+
39+
if (file.exists()) {
40+
this.instance = DataFileUtil.loadFileWithCodec(file, instance.codec());
41+
}
42+
}
43+
44+
public T data() {
45+
return this.instance;
46+
}
47+
48+
private void ensureFileReady() {
49+
var dir = instance.getDataLocation(server);
50+
DataFileUtil.ensureDirExists(dir);
51+
}
52+
53+
public void save() {
54+
if (instance != null) {
55+
ensureFileReady();
56+
57+
var fullData = new CompoundTag();
58+
fullData.putString("version", instance.getDataVersion());
59+
60+
var fileData = instance.codec()
61+
.encodeStart(NbtOps.INSTANCE, instance)
62+
.getOrThrow();
63+
64+
fullData.put("data", fileData);
65+
66+
try {
67+
IOUtilities.writeNbtCompressed(fullData, instance.getDataLocation(server).resolve(dataKey + ".dat"));
68+
} catch (IOException e) {
69+
LoggingUtil.modLog().error("Failed to write data: " + e.getMessage(), e);
70+
}
71+
}
72+
}
6073
}

neoforge-main/src/main/java/dev/compactmods/machines/player/PlayerEntryPointHistoryManager.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import dev.compactmods.feather.node.Node;
88
import dev.compactmods.feather.traversal.GraphNodeTransformationFunction;
99
import dev.compactmods.machines.api.CompactMachines;
10-
import dev.compactmods.machines.api.dimension.CompactDimension;
1110
import dev.compactmods.machines.api.room.data.CMRoomDataLocations;
1211
import dev.compactmods.machines.api.room.history.IPlayerEntryPointHistoryManager;
1312
import dev.compactmods.machines.api.room.history.PlayerRoomHistoryEntry;
@@ -82,7 +81,7 @@ private PlayerEntryPointHistoryManager(int maxDepth, Map<UUID, List<PlayerRoomHi
8281
entry.getValue()
8382
.stream()
8483
.sorted(Comparator.comparing(PlayerRoomHistoryEntry::instant))
85-
.forEach(hist -> enterRoom(entry.getKey(), hist));
84+
.forEach(hist -> addRoomEntryUnsafe(entry.getKey(), hist));
8685
}
8786
}
8887

@@ -141,6 +140,10 @@ public RoomEntryResult enterRoom(UUID player, PlayerRoomHistoryEntry history) {
141140
if (!CompactMachines.isValidRoomCode(history.roomCode()))
142141
return RoomEntryResult.FAILED_ROOM_INVALID;
143142

143+
return addRoomEntryUnsafe(player, history);
144+
}
145+
146+
private @NotNull RoomEntryResult addRoomEntryUnsafe(UUID player, PlayerRoomHistoryEntry history) {
144147
PlayerReferenceNode playerNode = getOrCreatePlayer(player);
145148

146149
long depth = graph.outboundEdges(playerNode, PlayerEntryPointNode.class).count();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dev.compactmods.machines.player;
2+
3+
import dev.compactmods.machines.network.room.SyncRoomMetadataPacket;
4+
import dev.compactmods.machines.room.Rooms;
5+
import net.minecraft.Util;
6+
import net.minecraft.server.level.ServerPlayer;
7+
import net.neoforged.neoforge.common.NeoForge;
8+
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
9+
import net.neoforged.neoforge.network.PacketDistributor;
10+
11+
public class PlayerEventHandler {
12+
13+
public static void registerEvents() {
14+
NeoForge.EVENT_BUS.addListener(PlayerEventHandler::onPlayerJoinedServer);
15+
}
16+
17+
public static void onPlayerJoinedServer(PlayerEvent.PlayerLoggedInEvent event) {
18+
final var player = event.getEntity();
19+
20+
if(player instanceof ServerPlayer serverPlayer) {
21+
final var currentRoom = serverPlayer.getExistingData(Rooms.DataAttachments.CURRENT_ROOM_CODE);
22+
currentRoom.ifPresent(roomCode -> PacketDistributor.sendToPlayer(serverPlayer, new SyncRoomMetadataPacket(roomCode, Util.NIL_UUID)));
23+
}
24+
}
25+
}

neoforge-main/src/main/java/dev/compactmods/machines/room/RoomRegistrar.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,6 @@ public Path getDataLocation(MinecraftServer server) {
124124
return CMRoomDataLocations.DATA_ROOT.apply(server);
125125
}
126126

127-
public static File getFile(MinecraftServer server) {
128-
return CMRoomDataLocations.DATA_ROOT.apply(server)
129-
.resolve("room_registrations.dat")
130-
.toFile();
131-
}
132-
133127
@Override
134128
public Codec<RoomRegistrar> codec() {
135129
return CODEC;

0 commit comments

Comments
 (0)