From 4ad4abb806864ccb79789825e0245d34e575b778 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:55:19 +0300 Subject: [PATCH 01/10] Add Folia scheduler adapter with folia check support; (cherry picked from commit 7dd04ccc1bb953880aa93c4f8d0b92c3f8586e32) --- .../scheduler/FoliaSchedulerAdapter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java new file mode 100644 index 000000000..77a048bb6 --- /dev/null +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java @@ -0,0 +1,19 @@ +package com.sk89q.worldguard.bukkit.scheduler; + +public class FoliaSchedulerAdapter { + + private static final boolean SUPPORTED = checkSupport(); + + public static boolean isSupported() { + return SUPPORTED; + } + + private static boolean checkSupport() { + try { + Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} From 9157100bdbaa2e5d3f1c54f5b47d5f7b9c3f7c7a Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:57:08 +0300 Subject: [PATCH 02/10] Add scheduler report only if it is not Folia; (cherry picked from commit a9d6cf0ac2d6fecfb91d618df22a22cfc092a292) --- .../com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java index 37e7f07ac..71456f012 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java @@ -29,6 +29,7 @@ import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.scheduler.FoliaSchedulerAdapter; import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.util.profile.resolver.PaperPlayerService; @@ -235,7 +236,7 @@ public void stackPlayerInventory(LocalPlayer localPlayer) { public void addPlatformReports(ReportList report) { report.add(new ServerReport()); report.add(new PluginReport()); - report.add(new SchedulerReport()); + if (!FoliaSchedulerAdapter.isSupported()) report.add(new SchedulerReport()); report.add(new ServicesReport()); report.add(new WorldReport()); report.add(new PerformanceReport()); From e632541eb309c17b432178eea4723381df8862bd Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Fri, 9 Jun 2023 01:38:22 +0300 Subject: [PATCH 03/10] Add scheduler adapter interface & implementation for: folia, bukkit; (cherry picked from commit a6f859964023765bcfa5299fa84e25443a384bd9) --- .../scheduler/BukkitSchedulerAdapter.java | 66 ++++++++++++++ .../scheduler/FoliaSchedulerAdapter.java | 91 ++++++++++++++++--- .../bukkit/scheduler/SchedulerAdapter.java | 38 ++++++++ 3 files changed, 183 insertions(+), 12 deletions(-) create mode 100644 worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java create mode 100644 worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java new file mode 100644 index 000000000..9a297b8c6 --- /dev/null +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java @@ -0,0 +1,66 @@ +/* + * WorldGuard, a suite of tools for Minecraft + * Copyright (C) sk89q + * Copyright (C) WorldGuard team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldguard.bukkit.scheduler; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitScheduler; + +public class BukkitSchedulerAdapter implements SchedulerAdapter { + + private final Plugin plugin; + private final BukkitScheduler scheduler; + + public BukkitSchedulerAdapter(final Plugin plugin) { + this.plugin = plugin; + this.scheduler = plugin.getServer().getScheduler(); + } + + @Override + public void runAsync(final Runnable runnable) { + scheduler.runTaskAsynchronously(plugin, runnable); + } + + @Override + public void runAsyncRate(Runnable runnable, long delay, long period) { + scheduler.runTaskTimerAsynchronously(plugin, runnable, delay, period); + } + + @Override + public void runAtEntity(Entity entity, Runnable runnable) { + + } + + @Override + public void runAtEntityLater(final Entity entity, final Runnable runnable, final long delay) { + scheduler.runTaskLater(plugin, runnable, delay); + } + + @Override + public void runAtRegion(Location location, Runnable runnable) { + + } + + @Override + public void cancelTasks() { + + } +} diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java index 77a048bb6..f8cde89e8 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java @@ -1,19 +1,86 @@ +/* + * WorldGuard, a suite of tools for Minecraft + * Copyright (C) sk89q + * Copyright (C) WorldGuard team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + package com.sk89q.worldguard.bukkit.scheduler; -public class FoliaSchedulerAdapter { +import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; +import io.papermc.paper.threadedregions.scheduler.RegionScheduler; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.plugin.Plugin; + +import java.util.concurrent.TimeUnit; + +public class FoliaSchedulerAdapter implements SchedulerAdapter { + private static final boolean SUPPORTED = checkSupport(); + + private final Plugin plugin; + private final AsyncScheduler asyncScheduler; + private final RegionScheduler regionScheduler; + + public FoliaSchedulerAdapter(final Plugin plugin) { + this.plugin = plugin; + this.asyncScheduler = plugin.getServer().getAsyncScheduler(); + this.regionScheduler = plugin.getServer().getRegionScheduler(); + } - private static final boolean SUPPORTED = checkSupport(); + public static boolean isSupported() { + return SUPPORTED; + } - public static boolean isSupported() { - return SUPPORTED; - } + private static boolean checkSupport() { + try { + Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + @Override + public void runAsync(final Runnable runnable) { + asyncScheduler.runNow(plugin, task -> runnable.run()); + } - private static boolean checkSupport() { - try { - Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); - return true; - } catch (ClassNotFoundException e) { - return false; + @Override + public void runAsyncRate(final Runnable runnable, final long delay, final long period) { + asyncScheduler.runAtFixedRate(plugin, task -> runnable.run(), delay * 50, period * 50, TimeUnit.MILLISECONDS); } - } + + @Override + public void runAtEntity(final Entity entity, final Runnable runnable) { + entity.getScheduler().run(plugin, task -> runnable.run(), null); + } + + @Override + public void runAtEntityLater(final Entity entity, final Runnable runnable, final long delay) { + entity.getScheduler().execute(plugin, runnable, null, delay); + } + + @Override + public void runAtRegion(final Location location, final Runnable runnable) { + regionScheduler.execute(plugin, location, runnable); + } + + @Override + public void cancelTasks() { + asyncScheduler.cancelTasks(plugin); + } + } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java new file mode 100644 index 000000000..b674725be --- /dev/null +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java @@ -0,0 +1,38 @@ +/* + * WorldGuard, a suite of tools for Minecraft + * Copyright (C) sk89q + * Copyright (C) WorldGuard team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldguard.bukkit.scheduler; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +public interface SchedulerAdapter { + + void runAsync(Runnable runnable); + + void runAsyncRate(Runnable runnable, long delay, long period); + + void runAtEntity(Entity entity, Runnable runnable); + + void runAtEntityLater(Entity entity, Runnable runnable, long delay); + + void runAtRegion(Location location, Runnable runnable); + + void cancelTasks(); +} From dbe1a4e0c6f6c07cbc57303446431bf61748a47d Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Fri, 9 Jun 2023 01:57:47 +0300 Subject: [PATCH 04/10] Migrate to using scheduler adapter; (cherry picked from commit f91082d174e57975b7cb089593a69c368d97a4ff) --- .../bukkit/BukkitRegionContainer.java | 2 +- .../worldguard/bukkit/WorldGuardPlugin.java | 20 ++++++++++++++----- .../listener/EventAbstractionListener.java | 3 +-- .../bukkit/listener/PlayerMoveListener.java | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitRegionContainer.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitRegionContainer.java index 79d7b3446..42ef9ea73 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitRegionContainer.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitRegionContainer.java @@ -94,7 +94,7 @@ public void onChunkUnload(ChunkUnloadEvent event) { } }, plugin); - Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, cache::invalidateAll, CACHE_INVALIDATION_INTERVAL, CACHE_INVALIDATION_INTERVAL); + plugin.getScheduler().runAsyncRate(cache::invalidateAll, CACHE_INVALIDATION_INTERVAL, CACHE_INVALIDATION_INTERVAL); } public void shutdown() { diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java index 3ba997921..0b1589c39 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java @@ -58,6 +58,9 @@ import com.sk89q.worldguard.bukkit.listener.WorldGuardWeatherListener; import com.sk89q.worldguard.bukkit.listener.WorldGuardWorldListener; import com.sk89q.worldguard.bukkit.listener.WorldRulesListener; +import com.sk89q.worldguard.bukkit.scheduler.BukkitSchedulerAdapter; +import com.sk89q.worldguard.bukkit.scheduler.FoliaSchedulerAdapter; +import com.sk89q.worldguard.bukkit.scheduler.SchedulerAdapter; import com.sk89q.worldguard.bukkit.session.BukkitSessionManager; import com.sk89q.worldguard.bukkit.util.ClassSourceValidator; import com.sk89q.worldguard.bukkit.util.Entities; @@ -107,6 +110,8 @@ public class WorldGuardPlugin extends JavaPlugin { private static WorldGuardPlugin inst; private static BukkitWorldGuardPlatform platform; private final CommandsManager commands; + private final SchedulerAdapter scheduler = FoliaSchedulerAdapter.isSupported() + ? new FoliaSchedulerAdapter(this) : new BukkitSchedulerAdapter(this); private PlayerMoveListener playerMoveListener; private static final int BSTATS_PLUGIN_ID = 3283; @@ -164,7 +169,7 @@ public void onEnable() { reg.register(GeneralCommands.class); } - getServer().getScheduler().scheduleSyncRepeatingTask(this, sessionManager, BukkitSessionManager.RUN_DELAY, BukkitSessionManager.RUN_DELAY); + getScheduler().runAsyncRate(sessionManager, BukkitSessionManager.RUN_DELAY, BukkitSessionManager.RUN_DELAY); // Register events getServer().getPluginManager().registerEvents(sessionManager, this); @@ -205,10 +210,12 @@ public void onEnable() { } worldListener.registerEvents(); - Bukkit.getScheduler().runTask(this, () -> { + getScheduler().runAsync(() -> { for (Player player : Bukkit.getServer().getOnlinePlayers()) { - ProcessPlayerEvent event = new ProcessPlayerEvent(player); - Events.fire(event); + getScheduler().runAtEntity(player, () -> { + ProcessPlayerEvent event = new ProcessPlayerEvent(player); + Events.fire(event); + }); } }); @@ -266,7 +273,7 @@ private void setupCustomCharts(Metrics metrics) { @Override public void onDisable() { WorldGuard.getInstance().disable(); - this.getServer().getScheduler().cancelTasks(this); + getScheduler().cancelTasks(); } @Override @@ -526,4 +533,7 @@ public PlayerMoveListener getPlayerMoveListener() { return playerMoveListener; } + public SchedulerAdapter getScheduler() { + return scheduler; + } } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index e39a4c3cf..c4ac3a46f 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -990,8 +990,7 @@ public void onInventoryMoveItem(InventoryMoveItemEvent event) { handleInventoryHolderUse(event, cause, targetHolder); if (event.isCancelled() && causeHolder instanceof Hopper && wcfg.breakDeniedHoppers) { - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), - () -> ((Hopper) causeHolder).getBlock().breakNaturally()); + getPlugin().getScheduler().runAtRegion(((Hopper) causeHolder).getLocation(), () -> ((Hopper) causeHolder).getBlock().breakNaturally()); } else { entry.setCancelled(event.isCancelled()); } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java index 7b95a5743..801b18c56 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java @@ -127,7 +127,7 @@ public void onPlayerMove(PlayerMoveEvent event) { player.teleport(override.clone().add(0, 1, 0)); - Bukkit.getScheduler().runTaskLater(getPlugin(), () -> player.teleport(override.clone().add(0, 1, 0)), 1); + getPlugin().getScheduler().runAtEntityLater(player, () -> player.teleport(override.clone().add(0, 1, 0)), 1); } } } From ce7b623c71d26b5ec5cc0e6e0ab545cf789241f3 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Tue, 1 Aug 2023 03:39:08 +0300 Subject: [PATCH 05/10] Implement synchronous execution for BukkitSchedulerAdapter; Add javadoc for SchedulerAdapter interface; (cherry picked from commit 919a249eb538b9e271236ca5cd1efc35d3b62c6c) --- .../scheduler/BukkitSchedulerAdapter.java | 18 +++--- .../scheduler/FoliaSchedulerAdapter.java | 11 +--- .../bukkit/scheduler/SchedulerAdapter.java | 58 ++++++++++++++++--- 3 files changed, 61 insertions(+), 26 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java index 9a297b8c6..4d80c64a2 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/BukkitSchedulerAdapter.java @@ -27,6 +27,7 @@ public class BukkitSchedulerAdapter implements SchedulerAdapter { private final Plugin plugin; + @SuppressWarnings("deprecation") private final BukkitScheduler scheduler; public BukkitSchedulerAdapter(final Plugin plugin) { @@ -34,33 +35,28 @@ public BukkitSchedulerAdapter(final Plugin plugin) { this.scheduler = plugin.getServer().getScheduler(); } - @Override - public void runAsync(final Runnable runnable) { - scheduler.runTaskAsynchronously(plugin, runnable); - } - @Override public void runAsyncRate(Runnable runnable, long delay, long period) { scheduler.runTaskTimerAsynchronously(plugin, runnable, delay, period); } @Override - public void runAtEntity(Entity entity, Runnable runnable) { - + public void executeAtEntity(Entity entity, Runnable runnable) { + scheduler.runTask(plugin, runnable); } @Override - public void runAtEntityLater(final Entity entity, final Runnable runnable, final long delay) { + public void runAtEntityDelayed(final Entity entity, final Runnable runnable, final long delay) { scheduler.runTaskLater(plugin, runnable, delay); } @Override - public void runAtRegion(Location location, Runnable runnable) { - + public void executeAtRegion(Location location, Runnable runnable) { + scheduler.runTask(plugin, runnable); } @Override public void cancelTasks() { - + scheduler.cancelTasks(plugin); } } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java index f8cde89e8..2d63ce3a5 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/FoliaSchedulerAdapter.java @@ -53,28 +53,23 @@ private static boolean checkSupport() { } } - @Override - public void runAsync(final Runnable runnable) { - asyncScheduler.runNow(plugin, task -> runnable.run()); - } - @Override public void runAsyncRate(final Runnable runnable, final long delay, final long period) { asyncScheduler.runAtFixedRate(plugin, task -> runnable.run(), delay * 50, period * 50, TimeUnit.MILLISECONDS); } @Override - public void runAtEntity(final Entity entity, final Runnable runnable) { + public void executeAtEntity(final Entity entity, final Runnable runnable) { entity.getScheduler().run(plugin, task -> runnable.run(), null); } @Override - public void runAtEntityLater(final Entity entity, final Runnable runnable, final long delay) { + public void runAtEntityDelayed(final Entity entity, final Runnable runnable, final long delay) { entity.getScheduler().execute(plugin, runnable, null, delay); } @Override - public void runAtRegion(final Location location, final Runnable runnable) { + public void executeAtRegion(final Location location, final Runnable runnable) { regionScheduler.execute(plugin, location, runnable); } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java index b674725be..f7db0e468 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/scheduler/SchedulerAdapter.java @@ -24,15 +24,59 @@ public interface SchedulerAdapter { - void runAsync(Runnable runnable); + /** + * Schedules the specified task to be executed asynchronously after the delay has passed, + * and then periodically executed with the specified period. + * + * @param runnable The task to execute. + * @param delay The time delay to pass before the task should be executed. + * @param period The time between task executions after the first execution of the task. + */ + void runAsyncRate(Runnable runnable, long delay, long period); - void runAsyncRate(Runnable runnable, long delay, long period); + /** + * Schedules a task. If the task failed to schedule because the scheduler is retired (entity removed), + * then returns {@code false}. Otherwise, either the run callback will be invoked after the specified delay, + * or the retired callback will be invoked if the scheduler is retired. + * Note that the retired callback is invoked in critical code, so it should not attempt to remove the entity, + * remove other entities, load chunks, load worlds, modify ticket levels, etc. + * + *

+ * It is guaranteed that the task and retired callback are invoked on the region which owns the entity. + *

+ * + * @param entity The entity relative to which the scheduler is obtained. + * @param runnable The task to execute. + */ + void executeAtEntity(Entity entity, Runnable runnable); - void runAtEntity(Entity entity, Runnable runnable); + /** + * Schedules a task with the given delay. If the task failed to schedule because the scheduler is retired (entity removed), + * then returns {@code false}. Otherwise, either the run callback will be invoked after the specified delay, + * or the retired callback will be invoked if the scheduler is retired. + * Note that the retired callback is invoked in critical code, so it should not attempt to remove the entity, + * remove other entities, load chunks, load worlds, modify ticket levels, etc. + * + *

+ * It is guaranteed that the task and retired callback are invoked on the region which owns the entity. + *

+ * + * @param entity The entity relative to which the scheduler is obtained. + * @param runnable The task to execute. + * @param delay The time delay to pass before the task should be executed, in ticks. + */ + void runAtEntityDelayed(Entity entity, Runnable runnable, long delay); - void runAtEntityLater(Entity entity, Runnable runnable, long delay); + /** + * Schedules a task to be executed on the region which owns the location. + * + * @param location The location at which the region executing should own. + * @param runnable The task to execute. + */ + void executeAtRegion(Location location, Runnable runnable); - void runAtRegion(Location location, Runnable runnable); - - void cancelTasks(); + /** + * Attempts to cancel all tasks scheduled by the plugin. + */ + void cancelTasks(); } From 4b5dc2ec3c1d5cf21a05e8101d3a4ff2bb9abd76 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Tue, 1 Aug 2023 03:41:15 +0300 Subject: [PATCH 06/10] Possible fix duplicate initialization; Remove over-parallelism; (cherry picked from commit e1861e68dc28469a2654bb29a0757769b8c845a0) --- .../sk89q/worldguard/bukkit/WorldGuardPlugin.java | 14 ++++++-------- .../bukkit/session/BukkitSessionManager.java | 3 +-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java index 0b1589c39..e2bb96a03 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java @@ -210,14 +210,12 @@ public void onEnable() { } worldListener.registerEvents(); - getScheduler().runAsync(() -> { - for (Player player : Bukkit.getServer().getOnlinePlayers()) { - getScheduler().runAtEntity(player, () -> { - ProcessPlayerEvent event = new ProcessPlayerEvent(player); - Events.fire(event); - }); - } - }); + for (Player player : Bukkit.getServer().getOnlinePlayers()) { + getScheduler().executeAtEntity(player, () -> { + ProcessPlayerEvent event = new ProcessPlayerEvent(player); + Events.fire(event); + }); + } ((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).setInitialized(true); ((SimpleDomainRegistry) WorldGuard.getInstance().getDomainRegistry()).setInitialized(true); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java index df589cbc0..c731ec4b6 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java @@ -60,8 +60,7 @@ public void resetAllStates() { @EventHandler public void onPlayerProcess(ProcessPlayerEvent event) { // Pre-load a session - LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(event.getPlayer()); - get(player).initialize(player); + get(WorldGuardPlugin.inst().wrapPlayer(event.getPlayer())); } @Override From 73f116d23d61d2901868593f14b9ca4a34b8a8d2 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Fri, 9 Jun 2023 01:59:02 +0300 Subject: [PATCH 07/10] Mark plugin as supporting Folia; (cherry picked from commit 6435dbe80c3f405f96d0bdce9e354af70cfb45da) --- worldguard-bukkit/src/main/resources/plugin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/worldguard-bukkit/src/main/resources/plugin.yml b/worldguard-bukkit/src/main/resources/plugin.yml index 223be72f7..cdee59d2b 100644 --- a/worldguard-bukkit/src/main/resources/plugin.yml +++ b/worldguard-bukkit/src/main/resources/plugin.yml @@ -4,3 +4,4 @@ version: "${internalVersion}" depend: [WorldEdit] softdepend: [CommandBook] api-version: "1.20" +folia-supported: true From e14f4f4caf2899f5191db1a161a05fff3557fba6 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Fri, 17 May 2024 19:23:10 +0300 Subject: [PATCH 08/10] Fix using modified SchedulerAdapter methods; --- .../worldguard/bukkit/listener/EventAbstractionListener.java | 2 +- .../sk89q/worldguard/bukkit/listener/PlayerMoveListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index c4ac3a46f..7bea6a62a 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -990,7 +990,7 @@ public void onInventoryMoveItem(InventoryMoveItemEvent event) { handleInventoryHolderUse(event, cause, targetHolder); if (event.isCancelled() && causeHolder instanceof Hopper && wcfg.breakDeniedHoppers) { - getPlugin().getScheduler().runAtRegion(((Hopper) causeHolder).getLocation(), () -> ((Hopper) causeHolder).getBlock().breakNaturally()); + getPlugin().getScheduler().executeAtRegion(((Hopper) causeHolder).getLocation(), () -> ((Hopper) causeHolder).getBlock().breakNaturally()); } else { entry.setCancelled(event.isCancelled()); } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java index 801b18c56..49cfbb54a 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java @@ -127,7 +127,7 @@ public void onPlayerMove(PlayerMoveEvent event) { player.teleport(override.clone().add(0, 1, 0)); - getPlugin().getScheduler().runAtEntityLater(player, () -> player.teleport(override.clone().add(0, 1, 0)), 1); + getPlugin().getScheduler().runAtEntityDelayed(player, () -> player.teleport(override.clone().add(0, 1, 0)), 1); } } } From 80faf9a1d7273afd76eade83b7380d3278d96422 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:26:43 +0300 Subject: [PATCH 09/10] Fix implicit session uninitialization; Add synchronized uninitialize handlers and mark a session uninitialized; --- .../main/java/com/sk89q/worldguard/session/Session.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java index cdc8401a3..8473e104a 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java @@ -130,8 +130,11 @@ public void uninitialize(LocalPlayer player) { Location location = player.getLocation(); ApplicableRegionSet set = query.getApplicableRegions(location); - for (Handler handler : handlers.values()) { - handler.uninitialize(player, location, set); + synchronized (this) { + for (Handler handler : handlers.values()) { + handler.uninitialize(player, location, set); + } + initialized = false; } } From 41de14c6837f02b0521e348a65db5c07ac920d73 Mon Sep 17 00:00:00 2001 From: HarvelsX <90945793+HarvelsX@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:34:54 +0300 Subject: [PATCH 10/10] Migrate to use PaperLib for async entity teleportation; --- .../bukkit/listener/PlayerMoveListener.java | 12 ++++++------ .../bukkit/listener/WorldGuardVehicleListener.java | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java index 49cfbb54a..b1be8431f 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java @@ -25,7 +25,7 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.session.MoveType; import com.sk89q.worldguard.session.Session; -import org.bukkit.Bukkit; +import io.papermc.lib.PaperLib; import org.bukkit.Location; import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Entity; @@ -118,16 +118,16 @@ public void onPlayerMove(PlayerMoveEvent event) { current.eject(); vehicle.setVelocity(new Vector()); if (vehicle instanceof LivingEntity) { - vehicle.teleport(override.clone()); + PaperLib.teleportAsync(vehicle, override.clone()); } else { - vehicle.teleport(override.clone().add(0, 1, 0)); + PaperLib.teleportAsync(vehicle, override.clone().add(0, 1, 0)); } current = current.getVehicle(); } - player.teleport(override.clone().add(0, 1, 0)); + PaperLib.teleportAsync(player, override.clone().add(0, 1, 0)); - getPlugin().getScheduler().runAtEntityDelayed(player, () -> player.teleport(override.clone().add(0, 1, 0)), 1); + getPlugin().getScheduler().runAtEntityDelayed(player, () -> PaperLib.teleportAsync(player, override.clone().add(0, 1, 0)), 1); } } } @@ -141,7 +141,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { com.sk89q.worldedit.util.Location loc = session.testMoveTo(localPlayer, BukkitAdapter.adapt(event.getPlayer().getLocation()), MoveType.OTHER_CANCELLABLE); // white lie if (loc != null) { - player.teleport(BukkitAdapter.adapt(loc)); + PaperLib.teleportAsync(player, BukkitAdapter.adapt(loc)); } session.uninitialize(localPlayer); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardVehicleListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardVehicleListener.java index fe604dad3..00007c4cc 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardVehicleListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardVehicleListener.java @@ -28,6 +28,7 @@ import com.sk89q.worldguard.config.WorldConfiguration; import com.sk89q.worldguard.session.MoveType; import com.sk89q.worldguard.util.Locations; +import io.papermc.lib.PaperLib; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; @@ -66,10 +67,10 @@ public void onVehicleMove(VehicleMoveEvent event) { if ((lastValid = WorldGuard.getInstance().getPlatform().getSessionManager().get(localPlayer) .testMoveTo(localPlayer, BukkitAdapter.adapt(event.getTo()), MoveType.RIDE)) != null) { vehicle.setVelocity(new Vector(0, 0, 0)); - vehicle.teleport(event.getFrom()); + PaperLib.teleportAsync(vehicle, event.getFrom()); if (Locations.isDifferentBlock(lastValid, BukkitAdapter.adapt(event.getFrom()))) { Vector dir = player.getLocation().getDirection(); - player.teleport(BukkitAdapter.adapt(lastValid).setDirection(dir)); + PaperLib.teleportAsync(player, BukkitAdapter.adapt(lastValid).setDirection(dir)); } return; }