From f43a4eaad88d55536f44388dbe13700387da5b8e Mon Sep 17 00:00:00 2001 From: wizjany Date: Thu, 19 Dec 2019 15:18:53 -0500 Subject: [PATCH] Add spawn-protection overlap check when defining regions. Update cached username on login. Bump WorldEdit dep version. --- buildSrc/src/main/kotlin/Versions.kt | 1 + worldguard-bukkit/build.gradle.kts | 2 +- .../bukkit/BukkitWorldGuardPlatform.java | 25 +++++++++++++++++++ .../bukkit/session/BukkitSessionManager.java | 9 ++++--- worldguard-core/build.gradle.kts | 2 +- .../commands/region/RegionCommands.java | 8 ++++-- .../commands/region/RegionCommandsBase.java | 21 ++++++++++++++++ .../internal/platform/WorldGuardPlatform.java | 14 +++++++++++ .../java/com/sk89q/worldguard/TestPlayer.java | 6 +++++ 9 files changed, 81 insertions(+), 7 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 9d98de41..6cc02443 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,6 +1,7 @@ object Versions { // const val PISTON = "0.4.3" // const val AUTO_VALUE = "1.6.5" + const val WORLDEDIT = "7.1.0-SNAPSHOT" const val JUNIT = "4.11" const val SQUIRRELID = "0.2.0" } diff --git a/worldguard-bukkit/build.gradle.kts b/worldguard-bukkit/build.gradle.kts index 727c4fa1..332a7fc1 100644 --- a/worldguard-bukkit/build.gradle.kts +++ b/worldguard-bukkit/build.gradle.kts @@ -26,7 +26,7 @@ //"compile"(project(":worldguard-libs:bukkit")) "api"("com.destroystokyo.paper:paper-api:1.15-R0.1-SNAPSHOT") "implementation"("io.papermc:paperlib:1.0.2") - "api"("com.sk89q.worldedit:worldedit-bukkit:7.0.1-SNAPSHOT") { isTransitive = false } + "api"("com.sk89q.worldedit:worldedit-bukkit:${Versions.WORLDEDIT}") { isTransitive = false } "implementation"("com.sk89q:commandbook:2.3") { isTransitive = false } "implementation"("org.bstats:bstats-bukkit:1.5") } 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 9b068b0f..f576d764 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 @@ -19,12 +19,18 @@ package com.sk89q.worldguard.bukkit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.report.ReportList; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.util.profile.resolver.PaperProfileService; import com.sk89q.worldguard.bukkit.protection.events.flags.FlagContextCreateEvent; import com.sk89q.worldguard.bukkit.session.BukkitSessionManager; @@ -52,6 +58,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.Permissible; +import javax.annotation.Nullable; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -251,4 +258,22 @@ public ProfileService createProfileService(ProfileCache profileCache) { return new CacheForwardingService(new CombinedProfileService(services), profileCache); } + + @Nullable + @Override + public ProtectedRegion getSpawnProtection(World world) { + if (world instanceof BukkitWorld) { + org.bukkit.World bWorld = ((BukkitWorld) world).getWorld(); + if (bWorld.getUID().equals(Bukkit.getServer().getWorlds().get(0).getUID())) { + int radius = Bukkit.getServer().getSpawnRadius(); + if (radius > 0) { + BlockVector3 spawnLoc = BukkitAdapter.asBlockVector(bWorld.getSpawnLocation()); + return new ProtectedCuboidRegion("__spawn_protection__", + spawnLoc.subtract(radius, 0, radius).withY(world.getMinimumPoint().getY()), + spawnLoc.add(radius, 0, radius).withY(world.getMaxY())); + } + } + } + return null; + } } 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 6c312f0d..cd4839ff 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 @@ -24,13 +24,14 @@ import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.BukkitPlayer; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.bukkit.event.player.ProcessPlayerEvent; import com.sk89q.worldguard.session.AbstractSessionManager; import com.sk89q.worldguard.session.Session; +import com.sk89q.worldguard.util.profile.Profile; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; import java.util.Collection; @@ -57,10 +58,12 @@ public void resetAllStates() { } @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { + public void onPlayerProcess(ProcessPlayerEvent event) { // Pre-load a session LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(event.getPlayer()); get(player).initialize(player); + WorldGuard.getInstance().getExecutorService().submit(() -> + WorldGuard.getInstance().getProfileCache().put(new Profile(player.getUniqueId(), player.getName()))); } @Override @@ -75,7 +78,7 @@ public void run() { public boolean hasBypass(LocalPlayer player, World world) { if (player instanceof BukkitPlayer) { if (((BukkitPlayer) player).getPlayer().hasMetadata("NPC") - && WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride) + && WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride) return true; } return super.hasBypass(player, world); diff --git a/worldguard-core/build.gradle.kts b/worldguard-core/build.gradle.kts index d3f1a879..4fb496fb 100644 --- a/worldguard-core/build.gradle.kts +++ b/worldguard-core/build.gradle.kts @@ -8,7 +8,7 @@ dependencies { "compile"(project(":worldguard-libs:core")) - "compile"("com.sk89q.worldedit:worldedit-core:7.0.1-SNAPSHOT") + "compile"("com.sk89q.worldedit:worldedit-core:${Versions.WORLDEDIT}") "implementation"("org.flywaydb:flyway-core:3.0") "compileOnly"("com.google.code.findbugs:jsr305:1.3.9") diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java index 0fe9abeb..426d1406 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java @@ -144,7 +144,8 @@ public void define(CommandContext args, Actor sender) throws CommandException { String id = checkRegionId(args.getString(0), false); - RegionManager manager = checkRegionManager(player.getWorld()); + World world = player.getWorld(); + RegionManager manager = checkRegionManager(world); checkRegionDoesNotExist(manager, id, true); @@ -167,6 +168,7 @@ public void define(CommandContext args, Actor sender) throws CommandException { sender.print(String.format("A new region has been made named '%s'.", region.getId())); warnAboutDimensions(sender, region); informNewUser(sender, manager, region); + checkSpawnOverlap(sender, world, region); }) .onFailure(String.format("Failed to add the region '%s'", region.getId()), worldGuard.getExceptionConverter()) .buildAndExec(worldGuard.getExecutorService()); @@ -191,7 +193,8 @@ public void redefine(CommandContext args, Actor sender) throws CommandException String id = checkRegionId(args.getString(0), false); - RegionManager manager = checkRegionManager(player.getWorld()); + World world = player.getWorld(); + RegionManager manager = checkRegionManager(world); ProtectedRegion existing = checkExistingRegion(manager, id, false); @@ -221,6 +224,7 @@ public void redefine(CommandContext args, Actor sender) throws CommandException player.print(String.format("Region '%s' has been updated with a new area.", region.getId())); warnAboutDimensions(player, region); informNewUser(player, manager, region); + checkSpawnOverlap(sender, world, region); }) .onFailure(String.format("Failed to update the region '%s'", region.getId()), worldGuard.getExceptionConverter()) .buildAndExec(worldGuard.getExecutorService()); diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java index c062ef87..a3dee9f6 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java @@ -20,6 +20,7 @@ package com.sk89q.worldguard.commands.region; import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.worldedit.IncompleteRegionException; @@ -32,11 +33,13 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector; +import com.sk89q.worldedit.util.formatting.component.ErrorFormat; import com.sk89q.worldedit.util.formatting.component.SubtleFormat; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; import com.sk89q.worldedit.util.formatting.text.format.TextColor; +import com.sk89q.worldedit.util.formatting.text.format.TextDecoration; import com.sk89q.worldedit.world.World; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; @@ -341,6 +344,24 @@ protected static void informNewUser(Actor sender, RegionManager manager, Protect } } + /** + * Inform a user if the region overlaps spawn protection. + * + * @param sender the sender to send the message to + * @param world the world the region is in + * @param region the region + */ + protected static void checkSpawnOverlap(Actor sender, World world, ProtectedRegion region) { + ProtectedRegion spawn = WorldGuard.getInstance().getPlatform().getSpawnProtection(world); + if (spawn != null) { + if (!spawn.getIntersectingRegions(ImmutableList.of(region)).isEmpty()) { + sender.print(ErrorFormat.wrap("Warning!") + .append(TextComponent.of(" This region overlaps vanilla's spawn protection. WorldGuard cannot " + + "override this, and only server operators will be able to interact with this area."))); + } + } + } + /** * Set a player's selection to a given region. * diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/internal/platform/WorldGuardPlatform.java b/worldguard-core/src/main/java/com/sk89q/worldguard/internal/platform/WorldGuardPlatform.java index 65a66f90..71e26a4d 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/internal/platform/WorldGuardPlatform.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/internal/platform/WorldGuardPlatform.java @@ -21,15 +21,18 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.report.ReportList; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.config.ConfigurationManager; import com.sk89q.worldguard.protection.flags.FlagContext; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.session.SessionManager; import com.sk89q.worldguard.util.profile.cache.ProfileCache; import com.sk89q.worldguard.util.profile.resolver.ProfileService; +import javax.annotation.Nullable; import java.nio.file.Path; /** @@ -155,4 +158,15 @@ public interface WorldGuardPlatform { * Internal use. */ ProfileService createProfileService(ProfileCache profileCache); + + /** + * Get a region that encompasses the Vanilla spawn protection for the given world, if applicable. + * + * @param world world to check spawn protection of + * @return a region, or null if not applicable + */ + @Nullable + default ProtectedRegion getSpawnProtection(World world) { + return null; + } } diff --git a/worldguard-core/src/test/java/com/sk89q/worldguard/TestPlayer.java b/worldguard-core/src/test/java/com/sk89q/worldguard/TestPlayer.java index 4ce5f32d..87864ae7 100644 --- a/worldguard-core/src/test/java/com/sk89q/worldguard/TestPlayer.java +++ b/worldguard-core/src/test/java/com/sk89q/worldguard/TestPlayer.java @@ -33,6 +33,7 @@ import org.junit.Ignore; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; @@ -213,6 +214,11 @@ public void print(Component component) { } + @Override + public Locale getLocale() { + return Locale.ENGLISH; + } + @Override public String[] getGroups() { return groups.toArray(new String[groups.size()]);