Skip to content

Commit a6d0be9

Browse files
committed
Add even more guards to try and prevent #638
1 parent 6177d6d commit a6d0be9

File tree

13 files changed

+68
-56
lines changed

13 files changed

+68
-56
lines changed

core-api/src/main/java/dev/compactmods/machines/api/CompactMachines.java

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import net.minecraft.world.phys.Vec2;
2929
import net.neoforged.neoforge.attachment.IAttachmentHolder;
3030
import net.neoforged.neoforge.registries.DeferredRegister;
31+
import net.neoforged.neoforge.server.ServerLifecycleHooks;
3132
import org.apache.logging.log4j.LogManager;
3233
import org.apache.logging.log4j.Logger;
3334
import org.jetbrains.annotations.ApiStatus;
@@ -71,24 +72,24 @@ public class CompactMachines {
7172
* to call this!
7273
*/
7374
public static void reloadServices(MinecraftServer server) {
74-
reloadServices("dev.compactmods.machines", server);
75-
}
76-
77-
public static void reloadServices(String prefix, MinecraftServer server) {
7875
logger.debug("Reloading Compact services...");
79-
ROOM_REGISTRAR = serverProvidedService(IRoomRegistrar.class, RoomRegistrarProvider.class, prefix, server);
80-
CHUNK_MANAGER = serverProvidedService(IRoomChunkManager.class, RoomChunkManagerProvider.class, prefix, server);
81-
SPAWN_MANAGERS = serverProvidedService(IRoomSpawnManagers.class, RoomSpawnManagersProvider.class, prefix, server);
82-
83-
ROOM_DATA_ACCESSOR = cmService(IRoomDataAttachmentAccessor.class, prefix);
84-
PLAYER_HISTORY_API = cmService(IPlayerHistoryApi.class, prefix);
85-
UPGRADE_MANAGER = cmService(IRoomUpgradeManager.class, prefix);
86-
ROOM_UPGRADE_DATA_ACCESSOR = cmService(IRoomUpgradeDataAttachmentAccessor.class, prefix);
76+
reloadRoomRegistrar(server);
77+
CHUNK_MANAGER = serverProvidedService(IRoomChunkManager.class, RoomChunkManagerProvider.class, server);
78+
SPAWN_MANAGERS = serverProvidedService(IRoomSpawnManagers.class, RoomSpawnManagersProvider.class, server);
79+
80+
ROOM_DATA_ACCESSOR = cmService(IRoomDataAttachmentAccessor.class);
81+
PLAYER_HISTORY_API = cmService(IPlayerHistoryApi.class);
82+
UPGRADE_MANAGER = cmService(IRoomUpgradeManager.class);
83+
ROOM_UPGRADE_DATA_ACCESSOR = cmService(IRoomUpgradeDataAttachmentAccessor.class);
8784
logger.debug("Compact services loaded.");
8885
}
8986

90-
private static <T, TP extends ServerServiceProvider<T>> T serverProvidedService(Class<T> ignored, Class<TP> providerClass, String packagePrefix, MinecraftServer server) {
91-
final var registrarProvider = cmService(providerClass, packagePrefix);
87+
private static void reloadRoomRegistrar(MinecraftServer server) {
88+
ROOM_REGISTRAR = serverProvidedService(IRoomRegistrar.class, RoomRegistrarProvider.class, server);
89+
}
90+
91+
private static <T, TP extends ServerServiceProvider<T>> T serverProvidedService(Class<T> ignored, Class<TP> providerClass, MinecraftServer server) {
92+
final var registrarProvider = cmService(providerClass);
9293
if(registrarProvider == null) return null;
9394
return registrarProvider.makeServiceInstance(server);
9495
}
@@ -100,12 +101,12 @@ private static <T, TP extends ServerServiceProvider<T>> T serverProvidedService(
100101
* @return
101102
* @param <T>
102103
*/
103-
private static <T> T cmService(Class<T> serviceClass, String packagePrefix) {
104+
private static <T> T cmService(Class<T> serviceClass) {
104105
final var loader = ServiceLoader.load(serviceClass, serviceClass.getClassLoader());
105106
logger.debug("Attempting to find implementation for {}...", serviceClass.getName());
106107

107108
for(var s : loader) {
108-
if(s.getClass().getPackageName().startsWith(packagePrefix)) {
109+
if(s.getClass().getPackageName().startsWith("dev.compactmods.machines")) {
109110
logger.debug("Located implementation for {}: {}", serviceClass.getName(), s.getClass().getName());
110111
return s;
111112
}
@@ -135,8 +136,13 @@ public static IPlayerHistoryApi playerHistoryApi() {
135136
return PLAYER_HISTORY_API;
136137
}
137138

139+
@Deprecated
138140
public static Optional<RoomInstance> room(String roomCode) {
139-
return ROOM_REGISTRAR.get(roomCode);
141+
return roomRegistrar(ServerLifecycleHooks.getCurrentServer()).get(roomCode);
142+
}
143+
144+
public static Optional<RoomInstance> room(MinecraftServer server, String roomCode) {
145+
return roomRegistrar(server).get(roomCode);
140146
}
141147

142148
/**
@@ -148,7 +154,7 @@ public static Optional<RoomInstance> room(String roomCode) {
148154
* @return
149155
*/
150156
public static RoomInstance newRoom(MinecraftServer server, RoomTemplate template, UUID owner) throws MissingDimensionException {
151-
final var instance = ROOM_REGISTRAR.createNew(template, owner);
157+
final var instance = roomRegistrar(server).createNew(template, owner);
152158
final var compactDim = CompactDimension.forServer(server);
153159
CompactRoomGenerator.generateRoom(compactDim, instance.boundaries().outerBounds());
154160

@@ -175,10 +181,6 @@ public static RoomInstance newRoom(MinecraftServer server, RoomTemplate template
175181
return instance;
176182
}
177183

178-
public static Optional<? extends IAttachmentHolder> existingRoomData(String code) {
179-
return ROOM_DATA_ACCESSOR.get(code);
180-
}
181-
182184
public static IRoomDataAttachmentAccessor roomDataAccessor() {
183185
return ROOM_DATA_ACCESSOR;
184186
}
@@ -203,7 +205,10 @@ public static IRoomUpgradeManager upgradeManager() {
203205
return UPGRADE_MANAGER;
204206
}
205207

206-
public static IRoomRegistrar roomRegistrar() {
208+
public static IRoomRegistrar roomRegistrar(MinecraftServer server) {
209+
if(ROOM_REGISTRAR == null)
210+
reloadRoomRegistrar(server);
211+
207212
return ROOM_REGISTRAR;
208213
}
209214

neoforge-main/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ neoForge {
124124
create("server") {
125125
server()
126126
gameDirectory.set(file("runs/server"))
127-
programArgument("nogui")
127+
// programArgument("nogui")
128128
}
129129

130130
create("gameTestServer") {

neoforge-main/src/main/java/dev/compactmods/machines/command/CMRebindSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private static int doRebind(CommandContext<CommandSourceStack> ctx) throws Comma
3131

3232
final var LOGS = LoggingUtil.modLog();
3333

34-
final var roomProvider = CompactMachines.roomRegistrar();
34+
final var roomProvider = CompactMachines.roomRegistrar(source.getServer());
3535
final var rebindingMachine = BlockPosArgument.getLoadedBlockPos(ctx, "pos");
3636
final var roomCode = StringArgumentType.getString(ctx, "bindTo");
3737

neoforge-main/src/main/java/dev/compactmods/machines/command/argument/Suggestors.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,23 @@
1414
import java.util.Set;
1515

1616
public class Suggestors {
17-
public static final SuggestionProvider<CommandSourceStack> ROOM_TEMPLATES = (ctx, builder) ->
18-
SharedSuggestionProvider.suggestResource(getRegistryValues(ctx, RoomTemplate.REGISTRY_KEY), builder);
17+
public static final SuggestionProvider<CommandSourceStack> ROOM_TEMPLATES = (ctx, builder) ->
18+
SharedSuggestionProvider.suggestResource(getRegistryValues(ctx, RoomTemplate.REGISTRY_KEY), builder);
1919

20-
public static final SuggestionProvider<CommandSourceStack> ROOM_CODES = (ctx, builder) -> {
21-
final var codes = CompactMachines.roomRegistrar()
22-
.allRoomCodes()
23-
.toList();
20+
public static final SuggestionProvider<CommandSourceStack> ROOM_CODES = (ctx, builder) -> {
21+
final var server = ctx.getSource().getServer();
22+
final var codes = CompactMachines.roomRegistrar(server)
23+
.allRoomCodes()
24+
.toList();
2425

25-
return SharedSuggestionProvider.suggest(codes, builder);
26-
};
27-
public static final SuggestionProvider<CommandSourceStack> ROOM_UPGRADE_TYPES = (ctx, builder) ->
28-
SharedSuggestionProvider.suggestResource(getRegistryValues(ctx, RoomUpgradeComponentType.REGISTRY_KEY), builder);
26+
return SharedSuggestionProvider.suggest(codes, builder);
27+
};
28+
public static final SuggestionProvider<CommandSourceStack> ROOM_UPGRADE_TYPES = (ctx, builder) ->
29+
SharedSuggestionProvider.suggestResource(getRegistryValues(ctx, RoomUpgradeComponentType.REGISTRY_KEY), builder);
2930

30-
private static <T> Set<ResourceLocation> getRegistryValues(CommandContext<CommandSourceStack> ctx, ResourceKey<Registry<T>> keyType) {
31-
return ctx.getSource().registryAccess()
32-
.registryOrThrow(keyType)
33-
.keySet();
34-
}
31+
private static <T> Set<ResourceLocation> getRegistryValues(CommandContext<CommandSourceStack> ctx, ResourceKey<Registry<T>> keyType) {
32+
return ctx.getSource().registryAccess()
33+
.registryOrThrow(keyType)
34+
.keySet();
35+
}
3536
}

neoforge-main/src/main/java/dev/compactmods/machines/command/rooms/CMRoomsSubcommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ public static LiteralArgumentBuilder<CommandSourceStack> make() {
2929

3030
private static int execRoomSummary(CommandContext<CommandSourceStack> ctx) {
3131
var src = ctx.getSource();
32+
final var server = src.getServer();
3233

3334
// FIXME: Per-dimension machine count
3435

35-
final var roomCount = CompactMachines.roomRegistrar().count();
36+
final var roomCount = CompactMachines.roomRegistrar(server).count();
3637
src.sendSuccess(() -> Component.translatable(CommandTranslations.IDs.ROOM_COUNT, roomCount), false);
3738

3839
return 0;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public static void entityJoined(final EntityJoinLevelEvent evt) {
4949
if (ent instanceof ServerPlayer serverPlayer) {
5050
CompactMachines.chunkManager()
5151
.findRoomByChunk(serverPlayer.chunkPosition())
52-
.flatMap(CompactMachines::room)
52+
.flatMap((String roomCode) -> CompactMachines.room(serverPlayer.server, roomCode))
5353
.ifPresent(room -> {
5454
PacketDistributor.sendToPlayer(serverPlayer, new SyncRoomMetadataPacket(room.code(), room.getData(CMDataAttachments.ROOM_OWNER)));
5555
});
@@ -95,7 +95,7 @@ private static boolean positionInsideRoom(Entity entity, Vec3 target) {
9595

9696
return CompactMachines.chunkManager()
9797
.findRoomByChunk(entity.chunkPosition())
98-
.flatMap(CompactMachines::room)
98+
.flatMap((String roomCode) -> CompactMachines.room(entity.getServer(), roomCode))
9999
.map(ib -> ib.boundaries().innerBounds().contains(target))
100100
.orElse(false);
101101
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static CompletableFuture<RoomEntryResult> teleportPlayerIntoMachine(Level
3535
MinecraftServer serv = machineLevel.getServer();
3636

3737
LOGS.debug("Player {} entering machine at: {}", player.getName(), machinePos);
38-
return CompactMachines.room(roomCode).map(roomInfo -> {
38+
return CompactMachines.room(player.server, roomCode).map(roomInfo -> {
3939
try {
4040
return teleportPlayerIntoRoom(serv, player, roomInfo, RoomEntryPoint.playerEnteringMachine(player));
4141
} catch (MissingDimensionException e) {

neoforge-main/src/main/java/dev/compactmods/machines/room/spatial/GraphChunkManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import dev.compactmods.machines.room.graph.node.RoomChunkNode;
1212
import dev.compactmods.machines.room.graph.node.RoomReferenceNode;
1313
import dev.compactmods.machines.util.MathUtil;
14+
import net.minecraft.server.MinecraftServer;
1415
import net.minecraft.world.level.ChunkPos;
1516

1617
import java.lang.ref.WeakReference;
@@ -26,11 +27,11 @@ public class GraphChunkManager implements IRoomChunkManager {
2627
private final MemoryGraph graph;
2728
private final Map<ChunkPos, RoomChunkNode> chunks;
2829

29-
public GraphChunkManager() {
30+
public GraphChunkManager(MinecraftServer server) {
3031
this.graph = new MemoryGraph();
3132
this.chunks = new HashMap<>();
3233

33-
CompactMachines.roomRegistrar()
34+
CompactMachines.roomRegistrar(server)
3435
.allRooms()
3536
.forEach(inst -> calculateChunks(inst.code(), inst.boundaries()));
3637
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.minecraft.world.phys.AABB;
1818
import net.minecraft.world.phys.Vec2;
1919
import net.minecraft.world.phys.Vec3;
20+
import net.neoforged.neoforge.server.ServerLifecycleHooks;
2021
import org.apache.logging.log4j.LogManager;
2122
import org.apache.logging.log4j.Logger;
2223
import org.jetbrains.annotations.Nullable;

neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgradeEventHandlers.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import dev.compactmods.machines.api.room.upgrade.event.NeoForgeEventHandler;
1616
import dev.compactmods.machines.api.room.upgrade.event.NeoForgeEventListener;
1717
import net.minecraft.network.chat.Component;
18+
import net.minecraft.server.MinecraftServer;
1819
import net.minecraft.server.level.ServerLevel;
1920
import net.minecraft.util.CommonColors;
2021
import net.minecraft.world.item.Item;
@@ -56,8 +57,8 @@ public static void collectUpgradeEvents() {
5657
allEvents.forEach(RoomUpgrades::eventProcessor);
5758
}
5859

59-
private static void doRoomUpgradeLoop(BiConsumer<RoomInstance, RoomUpgradeInventory> forEach) {
60-
final var rooms = CompactMachines.roomRegistrar();
60+
private static void doRoomUpgradeLoop(MinecraftServer server, BiConsumer<RoomInstance, RoomUpgradeInventory> forEach) {
61+
final var rooms = CompactMachines.roomRegistrar(server);
6162
if (rooms != null) {
6263
final var registeredRooms = rooms.allRooms()
6364
.collect(Collectors.toUnmodifiableSet());
@@ -71,10 +72,11 @@ private static void doRoomUpgradeLoop(BiConsumer<RoomInstance, RoomUpgradeInvent
7172
}
7273

7374
public static void cleanupDeadUpgrades(final ServerStartedEvent serverStartedEvent) {
74-
if (!CMFeatureFlags.ROOM_UPGRADES.isSubsetOf(serverStartedEvent.getServer().getWorldData().enabledFeatures()))
75+
final var server = serverStartedEvent.getServer();
76+
if (!CMFeatureFlags.ROOM_UPGRADES.isSubsetOf(server.getWorldData().enabledFeatures()))
7577
return;
7678

77-
CompactMachines.roomRegistrar()
79+
CompactMachines.roomRegistrar(server)
7880
.allRooms()
7981
.forEach(RoomUpgradeHelper::cleanDeadUpgrades);
8082
}
@@ -84,7 +86,7 @@ public static void onLevelLoad(final LevelEvent.Load loaded) {
8486
return;
8587

8688
if (loaded.getLevel() instanceof ServerLevel serverLevel && CompactDimension.isLevelCompact(serverLevel)) {
87-
doRoomUpgradeLoop((room, inv) -> handleBasicEvent(room, inv, LevelLoadedUpgradeEventListener.class));
89+
doRoomUpgradeLoop(serverLevel.getServer(), (room, inv) -> handleBasicEvent(room, inv, LevelLoadedUpgradeEventListener.class));
8890
}
8991
}
9092

@@ -93,7 +95,7 @@ public static void onLevelUnload(final LevelEvent.Unload loaded) {
9395
return;
9496

9597
if (loaded.getLevel() instanceof ServerLevel serverLevel && CompactDimension.isLevelCompact(serverLevel)) {
96-
doRoomUpgradeLoop((room, inv) -> handleBasicEvent(room, inv, LevelUnloadedUpgradeEventListener.class));
98+
doRoomUpgradeLoop(serverLevel.getServer(), (room, inv) -> handleBasicEvent(room, inv, LevelUnloadedUpgradeEventListener.class));
9799
}
98100
}
99101

@@ -102,7 +104,7 @@ public static void onLevelTick(LevelTickEvent.Post postTick) {
102104
return;
103105

104106
if (postTick.getLevel() instanceof ServerLevel serverLevel && CompactDimension.isLevelCompact(serverLevel)) {
105-
doRoomUpgradeLoop((room, inv) -> handleBasicEvent(room, inv, UpgradeTickedEventListener.class));
107+
doRoomUpgradeLoop(serverLevel.getServer(), (room, inv) -> handleBasicEvent(room, inv, UpgradeTickedEventListener.class));
106108
}
107109
}
108110

0 commit comments

Comments
 (0)