diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java index c0e419b8..3714cbfe 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java @@ -145,6 +145,7 @@ public class WorldConfiguration { public int maxClaimVolume; public boolean claimOnlyInsideExistingRegions; public int maxRegionCountPerPlayer; + public boolean boundedLocationFlags; public boolean antiWolfDumbness; public boolean signChestProtection; public boolean disableSignChestProtectionCheck; @@ -462,6 +463,7 @@ private void loadConfiguration() { regionWand = getInt("regions.wand", 334); maxClaimVolume = getInt("regions.max-claim-volume", 30000); claimOnlyInsideExistingRegions = getBoolean("regions.claim-only-inside-existing-regions", false); + boundedLocationFlags = getBoolean("regions.location-flags-only-inside-regions", false); maxRegionCountPerPlayer = getInt("regions.max-region-count-per-player.default", 7); maxRegionCounts = new HashMap(); diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/commands/region/RegionCommands.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/commands/region/RegionCommands.java index d9a4b92f..7ce0c522 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/commands/region/RegionCommands.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/commands/region/RegionCommands.java @@ -540,7 +540,7 @@ public void flag(CommandContext args, CommandSender sender) throws CommandExcept // Parse the [-g group] separately so entire command can abort if parsing // the [value] part throws an error. try { - groupValue = groupFlag.parseInput(FlagContext.create().setSender(sender).setInput(group).build()); + groupValue = groupFlag.parseInput(FlagContext.create().setSender(sender).setInput(group).setObject("region", existing).build()); } catch (InvalidFlagFormat e) { throw new CommandException(e.getMessage()); } diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/permission/RegionPermissionModel.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/permission/RegionPermissionModel.java index 6aaa3bb9..da017a04 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/permission/RegionPermissionModel.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/bukkit/permission/RegionPermissionModel.java @@ -99,6 +99,10 @@ public boolean mayLookup(ProtectedRegion region) { public boolean mayTeleportTo(ProtectedRegion region) { return hasPatternPermission("teleport", region); } + + public boolean mayOverrideLocationFlagBounds(ProtectedRegion region) { + return hasPatternPermission("locationoverride", region); + } public boolean mayList() { return hasPluginPermission("region.list"); diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/protection/flags/LocationFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/protection/flags/LocationFlag.java index 7677ae75..d6753f53 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/protection/flags/LocationFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/protection/flags/LocationFlag.java @@ -22,6 +22,10 @@ import com.sk89q.worldedit.Location; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.bukkit.BukkitUtil; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.bukkit.permission.RegionPermissionModel; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.entity.Player; @@ -43,8 +47,9 @@ public Location parseInput(FlagContext context) throws InvalidFlagFormat { String input = context.getUserInput(); Player player = context.getPlayerSender(); + Location loc = null; if ("here".equalsIgnoreCase(input)) { - return toLazyLocation(player.getLocation()); + loc = toLazyLocation(player.getLocation()); } else if ("none".equalsIgnoreCase(input)) { return null; } else { @@ -58,13 +63,29 @@ public Location parseInput(FlagContext context) throws InvalidFlagFormat { final float yaw = split.length < 4 ? 0 : Float.parseFloat(split[3]); final float pitch = split.length < 5 ? 0 : Float.parseFloat(split[4]); - return new LazyLocation(world.getName(), new Vector(x, y, z), yaw, pitch); + loc = new LazyLocation(world.getName(), new Vector(x, y, z), yaw, pitch); } catch (NumberFormatException ignored) { } } - - throw new InvalidFlagFormat("Expected 'here' or x,y,z."); } + if (loc != null) { + Object obj = context.get("region"); + if (obj instanceof ProtectedRegion) { + ProtectedRegion rg = (ProtectedRegion) obj; + if (WorldGuardPlugin.inst().getGlobalStateManager().get(player.getWorld()).boundedLocationFlags) { + if (!rg.contains(loc.getPosition()) && new RegionPermissionModel(WorldGuardPlugin.inst(), player).mayOverrideLocationFlagBounds(rg)) { + player.sendMessage(ChatColor.GRAY + "WARNING: Flag location is outside of region."); + } else { + // no permission + throw new InvalidFlagFormat("You can't set that flag outside of the region boundaries."); + } + // clamp height to world limits + loc.setPosition(loc.getPosition().clampY(0, player.getWorld().getMaxHeight())); + return loc; + } + } + } + throw new InvalidFlagFormat("Expected 'here' or x,y,z."); } private Location toLazyLocation(org.bukkit.Location location) {