Skip to content

Commit 971d5e7

Browse files
Add group flag support
1 parent 55f872d commit 971d5e7

File tree

2 files changed

+81
-39
lines changed

2 files changed

+81
-39
lines changed

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

Lines changed: 62 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,12 @@ public class ExprRegionFlag extends SimpleExpression<Object> {
4747

4848
public static void register(SyntaxRegistry registry) {
4949
PropertyExpression.register(registry, ExprRegionFlag.class, Object.class,
50-
"[region] flag %string%", "worldguardregions");
50+
"[region] [group:group flag of [the]] flag %string%", "worldguardregions");
5151
}
5252

5353
private Expression<String> flagName;
5454
private Expression<WorldGuardRegion> regions;
55+
private boolean isGroupFlag;
5556

5657
private WorldGuardFlag<?, ?> flag;
5758

@@ -62,6 +63,7 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
6263
flagName = (Expression<String>) expressions[isFlagFirst ? 0 : 1];
6364
//noinspection unchecked
6465
regions = (Expression<WorldGuardRegion>) expressions[isFlagFirst ? 1 : 0];
66+
isGroupFlag = parseResult.hasTag("group");
6567

6668
if (flagName instanceof Literal<String> literal) {
6769
WorldGuardFlag.LookupResult result = WorldGuardFlag.fromName(literal.getSingle());
@@ -70,26 +72,48 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
7072
Skript.error(result.error());
7173
return false;
7274
}
75+
if (isGroupFlag) {
76+
flag = flag.groupFlag();
77+
if (flag == null) {
78+
Skript.error("The flag '" + literal.getSingle() + "' does not have a group flag");
79+
return false;
80+
}
81+
}
7382
}
7483

7584
return true;
7685
}
7786

78-
@Override
79-
protected Object @Nullable [] get(Event event) {
80-
WorldGuardFlag<?, ?> flag = this.flag;
87+
private @Nullable WorldGuardFlag<?, ?> getRuntimeFlag(Event event) {
88+
if (flag != null) {
89+
return flag;
90+
}
91+
String flagName = this.flagName.getSingle(event);
92+
if (flagName == null) {
93+
return null;
94+
}
95+
WorldGuardFlag.LookupResult result = WorldGuardFlag.fromName(flagName);
96+
WorldGuardFlag<?, ?> flag = result.flag();
8197
if (flag == null) {
82-
String flagName = this.flagName.getSingle(event);
83-
if (flagName == null) {
84-
return new Object[0];
85-
}
86-
WorldGuardFlag.LookupResult result = WorldGuardFlag.fromName(flagName);
87-
flag = result.flag();
98+
error(result.error());
99+
return null;
100+
}
101+
if (isGroupFlag) {
102+
flag = flag.groupFlag();
88103
if (flag == null) {
89-
error(result.error());
90-
return new Object[0];
104+
error("The flag '" + flagName + "' does not have a group flag");
105+
return null;
91106
}
92107
}
108+
return flag;
109+
}
110+
111+
@Override
112+
protected Object @Nullable [] get(Event event) {
113+
WorldGuardFlag<?, ?> flag = getRuntimeFlag(event);
114+
if (flag == null) {
115+
return new Object[0];
116+
}
93117
WorldGuardRegion[] regions = this.regions.getArray(event);
94118

95119
List<Object> values = new ArrayList<>();
@@ -127,18 +151,9 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
127151

128152
@Override
129153
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
130-
WorldGuardFlag<?, ?> flag = this.flag;
154+
WorldGuardFlag<?, ?> flag = getRuntimeFlag(event);
131155
if (flag == null) {
132-
String flagName = this.flagName.getSingle(event);
133-
if (flagName == null) {
134-
return;
135-
}
136-
WorldGuardFlag.LookupResult result = WorldGuardFlag.fromName(flagName);
137-
flag = result.flag();
138-
if (flag == null) {
139-
error(result.error());
140-
return;
141-
}
156+
return;
142157
}
143158
WorldGuardRegion[] regions = this.regions.getArray(event);
144159

@@ -206,9 +221,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
206221
} else {
207222
value = delta[0];
208223
}
209-
for (WorldGuardRegion region : regions) {
210-
//noinspection unchecked, rawtypes
211-
region.region().setFlag((Flag) flag.flag(), ((Function) flag.valueConverter().toMapper()).apply(value));
224+
//noinspection unchecked, rawtypes
225+
Object mappedValue = ((Function) flag.valueConverter().toMapper()).apply(value);
226+
if (mappedValue != null) {
227+
for (WorldGuardRegion region : regions) {
228+
//noinspection unchecked, rawtypes
229+
region.region().setFlag((Flag) flag.flag(), mappedValue);
230+
}
212231
}
213232
}
214233
case ADD, REMOVE -> {
@@ -234,7 +253,11 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
234253
}
235254

236255
//noinspection unchecked, rawtypes
237-
region.region().setFlag((Flag) flag.flag(), ((Function) flag.valueConverter().toMapper()).apply(result));
256+
Object mappedResult = ((Function) flag.valueConverter().toMapper()).apply(result);
257+
if (mappedResult != null) {
258+
//noinspection unchecked, rawtypes
259+
region.region().setFlag((Flag) flag.flag(), mappedResult);
260+
}
238261
}
239262
} else if (flag.valueConverter().fromType().isArray()) {
240263
Set<?> deltaSet = Set.of(delta);
@@ -262,10 +285,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
262285
} else {
263286
valueSet = Sets.union(mappedSet, deltaSet);
264287
}
265-
Object[] values = valueSet.toArray();
266288

267289
//noinspection unchecked, rawtypes
268-
region.region().setFlag((Flag) flag.flag(), ((Function) flag.valueConverter().toMapper()).apply(values));
290+
Object mappedValue = ((Function) flag.valueConverter().toMapper()).apply(valueSet.toArray());
291+
if (mappedValue != null) {
292+
//noinspection unchecked, rawtypes
293+
region.region().setFlag((Flag) flag.flag(), mappedValue);
294+
}
269295
}
270296
} else {
271297
error(toString(event, Skript.debug()) + " can't have values " +
@@ -306,9 +332,13 @@ public Class<?> getReturnType() {
306332

307333
@Override
308334
public String toString(@Nullable Event event, boolean debug) {
309-
return new SyntaxStringBuilder(event, debug)
310-
.append("the flag", flagName, "of", regions)
311-
.toString();
335+
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
336+
builder.append("the");
337+
if (isGroupFlag) {
338+
builder.append("group flag of the");
339+
}
340+
builder.append("flag", flagName, "of", regions);
341+
return builder.toString();
312342
}
313343

314344
}

src/main/java/org/skriptlang/skriptworldguard/worldguard/WorldGuardFlag.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,11 @@ static <T> FlagValueConverter<T, T> simple(Class<T> type) {
8181
// skipped: MapFlag (too complex), NumberFlag (is abstract)
8282
// RegionGroupFlag
8383
mappings.put(RegionGroupFlag.class, RegionGroup.class);
84+
// We use the same parsing for group flags as is used by the command
85+
// It is consistent across flags, just not static, so we use the BUILD flag instance
8486
converters.put(RegionGroup.class, new FlagValueConverter<>(String.class, RegionGroup.class,
85-
from -> {
86-
try {
87-
return RegionGroup.valueOf(from.toUpperCase(Locale.ENGLISH));
88-
} catch (IllegalArgumentException e) {
89-
return null;
90-
}
91-
}, to -> to.name().toLowerCase(Locale.ENGLISH)));
87+
from -> Flags.BUILD.getRegionGroupFlag().detectValue(from),
88+
to -> to.name().replace("_", "").toLowerCase(Locale.ENGLISH)));
9289
// skipped: RegistryFlag (handled at runtime), SetFlag (handled at runtime)
9390
// StateFlag
9491
mappings.put(StateFlag.class, StateFlag.State.class);
@@ -217,4 +214,19 @@ public static LookupResult fromName(String name) {
217214
return new LookupResult(new WorldGuardFlag(flag, converter), null);
218215
}
219216

217+
/**
218+
* Obtains the group flag of this flag, which controls who the flag is applied to.
219+
* @return The group flag of this flag. Null if this flag is already a group flag.
220+
* @see RegionGroupFlag
221+
*/
222+
public @Nullable WorldGuardFlag<String, RegionGroup> groupFlag() {
223+
RegionGroupFlag groupFlag = flag().getRegionGroupFlag();
224+
if (groupFlag == null) { // This must be a group flag
225+
return null;
226+
}
227+
//noinspection unchecked
228+
return new WorldGuardFlag<>(flag().getRegionGroupFlag(),
229+
(FlagValueConverter<String, RegionGroup>) getFlagValueConverter(groupFlag));
230+
}
231+
220232
}

0 commit comments

Comments
 (0)