Skip to content

Commit b0fef3c

Browse files
Improve region members/owners expression
Support for both values at once
1 parent 41cffcb commit b0fef3c

File tree

1 file changed

+114
-84
lines changed

1 file changed

+114
-84
lines changed

src/main/java/org/skriptlang/skriptworldguard/elements/expressions/ExprRegionMembersOwners.java

Lines changed: 114 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,67 @@
1818
import org.bukkit.OfflinePlayer;
1919
import org.bukkit.event.Event;
2020

21+
import java.lang.reflect.Array;
2122
import java.util.ArrayList;
2223
import java.util.List;
2324
import java.util.UUID;
2425

2526
@Name("Region Members/Owners")
2627
@Description({
2728
"An expression to obtain the members/owners of the given regions.",
28-
"The members/owners of a region are not limited to players, so a keyword to get the group members or owners exists.",
29-
"Note that, by default, the player members/owners of a group will be returned."
29+
"The members/owners of a region are made up of players and groups (strings).",
30+
"By default, this expression returns both. However, keyword specifiers for each type (player/group) are available."
3031
})
3132
@Example("""
3233
on region enter:
3334
message "You have entered %region%. It is owned by %owners of region%."
3435
""")
36+
@Example("""
37+
command /promote <text> <player>:
38+
trigger:
39+
set {_region} to the region text-argument in the player's world
40+
if player-argument is an owner of {_region}:
41+
message "<red>%player-argument% is already an owner of %{_region}%"
42+
else if player-argument is a member of {_region}:
43+
add player to the player owners of {_region}
44+
message "<green>%player-argument% has been promoted to an owner of %{_region}%"
45+
else:
46+
add player to the player members of {_region}
47+
message "<green>%player-argument% has been promoted to a member of %{_region}%"
48+
""")
3549
@Since("1.0")
3650
public class ExprRegionMembersOwners extends PropertyExpression<WorldGuardRegion, Object> {
3751

3852
public static void register(SyntaxRegistry registry) {
3953
registry.register(SyntaxRegistry.EXPRESSION, infoBuilder(ExprRegionMembersOwners.class, Object.class, "", "", false)
4054
.supplier(ExprRegionMembersOwners::new)
4155
.clearPatterns() // overwrite them
42-
.addPatterns(getPatterns("player (members|:owners)", "worldguardregions"))
43-
.addPatterns(getPatterns("(member|:owner) groups", "worldguardregions"))
56+
.addPatterns(getPatterns(
57+
"[:player|:group] (members|:owners)",
58+
"worldguardregions"))
59+
.addPatterns(getPatterns(
60+
"(member|:owner) [player:players|group:groups]",
61+
"worldguardregions"))
4462
.build());
4563
}
4664

47-
private boolean isGroups;
65+
private enum Type {
66+
PLAYER,
67+
GROUP,
68+
BOTH
69+
}
70+
4871
private boolean isOwners;
72+
private Type type = Type.BOTH;
4973

5074
@Override
5175
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
52-
isGroups = parseResult.hasTag("group");
5376
isOwners = parseResult.hasTag("owners");
77+
if (parseResult.hasTag("player")) {
78+
type = Type.PLAYER;
79+
} else if (parseResult.hasTag("group")) {
80+
type = Type.GROUP;
81+
}
5482
//noinspection unchecked
5583
setExpr((Expression<? extends WorldGuardRegion>) exprs[0]);
5684
return true;
@@ -69,27 +97,32 @@ protected Object[] get(Event event, WorldGuardRegion[] regions) {
6997
}
7098
}
7199

72-
if (isGroups) {
73-
List<String> groups = new ArrayList<>();
74-
for (DefaultDomain domain : domains) {
75-
groups.addAll(domain.getGroups());
76-
}
77-
return groups.toArray(new String[0]);
78-
} else {
79-
List<OfflinePlayer> players = new ArrayList<>();
100+
List<Object> values = new ArrayList<>();
101+
if (type != Type.GROUP) {
80102
for (DefaultDomain domain : domains) {
81103
for (UUID uuid : domain.getUniqueIds()) {
82-
players.add(Bukkit.getOfflinePlayer(uuid));
104+
values.add(Bukkit.getOfflinePlayer(uuid));
83105
}
84106
}
85-
return players.toArray(new OfflinePlayer[0]);
86107
}
108+
if (type != Type.PLAYER) {
109+
for (DefaultDomain domain : domains) {
110+
values.addAll(domain.getGroups());
111+
}
112+
}
113+
return values.toArray((Object[]) Array.newInstance(getReturnType(), values.size()));
87114
}
88115

89116
@Override
90117
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
91118
return switch (mode) {
92-
case ADD, SET, REMOVE, DELETE, RESET -> new Class[]{isGroups ? String[].class : OfflinePlayer[].class};
119+
case ADD, SET, REMOVE, DELETE, RESET -> {
120+
Class<?>[] types = possibleReturnTypes();
121+
for (int i = 0; i < types.length; i++) { // allow multiple values
122+
types[i] = types[i].arrayType();
123+
}
124+
yield types;
125+
}
93126
default -> null;
94127
};
95128
}
@@ -112,68 +145,58 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
112145
}
113146
}
114147

115-
if (isGroups) {
116-
switch (mode) {
117-
case SET:
118-
case DELETE:
119-
case RESET:
120-
for (DefaultDomain domain : domains) {
121-
domain.getGroupDomain().clear();
122-
}
123-
if (mode != ChangeMode.SET) { // Only fall through for SET
124-
break;
125-
}
126-
//$FALL-THROUGH$
127-
case ADD:
128-
assert delta != null;
129-
for (DefaultDomain domain : domains) {
130-
for (Object group : delta) {
131-
domain.addGroup((String) group);
148+
switch (mode) {
149+
case SET:
150+
for (DefaultDomain domain : domains) {
151+
domain.clear();
152+
}
153+
//$FALL-THROUGH$
154+
case ADD:
155+
assert delta != null;
156+
for (DefaultDomain domain : domains) {
157+
for (Object object : delta) {
158+
if (object instanceof OfflinePlayer player) {
159+
domain.addPlayer(player.getUniqueId());
160+
} else {
161+
domain.addGroup((String) object);
132162
}
133163
}
134-
break;
135-
case REMOVE:
136-
assert delta != null;
137-
for (DefaultDomain domain : domains) {
138-
for (Object group : delta) {
139-
domain.removeGroup((String) group);
164+
}
165+
break;
166+
case REMOVE:
167+
assert delta != null;
168+
for (DefaultDomain domain : domains) {
169+
for (Object object : delta) {
170+
if (object instanceof OfflinePlayer player) {
171+
domain.removePlayer(player.getUniqueId());
172+
} else {
173+
domain.removeGroup((String) object);
140174
}
141175
}
142-
break;
143-
default:
144-
assert false;
145-
}
146-
} else { // Players
147-
switch (mode) {
148-
case SET:
149-
case DELETE:
150-
case RESET:
151-
for (DefaultDomain domain : domains) {
152-
domain.getPlayerDomain().clear();
153-
}
154-
if (mode != ChangeMode.SET) { // Only fall through for SET
155-
break;
176+
}
177+
break;
178+
case DELETE:
179+
case RESET:
180+
switch (type) {
181+
case PLAYER -> {
182+
for (DefaultDomain domain : domains) {
183+
domain.getPlayerDomain().clear();
184+
}
156185
}
157-
//$FALL-THROUGH$
158-
case ADD:
159-
assert delta != null;
160-
for (DefaultDomain domain : domains) {
161-
for (Object player : delta) {
162-
domain.addPlayer(((OfflinePlayer) player).getUniqueId());
186+
case GROUP -> {
187+
for (DefaultDomain domain : domains) {
188+
domain.getGroupDomain().clear();
163189
}
164190
}
165-
break;
166-
case REMOVE:
167-
assert delta != null;
168-
for (DefaultDomain domain : domains) {
169-
for (Object player : delta) {
170-
domain.removePlayer(((OfflinePlayer) player).getUniqueId());
191+
case BOTH -> {
192+
for (DefaultDomain domain : domains) {
193+
domain.clear();
171194
}
172195
}
173-
break;
174-
default:
175-
assert false;
176-
}
196+
}
197+
break;
198+
default:
199+
assert false;
177200
}
178201
}
179202

@@ -185,27 +208,34 @@ public boolean isSingle() {
185208

186209
@Override
187210
public Class<?> getReturnType() {
188-
return isGroups ? String.class : OfflinePlayer.class;
211+
return switch (type) {
212+
case PLAYER -> OfflinePlayer.class;
213+
case GROUP -> String.class;
214+
case BOTH -> Object.class;
215+
};
216+
}
217+
218+
@Override
219+
public Class<?>[] possibleReturnTypes() {
220+
if (type == Type.BOTH) {
221+
return new Class[]{OfflinePlayer.class, String.class};
222+
}
223+
return super.possibleReturnTypes();
189224
}
190225

191226
@Override
192227
public String toString(@Nullable Event event, boolean debug) {
193228
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
194229
builder.append("the");
195-
if (isGroups) {
196-
if (isOwners) {
197-
builder.append("owner");
198-
} else {
199-
builder.append("member");
200-
}
201-
builder.append("groups");
202-
} else {
230+
if (type == Type.PLAYER) {
203231
builder.append("player");
204-
if (isOwners) {
205-
builder.append("owners");
206-
} else {
207-
builder.append("members");
208-
}
232+
} else if (type == Type.GROUP) {
233+
builder.append("group");
234+
}
235+
if (isOwners) {
236+
builder.append("owners");
237+
} else {
238+
builder.append("members");
209239
}
210240
builder.append("of", getExpr());
211241
return builder.toString();

0 commit comments

Comments
 (0)