From b78fab3172a2423f1618e420940e2b30870a9c7f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 31 Oct 2026 16:02:31 +0100 Subject: [PATCH] Stop the loader task and listener when a loader ends Every loader started a timer and registered itself as listener, but neither was stopped, so each loader kept running every tick until the server restarted. Both are now stopped when the loader is stopped or replaced by a new one. --- .../bausystem/features/loader/Loader.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java index dd6e3f6d..398436db 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/Loader.java @@ -36,9 +36,11 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitTask; import java.util.ArrayList; import java.util.List; @@ -63,13 +65,14 @@ public class Loader implements Listener, SWPlayer.Component { private List elements = new ArrayList<>(); private int currentElement = 0; private long waitTime = 0; + private final BukkitTask task; public Loader(Player p) { this.p = p; this.recorder = new LoaderRecorder(p, elements); Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance()); - BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { + task = BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { if (stage != Stage.RUNNING && stage != Stage.SINGLE) return; if (!Permission.BUILD.hasPermission(p)) return; if (waitTime > 0) { @@ -136,13 +139,27 @@ public class Loader implements Listener, SWPlayer.Component { } public void stop() { + end(); + if (getLoader(p) == this) { + SWPlayer.of(p).removeComponent(Loader.class); + } + } + + // Also called when the loader is replaced by a new one + @Override + public void onUnmount(SWPlayer player) { + end(); + } + + private void end() { stage = Stage.END; if (recorder != null) { recorder.stop(); recorder = null; } elements.clear(); - SWPlayer.of(p).removeComponent(Loader.class); + task.cancel(); + HandlerList.unregisterAll(this); } public boolean setTicksBetweenShots(int delay) {