diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java index 26567ffaa..16a10e1ef 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java @@ -13,6 +13,7 @@ import net.ess3.api.events.teleport.PreTeleportEvent; import net.ess3.api.events.teleport.TeleportWarmupEvent; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -141,13 +142,13 @@ public class AsyncTeleport implements IAsyncTeleport { paperFuture.exceptionally(future::completeExceptionally); } - private void runOnMain(final Runnable runnable) throws ExecutionException, InterruptedException { - if (Bukkit.isPrimaryThread()) { + private void runOnEntity(final Entity entity, final Runnable runnable) throws ExecutionException, InterruptedException { + if (ess.isEntityThread(entity)) { runnable.run(); return; } final CompletableFuture taskLock = new CompletableFuture<>(); - Bukkit.getScheduler().runTask(ess, () -> { + ess.scheduleEntityDelayedTask(entity, () -> { runnable.run(); taskLock.complete(new Object()); }); @@ -171,7 +172,7 @@ public class AsyncTeleport implements IAsyncTeleport { } try { - runOnMain(() -> teleportee.getBase().eject()); //EntityDismountEvent requires a sync context. + runOnEntity(teleportee.getBase(), () -> teleportee.getBase().eject()); //EntityDismountEvent requires a sync context. } catch (final ExecutionException | InterruptedException e) { future.completeExceptionally(e); return; diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 77b24ca1f..aaf11837d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -1228,6 +1228,16 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return schedulingProvider.runGlobalLocationalTaskRepeating(run, delay, period); } + @Override + public boolean isEntityThread(Entity entity) { + return schedulingProvider.isEntityThread(entity); + } + + @Override + public boolean isRegionThread(Location location) { + return schedulingProvider.isRegionThread(location); + } + @Override public PermissionsHandler getPermissionsHandler() { return permissionsHandler; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index 593341583..0f0c51a2d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -125,6 +125,10 @@ public interface IEssentials extends Plugin { void scheduleInitTask(Runnable runnable); + boolean isEntityThread(Entity entity); + + boolean isRegionThread(Location location); + PermissionsHandler getPermissionsHandler(); AlternativeCommandsHandler getAlternativeCommandsHandler();