diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 88d22880e..ba9c2fcab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -worldedit = "7.3.18" +worldedit = "7.4.1-SNAPSHOT" # Minimum versions we apply to make dependencies support newer Java minimumAsm = "9.7" @@ -31,7 +31,7 @@ paperApi = "io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT" paperLib = "io.papermc:paperlib:1.0.8" dummypermscompat = "com.sk89q:dummypermscompat:1.10" -bstats-bukkit = "org.bstats:bstats-bukkit:2.2.1" +bstats-bukkit = "org.bstats:bstats-bukkit:3.2.1" prtree = "org.khelekore:prtree:1.5.0" 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..58ebec2b1 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,11 @@ public void onChunkUnload(ChunkUnloadEvent event) { } }, plugin); - Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, cache::invalidateAll, CACHE_INVALIDATION_INTERVAL, CACHE_INVALIDATION_INTERVAL); + if (WorldGuardPlugin.inst().isFolia()) { + Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> cache.invalidateAll(), CACHE_INVALIDATION_INTERVAL, CACHE_INVALIDATION_INTERVAL); + } else { + Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, 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 86aefb550..31abda6af 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 @@ -33,6 +33,8 @@ import com.sk89q.worldedit.bukkit.BukkitCommandSender; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.blacklist.Blacklist; @@ -74,6 +76,8 @@ import com.sk89q.worldguard.protection.managers.storage.sql.SQLDriver; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.util.logging.RecordMessagePrefixer; +import io.papermc.lib.PaperLib; +import io.papermc.paper.ServerBuildInfo; import org.bstats.bukkit.Metrics; import org.bstats.charts.DrilldownPie; import org.bstats.charts.SimplePie; @@ -103,6 +107,7 @@ */ public class WorldGuardPlugin extends JavaPlugin { + private static final org.apache.logging.log4j.Logger LOGGER = LogManagerCompat.getLogger(); private static WorldGuardPlugin inst; private static BukkitWorldGuardPlatform platform; private final CommandsManager commands; @@ -163,7 +168,11 @@ public void onEnable() { reg.register(GeneralCommands.class); } - getServer().getScheduler().scheduleSyncRepeatingTask(this, sessionManager, BukkitSessionManager.RUN_DELAY, BukkitSessionManager.RUN_DELAY); + if (this.isFolia()) { + getServer().getGlobalRegionScheduler().runAtFixedRate(this, scheduledTask -> sessionManager.run(), BukkitSessionManager.RUN_DELAY, BukkitSessionManager.RUN_DELAY); + } else { + getServer().getScheduler().scheduleSyncRepeatingTask(this, sessionManager, BukkitSessionManager.RUN_DELAY, BukkitSessionManager.RUN_DELAY); + } // Register events getServer().getPluginManager().registerEvents(sessionManager, this); @@ -204,12 +213,21 @@ public void onEnable() { } worldListener.registerEvents(); - Bukkit.getScheduler().runTask(this, () -> { + if (this.isFolia()) { for (Player player : Bukkit.getServer().getOnlinePlayers()) { - ProcessPlayerEvent event = new ProcessPlayerEvent(player); - Events.fire(event); + player.getScheduler().run(this, scheduledTask -> { + ProcessPlayerEvent event = new ProcessPlayerEvent(player); + Events.fire(event); + }, null); } - }); + } else { + Bukkit.getScheduler().runTask(this, () -> { + for (Player player : Bukkit.getServer().getOnlinePlayers()) { + ProcessPlayerEvent event = new ProcessPlayerEvent(player); + Events.fire(event); + } + }); + } ((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).setInitialized(true); @@ -264,7 +282,12 @@ private void setupCustomCharts(Metrics metrics) { @Override public void onDisable() { WorldGuard.getInstance().disable(); - this.getServer().getScheduler().cancelTasks(this); + if (this.isFolia()) { + this.getServer().getGlobalRegionScheduler().cancelTasks(this); + this.getServer().getAsyncScheduler().cancelTasks(this); + } else { + this.getServer().getScheduler().cancelTasks(this); + } } @Override @@ -523,5 +546,22 @@ private void copyDefaultConfig(InputStream input, File actual, String name) { public PlayerMoveListener getPlayerMoveListener() { return playerMoveListener; } + private final LazyReference folia = LazyReference.from(() -> { + try { + // Folia is Paper-based, so this is a good first check. + if (PaperLib.isPaper()) { + return ServerBuildInfo.buildInfo().isBrandCompatible(net.kyori.adventure.key.Key.key("papermc", "folia")); + } + } catch (Throwable t) { + // Ignore, this likely means an outdated version. + LOGGER.warn("Failed to check if server is running Folia", t); + } + + return false; + }); + + public boolean isFolia() { + return folia.getValue(); + } } 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 22e0aa270..0aa8a3c55 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 @@ -1045,8 +1045,14 @@ public void onInventoryMoveItem(InventoryMoveItemEvent event) { } if (event.isCancelled() && causeHolder instanceof Hopper && wcfg.breakDeniedHoppers) { - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), - () -> ((Hopper) causeHolder).getBlock().breakNaturally()); + Hopper hopper = (Hopper) causeHolder; + if (WorldGuardPlugin.inst().isFolia()) { + Bukkit.getRegionScheduler().run(getPlugin(), hopper.getLocation(), + (scheduledTask) -> hopper.getBlock().breakNaturally()); + } else { + Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), + () -> hopper.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..7c7e0e259 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,6 +25,7 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.session.MoveType; import com.sk89q.worldguard.session.Session; +import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.AbstractHorse; @@ -118,16 +119,37 @@ public void onPlayerMove(PlayerMoveEvent event) { current.eject(); vehicle.setVelocity(new Vector()); if (vehicle instanceof LivingEntity) { - vehicle.teleport(override.clone()); + Location vehicleTeleportLocation = override.clone(); + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(vehicle, vehicleTeleportLocation); + } else { + vehicle.teleport(vehicleTeleportLocation); + } } else { - vehicle.teleport(override.clone().add(0, 1, 0)); + Location dismountLocation = override.clone().add(0, 1, 0); + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(vehicle, dismountLocation); + } else { + vehicle.teleport(dismountLocation); + } } current = current.getVehicle(); } - player.teleport(override.clone().add(0, 1, 0)); + Location playerDismountLocation = override.clone().add(0, 1, 0); + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(player, playerDismountLocation); + } else { + player.teleport(playerDismountLocation); + } + - Bukkit.getScheduler().runTaskLater(getPlugin(), () -> player.teleport(override.clone().add(0, 1, 0)), 1); + Location delayedDismountLocation = override.clone().add(0, 1, 0); + if (getPlugin().isFolia()) { + player.getScheduler().runDelayed(getPlugin(), scheduledTask -> PaperLib.teleportAsync(player, delayedDismountLocation), null, 1); + } else { + Bukkit.getScheduler().runTaskLater(getPlugin(), () -> player.teleport(delayedDismountLocation), 1); + } } } } @@ -141,7 +163,11 @@ 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)); + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(player, BukkitAdapter.adapt(loc)); + } else { + player.teleport(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..5f7ade69c 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; @@ -55,21 +56,31 @@ public void onVehicleMove(VehicleMoveEvent event) { } World world = vehicle.getWorld(); WorldConfiguration wcfg = getWorldConfig(world); - + org.bukkit.Location from = event.getFrom(); + org.bukkit.Location to = event.getTo(); if (wcfg.useRegions) { // Did we move a block? - if (Locations.isDifferentBlock(BukkitAdapter.adapt(event.getFrom()), BukkitAdapter.adapt(event.getTo()))) { + if (Locations.isDifferentBlock(BukkitAdapter.adapt(from), BukkitAdapter.adapt(to))) { for (Player player : playerPassengers) { if (Entities.isNPC(player)) continue; LocalPlayer localPlayer = getPlugin().wrapPlayer(player); Location lastValid; if ((lastValid = WorldGuard.getInstance().getPlatform().getSessionManager().get(localPlayer) - .testMoveTo(localPlayer, BukkitAdapter.adapt(event.getTo()), MoveType.RIDE)) != null) { + .testMoveTo(localPlayer, BukkitAdapter.adapt(to), MoveType.RIDE)) != null) { vehicle.setVelocity(new Vector(0, 0, 0)); - vehicle.teleport(event.getFrom()); - if (Locations.isDifferentBlock(lastValid, BukkitAdapter.adapt(event.getFrom()))) { + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(vehicle, from); + } else { + vehicle.teleport(from); + } + if (Locations.isDifferentBlock(lastValid, BukkitAdapter.adapt(from))) { Vector dir = player.getLocation().getDirection(); - player.teleport(BukkitAdapter.adapt(lastValid).setDirection(dir)); + org.bukkit.Location playerTeleportLocation = BukkitAdapter.adapt(lastValid).setDirection(dir); + if (getPlugin().isFolia()) { + PaperLib.teleportAsync(player, playerTeleportLocation); + } else { + player.teleport(playerTeleportLocation); + } } return; } 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..0fe6b252e 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 @@ -49,10 +49,20 @@ public class BukkitSessionManager extends AbstractSessionManager implements Runn public void resetAllStates() { Collection players = Bukkit.getServer().getOnlinePlayers(); for (Player player : players) { - BukkitPlayer bukkitPlayer = new BukkitPlayer(WorldGuardPlugin.inst(), player); - Session session = getIfPresent(bukkitPlayer); - if (session != null) { - session.resetState(bukkitPlayer); + if (WorldGuardPlugin.inst().isFolia()) { + player.getScheduler().run(WorldGuardPlugin.inst(), scheduledTask -> { + BukkitPlayer bukkitPlayer = new BukkitPlayer(WorldGuardPlugin.inst(), player); + Session session = getIfPresent(bukkitPlayer); + if (session != null) { + session.resetState(bukkitPlayer); + } + }, null); + } else { + BukkitPlayer bukkitPlayer = new BukkitPlayer(WorldGuardPlugin.inst(), player); + Session session = getIfPresent(bukkitPlayer); + if (session != null) { + session.resetState(bukkitPlayer); + } } } } @@ -67,8 +77,15 @@ public void onPlayerProcess(ProcessPlayerEvent event) { @Override public void run() { for (Player player : Bukkit.getServer().getOnlinePlayers()) { - LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); - get(localPlayer).tick(localPlayer); + if (WorldGuardPlugin.inst().isFolia()) { + player.getScheduler().run(WorldGuardPlugin.inst(), (scheduledTask) -> { + LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); + get(localPlayer).tick(localPlayer); + }, null); + } else { + LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); + get(localPlayer).tick(localPlayer); + } } } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/report/SchedulerReport.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/report/SchedulerReport.java index d897162cf..ea0ec2076 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/report/SchedulerReport.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/report/SchedulerReport.java @@ -24,6 +24,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.sk89q.worldedit.util.report.DataReport; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitTask; @@ -51,6 +52,9 @@ public Optional load(Class clazz) throws Exception { public SchedulerReport() { super("Scheduler"); + if (WorldGuardPlugin.inst().isFolia()) { + return; // Todo Add support Schedulers + } List tasks = Bukkit.getServer().getScheduler().getPendingTasks(); diff --git a/worldguard-bukkit/src/main/resources/plugin.yml b/worldguard-bukkit/src/main/resources/plugin.yml index b0352a641..ef913ee75 100644 --- a/worldguard-bukkit/src/main/resources/plugin.yml +++ b/worldguard-bukkit/src/main/resources/plugin.yml @@ -3,3 +3,4 @@ main: com.sk89q.worldguard.bukkit.WorldGuardPlugin version: "${internalVersion}" depend: [WorldEdit] api-version: "1.21.11" +folia-supported: true \ No newline at end of file