From 360a655627a7be03770dccc5f357b3e2facda000 Mon Sep 17 00:00:00 2001 From: sk89q Date: Mon, 27 Jun 2011 10:11:23 -0700 Subject: [PATCH] Added the ability to add owners/members to the global region for handling guest groups. --- .../protection/ApplicableRegionSet.java | 8 +++- .../protection/regions/ProtectedRegion.java | 46 ++++++++++++++++--- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java index 3bf132ce..49d7ed26 100644 --- a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java +++ b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java @@ -164,7 +164,13 @@ private boolean internalGetState(StateFlag flag, LocalPlayer player, // The global region has this flag set if (globalState != null) { - def = (globalState == State.ALLOW); + // Special case for the build flag + if (player != null && globalRegion.hasMembersOrOwners()) { + def = globalRegion.isMember(player) + ? (globalState == State.ALLOW) : false; + } else { + def = (globalState == State.ALLOW); + } } } diff --git a/src/main/java/com/sk89q/worldguard/protection/regions/ProtectedRegion.java b/src/main/java/com/sk89q/worldguard/protection/regions/ProtectedRegion.java index 7ecca432..0531523a 100644 --- a/src/main/java/com/sk89q/worldguard/protection/regions/ProtectedRegion.java +++ b/src/main/java/com/sk89q/worldguard/protection/regions/ProtectedRegion.java @@ -168,7 +168,6 @@ public void setOwners(DefaultDomain owners) { * @return the members */ public DefaultDomain getMembers() { - return members; } @@ -178,12 +177,21 @@ public DefaultDomain getMembers() { public void setMembers(DefaultDomain members) { this.members = members; } + + /** + * Checks whether a region has members or owners. + * + * @return whether there are members or owners + */ + public boolean hasMembersOrOwners() { + return owners.size() > 0 || members.size() > 0; + } /** * Checks whether a player is an owner of region or any of its parents. * - * @param player - * @return + * @param player player to check + * @return whether an owner */ public boolean isOwner(LocalPlayer player) { if (owners.contains(player)) { @@ -202,12 +210,12 @@ public boolean isOwner(LocalPlayer player) { return false; } - /** - * Checks whether a player is a member of the region or any of its parents. + * Checks whether a player is a member OR OWNER of the region + * or any of its parents. * - * @param player - * @return + * @param player player to check + * @return whether an owner or member */ public boolean isMember(LocalPlayer player) { if (owners.contains(player) || members.contains(player)) { @@ -226,6 +234,30 @@ public boolean isMember(LocalPlayer player) { return false; } + + /** + * Checks whether a player is a member of the region + * or any of its parents. + * + * @param player player to check + * @return whether an member + */ + public boolean isMemberOnly(LocalPlayer player) { + if (members.contains(player)) { + return true; + } + + ProtectedRegion curParent = getParent(); + while (curParent != null) { + if (curParent.getMembers().contains(player)) { + return true; + } + + curParent = curParent.getParent(); + } + + return false; + } /** * Get a flag's value.