diff --git a/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java b/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java
index 79094015..e5da5359 100644
--- a/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java
+++ b/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java
@@ -24,6 +24,8 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.bukkit.plugin.Plugin;
+
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.error.Report;
import com.comphenix.protocol.error.ReportType;
@@ -38,8 +40,6 @@ import com.comphenix.protocol.timing.TimedTracker;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
-import org.bukkit.plugin.Plugin;
-
/**
* Represents a handler for an asynchronous event.
*
@@ -328,7 +328,7 @@ public class AsyncListenerHandler {
}
private void scheduleAsync(Runnable runnable) {
- listener.getPlugin().getServer().getScheduler().runTaskAsynchronously(listener.getPlugin(), runnable);
+ filterManager.getScheduler().runTaskAsync(runnable);
}
/**
diff --git a/src/main/java/com/comphenix/protocol/scheduler/DefaultScheduler.java b/src/main/java/com/comphenix/protocol/scheduler/DefaultScheduler.java
index 8e1766af..a6d312bd 100644
--- a/src/main/java/com/comphenix/protocol/scheduler/DefaultScheduler.java
+++ b/src/main/java/com/comphenix/protocol/scheduler/DefaultScheduler.java
@@ -29,4 +29,10 @@ public class DefaultScheduler implements ProtocolScheduler {
int taskId = scheduler.scheduleSyncDelayedTask(plugin, task, delay);
return taskId >= 0 ? new DefaultTask(scheduler, taskId) : null;
}
+
+ @Override
+ public Task runTaskAsync(Runnable task) {
+ int taskId = scheduler.runTaskAsynchronously(plugin, task).getTaskId();
+ return taskId >= 0 ? new DefaultTask(scheduler, taskId) : null;
+ }
}
diff --git a/src/main/java/com/comphenix/protocol/scheduler/DefaultTask.java b/src/main/java/com/comphenix/protocol/scheduler/DefaultTask.java
index 8662d80d..1146adda 100644
--- a/src/main/java/com/comphenix/protocol/scheduler/DefaultTask.java
+++ b/src/main/java/com/comphenix/protocol/scheduler/DefaultTask.java
@@ -1,7 +1,6 @@
package com.comphenix.protocol.scheduler;
import org.bukkit.scheduler.BukkitScheduler;
-import org.bukkit.scheduler.BukkitTask;
public class DefaultTask implements Task {
private final int taskId;
diff --git a/src/main/java/com/comphenix/protocol/scheduler/FoliaScheduler.java b/src/main/java/com/comphenix/protocol/scheduler/FoliaScheduler.java
index 8ca48caa..ee45cad3 100644
--- a/src/main/java/com/comphenix/protocol/scheduler/FoliaScheduler.java
+++ b/src/main/java/com/comphenix/protocol/scheduler/FoliaScheduler.java
@@ -9,23 +9,32 @@ import org.bukkit.plugin.Plugin;
import java.util.function.Consumer;
public class FoliaScheduler implements ProtocolScheduler {
- private final Object foliaScheduler;
+ private final Object foliaRegionScheduler;
private final MethodAccessor runAtFixedRate;
private final MethodAccessor runDelayed;
private final MethodAccessor execute;
private final MethodAccessor cancel;
+
+ private final Object foliaAsyncScheduler;
+ private final MethodAccessor executeAsync;
+
private final Plugin plugin;
public FoliaScheduler(Plugin plugin) {
this.plugin = plugin;
MethodAccessor getScheduler = Accessors.getMethodAccessor(Bukkit.getServer().getClass(), "getGlobalRegionScheduler");
- this.foliaScheduler = getScheduler.invoke(Bukkit.getServer());
+ this.foliaRegionScheduler = getScheduler.invoke(Bukkit.getServer());
- this.runAtFixedRate = Accessors.getMethodAccessor(foliaScheduler.getClass(), "runAtFixedRate", Plugin.class,
+ this.runAtFixedRate = Accessors.getMethodAccessor(foliaRegionScheduler.getClass(), "runAtFixedRate", Plugin.class,
Consumer.class, long.class, long.class);
- this.execute = Accessors.getMethodAccessor(foliaScheduler.getClass(), "run", Plugin.class, Consumer.class);
- this.runDelayed = Accessors.getMethodAccessor(foliaScheduler.getClass(), "runDelayed", Plugin.class, Consumer.class, long.class);
+ this.execute = Accessors.getMethodAccessor(foliaRegionScheduler.getClass(), "run", Plugin.class, Consumer.class);
+ this.runDelayed = Accessors.getMethodAccessor(foliaRegionScheduler.getClass(), "runDelayed", Plugin.class, Consumer.class, long.class);
+
+ MethodAccessor getAsyncScheduler = Accessors.getMethodAccessor(Bukkit.getServer().getClass(), "getAsyncScheduler");
+ foliaAsyncScheduler = getAsyncScheduler.invoke(Bukkit.getServer());
+
+ this.executeAsync = Accessors.getMethodAccessor(foliaAsyncScheduler.getClass(), "runNow", Plugin.class, Consumer.class);
Class> taskClass = MinecraftReflection.getLibraryClass("io.papermc.paper.threadedregions.scheduler.ScheduledTask");
this.cancel = Accessors.getMethodAccessor(taskClass, "cancel");
@@ -33,19 +42,25 @@ public class FoliaScheduler implements ProtocolScheduler {
@Override
public Task scheduleSyncRepeatingTask(Runnable task, long delay, long period) {
- Object taskHandle = runAtFixedRate.invoke(foliaScheduler, plugin, (Consumer