Skip to content

Commit e426a1a

Browse files
committed
Fix SecModifySpawnerData and ExprSpawnerData & cleanup
1 parent 467c2ba commit e426a1a

7 files changed

Lines changed: 195 additions & 131 deletions

File tree

src/main/java/org/skriptlang/skript/bukkit/spawners/elements/effects/EffSpawnerItem.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
@Name("Modify Spawner Item")
2121
@Description("""
22-
Make a mob spawner spawn items rather than entities. In this case, the mob spawner's spawn count determines how many \
23-
stacks are spawned, not how many items should be in each stack.
22+
Make a mob spawner spawn items rather than entities. In this case, the mob spawner's spawn count determines \
23+
how many stacks are spawned, not how many items should be in each stack.
2424
""")
2525
@Example("""
2626
make event-block spawn 15 diamonds

src/main/java/org/skriptlang/skript/bukkit/spawners/elements/expressions/spawner/spawnerdata/ExprSpawnerData.java

Lines changed: 103 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import ch.njol.skript.doc.Example;
66
import ch.njol.skript.doc.Name;
77
import ch.njol.skript.doc.RequiredPlugins;
8-
import ch.njol.skript.expressions.base.SimplePropertyExpression;
8+
import ch.njol.skript.expressions.base.PropertyExpression;
99
import ch.njol.skript.lang.Expression;
1010
import ch.njol.skript.lang.SkriptParser.ParseResult;
11+
import ch.njol.skript.lang.SyntaxStringBuilder;
1112
import ch.njol.util.Kleenean;
1213
import ch.njol.util.coll.CollectionUtils;
14+
import org.bukkit.block.TrialSpawner;
1315
import org.bukkit.event.Event;
1416
import org.jetbrains.annotations.Nullable;
1517
import org.skriptlang.skript.bukkit.spawners.util.SpawnerDataType;
@@ -19,14 +21,14 @@
1921
import org.skriptlang.skript.bukkit.spawners.util.spawnerdata.SkriptTrialSpawnerData;
2022
import 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:
@@ -48,39 +50,79 @@
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
}

src/main/java/org/skriptlang/skript/bukkit/spawners/elements/sections/SecModifySpawnerData.java

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ch.njol.skript.lang.util.SectionUtils;
77
import ch.njol.skript.variables.Variables;
88
import ch.njol.util.Kleenean;
9+
import org.bukkit.block.TrialSpawner;
910
import org.bukkit.event.Event;
1011
import org.jetbrains.annotations.Nullable;
1112
import org.skriptlang.skript.bukkit.spawners.util.SpawnerDataType;
@@ -30,23 +31,36 @@ public static void register(SyntaxRegistry registry) {
3031
.addPattern("modify [the] [:mob] spawner data of %" + SpawnerUtils.spawnerPropertyType + '%');
3132

3233
if (SpawnerUtils.IS_RUNNING_1_21)
33-
info.addPattern("modify [the] [:ominous [regular:and (regular|normal]] trial:trial spawner data of %blocks%");
34+
info.addPattern("modify [the] [:ominous|:regular|:ominous and regular] trial:trial spawner data of %blocks%");
3435

3536
registry.register(SyntaxRegistry.SECTION, info.build());
3637
}
3738

39+
private enum TrialSpawnerState {
40+
OMINOUS, REGULAR, BOTH;
41+
42+
public static TrialSpawnerState fromTags(List<String> tags) {
43+
if (tags.contains("ominous")) {
44+
return OMINOUS;
45+
} else if (tags.contains("ominous and regular")) {
46+
return BOTH;
47+
} else {
48+
return REGULAR;
49+
}
50+
}
51+
}
52+
3853
private Expression<?> spawners;
3954
private SpawnerDataType dataType;
40-
private boolean ominous, regular;
55+
private TrialSpawnerState state;
4156

4257
private Trigger trigger;
4358

4459
@Override
4560
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult, SectionNode sectionNode, List<TriggerItem> triggerItems) {
4661
spawners = exprs[0];
4762
dataType = SpawnerDataType.fromTags(parseResult.tags);
48-
ominous = parseResult.hasTag("ominous");
49-
regular = parseResult.hasTag("regular");
63+
state = TrialSpawnerState.fromTags(parseResult.tags);
5064

5165
trigger = SectionUtils.loadLinkedCode("modify spawner data", (beforeLoading, afterLoading)
5266
-> loadCode(sectionNode, "modify spawner data", beforeLoading, afterLoading, SpawnerDataEvent.class));
@@ -55,23 +69,44 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
5569

5670
@Override
5771
protected @Nullable TriggerItem walk(Event event) {
58-
for (Object object : spawners.getArray(event)) {
59-
SkriptSpawnerData data = SpawnerUtils.getDataFromObject(object, dataType);
60-
61-
if (data == null)
72+
for (Object spawnerObject : spawners.getArray(event)) {
73+
if (!dataType.matches(spawnerObject))
6274
continue;
6375

64-
SpawnerDataEvent dataEvent = switch (dataType) {
65-
case MOB -> new MobSpawnerDataEvent((SkriptMobSpawnerData) data);
66-
case TRIAL -> new TrialSpawnerDataEvent((SkriptTrialSpawnerData) data);
67-
case ANY -> new SpawnerDataEvent(data, dataType);
68-
};
69-
70-
Variables.withLocalVariables(event, dataEvent, () ->
71-
TriggerItem.walk(trigger, dataEvent)
72-
);
73-
74-
SpawnerUtils.applyData(data, object, dataType, ominous, regular);
76+
SkriptSpawnerData data;
77+
78+
if (SpawnerUtils.isCreatureSpawner(spawnerObject)) {
79+
data = SkriptMobSpawnerData.fromSpawner(SpawnerUtils.getCreatureSpawner(spawnerObject));
80+
} else if (SpawnerUtils.isSpawnerMinecart(spawnerObject)) {
81+
data = SkriptMobSpawnerData.fromSpawner(SpawnerUtils.getSpawnerMinecart(spawnerObject));
82+
} else {
83+
data = SkriptTrialSpawnerData.fromTrialSpawner(SpawnerUtils.getTrialSpawner(spawnerObject),
84+
state == TrialSpawnerState.OMINOUS);
85+
}
86+
87+
if (data instanceof SkriptMobSpawnerData mobData) {
88+
MobSpawnerDataEvent mobEvent = new MobSpawnerDataEvent(mobData);
89+
Variables.withLocalVariables(event, mobEvent, () -> TriggerItem.walk(trigger, mobEvent));
90+
SpawnerUtils.applyToMobSpawner(spawnerObject, mobData);
91+
} else if (data instanceof SkriptTrialSpawnerData trialData) {
92+
TrialSpawner trialSpawner = SpawnerUtils.getTrialSpawner(spawnerObject);
93+
94+
TrialSpawnerDataEvent regularEvent = new TrialSpawnerDataEvent(trialData);
95+
Variables.withLocalVariables(event, regularEvent, () -> TriggerItem.walk(trigger, regularEvent));
96+
97+
if (state == TrialSpawnerState.BOTH) {
98+
// guaranteed to be the regular data here
99+
trialData.applyData(trialSpawner, false);
100+
101+
// modify the ominous data
102+
trialData = SkriptTrialSpawnerData.fromTrialSpawner(trialSpawner, true);
103+
TrialSpawnerDataEvent ominousEvent = new TrialSpawnerDataEvent(trialData);
104+
Variables.withLocalVariables(event, ominousEvent, () -> TriggerItem.walk(trigger, ominousEvent));
105+
trialData.applyData(trialSpawner, true);
106+
} else {
107+
trialData.applyData(trialSpawner, state == TrialSpawnerState.OMINOUS);
108+
}
109+
}
75110
}
76111

77112
return super.walk(event, false);
@@ -82,8 +117,15 @@ public String toString(@Nullable Event event, boolean debug) {
82117
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
83118

84119
builder.append("modify the");
85-
if (ominous)
86-
builder.append("ominous");
120+
if (dataType.isTrial()) {
121+
if (state == TrialSpawnerState.REGULAR) {
122+
builder.append("regular");
123+
} else if (state == TrialSpawnerState.OMINOUS) {
124+
builder.append("ominous");
125+
} else {
126+
builder.append("ominous and regular");
127+
}
128+
}
87129
builder.append(dataType.toString(), "spawner data of", spawners);
88130

89131
return builder.toString();

src/main/java/org/skriptlang/skript/bukkit/spawners/util/SpawnerDataType.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ public boolean isAny() {
6565
return this == ANY;
6666
}
6767

68+
/**
69+
* Checks if the given spawner object matches this spawner data type.
70+
* @param spawnerObject the spawner object to check
71+
* @return true if the spawner object matches the type, false otherwise
72+
*/
73+
public boolean matches(Object spawnerObject) {
74+
if (isTrial()) {
75+
return SpawnerUtils.isTrialSpawner(spawnerObject);
76+
} else if (isMob()) {
77+
return SpawnerUtils.isMobSpawner(spawnerObject);
78+
}
79+
80+
return SpawnerUtils.isMobSpawner(spawnerObject) || SpawnerUtils.isTrialSpawner(spawnerObject);
81+
}
82+
6883
@Override
6984
public String toString() {
7085
if (isAny())

0 commit comments

Comments
 (0)