From fc7799dbd8dccfc592f493a29f02adbf995c1c81 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Mon, 26 Jun 2023 11:25:28 +0530 Subject: [PATCH] Added easier method to register enum parser and serializer --- .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 14 +++++++++-- .../entity/EntityPropertyRegistryImpl.java | 19 +++++++++----- .../entity/EnumPropertySerializer.java | 25 +++++++++++++++++++ .../NpcPosePropertySerializer.java | 21 ---------------- .../{NpcPoseParser.java => EnumParser.java} | 13 ++++++---- 5 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/EnumPropertySerializer.java delete mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NpcPosePropertySerializer.java rename plugin/src/main/java/lol/pyr/znpcsplus/parsers/{NpcPoseParser.java => EnumParser.java} (55%) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 0e2238d..8a8b24b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -52,12 +52,16 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.DyeColor; import org.bukkit.World; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Reader; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.ArrayList; @@ -259,9 +263,11 @@ public class ZNpcsPlus extends JavaPlugin { manager.registerParser(Boolean.class, new BooleanParser(incorrectUsageMessage)); manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage)); manager.registerParser(InteractionType.class, new InteractionTypeParser(incorrectUsageMessage)); - manager.registerParser(NpcPose.class, new NpcPoseParser(incorrectUsageMessage)); manager.registerParser(PotionColor.class, new PotionColorParser(incorrectUsageMessage)); + registerEnumParser(manager, NpcPose.class, incorrectUsageMessage); + registerEnumParser(manager, DyeColor.class, incorrectUsageMessage); + manager.registerCommand("npc", new MultiCommand(loadHelpMessage("root")) .addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry)) .addSubcommand("toggle", new ToggleCommand(npcRegistry)) @@ -292,6 +298,10 @@ public class ZNpcsPlus extends JavaPlugin { ); } + private > void registerEnumParser(CommandManager manager, Class clazz, Message message) { + manager.registerParser(clazz, new EnumParser<>(clazz, message)); + } + private Message loadHelpMessage(String name) { Reader reader = getTextResource("help-messages/" + name + ".txt"); if (reader == null) throw new RuntimeException(name + ".txt is missing from the help-messages folder in the ZNPCsPlus jar!"); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java index 5f029ca..3c8b25c 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -10,6 +10,7 @@ import lol.pyr.znpcsplus.util.NpcPose; import lol.pyr.znpcsplus.util.PotionColor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.DyeColor; import java.util.Collection; import java.util.Collections; @@ -28,9 +29,11 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new ItemStackPropertySerializer()); - registerSerializer(new NpcPosePropertySerializer()); registerSerializer(new PotionColorPropertySerializer()); + registerEnumSerializer(NpcPose.class); + registerEnumSerializer(DyeColor.class); + registerType("glow", NamedTextColor.class); registerType("fire", false); registerType("invisible", false); @@ -98,7 +101,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("horse_saddle", false); // TODO // LLama - registerType("carpet_color", -1); // TODO + registerType("carpet_color", DyeColor.class); // TODO registerType("llama_variant", 0); // TODO // Axolotl @@ -135,7 +138,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("polar_bear_standing", false); // TODO // Sheep - registerType("sheep_color", 0); // TODO: Figure this out + registerType("sheep_color", DyeColor.WHITE); // TODO: Figure this out registerType("sheep_sheared", false); // TODO // Strider @@ -145,10 +148,10 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { // Cat registerType("cat_variant", null); // TODO: Custom type registerType("cat_laying", false); // TODO - registerType("cat_collar_color", 14); // TODO + registerType("cat_collar_color", DyeColor.RED); // TODO // Wolf - registerType("wolf_collar_color", 14); // TODO + registerType("wolf_collar_color", DyeColor.RED); // TODO registerType("wolf_angry", false); // TODO // Parrot @@ -164,7 +167,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { // Shulker registerType("attach_direction", null); // TODO: make a direction enum registerType("shield_height", 0); // TODO: figure this out - registerType("shulker_color", 10); // TODO + registerType("shulker_color", DyeColor.RED); // TODO // Piglin / Hoglin registerType("immune_to_zombification", false); // TODO @@ -208,6 +211,10 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { serializerMap.put(serializer.getTypeClass(), serializer); } + private > void registerEnumSerializer(Class clazz) { + serializerMap.put(clazz, new EnumPropertySerializer<>(clazz)); + } + private void registerType(String name, Class type) { registerType(name, null, type); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EnumPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EnumPropertySerializer.java new file mode 100644 index 0000000..c9a93c8 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EnumPropertySerializer.java @@ -0,0 +1,25 @@ +package lol.pyr.znpcsplus.entity; + +public class EnumPropertySerializer> implements PropertySerializer { + + private final Class enumClass; + + public EnumPropertySerializer(Class enumClass) { + this.enumClass = enumClass; + } + + @Override + public String serialize(T property) { + return property.name(); + } + + @Override + public T deserialize(String property) { + return Enum.valueOf(enumClass, property.toUpperCase()); + } + + @Override + public Class getTypeClass() { + return enumClass; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NpcPosePropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NpcPosePropertySerializer.java deleted file mode 100644 index d8ca9be..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NpcPosePropertySerializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package lol.pyr.znpcsplus.entity.serializers; - -import lol.pyr.znpcsplus.entity.PropertySerializer; -import lol.pyr.znpcsplus.util.NpcPose; - -public class NpcPosePropertySerializer implements PropertySerializer { - @Override - public String serialize(NpcPose property) { - return property.name(); - } - - @Override - public NpcPose deserialize(String property) { - return NpcPose.valueOf(property.toUpperCase()); - } - - @Override - public Class getTypeClass() { - return NpcPose.class; - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EnumParser.java similarity index 55% rename from plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java rename to plugin/src/main/java/lol/pyr/znpcsplus/parsers/EnumParser.java index 9f10488..344c1b9 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EnumParser.java @@ -4,19 +4,22 @@ import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.parse.ParserType; import lol.pyr.director.common.command.CommandExecutionException; import lol.pyr.director.common.message.Message; -import lol.pyr.znpcsplus.util.NpcPose; import java.util.Deque; -public class NpcPoseParser extends ParserType { - public NpcPoseParser(Message message) { +public class EnumParser> extends ParserType { + + private final Class enumClass; + + public EnumParser(Class enumClass, Message message) { super(message); + this.enumClass = enumClass; } @Override - public NpcPose parse(Deque deque) throws CommandExecutionException { + public T parse(Deque deque) throws CommandExecutionException { try { - return NpcPose.valueOf(deque.pop().toUpperCase()); + return Enum.valueOf(enumClass, deque.pop().toUpperCase()); } catch (IllegalArgumentException e) { throw new CommandExecutionException(); }