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
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() {

@ -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() {

@ -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<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)
.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<Method> FOLIA_RUN_AT_FIXED_RATE =
public static final ReflectionLazyLoader<Method> 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<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 =
new ReflectionBuilder(ASYNC_SCHEDULER_CLASS)
.withMethodName("cancelTasks")

@ -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<Object>) 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<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) {
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<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) {
throw new RuntimeException(e);
}

@ -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);
}

@ -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();
}