Added easier method to register enum parser and serializer
This commit is contained in:
parent
127f8f49af
commit
fc7799dbd8
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();
|
||||||
}
|
}
|
Loading…
Reference in a new issue