diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java index 0bbdded..aee99e2 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java @@ -20,7 +20,7 @@ public class ConsoleCommandAction extends InteractionAction { @Override public void run(Player player) { String cmd = command.replace("{player}", player.getName()).replace("{uuid}", player.getUniqueId().toString()); - scheduler.runSync(() -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), PapiUtil.set(player, cmd))); + scheduler.runSyncGlobal(() -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), PapiUtil.set(player, cmd))); } public String getCommand() { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java index 19a29b8..a028545 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java @@ -1,10 +1,9 @@ package lol.pyr.znpcsplus.interaction.playercommand; -import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.api.interaction.InteractionType; +import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.util.PapiUtil; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; public class PlayerCommandAction extends InteractionAction { @@ -20,7 +19,7 @@ public class PlayerCommandAction extends InteractionAction { @Override public void run(Player player) { String cmd = command.replace("{player}", player.getName()).replace("{uuid}", player.getUniqueId().toString()); - scheduler.runSync(() -> Bukkit.dispatchCommand(player, PapiUtil.set(player, cmd))); + scheduler.schedulePlayerCommand(player, PapiUtil.set(player, cmd)); } public String getCommand() { 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 3a66506..dcd2ffc 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java @@ -74,6 +74,12 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toClassReflection().get(); + public static final Class REGION_SCHEDULER_CLASS = + new ReflectionBuilder("io.papermc.paper.threadedregions.scheduler") + .withClassName("RegionScheduler") + .setStrict(FoliaUtil.isFolia()) + .toClassReflection().get(); + public static final Class SCHEDULED_TASK_CLASS = new ReflectionBuilder("io.papermc.paper.threadedregions.scheduler") .withClassName("ScheduledTask") @@ -94,7 +100,14 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toMethodReflection(); - public static final ReflectionLazyLoader FOLIA_RUN_DELAYED = + public static final ReflectionLazyLoader FOLIA_GET_REGION_SCHEDULER = + new ReflectionBuilder(Bukkit.class) + .withMethodName("getRegionScheduler") + .withExpectResult(REGION_SCHEDULER_CLASS) + .setStrict(FoliaUtil.isFolia()) + .toMethodReflection(); + + public static final ReflectionLazyLoader FOLIA_RUN_DELAYED_ASYNC = new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) .withMethodName("runDelayed") .withParameterTypes(Plugin.class, Consumer.class, long.class, TimeUnit.class) @@ -102,7 +115,7 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toMethodReflection(); - public static final ReflectionLazyLoader FOLIA_RUN_AT_FIXED_RATE = + public static final ReflectionLazyLoader FOLIA_RUN_AT_FIXED_RATE_ASYNC = new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) .withMethodName("runAtFixedRate") .withParameterTypes(Plugin.class, Consumer.class, long.class, long.class, TimeUnit.class) @@ -118,6 +131,14 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_EXECUTE_REGION = + new ReflectionBuilder(REGION_SCHEDULER_CLASS) + .withMethodName("execute") + .withParameterTypes(Plugin.class, Location.class, Runnable.class) + .withExpectResult(SCHEDULED_TASK_CLASS) + .setStrict(FoliaUtil.isFolia()) + .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_CANCEL_ASYNC_TASKS = new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) .withMethodName("cancelTasks") 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 2bea1ba..1856199 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java @@ -1,6 +1,8 @@ package lol.pyr.znpcsplus.scheduling; import lol.pyr.znpcsplus.reflection.Reflections; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import java.lang.reflect.InvocationTargetException; @@ -13,7 +15,16 @@ public class FoliaScheduler extends TaskScheduler { } @Override - public void runSync(Runnable runnable) { + public void schedulePlayerCommand(Player player, String command) { + try { + Object scheduler = Reflections.FOLIA_GET_REGION_SCHEDULER.get().invoke(null); + Reflections.FOLIA_EXECUTE_REGION.get().invoke(scheduler, plugin, player.getLocation(), (Runnable) () -> Bukkit.dispatchCommand(player, command)); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public void runSyncGlobal(Runnable runnable) { try { Object scheduler = Reflections.FOLIA_GET_GLOBAL_REGION_SCHEDULER.get().invoke(null); Reflections.FOLIA_RUN_NOW_GLOBAL.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run()); @@ -26,7 +37,7 @@ public class FoliaScheduler extends TaskScheduler { public void runLaterAsync(Runnable runnable, long delay) { try { Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); - Reflections.FOLIA_RUN_DELAYED.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run(), delay * 50, TimeUnit.MILLISECONDS); + Reflections.FOLIA_RUN_DELAYED_ASYNC.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run(), delay * 50, TimeUnit.MILLISECONDS); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } @@ -36,7 +47,7 @@ public class FoliaScheduler extends TaskScheduler { public void runDelayedTimerAsync(Runnable runnable, long delay, long interval) { try { Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); - Reflections.FOLIA_RUN_AT_FIXED_RATE.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run(), delay * 50, interval * 50, TimeUnit.MILLISECONDS); + Reflections.FOLIA_RUN_AT_FIXED_RATE_ASYNC.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run(), delay * 50, interval * 50, TimeUnit.MILLISECONDS); } 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 639e18e..21096c5 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java @@ -1,6 +1,7 @@ package lol.pyr.znpcsplus.scheduling; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public class SpigotScheduler extends TaskScheduler { @@ -9,7 +10,12 @@ public class SpigotScheduler extends TaskScheduler { } @Override - public void runSync(Runnable runnable) { + public void schedulePlayerCommand(Player player, String command) { + runSyncGlobal(() -> Bukkit.dispatchCommand(player, command)); + } + + @Override + public void runSyncGlobal(Runnable runnable) { Bukkit.getScheduler().runTask(plugin, runnable); } 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 2a50c74..ddb71b9 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java @@ -1,5 +1,6 @@ package lol.pyr.znpcsplus.scheduling; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public abstract class TaskScheduler { @@ -9,11 +10,9 @@ public abstract class TaskScheduler { this.plugin = plugin; } - public abstract void runSync(Runnable runnable); - + public abstract void schedulePlayerCommand(Player player, String command); + public abstract void runSyncGlobal(Runnable runnable); public abstract void runLaterAsync(Runnable runnable, long delay); - public abstract void runDelayedTimerAsync(Runnable runnable, long delay, long interval); - public abstract void cancelAll(); }