From e3d5ebab8b86a83780b1c35c2a5d658594e318d8 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Wed, 17 May 2023 18:47:01 +0530 Subject: [PATCH] cancel tasks on plugin disable --- .../main/java/lol/pyr/znpcsplus/ZNpcsPlus.java | 1 + .../pyr/znpcsplus/reflection/Reflections.java | 12 ++++++++++++ .../pyr/znpcsplus/scheduling/FoliaScheduler.java | 16 ++++++++++++++++ .../znpcsplus/scheduling/SpigotScheduler.java | 5 +++++ .../pyr/znpcsplus/scheduling/TaskScheduler.java | 2 ++ 5 files changed, 36 insertions(+) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index fcf2d3b..750a0f4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -212,6 +212,7 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi { @Override public void onDisable() { if (!enabled) return; + scheduler.cancelAll(); npcRegistry.save(); ZApiProvider.unregister(); Bukkit.getOnlinePlayers().forEach(userManager::remove); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java b/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java index c9e450b..2af7a3e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java @@ -117,6 +117,18 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_CANCEL_ASYNC_TASKS = + new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) + .withMethodName("cancelTasks") + .setStrict(FoliaUtil.isFolia()) + .toMethodReflection(); + + public static final ReflectionLazyLoader FOLIA_CANCEL_GLOBAL_TASKS = + new ReflectionBuilder(GLOBAL_REGION_SCHEDULER_CLASS) + .withMethodName("cancelTasks") + .setStrict(FoliaUtil.isFolia()) + .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_TELEPORT_ASYNC = new ReflectionBuilder(Entity.class) .withMethodName("teleportAsync") diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java index 6d8e742..6bf978a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java @@ -41,5 +41,21 @@ public class FoliaScheduler extends TaskScheduler { throw new RuntimeException(e); } } + + @Override + public void cancelAll() { + try { + Object asyncScheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); + Reflections.FOLIA_CANCEL_ASYNC_TASKS.get().invoke(asyncScheduler, plugin); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + try { + Object globalScheduler = Reflections.FOLIA_GET_GLOBAL_REGION_SCHEDULER.get().invoke(null); + Reflections.FOLIA_CANCEL_GLOBAL_TASKS.get().invoke(globalScheduler, plugin); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java index 10a420c..dc15536 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java @@ -22,4 +22,9 @@ public class SpigotScheduler extends TaskScheduler { public void runDelayedTimerAsync(Runnable runnable, long delay, long ticks) { Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, ticks); } + + @Override + public void cancelAll() { + Bukkit.getScheduler().cancelTasks(plugin); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java index af97271..d6e1fe3 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java @@ -14,4 +14,6 @@ public abstract class TaskScheduler { public abstract void runLaterAsync(Runnable runnable, long ticks); public abstract void runDelayedTimerAsync(Runnable runnable, long delay, long ticks); + + public abstract void cancelAll(); }