diff --git a/docs/scarpet/api/Events.md b/docs/scarpet/api/Events.md index b337090d..18e3f2ba 100644 --- a/docs/scarpet/api/Events.md +++ b/docs/scarpet/api/Events.md @@ -32,6 +32,13 @@ if it accepts required number of parameters. Global events will be handled once per app that is with `'global'` scope. With `player` scoped apps, each player instance is responsible independently from handling their events, so a global event may be executed multiple times for each player. +### `__on_server_starts()` +Event triggers after world is loaded and after all startup apps have started. It won't be triggered with `/reload`. + +### `__on_server_shuts_down()` +Event triggers when the server started the shutdown process, before `__on_close()` is executed. Unlike `__on_close()`, it doesn't +trigger with `/reload`. + ### `__on_tick()` Event triggers at the beginning of each tick, located in the overworld. You can use `in_dimension()` to access other dimensions from there. diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index d069fe81..773b61e3 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -102,9 +102,9 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit public static void onServerLoadedWorlds(MinecraftServer minecraftServer) { + HopperCounter.resetAll(minecraftServer); extensions.forEach(e -> e.onServerLoadedWorlds(minecraftServer)); scriptServer.initializeForWorld(); - HopperCounter.resetAll(minecraftServer); } public static void tick(MinecraftServer server) @@ -169,9 +169,9 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit public static void onServerClosed(MinecraftServer server) { + if (scriptServer != null) scriptServer.onClose(); ServerNetworkHandler.close(); currentCommandDispatcher = null; - if (scriptServer != null) scriptServer.onClose(); LoggerRegistry.stopLoggers(); extensions.forEach(e -> e.onServerClosed(server)); diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 04599e8d..11e89c03 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -309,6 +309,30 @@ public class CarpetEventServer return events; } + public static final Event START = new Event("server_starts", 0, true) + { + @Override + public void onTick() + { + handler.call(Collections::emptyList, () -> + CarpetServer.minecraft_server.getCommandSource(). + withWorld(CarpetServer.minecraft_server.getWorld(World.OVERWORLD)) + ); + } + }; + + public static final Event SHUTDOWN = new Event("server_shuts_down", 0, true) + { + @Override + public void onTick() + { + handler.call(Collections::emptyList, () -> + CarpetServer.minecraft_server.getCommandSource(). + withWorld(CarpetServer.minecraft_server.getWorld(World.OVERWORLD)) + ); + } + }; + public static final Event TICK = new Event("tick", 0, true) { @Override diff --git a/src/main/java/carpet/script/CarpetScriptServer.java b/src/main/java/carpet/script/CarpetScriptServer.java index 736ed338..41b2fc34 100644 --- a/src/main/java/carpet/script/CarpetScriptServer.java +++ b/src/main/java/carpet/script/CarpetScriptServer.java @@ -127,7 +127,7 @@ public class CarpetScriptServer addScriptHost(server.getCommandSource(), moduleName, null, true, true, false); } } - + CarpetEventServer.Event.START.onTick(); } public Module getModule(String name, boolean allowLibraries) @@ -489,6 +489,7 @@ public class CarpetScriptServer public void onClose() { + CarpetEventServer.Event.SHUTDOWN.onTick(); for (ScriptHost host : modules.values()) { host.onClose();