execute player commands on region scheduler on Folia (fixes #54)

This commit is contained in:
Pyrbu 2023-05-25 13:08:46 +01:00
parent 5ae5ca200d
commit 1762bf595e
6 changed files with 50 additions and 14 deletions

@ -20,7 +20,7 @@ public class ConsoleCommandAction extends InteractionAction {
@Override @Override
public void run(Player player) { public void run(Player player) {
String cmd = command.replace("{player}", player.getName()).replace("{uuid}", player.getUniqueId().toString()); 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() { public String getCommand() {

@ -1,10 +1,9 @@
package lol.pyr.znpcsplus.interaction.playercommand; package lol.pyr.znpcsplus.interaction.playercommand;
import lol.pyr.znpcsplus.interaction.InteractionAction;
import lol.pyr.znpcsplus.api.interaction.InteractionType; import lol.pyr.znpcsplus.api.interaction.InteractionType;
import lol.pyr.znpcsplus.interaction.InteractionAction;
import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import lol.pyr.znpcsplus.util.PapiUtil; import lol.pyr.znpcsplus.util.PapiUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class PlayerCommandAction extends InteractionAction { public class PlayerCommandAction extends InteractionAction {
@ -20,7 +19,7 @@ public class PlayerCommandAction extends InteractionAction {
@Override @Override
public void run(Player player) { public void run(Player player) {
String cmd = command.replace("{player}", player.getName()).replace("{uuid}", player.getUniqueId().toString()); 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() { public String getCommand() {

@ -74,6 +74,12 @@ public final class Reflections {
.setStrict(FoliaUtil.isFolia()) .setStrict(FoliaUtil.isFolia())
.toClassReflection().get(); .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 = public static final Class<?> SCHEDULED_TASK_CLASS =
new ReflectionBuilder("io.papermc.paper.threadedregions.scheduler") new ReflectionBuilder("io.papermc.paper.threadedregions.scheduler")
.withClassName("ScheduledTask") .withClassName("ScheduledTask")
@ -94,7 +100,14 @@ public final class Reflections {
.setStrict(FoliaUtil.isFolia()) .setStrict(FoliaUtil.isFolia())
.toMethodReflection(); .toMethodReflection();
public static final ReflectionLazyLoader<Method> FOLIA_RUN_DELAYED = public static final ReflectionLazyLoader<Method> FOLIA_GET_REGION_SCHEDULER =
new ReflectionBuilder(Bukkit.class)
.withMethodName("getRegionScheduler")
.withExpectResult(REGION_SCHEDULER_CLASS)
.setStrict(FoliaUtil.isFolia())
.toMethodReflection();
public static final ReflectionLazyLoader<Method> FOLIA_RUN_DELAYED_ASYNC =
new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) new ReflectionBuilder(ASYNC_SCHEDULER_CLASS)
.withMethodName("runDelayed") .withMethodName("runDelayed")
.withParameterTypes(Plugin.class, Consumer.class, long.class, TimeUnit.class) .withParameterTypes(Plugin.class, Consumer.class, long.class, TimeUnit.class)
@ -102,7 +115,7 @@ public final class Reflections {
.setStrict(FoliaUtil.isFolia()) .setStrict(FoliaUtil.isFolia())
.toMethodReflection(); .toMethodReflection();
public static final ReflectionLazyLoader<Method> FOLIA_RUN_AT_FIXED_RATE = public static final ReflectionLazyLoader<Method> FOLIA_RUN_AT_FIXED_RATE_ASYNC =
new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) new ReflectionBuilder(ASYNC_SCHEDULER_CLASS)
.withMethodName("runAtFixedRate") .withMethodName("runAtFixedRate")
.withParameterTypes(Plugin.class, Consumer.class, long.class, long.class, TimeUnit.class) .withParameterTypes(Plugin.class, Consumer.class, long.class, long.class, TimeUnit.class)
@ -118,6 +131,14 @@ public final class Reflections {
.setStrict(FoliaUtil.isFolia()) .setStrict(FoliaUtil.isFolia())
.toMethodReflection(); .toMethodReflection();
public static final ReflectionLazyLoader<Method> 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<Method> FOLIA_CANCEL_ASYNC_TASKS = public static final ReflectionLazyLoader<Method> FOLIA_CANCEL_ASYNC_TASKS =
new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) new ReflectionBuilder(ASYNC_SCHEDULER_CLASS)
.withMethodName("cancelTasks") .withMethodName("cancelTasks")

@ -1,6 +1,8 @@
package lol.pyr.znpcsplus.scheduling; package lol.pyr.znpcsplus.scheduling;
import lol.pyr.znpcsplus.reflection.Reflections; import lol.pyr.znpcsplus.reflection.Reflections;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@ -13,7 +15,16 @@ public class FoliaScheduler extends TaskScheduler {
} }
@Override @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 { try {
Object scheduler = Reflections.FOLIA_GET_GLOBAL_REGION_SCHEDULER.get().invoke(null); Object scheduler = Reflections.FOLIA_GET_GLOBAL_REGION_SCHEDULER.get().invoke(null);
Reflections.FOLIA_RUN_NOW_GLOBAL.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run()); Reflections.FOLIA_RUN_NOW_GLOBAL.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run());
@ -26,7 +37,7 @@ public class FoliaScheduler extends TaskScheduler {
public void runLaterAsync(Runnable runnable, long delay) { public void runLaterAsync(Runnable runnable, long delay) {
try { try {
Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null);
Reflections.FOLIA_RUN_DELAYED.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run(), delay * 50, TimeUnit.MILLISECONDS); Reflections.FOLIA_RUN_DELAYED_ASYNC.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run(), delay * 50, TimeUnit.MILLISECONDS);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -36,7 +47,7 @@ public class FoliaScheduler extends TaskScheduler {
public void runDelayedTimerAsync(Runnable runnable, long delay, long interval) { public void runDelayedTimerAsync(Runnable runnable, long delay, long interval) {
try { try {
Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null);
Reflections.FOLIA_RUN_AT_FIXED_RATE.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run(), delay * 50, interval * 50, TimeUnit.MILLISECONDS); Reflections.FOLIA_RUN_AT_FIXED_RATE_ASYNC.get().invoke(scheduler, plugin, (Consumer<Object>) o -> runnable.run(), delay * 50, interval * 50, TimeUnit.MILLISECONDS);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

@ -1,6 +1,7 @@
package lol.pyr.znpcsplus.scheduling; package lol.pyr.znpcsplus.scheduling;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class SpigotScheduler extends TaskScheduler { public class SpigotScheduler extends TaskScheduler {
@ -9,7 +10,12 @@ public class SpigotScheduler extends TaskScheduler {
} }
@Override @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); Bukkit.getScheduler().runTask(plugin, runnable);
} }

@ -1,5 +1,6 @@
package lol.pyr.znpcsplus.scheduling; package lol.pyr.znpcsplus.scheduling;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public abstract class TaskScheduler { public abstract class TaskScheduler {
@ -9,11 +10,9 @@ public abstract class TaskScheduler {
this.plugin = plugin; 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 runLaterAsync(Runnable runnable, long delay);
public abstract void runDelayedTimerAsync(Runnable runnable, long delay, long interval); public abstract void runDelayedTimerAsync(Runnable runnable, long delay, long interval);
public abstract void cancelAll(); public abstract void cancelAll();
} }