33import com .mojang .serialization .Codec ;
44import com .mojang .serialization .codecs .RecordCodecBuilder ;
55import com .mojang .serialization .codecs .UnboundedMapCodec ;
6+ import dev .compactmods .machines .api .CompactMachines ;
7+ import dev .compactmods .machines .api .room .RoomInstance ;
68import dev .compactmods .machines .api .room .data .CMRoomDataLocations ;
79import dev .compactmods .machines .data .CMDataFile ;
810import dev .compactmods .machines .api .room .spatial .IRoomBoundaries ;
1719import net .minecraft .world .phys .Vec3 ;
1820import org .apache .logging .log4j .LogManager ;
1921import org .apache .logging .log4j .Logger ;
22+ import org .jetbrains .annotations .Nullable ;
2023
2124import java .nio .file .Path ;
2225import 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