From 13cfc35de86ab8100b0fe9c4c0eaca7046912e0e Mon Sep 17 00:00:00 2001 From: Zephrynis Date: Wed, 28 Jan 2026 22:37:59 +0000 Subject: [PATCH] Add cleanup task registration and execution in ScriptApi --- src/main/java/net/jstom/script/ScriptApi.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/net/jstom/script/ScriptApi.java b/src/main/java/net/jstom/script/ScriptApi.java index 64d32ba..7317f54 100644 --- a/src/main/java/net/jstom/script/ScriptApi.java +++ b/src/main/java/net/jstom/script/ScriptApi.java @@ -17,6 +17,7 @@ import java.lang.reflect.Modifier; public class ScriptApi { private final List> registeredNodes = new ArrayList<>(); private final List trackedEntities = new ArrayList<>(); + private final List cleanupTasks = new ArrayList<>(); private static final Map entityTypes = new HashMap<>(); static { @@ -32,6 +33,18 @@ public class ScriptApi { } } + /** + * Registers a cleanup task. + * Usage in JS: server.onCleanup(() => { timer.cancel(); }); + */ + public void onCleanup(Value callback) { + if (callback.canExecute()) { + synchronized (cleanupTasks) { + cleanupTasks.add(callback); + } + } + } + /** * Registers an event listener from JavaScript. * Usage in JS: server.on('net.minestom.server.event.player.PlayerLoginEvent', (event) => { ... }); @@ -82,6 +95,19 @@ public class ScriptApi { } public void cleanup() { + System.out.println("[JStom] Running " + cleanupTasks.size() + " cleanup tasks..."); + synchronized (cleanupTasks) { + for (Value task : cleanupTasks) { + try { + task.executeVoid(); + } catch (Exception e) { + System.err.println("[JStom] Error in cleanup task:"); + e.printStackTrace(); + } + } + cleanupTasks.clear(); + } + System.out.println("[JStom] Cleaning up " + registeredNodes.size() + " event nodes..."); for (var node : registeredNodes) { MinecraftServer.getGlobalEventHandler().removeChild(node);