Skip to content

Commit 2dff680

Browse files
committed
Add non-player members
1 parent c8a6e59 commit 2dff680

File tree

12 files changed

+217
-41
lines changed

12 files changed

+217
-41
lines changed

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ public void loadConfiguration() {
296296
maxClaimVolume = getInt("regions.max-claim-volume", 30000);
297297
claimOnlyInsideExistingRegions = getBoolean("regions.claim-only-inside-existing-regions", false);
298298
setParentOnClaim = getString("regions.set-parent-on-claim", "");
299+
nonplayerBorderBypassOnClaim = getBoolean("regions.nonplayer-border-bypass-on-claim", false);
299300
boundedLocationFlags = getBoolean("regions.location-flags-only-inside-regions", false);
300301

301302
maxRegionCountPerPlayer = getInt("regions.max-region-count-per-player.default", 7);

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
import com.sk89q.worldguard.commands.GeneralCommands;
6565
import com.sk89q.worldguard.commands.ProtectionCommands;
6666
import com.sk89q.worldguard.commands.ToggleCommands;
67+
import com.sk89q.worldguard.domains.CustomDomain;
68+
import com.sk89q.worldguard.domains.registry.CustomDomainContext;
6769
import com.sk89q.worldguard.domains.registry.SimpleDomainRegistry;
6870
import com.sk89q.worldguard.protection.flags.Flag;
6971
import com.sk89q.worldguard.protection.flags.Flags;
@@ -93,8 +95,14 @@
9395
import java.io.FileOutputStream;
9496
import java.io.IOException;
9597
import java.io.InputStream;
98+
import java.util.ArrayList;
99+
import java.util.Arrays;
100+
import java.util.Collection;
96101
import java.util.HashMap;
102+
import java.util.HashSet;
97103
import java.util.Map;
104+
import java.util.Set;
105+
import java.util.UUID;
98106
import java.util.logging.Level;
99107
import java.util.logging.Logger;
100108

@@ -132,6 +140,61 @@ public static WorldGuardPlugin inst() {
132140
return inst;
133141
}
134142

143+
@Override
144+
public void onLoad() {
145+
WorldGuard.getInstance().getDomainRegistry().register("nonplayer-protection-domains", n -> new CustomDomain(n) {
146+
private final Set<String> nonplayerProtectionDomains = new HashSet<>();
147+
148+
@Override
149+
public void parseInput(CustomDomainContext context) {
150+
setDirty(true);
151+
nonplayerProtectionDomains.addAll(Arrays.asList(context.getUserInput().split(",")));
152+
}
153+
154+
@Override
155+
public void unmarshal(Object o) {
156+
nonplayerProtectionDomains.clear();
157+
nonplayerProtectionDomains.addAll((Collection<? extends String>) o);
158+
}
159+
160+
@Override
161+
public Object marshal() {
162+
return new ArrayList<>(nonplayerProtectionDomains);
163+
}
164+
165+
@Override
166+
public boolean contains(UUID uniqueId) {
167+
return false;
168+
}
169+
170+
@Override
171+
public boolean contains(String playerName) {
172+
return false;
173+
}
174+
175+
@Override
176+
public boolean containsNonplayer(String nonplayerProtectionDomain) {
177+
return nonplayerProtectionDomains.contains(nonplayerProtectionDomain);
178+
}
179+
180+
@Override
181+
public int size() {
182+
return nonplayerProtectionDomains.size();
183+
}
184+
185+
@Override
186+
public void clear() {
187+
setDirty(true);
188+
nonplayerProtectionDomains.clear();
189+
}
190+
191+
@Override
192+
public String toString() {
193+
return " " + nonplayerProtectionDomains;
194+
}
195+
});
196+
}
197+
135198
/**
136199
* Called on plugin enable.
137200
*/

worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
import com.sk89q.worldguard.commands.task.RegionRemover;
5454
import com.sk89q.worldguard.config.ConfigurationManager;
5555
import com.sk89q.worldguard.config.WorldConfiguration;
56+
import com.sk89q.worldguard.domains.CustomDomain;
57+
import com.sk89q.worldguard.domains.registry.CustomDomainContext;
58+
import com.sk89q.worldguard.domains.registry.InvalidDomainFormat;
5659
import com.sk89q.worldguard.internal.permission.RegionPermissionModel;
5760
import com.sk89q.worldguard.protection.ApplicableRegionSet;
5861
import com.sk89q.worldguard.protection.FlagValueCalculator;
@@ -83,7 +86,9 @@
8386
import com.sk89q.worldguard.util.logging.LoggerToChatHandler;
8487

8588
import java.util.ArrayList;
89+
import java.util.Arrays;
8690
import java.util.Collections;
91+
import java.util.HashSet;
8792
import java.util.List;
8893
import java.util.concurrent.Callable;
8994
import java.util.logging.Level;
@@ -330,6 +335,19 @@ public void claim(CommandContext args, Actor sender) throws CommandException {
330335
}
331336
}
332337

338+
if (wcfg.nonplayerBorderBypassOnClaim) {
339+
CustomDomain customDomain = WorldGuard.getInstance().getDomainRegistry().createDomain("nonplayer-protection-domains");
340+
341+
try {
342+
customDomain.parseInput(CustomDomainContext.create().setInput(player.getUniqueId().toString()).build());
343+
} catch (InvalidDomainFormat e) {
344+
throw new CommandException(e.getMessage());
345+
}
346+
347+
region.getOwners().addCustomDomain(customDomain);
348+
region.setFlag(Flags.NONPLAYER_PROTECTION_DOMAINS, new HashSet<>(Arrays.asList(player.getUniqueId().toString())));
349+
}
350+
333351
region.getOwners().addPlayer(player);
334352
manager.addRegion(region);
335353
player.print(TextComponent.of(String.format("A new region has been claimed named '%s'.", id)));

worldguard-core/src/main/java/com/sk89q/worldguard/config/WorldConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public abstract class WorldConfiguration {
130130
public int maxClaimVolume;
131131
public boolean claimOnlyInsideExistingRegions;
132132
public String setParentOnClaim;
133+
public boolean nonplayerBorderBypassOnClaim;
133134
public int maxRegionCountPerPlayer;
134135
public boolean antiWolfDumbness;
135136
public boolean signChestProtection;

worldguard-core/src/main/java/com/sk89q/worldguard/domains/DefaultDomain.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ public boolean contains(String playerName) {
324324
return playerDomain.contains(playerName);
325325
}
326326

327+
@Override
328+
public boolean containsNonplayer(String nonplayerProtectionDomain) {
329+
return customDomains.stream().anyMatch(d -> d.containsNonplayer(nonplayerProtectionDomain));
330+
}
331+
327332
@Override
328333
public int size() {
329334
return groupDomain.size() + playerDomain.size() + customDomains.size();

worldguard-core/src/main/java/com/sk89q/worldguard/domains/Domain.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ public interface Domain {
5858
@Deprecated
5959
boolean contains(String playerName);
6060

61+
/**
62+
* Returns true if a domain contains a non-player.
63+
*
64+
* @param nonplayerProtectionDomain the non-player protection domain to check
65+
* @return whether this domain contains {@code nonplayerProtectionDomain}
66+
*/
67+
boolean containsNonplayer(String nonplayerProtectionDomain);
68+
6169
/**
6270
* Get the number of entries.
6371
*

worldguard-core/src/main/java/com/sk89q/worldguard/domains/GroupDomain.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ public boolean contains(String playerName) {
120120
return false; // GroupDomains can't contain player names.
121121
}
122122

123+
@Override
124+
public boolean containsNonplayer(String nonplayerProtectionDomain) {
125+
return false; // GroupDomains can't contain non-players.
126+
}
127+
123128
@Override
124129
public int size() {
125130
return groups.size();

worldguard-core/src/main/java/com/sk89q/worldguard/domains/PlayerDomain.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ public boolean contains(String playerName) {
184184
return names.contains(playerName.trim().toLowerCase());
185185
}
186186

187+
@Override
188+
public boolean containsNonplayer(String nonplayerProtectionDomain) {
189+
return false; // PlayerDomains can't contain non-players.
190+
}
191+
187192
@Override
188193
public int size() {
189194
return names.size() + uniqueIds.size();

worldguard-core/src/main/java/com/sk89q/worldguard/domains/registry/UnknownDomain.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ public boolean contains(String playerName) {
5858
return false;
5959
}
6060

61+
@Override
62+
public boolean containsNonplayer(String nonplayerProtectionDomain) {
63+
return false;
64+
}
65+
6166
@Override
6267
public int size() {
6368
return 0;

worldguard-core/src/main/java/com/sk89q/worldguard/protection/association/AbstractRegionOverlapAssociation.java

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,9 @@
2222
import static com.google.common.base.Preconditions.checkNotNull;
2323

2424
import com.sk89q.worldguard.domains.Association;
25-
import com.sk89q.worldguard.protection.FlagValueCalculator;
26-
import com.sk89q.worldguard.protection.flags.Flags;
2725
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
2826

2927
import javax.annotation.Nullable;
30-
import java.util.Collection;
31-
import java.util.Collections;
3228
import java.util.HashSet;
3329
import java.util.List;
3430
import java.util.Set;
@@ -64,39 +60,22 @@ protected void calcMaxPriority() {
6460
this.maxPriorityRegions = bestRegions;
6561
}
6662

67-
private boolean checkNonplayerProtectionDomains(Iterable<? extends ProtectedRegion> source, Collection<?> domains) {
68-
if (source == null || domains == null || domains.isEmpty()) {
69-
return false;
70-
}
71-
72-
for (ProtectedRegion region : source) {
73-
// Potential endless recurrence? No, because there is no region group flag.
74-
Set<String> regionDomains = FlagValueCalculator.getEffectiveFlagOf(region, Flags.NONPLAYER_PROTECTION_DOMAINS, this);
75-
76-
if (regionDomains == null || regionDomains.isEmpty()) {
77-
continue;
78-
}
79-
80-
if (!Collections.disjoint(regionDomains, domains)) {
81-
return true;
82-
}
83-
}
84-
85-
return false;
86-
}
87-
8863
@Override
8964
public Association getAssociation(List<ProtectedRegion> regions) {
9065
checkNotNull(source);
66+
boolean member = false;
67+
9168
for (ProtectedRegion region : regions) {
92-
while (region != null) {
93-
if ((region.getId().equals(ProtectedRegion.GLOBAL_REGION) && source.isEmpty())) {
69+
ProtectedRegion current = region;
70+
71+
while (current != null) {
72+
if ((current.getId().equals(ProtectedRegion.GLOBAL_REGION) && source.isEmpty())) {
9473
return Association.OWNER;
9574
}
9675

97-
if (source.contains(region)) {
76+
if (source.contains(current)) {
9877
if (useMaxPriorityAssociation) {
99-
int priority = region.getPriority();
78+
int priority = current.getPriority();
10079
if (priority == maxPriority) {
10180
return Association.OWNER;
10281
}
@@ -105,23 +84,24 @@ public Association getAssociation(List<ProtectedRegion> regions) {
10584
}
10685
}
10786

108-
Set<ProtectedRegion> source;
87+
current = current.getParent();
88+
}
10989

110-
if (useMaxPriorityAssociation) {
111-
source = maxPriorityRegions;
112-
} else {
113-
source = this.source;
114-
}
90+
Set<ProtectedRegion> source;
11591

116-
// Potential endless recurrence? No, because there is no region group flag.
117-
if (checkNonplayerProtectionDomains(source, FlagValueCalculator.getEffectiveFlagOf(region, Flags.NONPLAYER_PROTECTION_DOMAINS, this))) {
118-
return Association.OWNER;
119-
}
92+
if (useMaxPriorityAssociation) {
93+
source = maxPriorityRegions;
94+
} else {
95+
source = this.source;
96+
}
12097

121-
region = region.getParent();
98+
if (source.stream().anyMatch(region::isOwner)) {
99+
return Association.OWNER;
100+
} else if (!member && source.stream().anyMatch(region::isMember)) {
101+
member = true;
122102
}
123103
}
124104

125-
return Association.NON_MEMBER;
105+
return member ? Association.MEMBER : Association.NON_MEMBER;
126106
}
127107
}

0 commit comments

Comments
 (0)