1818import org .bukkit .OfflinePlayer ;
1919import org .bukkit .event .Event ;
2020
21+ import java .lang .reflect .Array ;
2122import java .util .ArrayList ;
2223import java .util .List ;
2324import 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" )
3650public 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