diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java index ce603d69..28fb4581 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java @@ -768,8 +768,8 @@ public void onEntityRegainHealth(EntityRegainHealthEvent event) { /** * Check if a player is invincible, via either god mode or region flag. If - * the region denies invincibility, the player must have the another - * permission to override it. + * the region denies invincibility, the player must have an extra permission + * to override it. (worldguard.god.override-regions) * * @param player * @return @@ -779,13 +779,19 @@ private boolean isInvincible(Player player) { WorldConfiguration wcfg = cfg.get(player.getWorld()); boolean god = cfg.hasGodMode(player); - Boolean allowed = wcfg.useRegions && RegionQueryUtil.isAllowedInvinciblity(plugin, player); - if (allowed == false && wcfg.useRegions) { - return god && plugin.hasPermission(player, "worldguard.god.override-regions"); - } else if (allowed == true || !wcfg.useRegions) { - return god; + if (wcfg.useRegions) { + Boolean flag = RegionQueryUtil.isAllowedInvinciblity(plugin, player); + boolean allowed = flag == null || flag == true; + boolean invincible = RegionQueryUtil.isInvincible(plugin, player); + + if (allowed) { + return god || invincible; + } else { + return (god && plugin.hasPermission(player, "worldguard.god.override-regions")) + || invincible; + } } else { - return RegionQueryUtil.isInvincible(plugin, player); + return god; } } } diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index 87e4db6f..3a582932 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -1007,17 +1007,25 @@ public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { Vector pt = toVector(player.getLocation()); RegionManager mgr = plugin.getGlobalRegionManager().get(world); ApplicableRegionSet set = mgr.getApplicableRegions(pt); + ProtectedRegion globalRegion = mgr.getRegion("__global__"); String[] parts = event.getMessage().split(" "); Set allowedCommands = set.getFlag(DefaultFlag.ALLOWED_CMDS); + if (allowedCommands == null && globalRegion != null) { + allowedCommands = globalRegion.getFlag(DefaultFlag.ALLOWED_CMDS); + } if (allowedCommands != null && !allowedCommands.contains(parts[0].toLowerCase())) { + player.sendMessage(ChatColor.RED + parts[0].toLowerCase() + " is not allowed in this area."); event.setCancelled(true); return; } Set blockedCommands = set.getFlag(DefaultFlag.BLOCKED_CMDS); + if (blockedCommands == null && globalRegion != null) { + blockedCommands = globalRegion.getFlag(DefaultFlag.BLOCKED_CMDS); + } if (blockedCommands != null && blockedCommands.contains(parts[0].toLowerCase())) { player.sendMessage(ChatColor.RED + parts[0].toLowerCase() + " is blocked in this area."); event.setCancelled(true); diff --git a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java index 42ae01fa..9c49a8b5 100644 --- a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java +++ b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java @@ -309,9 +309,11 @@ private void clearParents(Set needsClear, * @throws IllegalArgumentException if a StateFlag is given */ public , V> V getFlag(T flag) { + /* if (flag instanceof StateFlag) { throw new IllegalArgumentException("Cannot use StateFlag with getFlag()"); } + */ int lastPriority = 0; boolean found = false;