@@ -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}
0 commit comments