From 9f307e3d1eaace6745960e5c396499312f73bc4f Mon Sep 17 00:00:00 2001 From: iceBear67 Date: Sun, 14 Jul 2024 15:18:46 +0800 Subject: [PATCH] fix #19 --- .../sfcraft/init/GuiceModInitializer.java | 11 +++++++++- .../event/SimpleRandomEventRegistry.java | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/ib67/sfcraft/init/GuiceModInitializer.java b/src/main/java/io/ib67/sfcraft/init/GuiceModInitializer.java index 955c5d4..f714671 100644 --- a/src/main/java/io/ib67/sfcraft/init/GuiceModInitializer.java +++ b/src/main/java/io/ib67/sfcraft/init/GuiceModInitializer.java @@ -34,6 +34,7 @@ public abstract class GuiceModInitializer extends AbstractModule implements ModI var handler = new PreInitHandler(initialized); ServerPlayConnectionEvents.JOIN.register(handler::defend); ServerLifecycleEvents.SERVER_STARTED.register(this::onServerStarted); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onServerStopping); injector = onInit(); var map = new HashMap(); for (Class registeredFeature : registeredFeatures) { @@ -48,6 +49,10 @@ public abstract class GuiceModInitializer extends AbstractModule implements ModI moduleManager = new SimpleModuleManager(ImmutableMap.copyOf(map)); } + private void onServerStopping(MinecraftServer minecraftServer) { + onStopping(minecraftServer); + } + private void onServerStarted(MinecraftServer server) { onReady(server); initialized.set(true); @@ -55,7 +60,11 @@ public abstract class GuiceModInitializer extends AbstractModule implements ModI protected abstract Injector onInit(); - protected abstract void onReady(MinecraftServer minecraftServer); + protected void onReady(MinecraftServer minecraftServer) { + } + + protected void onStopping(MinecraftServer minecraftServer) { + } @Provides protected ModuleManager getModuleManager() { diff --git a/src/main/java/io/ib67/sfcraft/registry/event/SimpleRandomEventRegistry.java b/src/main/java/io/ib67/sfcraft/registry/event/SimpleRandomEventRegistry.java index 909ceae..d3f01a6 100644 --- a/src/main/java/io/ib67/sfcraft/registry/event/SimpleRandomEventRegistry.java +++ b/src/main/java/io/ib67/sfcraft/registry/event/SimpleRandomEventRegistry.java @@ -4,8 +4,10 @@ import io.ib67.sfcraft.module.randomevt.ActiveEvent; import io.ib67.sfcraft.module.randomevt.RandomEvent; import lombok.Getter; import lombok.RequiredArgsConstructor; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.minecraft.registry.RegistryKey; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; @@ -17,12 +19,28 @@ import java.util.function.Predicate; public class SimpleRandomEventRegistry implements RandomEventRegistry { private final List entries = new ArrayList<>(); private final List activeEvents = new ArrayList<>(); + private boolean shutdown; protected SimpleRandomEventRegistry() { ServerTickEvents.END_WORLD_TICK.register(this::afterWorldTick); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onShutdown); + } + + private void onShutdown(MinecraftServer minecraftServer) { + shutdown = true; + for (StartedEntry activeEvent : activeEvents) { + activeEvent.getEvent().end(); + } + activeEvents.clear(); } private void afterWorldTick(ServerWorld serverWorld) { + if (shutdown) return; + triggerEvents(serverWorld); + clearActiveEvents(); + } + + private void triggerEvents(ServerWorld serverWorld) { for (RegisteredEntry entry : entries) { if (entry.world == serverWorld.getRegistryKey() && !entry.started && entry.worldTickPredicate.test(serverWorld)) { @@ -33,6 +51,9 @@ public class SimpleRandomEventRegistry implements RandomEventRegistry { } } } + } + + private void clearActiveEvents() { var it = activeEvents.iterator(); while (it.hasNext()) { var entry = it.next();