Skip to content

Commit 91d1faf

Browse files
committed
Add serialization methods to SpawnerData classes
1 parent d732346 commit 91d1faf

5 files changed

Lines changed: 144 additions & 145 deletions

File tree

src/main/java/ch/njol/skript/classes/data/SkriptClasses.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313
import ch.njol.skript.lang.ParseContext;
1414
import ch.njol.skript.lang.function.DynamicFunctionReference;
1515
import ch.njol.skript.lang.util.SimpleLiteral;
16-
import ch.njol.skript.lang.util.common.AnyAmount;
17-
import ch.njol.skript.lang.util.common.AnyContains;
18-
import ch.njol.skript.lang.util.common.AnyNamed;
19-
import ch.njol.skript.lang.util.common.AnyValued;
16+
import ch.njol.skript.lang.util.common.*;
2017
import ch.njol.skript.localization.Noun;
2118
import ch.njol.skript.localization.RegexMessage;
2219
import ch.njol.skript.registrations.Classes;
@@ -964,6 +961,14 @@ public String toVariableNameString(DynamicFunctionReference<?> function) {
964961
.examples("{a} contains {b}")
965962
.since("2.10")
966963
);
964+
965+
Classes.registerClass(new AnyInfo<>(AnyWeighted.class, "weighted")
966+
.name("Any Weighted Thing")
967+
.description("Something that has a weight.")
968+
.usage("")
969+
.examples("the weight of {spawner_entry}")
970+
.since("INSERT VERSION")
971+
);
967972
}
968973

969974
}

src/main/java/org/skriptlang/skript/bukkit/spawners/SpawnerModule.java

Lines changed: 11 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.skriptlang.skript.bukkit.spawners;
22

3-
import ch.njol.skript.Skript;
43
import ch.njol.skript.bukkitutil.EntityUtils;
54
import ch.njol.skript.classes.*;
65
import ch.njol.skript.entity.EntityData;
@@ -20,7 +19,6 @@
2019
import org.bukkit.event.entity.TrialSpawnerSpawnEvent;
2120
import org.bukkit.inventory.EquipmentSlot;
2221
import org.bukkit.loot.LootTable;
23-
import org.jetbrains.annotations.NotNull;
2422
import org.skriptlang.skript.addon.AddonModule;
2523
import org.skriptlang.skript.addon.SkriptAddon;
2624
import org.skriptlang.skript.bukkit.spawners.util.SkriptSpawnerEntry;
@@ -31,10 +29,7 @@
3129
import org.skriptlang.skript.bukkit.spawners.util.spawnerdata.SkriptMobSpawnerData;
3230
import org.skriptlang.skript.bukkit.spawners.util.spawnerdata.SkriptSpawnerData;
3331
import org.skriptlang.skript.bukkit.spawners.util.spawnerdata.SkriptTrialSpawnerData;
34-
import org.skriptlang.skript.lang.converter.Converter;
35-
import org.skriptlang.skript.lang.converter.Converters;
3632

37-
import java.io.IOException;
3833
import java.io.StreamCorruptedException;
3934
import java.util.HashMap;
4035
import java.util.Map;
@@ -50,7 +45,6 @@ public void init(SkriptAddon addon) {
5045
.name("Spawner Data")
5146
.description("todo")
5247
.since("INSERT VERSION")
53-
.serializer(new YggdrasilSerializer<>())
5448
);
5549

5650
Classes.registerClass(new ClassInfo<>(SkriptMobSpawnerData.class, "mobspawnerdata")
@@ -159,10 +153,8 @@ protected SkriptSpawnerEntry deserialize(Fields fields) throws StreamCorruptedEx
159153

160154
Map<EquipmentSlot, Float> dropChances = new HashMap<>();
161155
int count = 0;
162-
while (true) {
156+
while (fields.contains("equipment_slot_" + count)) {
163157
EquipmentSlot slot = fields.getObject("equipment_slot_" + count, EquipmentSlot.class);
164-
if (slot == null)
165-
break;
166158
float chance = fields.getPrimitive("chance_" + count, float.class);
167159
dropChances.put(slot, chance);
168160
count++;
@@ -257,6 +249,16 @@ protected boolean canBeInstantiated() {
257249
EventValues.registerEventValue(MobSpawnerDataEvent.class, SkriptMobSpawnerData.class, MobSpawnerDataEvent::getSpawnerData);
258250
EventValues.registerEventValue(SpawnerEntryEvent.class, SkriptSpawnerEntry.class, SpawnerEntryEvent::getSpawnerEntry);
259251
EventValues.registerEventValue(SpawnRuleEvent.class, SpawnRule.class, SpawnRuleEvent::getSpawnRule);
252+
253+
EventValues.registerEventValue(SpawnerSpawnEvent.class, Location.class, SpawnerSpawnEvent::getLocation);
254+
EventValues.registerEventValue(SpawnerSpawnEvent.class, Entity.class, SpawnerSpawnEvent::getEntity);
255+
256+
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Block.class, event -> event.getTrialSpawner().getBlock());
257+
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Location.class, TrialSpawnerSpawnEvent::getLocation);
258+
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Entity.class, TrialSpawnerSpawnEvent::getEntity);
259+
260+
EventValues.registerEventValue(PreSpawnerSpawnEvent.class, EntityData.class,
261+
event -> EntityUtils.toSkriptEntityData(event.getType()));
260262
}
261263

262264
@Override
@@ -365,66 +367,6 @@ public String toVariableNameString(SpawnerEntry entry) {
365367
})
366368
);
367369

368-
Classes.registerClass(new ClassInfo<>(SpawnerEntryEquipment.class, "spawnerentryequipment")
369-
.user("spawner ?entry ?equipments?")
370-
.name("Spawner Entry Equipment")
371-
.description(
372-
"Represents a spawner entry equipment. Spawner entry equipments are used to specify the equipment "
373-
+ "that an entity will spawn with. This includes the equipment loot table and the drop chances for each "
374-
+ "equipment slot. You can find more information about this in the Minecraft wiki for "
375-
+ "<a href='https://minecraft.wiki/w/Monster_Spawner'>spawners</a>")
376-
.since("INSERT VERSION")
377-
.requiredPlugins("MC 1.21+")
378-
.parser(new Parser<>() {
379-
@Override
380-
public boolean canParse(ParseContext context) {
381-
return false;
382-
}
383-
384-
@Override
385-
public String toString(SpawnerEntryEquipment equipment, int flags) {
386-
return "spawner entry equipment with "
387-
+ Classes.toString(equipment.getLootTable())
388-
+ " and "
389-
+ Classes.toString(equipment.getDropChances().toArray(), true);
390-
}
391-
392-
@Override
393-
public String toVariableNameString(SpawnerEntryEquipment equipment) {
394-
return "spawner entry equipment:" + equipment.hashCode();
395-
}
396-
})
397-
);
398-
399-
Classes.registerClass(new ClassInfo<>(DropChance.class, "equipmentdropchance")
400-
.user("(spawner entry ?)?equipment ?drop ?chances?")
401-
.name("Spawner Entry Equipment Drop Chance")
402-
.description("Represents a spawner entry's equipment drop chance. This is used to specify the drop chance "
403-
+ "for an equipment slot. You can find more information about this in the Minecraft wiki for "
404-
+ "<a href='https://minecraft.wiki/w/Monster_Spawner'>spawners</a>")
405-
.since("INSERT VERSION")
406-
.requiredPlugins("MC 1.21+")
407-
.parser(new Parser<>() {
408-
@Override
409-
public boolean canParse(ParseContext context) {
410-
return false;
411-
}
412-
413-
@Override
414-
public String toString(DropChance equipment, int flags) {
415-
return "equipment drop with chance "
416-
+ equipment.getDropChance()
417-
+ " for "
418-
+ Classes.toString(equipment.getEquipmentSlot());
419-
}
420-
421-
@Override
422-
public String toVariableNameString(DropChance equipment) {
423-
return "equipment drop:" + equipment.getEquipmentSlot() + ',' + equipment.getDropChance();
424-
}
425-
})
426-
);
427-
428370
Classes.registerClass(new ClassInfo<>(SpawnRule.class, "spawnrule")
429371
.user("spawn ?rules?")
430372
.name("Spawn Rule")
@@ -496,70 +438,6 @@ protected boolean canBeInstantiated() {
496438
}
497439
})
498440
);
499-
500-
Classes.registerClass(new AnyInfo<>(AnySpawnerWeighted.class, "spawnerweighted")
501-
.user("spawner ?weighteds?")
502-
.name("Any Spawner Weighted Thing")
503-
.description("Something related to spawners that has a weight.")
504-
.usage("")
505-
.examples("the weight of {_spawner entry}", "the weight of {_weighted loot table}")
506-
.since("INSERT VERSION")
507-
.defaultExpression(new EventValueExpression<>(AnySpawnerWeighted.class))
508-
);
509-
510-
//todo: remove after merge of equippable pr
511-
Classes.registerClass(new EnumClassInfo<>(EquipmentSlot.class, "equipmentslot", "equipment slots")
512-
.user("equipment slot")
513-
.name("Equipment Slot")
514-
.description("Represents an equipment slot.")
515-
.since("INSERT VERSION")
516-
);
517-
518-
ADDON = addon;
519-
SYNTAX_REGISTRY = addon.syntaxRegistry();
520-
try {
521-
Skript.getAddonInstance().loadClasses(
522-
"me.burb.skriptspawner.spawner",
523-
"elements");
524-
} catch (IOException e) {
525-
throw new RuntimeException(e);
526-
}
527-
528-
Converters.registerConverter(SpawnerEntry.class, AnySpawnerWeighted.class,
529-
entry -> new AnySpawnerWeighted() {
530-
@Override
531-
public @NotNull Integer spawnerWeight() {
532-
return entry.getSpawnWeight();
533-
}
534-
535-
@Override
536-
public boolean supportsSpawnerWeightChange() {
537-
return true;
538-
}
539-
540-
@Override
541-
public void setSpawnerWeight(Integer weight) throws UnsupportedOperationException {
542-
if (weight > 0)
543-
entry.setSpawnWeight(weight);
544-
}
545-
}, Converter.NO_RIGHT_CHAINING);
546-
547-
EventValues.registerEventValue(SpawnerSpawnEvent.class, Block.class, event -> {
548-
if (event.getSpawner() != null)
549-
return event.getSpawner().getBlock();
550-
return null;
551-
});
552-
EventValues.registerEventValue(SpawnerSpawnEvent.class, Location.class, SpawnerSpawnEvent::getLocation);
553-
EventValues.registerEventValue(SpawnerSpawnEvent.class, Entity.class, SpawnerSpawnEvent::getEntity);
554-
555-
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Block.class, event -> event.getTrialSpawner().getBlock());
556-
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Location.class, TrialSpawnerSpawnEvent::getLocation);
557-
EventValues.registerEventValue(TrialSpawnerSpawnEvent.class, Entity.class, TrialSpawnerSpawnEvent::getEntity);
558-
559-
if (Skript.classExists("com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent")) {
560-
EventValues.registerEventValue(PreSpawnerSpawnEvent.class, EntityData.class,
561-
event -> EntityUtils.toSkriptEntityData(event.getType()));
562-
}
563441
}
564442

565443
}

src/main/java/org/skriptlang/skript/bukkit/spawners/util/spawnerdata/SkriptMobSpawnerData.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import ch.njol.skript.util.Timespan;
44
import ch.njol.skript.util.Timespan.TimePeriod;
5-
import ch.njol.yggdrasil.YggdrasilSerializable;
5+
import ch.njol.yggdrasil.Fields;
6+
import ch.njol.yggdrasil.YggdrasilSerializable.YggdrasilExtendedSerializable;
67
import com.google.common.base.Preconditions;
78
import org.bukkit.block.CreatureSpawner;
89
import org.bukkit.entity.minecart.SpawnerMinecart;
@@ -11,6 +12,7 @@
1112
import org.skriptlang.skript.bukkit.spawners.util.SkriptSpawnerEntry;
1213
import org.skriptlang.skript.bukkit.spawners.util.SpawnerUtils;
1314

15+
import java.io.StreamCorruptedException;
1416
import java.util.stream.Collectors;
1517

1618
/**
@@ -19,11 +21,13 @@
1921
* @see SkriptTrialSpawnerData
2022
* @see SkriptSpawnerData
2123
*/
22-
public class SkriptMobSpawnerData extends SkriptSpawnerData implements YggdrasilSerializable {
24+
public class SkriptMobSpawnerData extends SkriptSpawnerData implements YggdrasilExtendedSerializable {
2325

2426
private int maxNearbyEntityCap = SpawnerUtils.DEFAULT_MAX_NEARBY_ENTITIES;
2527
private int spawnCount = SpawnerUtils.DEFAULT_SPAWN_COUNT;
2628

29+
public SkriptMobSpawnerData() {}
30+
2731
/**
2832
* Creates a new SkriptSpawnerData instance from the given Bukkit {@link Spawner}.
2933
* @param spawner the Bukkit spawner to convert
@@ -179,4 +183,26 @@ public void setSpawnCount(int spawnCount) {
179183
this.spawnCount = spawnCount;
180184
}
181185

186+
/*
187+
* YggdrasilExtendedSerializable
188+
*/
189+
190+
@Override
191+
public Fields serialize() {
192+
Fields fields = super.serialize();
193+
194+
fields.putPrimitive("max_nearby_entity_cap", this.maxNearbyEntityCap);
195+
fields.putPrimitive("spawn_count", this.spawnCount);
196+
197+
return fields;
198+
}
199+
200+
@Override
201+
public void deserialize(@NotNull Fields fields) throws StreamCorruptedException {
202+
super.deserialize(fields);
203+
204+
this.maxNearbyEntityCap = fields.getPrimitive("max_nearby_entity_cap", int.class);
205+
this.spawnCount = fields.getPrimitive("spawn_count", int.class);
206+
}
207+
182208
}

src/main/java/org/skriptlang/skript/bukkit/spawners/util/spawnerdata/SkriptSpawnerData.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package org.skriptlang.skript.bukkit.spawners.util.spawnerdata;
22

33
import ch.njol.skript.util.Timespan;
4-
import ch.njol.yggdrasil.YggdrasilSerializable;
4+
import ch.njol.yggdrasil.Fields;
55
import com.google.common.base.Preconditions;
66
import org.bukkit.spawner.BaseSpawner;
77
import org.jetbrains.annotations.NotNull;
88
import org.skriptlang.skript.bukkit.spawners.util.SkriptSpawnerEntry;
99
import org.skriptlang.skript.bukkit.spawners.util.SpawnerUtils;
1010

11+
import java.io.StreamCorruptedException;
1112
import java.util.HashSet;
12-
import java.util.List;
1313
import java.util.Set;
1414
import java.util.stream.Collectors;
1515

1616
/**
1717
* Abstract class representing the data of a trial spawner or a regular spawner.
1818
*/
19-
public abstract class SkriptSpawnerData implements YggdrasilSerializable {
19+
public abstract class SkriptSpawnerData {
2020

2121
private int activationRange = SpawnerUtils.DEFAULT_ACTIVATION_RANGE;
2222
private int spawnRange = SpawnerUtils.DEFAULT_SPAWN_RANGE;
@@ -254,4 +254,38 @@ public void clearSpawnerEntries() {
254254
spawnerEntries.clear();
255255
}
256256

257+
/*
258+
* Serialization
259+
*/
260+
261+
protected Fields serialize() {
262+
Fields fields = new Fields();
263+
fields.putPrimitive("activation_range", this.activationRange);
264+
fields.putPrimitive("spawn_range", this.spawnRange);
265+
fields.putObject("min_spawn_delay", this.minSpawnDelay);
266+
fields.putObject("max_spawn_delay", this.maxSpawnDelay);
267+
268+
int count = 0;
269+
for (SkriptSpawnerEntry entry : this.spawnerEntries) {
270+
fields.putObject("spawner_entry_" + count, entry);
271+
count++;
272+
}
273+
274+
return fields;
275+
}
276+
277+
protected void deserialize(@NotNull Fields fields) throws StreamCorruptedException {
278+
this.activationRange = fields.getPrimitive("activation_range", int.class);
279+
this.spawnRange = fields.getPrimitive("spawn_range", int.class);
280+
281+
this.minSpawnDelay = fields.getObject("min_spawn_delay", Timespan.class);
282+
this.maxSpawnDelay = fields.getObject("max_spawn_delay", Timespan.class);
283+
284+
int count = 0;
285+
while (fields.contains("spawner_entry_" + count)) {
286+
this.spawnerEntries.add(fields.getObject("spawner_entry_" + count, SkriptSpawnerEntry.class));
287+
count++;
288+
}
289+
}
290+
257291
}

0 commit comments

Comments
 (0)