Add spawn-protection overlap check when defining regions.

Update cached username on login.
Bump WorldEdit dep version.
This commit is contained in:
wizjany 2019-12-19 15:18:53 -05:00
parent abfa5cb6a5
commit f43a4eaad8
9 changed files with 81 additions and 7 deletions

View File

@ -1,6 +1,7 @@
object Versions { object Versions {
// const val PISTON = "0.4.3" // const val PISTON = "0.4.3"
// const val AUTO_VALUE = "1.6.5" // const val AUTO_VALUE = "1.6.5"
const val WORLDEDIT = "7.1.0-SNAPSHOT"
const val JUNIT = "4.11" const val JUNIT = "4.11"
const val SQUIRRELID = "0.2.0" const val SQUIRRELID = "0.2.0"
} }

View File

@ -26,7 +26,7 @@
//"compile"(project(":worldguard-libs:bukkit")) //"compile"(project(":worldguard-libs:bukkit"))
"api"("com.destroystokyo.paper:paper-api:1.15-R0.1-SNAPSHOT") "api"("com.destroystokyo.paper:paper-api:1.15-R0.1-SNAPSHOT")
"implementation"("io.papermc:paperlib:1.0.2") "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"("com.sk89q:commandbook:2.3") { isTransitive = false }
"implementation"("org.bstats:bstats-bukkit:1.5") "implementation"("org.bstats:bstats-bukkit:1.5")
} }

View File

@ -19,12 +19,18 @@
package com.sk89q.worldguard.bukkit; 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.formatting.text.TextComponent;
import com.sk89q.worldedit.util.report.ReportList; 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.GameMode;
import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.gamemode.GameModes;
import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.WorldGuard; 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.util.profile.resolver.PaperProfileService;
import com.sk89q.worldguard.bukkit.protection.events.flags.FlagContextCreateEvent; import com.sk89q.worldguard.bukkit.protection.events.flags.FlagContextCreateEvent;
import com.sk89q.worldguard.bukkit.session.BukkitSessionManager; import com.sk89q.worldguard.bukkit.session.BukkitSessionManager;
@ -52,6 +58,7 @@
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.permissions.Permissible; import org.bukkit.permissions.Permissible;
import javax.annotation.Nullable;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -251,4 +258,22 @@ public ProfileService createProfileService(ProfileCache profileCache) {
return new CacheForwardingService(new CombinedProfileService(services), return new CacheForwardingService(new CombinedProfileService(services),
profileCache); 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;
}
} }

View File

@ -24,13 +24,14 @@
import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.bukkit.BukkitPlayer; import com.sk89q.worldguard.bukkit.BukkitPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin; 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.AbstractSessionManager;
import com.sk89q.worldguard.session.Session; import com.sk89q.worldguard.session.Session;
import com.sk89q.worldguard.util.profile.Profile;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import java.util.Collection; import java.util.Collection;
@ -57,10 +58,12 @@ public void resetAllStates() {
} }
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerProcess(ProcessPlayerEvent event) {
// Pre-load a session // Pre-load a session
LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(event.getPlayer()); LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(event.getPlayer());
get(player).initialize(player); get(player).initialize(player);
WorldGuard.getInstance().getExecutorService().submit(() ->
WorldGuard.getInstance().getProfileCache().put(new Profile(player.getUniqueId(), player.getName())));
} }
@Override @Override
@ -75,7 +78,7 @@ public void run() {
public boolean hasBypass(LocalPlayer player, World world) { public boolean hasBypass(LocalPlayer player, World world) {
if (player instanceof BukkitPlayer) { if (player instanceof BukkitPlayer) {
if (((BukkitPlayer) player).getPlayer().hasMetadata("NPC") if (((BukkitPlayer) player).getPlayer().hasMetadata("NPC")
&& WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride) && WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride)
return true; return true;
} }
return super.hasBypass(player, world); return super.hasBypass(player, world);

View File

@ -8,7 +8,7 @@
dependencies { dependencies {
"compile"(project(":worldguard-libs:core")) "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") "implementation"("org.flywaydb:flyway-core:3.0")
"compileOnly"("com.google.code.findbugs:jsr305:1.3.9") "compileOnly"("com.google.code.findbugs:jsr305:1.3.9")

View File

@ -144,7 +144,8 @@ public void define(CommandContext args, Actor sender) throws CommandException {
String id = checkRegionId(args.getString(0), false); String id = checkRegionId(args.getString(0), false);
RegionManager manager = checkRegionManager(player.getWorld()); World world = player.getWorld();
RegionManager manager = checkRegionManager(world);
checkRegionDoesNotExist(manager, id, true); 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())); sender.print(String.format("A new region has been made named '%s'.", region.getId()));
warnAboutDimensions(sender, region); warnAboutDimensions(sender, region);
informNewUser(sender, manager, region); informNewUser(sender, manager, region);
checkSpawnOverlap(sender, world, region);
}) })
.onFailure(String.format("Failed to add the region '%s'", region.getId()), worldGuard.getExceptionConverter()) .onFailure(String.format("Failed to add the region '%s'", region.getId()), worldGuard.getExceptionConverter())
.buildAndExec(worldGuard.getExecutorService()); .buildAndExec(worldGuard.getExecutorService());
@ -191,7 +193,8 @@ public void redefine(CommandContext args, Actor sender) throws CommandException
String id = checkRegionId(args.getString(0), false); 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); 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())); player.print(String.format("Region '%s' has been updated with a new area.", region.getId()));
warnAboutDimensions(player, region); warnAboutDimensions(player, region);
informNewUser(player, manager, region); informNewUser(player, manager, region);
checkSpawnOverlap(sender, world, region);
}) })
.onFailure(String.format("Failed to update the region '%s'", region.getId()), worldGuard.getExceptionConverter()) .onFailure(String.format("Failed to update the region '%s'", region.getId()), worldGuard.getExceptionConverter())
.buildAndExec(worldGuard.getExecutorService()); .buildAndExec(worldGuard.getExecutorService());

View File

@ -20,6 +20,7 @@
package com.sk89q.worldguard.commands.region; package com.sk89q.worldguard.commands.region;
import com.google.common.base.Joiner; 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.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.IncompleteRegionException;
@ -32,11 +33,13 @@
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector; 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.component.SubtleFormat;
import com.sk89q.worldedit.util.formatting.text.TextComponent; 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.ClickEvent;
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; 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.TextColor;
import com.sk89q.worldedit.util.formatting.text.format.TextDecoration;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.WorldGuard; 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. * Set a player's selection to a given region.
* *

View File

@ -21,15 +21,18 @@
import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.report.ReportList; 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.GameMode;
import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.config.ConfigurationManager; import com.sk89q.worldguard.config.ConfigurationManager;
import com.sk89q.worldguard.protection.flags.FlagContext; 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.protection.regions.RegionContainer;
import com.sk89q.worldguard.session.SessionManager; import com.sk89q.worldguard.session.SessionManager;
import com.sk89q.worldguard.util.profile.cache.ProfileCache; import com.sk89q.worldguard.util.profile.cache.ProfileCache;
import com.sk89q.worldguard.util.profile.resolver.ProfileService; import com.sk89q.worldguard.util.profile.resolver.ProfileService;
import javax.annotation.Nullable;
import java.nio.file.Path; import java.nio.file.Path;
/** /**
@ -155,4 +158,15 @@ public interface WorldGuardPlatform {
* Internal use. * Internal use.
*/ */
ProfileService createProfileService(ProfileCache profileCache); 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;
}
} }

View File

@ -33,6 +33,7 @@
import org.junit.Ignore; import org.junit.Ignore;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -213,6 +214,11 @@ public void print(Component component) {
} }
@Override
public Locale getLocale() {
return Locale.ENGLISH;
}
@Override @Override
public String[] getGroups() { public String[] getGroups() {
return groups.toArray(new String[groups.size()]); return groups.toArray(new String[groups.size()]);