Skip to content

Commit bb3f94c

Browse files
committed
Persist spawn locations with keyed data manager, fixes #616
1 parent c010a4e commit bb3f94c

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed
Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,25 @@
11
package dev.compactmods.machines.room.spawn;
22

3-
import dev.compactmods.machines.api.CompactMachines;
43
import dev.compactmods.machines.api.room.spawn.IRoomSpawnManager;
54
import dev.compactmods.machines.api.room.spawn.IRoomSpawnManagers;
5+
import dev.compactmods.machines.data.manager.CMKeyedDataFileManager;
66
import net.minecraft.server.MinecraftServer;
77

8-
import java.util.HashMap;
9-
108
public class RoomSpawnManagers implements IRoomSpawnManagers {
119

12-
private final HashMap<String, IRoomSpawnManager> spawnManagers;
10+
private final CMKeyedDataFileManager<String, SpawnManager> spawnManagers;
1311

1412
public RoomSpawnManagers(MinecraftServer server) {
15-
this.spawnManagers = new HashMap<>();
16-
17-
CompactMachines.roomRegistrar()
18-
.allRooms()
19-
.forEach(roomInstance -> {
20-
final var manager = new SpawnManager(roomInstance.code(), roomInstance.boundaries());
21-
spawnManagers.put(roomInstance.code(), manager);
22-
});
13+
this.spawnManagers = new CMKeyedDataFileManager<>(server, (serv, code) -> new SpawnManager(code));
2314
}
2415

2516
@Override
2617
public IRoomSpawnManager get(String roomCode) {
27-
return spawnManagers.computeIfAbsent(roomCode, (code) -> CompactMachines
28-
.room(roomCode)
29-
.map(inst -> new SpawnManager(roomCode, inst.boundaries()))
30-
.orElseThrow());
18+
return spawnManagers.data(roomCode);
3119
}
3220

3321
@Override
3422
public void save() {
35-
// FIXME
23+
spawnManagers.save();
3624
}
3725
}

neoforge-main/src/main/java/dev/compactmods/machines/room/spawn/SpawnManager.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.mojang.serialization.Codec;
44
import com.mojang.serialization.codecs.RecordCodecBuilder;
55
import com.mojang.serialization.codecs.UnboundedMapCodec;
6+
import dev.compactmods.machines.api.CompactMachines;
7+
import dev.compactmods.machines.api.room.RoomInstance;
68
import dev.compactmods.machines.api.room.data.CMRoomDataLocations;
79
import dev.compactmods.machines.data.CMDataFile;
810
import dev.compactmods.machines.api.room.spatial.IRoomBoundaries;
@@ -17,6 +19,7 @@
1719
import net.minecraft.world.phys.Vec3;
1820
import org.apache.logging.log4j.LogManager;
1921
import org.apache.logging.log4j.Logger;
22+
import org.jetbrains.annotations.Nullable;
2023

2124
import java.nio.file.Path;
2225
import java.util.Collections;
@@ -37,16 +40,21 @@ public class SpawnManager implements IRoomSpawnManager, CodecHolder<SpawnManager
3740
).apply(inst, SpawnManager::new));
3841

3942
private final String roomCode;
43+
44+
@Nullable
45+
private RoomInstance roomInstance;
46+
47+
@Nullable
4048
private RoomSpawn defaultSpawn;
49+
4150
private final Map<UUID, RoomSpawn> playerSpawns;
42-
private AABB roomBounds;
4351

44-
public SpawnManager(String roomCode, IRoomBoundaries roomBounds) {
45-
this(roomCode, Collections.emptyMap(), new RoomSpawn(roomBounds.defaultSpawn(), Vec2.ZERO));
46-
this.roomBounds = roomBounds.innerBounds();
52+
public SpawnManager(String roomCode) {
53+
this.roomCode = roomCode;
54+
this.playerSpawns = new HashMap<>();
4755
}
4856

49-
public SpawnManager(String roomCode, Map<UUID, RoomSpawn> playerSpawns, RoomSpawn defaultSpawn) {
57+
private SpawnManager(String roomCode, Map<UUID, RoomSpawn> playerSpawns, RoomSpawn defaultSpawn) {
5058
this.roomCode = roomCode;
5159
this.playerSpawns = new HashMap<>(playerSpawns);
5260
this.defaultSpawn = defaultSpawn;
@@ -64,14 +72,20 @@ public void setDefaultSpawn(Vec3 position, Vec2 rotation) {
6472

6573
@Override
6674
public IRoomSpawns spawns() {
75+
if (this.defaultSpawn == null) {
76+
final var i = getRoomInstance();
77+
this.defaultSpawn = new RoomSpawn(i.boundaries().defaultSpawn(), Vec2.ZERO);
78+
}
79+
6780
final var ps = new HashMap<UUID, RoomSpawn>();
6881
playerSpawns.forEach(ps::putIfAbsent);
6982
return new RoomSpawns(defaultSpawn, ps);
7083
}
7184

7285
@Override
7386
public void setPlayerSpawn(UUID player, Vec3 location, Vec2 rotation) {
74-
if(!roomBounds.contains(location))
87+
final var ins = getRoomInstance();
88+
if (!ins.boundaries().innerBounds().contains(location))
7589
return;
7690

7791
playerSpawns.put(player, new RoomSpawn(location, rotation));
@@ -84,10 +98,20 @@ public Path getDataLocation(MinecraftServer server) {
8498

8599
@Override
86100
public Codec<SpawnManager> codec() {
87-
return null;
101+
return CODEC;
102+
}
103+
104+
private RoomInstance getRoomInstance() {
105+
if (roomInstance == null) {
106+
final var instance = CompactMachines.room(this.roomCode).orElseThrow();
107+
this.roomInstance = instance;
108+
}
109+
110+
return this.roomInstance;
88111
}
89112

90-
private record RoomSpawns(RoomSpawn defaultSpawn, Map<UUID, RoomSpawn> playerSpawnsSnapshot) implements IRoomSpawns {
113+
private record RoomSpawns(RoomSpawn defaultSpawn,
114+
Map<UUID, RoomSpawn> playerSpawnsSnapshot) implements IRoomSpawns {
91115

92116
@Override
93117
public Optional<IRoomSpawn> forPlayer(UUID player) {

0 commit comments

Comments
 (0)