55import ch .njol .skript .doc .Example ;
66import ch .njol .skript .doc .Name ;
77import ch .njol .skript .doc .RequiredPlugins ;
8- import ch .njol .skript .expressions .base .SimplePropertyExpression ;
8+ import ch .njol .skript .expressions .base .PropertyExpression ;
99import ch .njol .skript .lang .Expression ;
1010import ch .njol .skript .lang .SkriptParser .ParseResult ;
11+ import ch .njol .skript .lang .SyntaxStringBuilder ;
1112import ch .njol .util .Kleenean ;
1213import ch .njol .util .coll .CollectionUtils ;
14+ import org .bukkit .block .TrialSpawner ;
1315import org .bukkit .event .Event ;
1416import org .jetbrains .annotations .Nullable ;
1517import org .skriptlang .skript .bukkit .spawners .util .SpawnerDataType ;
1921import org .skriptlang .skript .bukkit .spawners .util .spawnerdata .SkriptTrialSpawnerData ;
2022import org .skriptlang .skript .registration .SyntaxRegistry ;
2123
22- import java .util .StringJoiner ;
24+ import java .util .ArrayList ;
25+ import java .util .List ;
2326
2427@ Name ("Spawner Data" )
2528@ Description ("""
2629 Returns the spawner data of a spawner. Since trial spawners use different data in its ominous and regular states, \
2730 you can specifically set the data of the ominous state using 'ominous trial spawner data'. Additionally, \
28- you can set the data of both states using 'ominous and regular trial spawner data', which will apply the data to \
29- both states of the trial spawner.
31+ you can set the data of both states using 'ominous and regular trial spawner data'.
3032 """ )
3133@ Example ("""
3234 set the spawner data of event-block to the mob spawner data:
4850 add {_entries::*} to the spawner entries
4951 set the base entity spawn count to 12
5052
51- set the trial spawner data of event-block to {_trial data} # regular data
52- set the ominous trial spawner data of event-block to {_trial data} # ominous data
53+ set the trial spawner data of event-block to {_trial data} # regular state
54+ set the ominous trial spawner data of event-block to {_trial data} # ominous state
5355 set the ominous and regular trial spawner datas of event-block to {_trial data} # both states
5456 """ )
5557@ RequiredPlugins ("Minecraft 1.21+ (for trial spawner data)" )
56- public class ExprSpawnerData extends SimplePropertyExpression <Object , SkriptSpawnerData > {
58+ public class ExprSpawnerData extends PropertyExpression <Object , SkriptSpawnerData > {
5759
5860 public static void register (SyntaxRegistry registry ) {
5961 String property = "[:mob] spawner data[s]" ;
6062 if (SpawnerUtils .IS_RUNNING_1_21 )
61- property = "[trial:[:ominous [ regular: and ( regular|normal] ] trial|:mob] spawner data[s]" ;
63+ property = "[trial:[:ominous|: regular|:ominous and regular] trial|:mob] spawner data[s]" ;
6264
6365 registry .register (SyntaxRegistry .EXPRESSION , infoBuilder (ExprSpawnerData .class , SkriptSpawnerData .class ,
6466 property , SpawnerUtils .spawnerPropertyType , false )
65- .supplier (ExprSpawnerData ::new )
66- .build ()
67+ .supplier (ExprSpawnerData ::new )
68+ .build ()
6769 );
6870 }
6971
72+ private enum TrialSpawnerState {
73+ OMINOUS , REGULAR , BOTH ;
74+
75+ public static TrialSpawnerState fromTags (List <String > tags ) {
76+ if (tags .contains ("ominous" )) {
77+ return OMINOUS ;
78+ } else if (tags .contains ("ominous and regular" )) {
79+ return BOTH ;
80+ } else {
81+ return REGULAR ;
82+ }
83+ }
84+ }
85+
7086 private SpawnerDataType dataType ;
71- private boolean ominous , regular ;
87+ private TrialSpawnerState state ;
7288
7389 @ Override
7490 public boolean init (Expression <?>[] expressions , int matchedPattern , Kleenean isDelayed , ParseResult parseResult ) {
7591 dataType = SpawnerDataType .fromTags (parseResult .tags );
76- ominous = parseResult .hasTag ("ominous" );
77- regular = parseResult .hasTag ("regular" );
78- return super .init (expressions , matchedPattern , isDelayed , parseResult );
92+ state = TrialSpawnerState .fromTags (parseResult .tags );
93+ return true ;
7994 }
8095
8196 @ Override
82- public @ Nullable SkriptSpawnerData convert (Object object ) {
83- return SpawnerUtils .getDataFromObject (object , dataType );
97+ protected SkriptSpawnerData [] get (Event event , Object [] source ) {
98+ List <SkriptSpawnerData > datas = new ArrayList <>();
99+
100+ for (Object spawnerObject : source ) {
101+ if (!dataType .matches (spawnerObject ))
102+ continue ;
103+
104+ if (SpawnerUtils .isMobSpawner (spawnerObject )) {
105+ if (SpawnerUtils .isSpawnerMinecart (spawnerObject )) {
106+ datas .add (SkriptMobSpawnerData .fromSpawner (SpawnerUtils .getSpawnerMinecart (spawnerObject )));
107+ } else {
108+ datas .add (SkriptMobSpawnerData .fromSpawner (SpawnerUtils .getCreatureSpawner (spawnerObject )));
109+ }
110+
111+ continue ;
112+ }
113+
114+ TrialSpawner trialSpawner = SpawnerUtils .getTrialSpawner (spawnerObject );
115+ datas .addAll (switch (state ) {
116+ case OMINOUS -> List .of (SkriptTrialSpawnerData .fromTrialSpawner (trialSpawner , true ));
117+ case REGULAR -> List .of (SkriptTrialSpawnerData .fromTrialSpawner (trialSpawner , false ));
118+ case BOTH -> List .of (
119+ SkriptTrialSpawnerData .fromTrialSpawner (trialSpawner , true ),
120+ SkriptTrialSpawnerData .fromTrialSpawner (trialSpawner , false )
121+ );
122+ });
123+ }
124+
125+ return datas .toArray (SkriptSpawnerData []::new );
84126 }
85127
86128 @ Override
@@ -95,34 +137,69 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
95137 public void change (Event event , Object @ Nullable [] delta , ChangeMode mode ) {
96138 SkriptSpawnerData data = delta != null ? (SkriptSpawnerData ) delta [0 ] : null ;
97139
98- for (Object object : getExpr ().getArray (event )) {
140+ for (Object spawnerObject : getExpr ().getArray (event )) {
141+ if (!dataType .matches (spawnerObject ))
142+ continue ;
143+
99144 if (data == null ) {
100- if (SpawnerUtils .isCreatureSpawner ( object ) || SpawnerUtils . isSpawnerMinecart ( object )) {
145+ if (SpawnerUtils .isMobSpawner ( spawnerObject )) {
101146 data = new SkriptMobSpawnerData ();
102- } else if (SpawnerUtils .isTrialSpawner (object )) {
147+ } else if (SpawnerUtils .isTrialSpawner (spawnerObject )) {
103148 data = new SkriptTrialSpawnerData ();
104149 }
105150 }
106151
107152 if (data == null )
108153 continue ;
109154
110- SpawnerUtils .applyData (data , object , dataType , ominous , regular );
155+ if (data instanceof SkriptMobSpawnerData mobData ) {
156+ SpawnerUtils .applyToMobSpawner (spawnerObject , mobData );
157+ continue ;
158+ }
159+
160+ assert data instanceof SkriptTrialSpawnerData ;
161+
162+ SkriptTrialSpawnerData trialData = (SkriptTrialSpawnerData ) data ;
163+ TrialSpawner trialSpawner = SpawnerUtils .getTrialSpawner (spawnerObject );
164+ switch (state ) {
165+ case OMINOUS -> trialData .applyData (trialSpawner , true );
166+ case REGULAR -> trialData .applyData (trialSpawner , false );
167+ case BOTH -> {
168+ trialData .applyData (trialSpawner , true );
169+ trialData .applyData (trialSpawner , false );
170+ }
171+ }
111172 }
112173 }
113174
175+ @ Override
176+ public boolean isSingle () {
177+ return getExpr ().isSingle () && state != TrialSpawnerState .BOTH ;
178+ }
179+
114180 @ Override
115181 public Class <? extends SkriptSpawnerData > getReturnType () {
116182 return dataType .getDataClass ();
117183 }
118184
119185 @ Override
120- protected String getPropertyName () {
121- StringJoiner joiner = new StringJoiner (" " , "" , "spawner data" );
122- if (ominous )
123- joiner .add ("ominous" );
124- joiner .add (dataType .toString ());
125- return joiner .toString ();
186+ public String toString (@ Nullable Event event , boolean debug ) {
187+ SyntaxStringBuilder builder = new SyntaxStringBuilder (event , debug );
188+
189+ builder .append ("the" );
190+ if (dataType .isTrial ()) {
191+ if (state == TrialSpawnerState .REGULAR ) {
192+ builder .append ("regular" );
193+ } else if (state == TrialSpawnerState .OMINOUS ) {
194+ builder .append ("ominous" );
195+ } else {
196+ builder .append ("ominous and regular" );
197+ }
198+ }
199+
200+ builder .append (dataType .toString () + " spawner data of" , getExpr ());
201+
202+ return builder .toString ();
126203 }
127204
128205}
0 commit comments