Have membership override BUILD=DENY like in WG 5.

This commit is contained in:
sk89q 2014-08-29 11:31:53 -07:00
parent 40ceb3d0b8
commit 0852fc0d65
3 changed files with 22 additions and 11 deletions

View File

@ -274,6 +274,11 @@ public <V> V queryValue(@Nullable RegionAssociable subject, Flag<V> flag) {
public <V> Collection<V> queryAllValues(@Nullable RegionAssociable subject, Flag<V> flag) {
checkNotNull(flag);
// Check to see whether we have a subject if this is BUILD
if (flag == DefaultFlag.BUILD && subject == null) {
throw new NullPointerException("The BUILD flag is handled in a special fashion and requires a non-null subject parameter");
}
int minimumPriority = Integer.MIN_VALUE;
// Say there are two regions in one location: CHILD and PARENT (CHILD
@ -317,10 +322,11 @@ public <V> Collection<V> queryAllValues(@Nullable RegionAssociable subject, Flag
}
V value = getEffectiveFlag(region, flag, subject);
int priority = getPriority(region);
if (value != null) {
if (!ignoredRegions.contains(region)) {
minimumPriority = getPriority(region);
minimumPriority = priority;
ignoreValuesOfParents(consideredValues, ignoredRegions, region);
consideredValues.put(region, value);
@ -332,13 +338,17 @@ public <V> Collection<V> queryAllValues(@Nullable RegionAssociable subject, Flag
}
}
}
// The BUILD flag (of lower priorities) can be overridden if
// this region has members... this check is here due to legacy
// reasons
if (priority != minimumPriority && flag == DefaultFlag.BUILD
&& getEffectiveFlag(region, DefaultFlag.PASSTHROUGH, subject) != State.ALLOW) {
minimumPriority = getPriority(region);
}
}
if (flag == DefaultFlag.BUILD && consideredValues.isEmpty()) {
if (subject == null) {
throw new NullPointerException("The BUILD flag is handled in a special fashion and requires a non-null subject parameter");
}
switch (getMembership(subject)) {
case FAIL:
return ImmutableList.of();

View File

@ -410,7 +410,7 @@ public void testPriorityDisjointBuildDenyFlagAndMembership() {
region.getOwners().addPlayer(member);
ApplicableRegionSet set = mock.getApplicableSet();
assertFalse(set.canBuild(member));
assertTrue(set.canBuild(member));
assertFalse(set.canBuild(nonMember));
}
@ -543,7 +543,7 @@ public void testGlobalRegionBuildFlagDenyWithRegion() {
region.getOwners().addPlayer(member);
ApplicableRegionSet set = mock.getApplicableSet();
assertFalse(set.canBuild(member));
assertTrue(set.canBuild(member));
assertFalse(set.canBuild(nonMember));
}

View File

@ -900,10 +900,11 @@ public void testQueryValueBuildFlagRegionsOverlappingAndGlobalRegionMembershipAn
region.getMembers().addPlayer(memberBoth);
FlagValueCalculator result = mock.getFlagCalculator();
assertThat(result.queryValue(globalMember, DefaultFlag.BUILD), is(State.DENY));
assertThat(result.queryValue(nonMember, DefaultFlag.BUILD), is(State.DENY));
assertThat(result.queryValue(memberOne, DefaultFlag.BUILD), is(State.DENY));
assertThat(result.queryValue(memberBoth, DefaultFlag.BUILD), is(State.DENY));
// Inconsistent due to legacy reasons
assertThat(result.queryValue(globalMember, DefaultFlag.BUILD), is((State) null));
assertThat(result.queryValue(nonMember, DefaultFlag.BUILD), is((State) null));
assertThat(result.queryValue(memberOne, DefaultFlag.BUILD), is((State) null));
assertThat(result.queryValue(memberBoth, DefaultFlag.BUILD), is(State.ALLOW));
}
@Test