Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<Actor> commands;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -523,5 +546,22 @@ private void copyDefaultConfig(InputStream input, File actual, String name) {
public PlayerMoveListener getPlayerMoveListener() {
return playerMoveListener;
}
private final LazyReference<Boolean> 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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think there is a reason to use PaperLib only for folia. Imo we could always use PaperLib which provides fallback stuff for spigot.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The potential problem would be that there could be a desynchronization between several teleportations on the Paper or Bukkit servers, which are currently a synchronous call
An issue has been created for WorldEdit regarding an API; if we know it won't cause any problems, I can merge using PaperLib for Bukkit like Folia.

} 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);
}
}
}
}
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,20 @@ public class BukkitSessionManager extends AbstractSessionManager implements Runn
public void resetAllStates() {
Collection<? extends Player> 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);
}
}
}
}
Expand All @@ -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);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -51,6 +52,9 @@ public Optional<Field> load(Class<?> clazz) throws Exception {

public SchedulerReport() {
super("Scheduler");
if (WorldGuardPlugin.inst().isFolia()) {
return; // Todo Add support Schedulers
}

List<BukkitTask> tasks = Bukkit.getServer().getScheduler().getPendingTasks();

Expand Down
1 change: 1 addition & 0 deletions worldguard-bukkit/src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ main: com.sk89q.worldguard.bukkit.WorldGuardPlugin
version: "${internalVersion}"
depend: [WorldEdit]
api-version: "1.21.11"
folia-supported: true