Added easier method to register enum parser and serializer

This commit is contained in:
D3v1s0m 2023-06-26 11:25:28 +05:30
parent 127f8f49af
commit fc7799dbd8
No known key found for this signature in database
GPG Key ID: 3B6EC35367B8D82E
5 changed files with 58 additions and 34 deletions

@ -52,12 +52,16 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; 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.Files;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.ArrayList; import java.util.ArrayList;
@ -259,9 +263,11 @@ public class ZNpcsPlus extends JavaPlugin {
manager.registerParser(Boolean.class, new BooleanParser(incorrectUsageMessage)); manager.registerParser(Boolean.class, new BooleanParser(incorrectUsageMessage));
manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage)); manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage));
manager.registerParser(InteractionType.class, new InteractionTypeParser(incorrectUsageMessage)); manager.registerParser(InteractionType.class, new InteractionTypeParser(incorrectUsageMessage));
manager.registerParser(NpcPose.class, new NpcPoseParser(incorrectUsageMessage));
manager.registerParser(PotionColor.class, new PotionColorParser(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")) manager.registerCommand("npc", new MultiCommand(loadHelpMessage("root"))
.addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry)) .addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry))
.addSubcommand("toggle", new ToggleCommand(npcRegistry)) .addSubcommand("toggle", new ToggleCommand(npcRegistry))
@ -292,6 +298,10 @@ public class ZNpcsPlus extends JavaPlugin {
); );
} }
private <T extends Enum<T>> void registerEnumParser(CommandManager manager, Class<T> clazz, Message<CommandContext> message) {
manager.registerParser(clazz, new EnumParser<>(clazz, message));
}
private Message<CommandContext> loadHelpMessage(String name) { private Message<CommandContext> loadHelpMessage(String name) {
Reader reader = getTextResource("help-messages/" + name + ".txt"); 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!"); if (reader == null) throw new RuntimeException(name + ".txt is missing from the help-messages folder in the ZNPCsPlus jar!");

@ -10,6 +10,7 @@ import lol.pyr.znpcsplus.util.NpcPose;
import lol.pyr.znpcsplus.util.PotionColor; import lol.pyr.znpcsplus.util.PotionColor;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.DyeColor;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -28,9 +29,11 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new NamedTextColorPropertySerializer());
registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new SkinDescriptorSerializer(skinCache));
registerSerializer(new ItemStackPropertySerializer()); registerSerializer(new ItemStackPropertySerializer());
registerSerializer(new NpcPosePropertySerializer());
registerSerializer(new PotionColorPropertySerializer()); registerSerializer(new PotionColorPropertySerializer());
registerEnumSerializer(NpcPose.class);
registerEnumSerializer(DyeColor.class);
registerType("glow", NamedTextColor.class); registerType("glow", NamedTextColor.class);
registerType("fire", false); registerType("fire", false);
registerType("invisible", false); registerType("invisible", false);
@ -98,7 +101,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("horse_saddle", false); // TODO registerType("horse_saddle", false); // TODO
// LLama // LLama
registerType("carpet_color", -1); // TODO registerType("carpet_color", DyeColor.class); // TODO
registerType("llama_variant", 0); // TODO registerType("llama_variant", 0); // TODO
// Axolotl // Axolotl
@ -135,7 +138,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("polar_bear_standing", false); // TODO registerType("polar_bear_standing", false); // TODO
// Sheep // Sheep
registerType("sheep_color", 0); // TODO: Figure this out registerType("sheep_color", DyeColor.WHITE); // TODO: Figure this out
registerType("sheep_sheared", false); // TODO registerType("sheep_sheared", false); // TODO
// Strider // Strider
@ -145,10 +148,10 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
// Cat // Cat
registerType("cat_variant", null); // TODO: Custom type registerType("cat_variant", null); // TODO: Custom type
registerType("cat_laying", false); // TODO registerType("cat_laying", false); // TODO
registerType("cat_collar_color", 14); // TODO registerType("cat_collar_color", DyeColor.RED); // TODO
// Wolf // Wolf
registerType("wolf_collar_color", 14); // TODO registerType("wolf_collar_color", DyeColor.RED); // TODO
registerType("wolf_angry", false); // TODO registerType("wolf_angry", false); // TODO
// Parrot // Parrot
@ -164,7 +167,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
// Shulker // Shulker
registerType("attach_direction", null); // TODO: make a direction enum registerType("attach_direction", null); // TODO: make a direction enum
registerType("shield_height", 0); // TODO: figure this out registerType("shield_height", 0); // TODO: figure this out
registerType("shulker_color", 10); // TODO registerType("shulker_color", DyeColor.RED); // TODO
// Piglin / Hoglin // Piglin / Hoglin
registerType("immune_to_zombification", false); // TODO registerType("immune_to_zombification", false); // TODO
@ -208,6 +211,10 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
serializerMap.put(serializer.getTypeClass(), serializer); serializerMap.put(serializer.getTypeClass(), serializer);
} }
private <T extends Enum<T>> void registerEnumSerializer(Class<T> clazz) {
serializerMap.put(clazz, new EnumPropertySerializer<>(clazz));
}
private <T> void registerType(String name, Class<T> type) { private <T> void registerType(String name, Class<T> type) {
registerType(name, null, type); registerType(name, null, type);
} }

@ -0,0 +1,25 @@
package lol.pyr.znpcsplus.entity;
public class EnumPropertySerializer<T extends Enum<T>> implements PropertySerializer<T> {
private final Class<T> enumClass;
public EnumPropertySerializer(Class<T> 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<T> getTypeClass() {
return enumClass;
}
}

@ -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<NpcPose> {
@Override
public String serialize(NpcPose property) {
return property.name();
}
@Override
public NpcPose deserialize(String property) {
return NpcPose.valueOf(property.toUpperCase());
}
@Override
public Class<NpcPose> getTypeClass() {
return NpcPose.class;
}
}

@ -4,19 +4,22 @@ import lol.pyr.director.adventure.command.CommandContext;
import lol.pyr.director.adventure.parse.ParserType; import lol.pyr.director.adventure.parse.ParserType;
import lol.pyr.director.common.command.CommandExecutionException; import lol.pyr.director.common.command.CommandExecutionException;
import lol.pyr.director.common.message.Message; import lol.pyr.director.common.message.Message;
import lol.pyr.znpcsplus.util.NpcPose;
import java.util.Deque; import java.util.Deque;
public class NpcPoseParser extends ParserType<NpcPose> { public class EnumParser<T extends Enum<T>> extends ParserType<T> {
public NpcPoseParser(Message<CommandContext> message) {
private final Class<T> enumClass;
public EnumParser(Class<T> enumClass, Message<CommandContext> message) {
super(message); super(message);
this.enumClass = enumClass;
} }
@Override @Override
public NpcPose parse(Deque<String> deque) throws CommandExecutionException { public T parse(Deque<String> deque) throws CommandExecutionException {
try { try {
return NpcPose.valueOf(deque.pop().toUpperCase()); return Enum.valueOf(enumClass, deque.pop().toUpperCase());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new CommandExecutionException(); throw new CommandExecutionException();
} }