execute player commands on region scheduler on Folia (fixes #54)
This commit is contained in:
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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue