From fa8247f285d069ad91adbc9e36d126ba2de5c4aa Mon Sep 17 00:00:00 2001 From: Pyrbu Date: Sun, 21 May 2023 14:25:21 +0100 Subject: [PATCH] make entity properties not static --- .../znpcsplus/api/entity/EntityProperty.java | 1 + .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 32 ++-- .../pyr/znpcsplus/commands/SkinCommand.java | 18 +- .../znpcsplus/entity/EntityPropertyImpl.java | 65 +------ .../entity/EntityPropertyRegistry.java | 57 ++++++ .../znpcsplus/entity/PropertySerializer.java | 7 + .../BooleanPropertySerializer.java | 20 +++ .../ComponentPropertySerializer.java | 25 +++ .../NamedTextColorPropertySerializer.java | 21 +++ .../serializers/SkinDescriptorSerializer.java | 29 ++++ .../pyr/znpcsplus/hologram/HologramLine.java | 7 +- .../java/lol/pyr/znpcsplus/npc/NpcImpl.java | 6 +- .../pyr/znpcsplus/npc/NpcRegistryImpl.java | 5 +- .../lol/pyr/znpcsplus/npc/NpcTypeImpl.java | 15 +- .../pyr/znpcsplus/npc/NpcTypeRegistry.java | 164 +++++++++--------- .../znpcsplus/packets/V1_10PacketFactory.java | 5 +- .../znpcsplus/packets/V1_14PacketFactory.java | 5 +- .../znpcsplus/packets/V1_19PacketFactory.java | 5 +- .../znpcsplus/packets/V1_8PacketFactory.java | 21 ++- .../znpcsplus/packets/V1_9PacketFactory.java | 10 +- .../parsers/EntityPropertyParser.java | 8 +- .../pyr/znpcsplus/storage/NpcStorageType.java | 7 +- .../znpcsplus/storage/yaml/YamlStorage.java | 7 +- 23 files changed, 339 insertions(+), 201 deletions(-) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistry.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/PropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/BooleanPropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ComponentPropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NamedTextColorPropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/SkinDescriptorSerializer.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/api/entity/EntityProperty.java b/api/src/main/java/lol/pyr/znpcsplus/api/entity/EntityProperty.java index b5c20b0..7ae66cb 100644 --- a/api/src/main/java/lol/pyr/znpcsplus/api/entity/EntityProperty.java +++ b/api/src/main/java/lol/pyr/znpcsplus/api/entity/EntityProperty.java @@ -2,4 +2,5 @@ package lol.pyr.znpcsplus.api.entity; public interface EntityProperty { T getDefaultValue(); + String getName(); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 172b654..8db618b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -22,6 +22,7 @@ import lol.pyr.znpcsplus.commands.storage.LoadAllCommand; import lol.pyr.znpcsplus.commands.storage.SaveAllCommand; import lol.pyr.znpcsplus.config.ConfigManager; import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.interaction.ActionRegistry; import lol.pyr.znpcsplus.interaction.InteractionPacketListener; import lol.pyr.znpcsplus.metadata.*; @@ -106,23 +107,24 @@ public class ZNpcsPlus extends JavaPlugin { log(ChatColor.WHITE + " * Initializing components..."); TaskScheduler scheduler = FoliaUtil.isFolia() ? new FoliaScheduler(this) : new SpigotScheduler(this); MetadataFactory metadataFactory = setupMetadataFactory(); - PacketFactory packetFactory = setupPacketFactory(scheduler, metadataFactory); - BungeeConnector bungeeConnector = new BungeeConnector(this); ConfigManager configManager = new ConfigManager(getDataFolder()); + SkinCache skinCache = new SkinCache(configManager); + EntityPropertyRegistry propertyRegistry = new EntityPropertyRegistry(skinCache); + PacketFactory packetFactory = setupPacketFactory(scheduler, metadataFactory, propertyRegistry); + BungeeConnector bungeeConnector = new BungeeConnector(this); ActionRegistry actionRegistry = new ActionRegistry(); NpcTypeRegistry typeRegistry = new NpcTypeRegistry(); - NpcRegistryImpl npcRegistry = new NpcRegistryImpl(configManager, this, packetFactory, actionRegistry, scheduler, typeRegistry); + NpcRegistryImpl npcRegistry = new NpcRegistryImpl(configManager, this, packetFactory, actionRegistry, scheduler, typeRegistry, propertyRegistry); UserManager userManager = new UserManager(); - SkinCache skinCache = new SkinCache(configManager); log(ChatColor.WHITE + " * Registerring components..."); - typeRegistry.registerDefault(packetEvents); + typeRegistry.registerDefault(packetEvents, propertyRegistry); actionRegistry.registerTypes(npcRegistry, scheduler, adventure, bungeeConnector, textSerializer); packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry), PacketListenerPriority.MONITOR); new Metrics(this, PLUGIN_ID); pluginManager.registerEvents(new UserListener(userManager), this); getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); - registerCommands(npcRegistry, skinCache, adventure, actionRegistry, typeRegistry); + registerCommands(npcRegistry, skinCache, adventure, actionRegistry, typeRegistry, propertyRegistry); log(ChatColor.WHITE + " * Starting tasks..."); if (configManager.getConfig().checkForUpdates()) { @@ -168,13 +170,13 @@ public class ZNpcsPlus extends JavaPlugin { for (Runnable runnable : shutdownTasks) runnable.run(); } - private PacketFactory setupPacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory) { + private PacketFactory setupPacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, EntityPropertyRegistry propertyRegistry) { HashMap> versions = new HashMap<>(); - versions.put(ServerVersion.V_1_8, LazyLoader.of(() -> new V1_8PacketFactory(scheduler, metadataFactory, packetEvents))); - versions.put(ServerVersion.V_1_9, LazyLoader.of(() -> new V1_9PacketFactory(scheduler, metadataFactory, packetEvents))); - versions.put(ServerVersion.V_1_10, LazyLoader.of(() -> new V1_10PacketFactory(scheduler, metadataFactory, packetEvents))); - versions.put(ServerVersion.V_1_14, LazyLoader.of(() -> new V1_14PacketFactory(scheduler, metadataFactory, packetEvents))); - versions.put(ServerVersion.V_1_19, LazyLoader.of(() -> new V1_19PacketFactory(scheduler, metadataFactory, packetEvents))); + versions.put(ServerVersion.V_1_8, LazyLoader.of(() -> new V1_8PacketFactory(scheduler, metadataFactory, packetEvents, propertyRegistry))); + versions.put(ServerVersion.V_1_9, LazyLoader.of(() -> new V1_9PacketFactory(scheduler, metadataFactory, packetEvents, propertyRegistry))); + versions.put(ServerVersion.V_1_10, LazyLoader.of(() -> new V1_10PacketFactory(scheduler, metadataFactory, packetEvents, propertyRegistry))); + versions.put(ServerVersion.V_1_14, LazyLoader.of(() -> new V1_14PacketFactory(scheduler, metadataFactory, packetEvents, propertyRegistry))); + versions.put(ServerVersion.V_1_19, LazyLoader.of(() -> new V1_19PacketFactory(scheduler, metadataFactory, packetEvents, propertyRegistry))); ServerVersion version = packetEvents.getServerManager().getVersion(); if (versions.containsKey(version)) return versions.get(version).get(); @@ -207,14 +209,14 @@ public class ZNpcsPlus extends JavaPlugin { } - private void registerCommands(NpcRegistryImpl npcRegistry, SkinCache skinCache, BukkitAudiences adventure, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry) { + private void registerCommands(NpcRegistryImpl npcRegistry, SkinCache skinCache, BukkitAudiences adventure, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry) { // TODO: make the messages better Message incorrectUsageMessage = context -> context.send(Component.text("Incorrect usage: /" + context.getUsage(), NamedTextColor.RED)); CommandManager manager = new CommandManager(this, adventure, incorrectUsageMessage); manager.registerParser(NpcTypeImpl.class, new NpcTypeParser(incorrectUsageMessage, typeRegistry)); manager.registerParser(NpcEntryImpl.class, new NpcEntryParser(npcRegistry, incorrectUsageMessage)); - manager.registerParser(EntityPropertyImpl.class, new EntityPropertyParser(incorrectUsageMessage)); + manager.registerParser(EntityPropertyImpl.class, new EntityPropertyParser(incorrectUsageMessage, propertyRegistry)); manager.registerParser(Integer.class, new IntegerParser(incorrectUsageMessage)); manager.registerParser(Double.class, new DoubleParser(incorrectUsageMessage)); manager.registerParser(Boolean.class, new BooleanParser(incorrectUsageMessage)); @@ -222,7 +224,7 @@ public class ZNpcsPlus extends JavaPlugin { manager.registerCommand("npc", new MultiCommand() .addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry)) - .addSubcommand("skin", new SkinCommand(skinCache, npcRegistry, typeRegistry)) + .addSubcommand("skin", new SkinCommand(skinCache, npcRegistry, typeRegistry, propertyRegistry)) .addSubcommand("delete", new DeleteCommand(npcRegistry, adventure)) .addSubcommand("move", new MoveCommand(npcRegistry)) .addSubcommand("properties", new PropertiesCommand(npcRegistry)) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java index a7928c6..6ef86ac 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java @@ -4,8 +4,12 @@ import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.command.CommandHandler; import lol.pyr.director.common.command.CommandExecutionException; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; -import lol.pyr.znpcsplus.npc.*; +import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.npc.NpcTypeRegistry; import lol.pyr.znpcsplus.skin.cache.SkinCache; import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor; @@ -20,11 +24,13 @@ public class SkinCommand implements CommandHandler { private final SkinCache skinCache; private final NpcRegistryImpl npcRegistry; private final NpcTypeRegistry typeRegistry; + private final EntityPropertyRegistry propertyRegistry; - public SkinCommand(SkinCache skinCache, NpcRegistryImpl npcRegistry, NpcTypeRegistry typeRegistry) { + public SkinCommand(SkinCache skinCache, NpcRegistryImpl npcRegistry, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry) { this.skinCache = skinCache; this.npcRegistry = npcRegistry; this.typeRegistry = typeRegistry; + this.propertyRegistry = propertyRegistry; } @Override @@ -35,7 +41,7 @@ public class SkinCommand implements CommandHandler { String type = context.popString(); if (type.equalsIgnoreCase("mirror")) { - npc.setProperty(EntityPropertyImpl.SKIN, new MirrorDescriptor(skinCache)); + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new MirrorDescriptor(skinCache)); npc.respawn(); context.halt(Component.text("The NPC's skin will now mirror the player that it's being displayed to", NamedTextColor.GREEN)); } @@ -49,7 +55,7 @@ public class SkinCommand implements CommandHandler { context.send(Component.text("Failed to fetch skin, are you sure the player name is valid?", NamedTextColor.RED)); return; } - npc.setProperty(EntityPropertyImpl.SKIN, skin); + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), skin); npc.respawn(); context.send(Component.text("The NPC's skin has been set to \"" + name + "\"")); }); @@ -59,7 +65,7 @@ public class SkinCommand implements CommandHandler { if (type.equalsIgnoreCase("dynamic")) { context.ensureArgsNotEmpty(); String name = context.dumpAllArgs(); - npc.setProperty(EntityPropertyImpl.SKIN, new FetchingDescriptor(skinCache, name)); + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new FetchingDescriptor(skinCache, name)); npc.respawn(); context.halt(Component.text("The NPC's skin will now be resolved per-player from \"" + name + "\"")); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java index 2dfbe26..c734d72 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyImpl.java @@ -2,41 +2,30 @@ package lol.pyr.znpcsplus.entity; import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.api.entity.PropertyHolder; -import lol.pyr.znpcsplus.api.skin.SkinDescriptor; -import lol.pyr.znpcsplus.skin.BaseSkinDescriptor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.minimessage.MiniMessage; - -import java.util.HashMap; -import java.util.Map; public class EntityPropertyImpl implements EntityProperty { private final String name; private final T defaultValue; private final Class clazz; - private final PropertySerializer serializer; - private final PropertyDeserializer deserializer; - public EntityPropertyImpl(String name, Class type, PropertySerializer serializer, PropertyDeserializer deserializer) { - this(name, null, type, serializer, deserializer); + protected EntityPropertyImpl(String name, Class type, PropertySerializer serializer) { + this(name, null, type, serializer); } @SuppressWarnings("unchecked") - public EntityPropertyImpl(String name, T defaultValue, PropertySerializer serializer, PropertyDeserializer deserializer) { - this(name, defaultValue, (Class) defaultValue.getClass(), serializer, deserializer); + protected EntityPropertyImpl(String name, T defaultValue, PropertySerializer serializer) { + this(name, defaultValue, (Class) defaultValue.getClass(), serializer); } - private EntityPropertyImpl(String name, T defaultValue, Class clazz, PropertySerializer serializer, PropertyDeserializer deserializer) { - this.name = name.toUpperCase(); + private EntityPropertyImpl(String name, T defaultValue, Class clazz, PropertySerializer serializer) { + this.name = name.toLowerCase(); this.defaultValue = defaultValue; this.clazz = clazz; this.serializer = serializer; - this.deserializer = deserializer; - BY_NAME.put(this.name, this); } + @Override public String getName() { return name; } @@ -50,7 +39,7 @@ public class EntityPropertyImpl implements EntityProperty { } public T deserialize(String str) { - return deserializer.deserialize(str); + return serializer.deserialize(str); } @Override @@ -61,42 +50,4 @@ public class EntityPropertyImpl implements EntityProperty { public Class getType() { return clazz; } - - private final static Map> BY_NAME = new HashMap<>(); - - public static EntityPropertyImpl getByName(String name) { - return BY_NAME.get(name.toUpperCase()); - } - - @FunctionalInterface - private interface PropertySerializer { - String serialize(T property); - } - - @FunctionalInterface - private interface PropertyDeserializer { - T deserialize(String property); - } - - - private final static PropertySerializer BOOLEAN_SERIALIZER = Object::toString; - private final static PropertyDeserializer BOOLEAN_DESERIALIZER = Boolean::valueOf; - - private final static PropertySerializer COLOR_SERIALIZER = color -> String.valueOf(color.value()); - private final static PropertyDeserializer COLOR_DESERIALIZER = str -> NamedTextColor.namedColor(Integer.parseInt(str)); - - private final static PropertySerializer COMPONENT_SERIALIZER = component -> MiniMessage.miniMessage().serialize(component); - private final static PropertyDeserializer COMPONENT_DESERIALIZER = str -> MiniMessage.miniMessage().deserialize(str); - - private final static PropertySerializer DESCRIPTOR_SERIALIZER = descriptor -> ((BaseSkinDescriptor) descriptor).serialize(); - private final static PropertyDeserializer DESCRIPTOR_DESERIALIZER = property -> null; // TODO: An actual property registry // BaseSkinDescriptor::deserialize; - - public static EntityPropertyImpl GLOW = new EntityPropertyImpl<>("glow", NamedTextColor.class, COLOR_SERIALIZER, COLOR_DESERIALIZER); - public static EntityPropertyImpl SKIN_LAYERS = new EntityPropertyImpl<>("skin_layers", true, BOOLEAN_SERIALIZER, BOOLEAN_DESERIALIZER); - public static EntityPropertyImpl FIRE = new EntityPropertyImpl<>("fire", false, BOOLEAN_SERIALIZER, BOOLEAN_DESERIALIZER); - public static EntityPropertyImpl INVISIBLE = new EntityPropertyImpl<>("invisible", false, BOOLEAN_SERIALIZER, BOOLEAN_DESERIALIZER); - public static EntityPropertyImpl SILENT = new EntityPropertyImpl<>("silent", false, BOOLEAN_SERIALIZER, BOOLEAN_DESERIALIZER); - - public static EntityPropertyImpl SKIN = new EntityPropertyImpl<>("skin", SkinDescriptor.class, DESCRIPTOR_SERIALIZER, DESCRIPTOR_DESERIALIZER); - public static EntityPropertyImpl NAME = new EntityPropertyImpl<>("name", Component.class, COMPONENT_SERIALIZER, COMPONENT_DESERIALIZER); } \ No newline at end of file diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistry.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistry.java new file mode 100644 index 0000000..cc966f9 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistry.java @@ -0,0 +1,57 @@ +package lol.pyr.znpcsplus.entity; + +import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.entity.serializers.BooleanPropertySerializer; +import lol.pyr.znpcsplus.entity.serializers.ComponentPropertySerializer; +import lol.pyr.znpcsplus.entity.serializers.NamedTextColorPropertySerializer; +import lol.pyr.znpcsplus.entity.serializers.SkinDescriptorSerializer; +import lol.pyr.znpcsplus.skin.cache.SkinCache; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@SuppressWarnings("unchecked") +public class EntityPropertyRegistry { + private final Map, PropertySerializer> serializerMap = new HashMap<>(); + private final List> properties = new ArrayList<>(); + + public EntityPropertyRegistry(SkinCache skinCache) { + registerSerializer(new BooleanPropertySerializer()); + registerSerializer(new ComponentPropertySerializer()); + registerSerializer(new NamedTextColorPropertySerializer()); + registerSerializer(new SkinDescriptorSerializer(skinCache)); + + registerType("glow", NamedTextColor.class); + registerType("skin_layers", true); + registerType("fire", false); + registerType("invisible", false); + registerType("silent", false); + registerType("skin", SkinDescriptor.class); + registerType("name", Component.class); + } + + private void registerSerializer(PropertySerializer serializer) { + serializerMap.put(serializer.getTypeClass(), serializer); + } + + private void registerType(String name, Class type) { + properties.add(new EntityPropertyImpl<>(name, type, (PropertySerializer) serializerMap.get(type))); + } + + private void registerType(String name, T defaultValue) { + properties.add(new EntityPropertyImpl<>(name, defaultValue, (PropertySerializer) serializerMap.get(defaultValue.getClass()))); + } + + public EntityPropertyImpl getByName(String name, Class type) { + return (EntityPropertyImpl) getByName(name); + } + + public EntityPropertyImpl getByName(String name) { + for (EntityPropertyImpl property : properties) if (property.getName().equalsIgnoreCase(name)) return property; + return null; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/PropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PropertySerializer.java new file mode 100644 index 0000000..73c8182 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PropertySerializer.java @@ -0,0 +1,7 @@ +package lol.pyr.znpcsplus.entity; + +public interface PropertySerializer { + String serialize(T property); + T deserialize(String property); + Class getTypeClass(); +} \ No newline at end of file diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/BooleanPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/BooleanPropertySerializer.java new file mode 100644 index 0000000..149bcdb --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/BooleanPropertySerializer.java @@ -0,0 +1,20 @@ +package lol.pyr.znpcsplus.entity.serializers; + +import lol.pyr.znpcsplus.entity.PropertySerializer; + +public class BooleanPropertySerializer implements PropertySerializer { + @Override + public String serialize(Boolean property) { + return String.valueOf(property); + } + + @Override + public Boolean deserialize(String property) { + return Boolean.valueOf(property); + } + + @Override + public Class getTypeClass() { + return Boolean.class; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ComponentPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ComponentPropertySerializer.java new file mode 100644 index 0000000..c7e3f75 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ComponentPropertySerializer.java @@ -0,0 +1,25 @@ +package lol.pyr.znpcsplus.entity.serializers; + +import lol.pyr.znpcsplus.entity.PropertySerializer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class ComponentPropertySerializer implements PropertySerializer { + @Override + public String serialize(Component property) { + return Base64.getEncoder().encodeToString(MiniMessage.miniMessage().serialize(property).getBytes(StandardCharsets.UTF_8)); + } + + @Override + public Component deserialize(String property) { + return MiniMessage.miniMessage().deserialize(new String(Base64.getDecoder().decode(property), StandardCharsets.UTF_8)); + } + + @Override + public Class getTypeClass() { + return Component.class; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NamedTextColorPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NamedTextColorPropertySerializer.java new file mode 100644 index 0000000..49eea80 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NamedTextColorPropertySerializer.java @@ -0,0 +1,21 @@ +package lol.pyr.znpcsplus.entity.serializers; + +import lol.pyr.znpcsplus.entity.PropertySerializer; +import net.kyori.adventure.text.format.NamedTextColor; + +public class NamedTextColorPropertySerializer implements PropertySerializer { + @Override + public String serialize(NamedTextColor property) { + return String.valueOf(property.value()); + } + + @Override + public NamedTextColor deserialize(String property) { + return NamedTextColor.namedColor(Integer.parseInt(property)); + } + + @Override + public Class getTypeClass() { + return NamedTextColor.class; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/SkinDescriptorSerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/SkinDescriptorSerializer.java new file mode 100644 index 0000000..1c685d3 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/SkinDescriptorSerializer.java @@ -0,0 +1,29 @@ +package lol.pyr.znpcsplus.entity.serializers; + +import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.entity.PropertySerializer; +import lol.pyr.znpcsplus.skin.BaseSkinDescriptor; +import lol.pyr.znpcsplus.skin.cache.SkinCache; + +public class SkinDescriptorSerializer implements PropertySerializer { + private final SkinCache skinCache; + + public SkinDescriptorSerializer(SkinCache skinCache) { + this.skinCache = skinCache; + } + + @Override + public String serialize(SkinDescriptor property) { + return ((BaseSkinDescriptor) property).serialize(); + } + + @Override + public SkinDescriptor deserialize(String property) { + return BaseSkinDescriptor.deserialize(skinCache, property); + } + + @Override + public Class getTypeClass() { + return SkinDescriptor.class; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java index abeccbf..181d05a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java @@ -3,7 +3,6 @@ package lol.pyr.znpcsplus.hologram; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.api.entity.PropertyHolder; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.util.NpcLocation; @@ -44,13 +43,13 @@ public class HologramLine implements PropertyHolder { @SuppressWarnings("unchecked") @Override public T getProperty(EntityProperty key) { - if (key == EntityPropertyImpl.INVISIBLE) return (T) Boolean.TRUE; - if (key == EntityPropertyImpl.NAME) return (T) text; + if (key.getName().equalsIgnoreCase("invisible")) return (T) Boolean.TRUE; + if (key.getName().equalsIgnoreCase("name")) return (T) text; return key.getDefaultValue(); } @Override public boolean hasProperty(EntityProperty key) { - return key == EntityPropertyImpl.NAME || key == EntityPropertyImpl.INVISIBLE; + return key.getName().equalsIgnoreCase("name") || key.getName().equalsIgnoreCase("invisible"); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java index 2c50c52..e2850b8 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java @@ -8,8 +8,8 @@ import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.hologram.HologramImpl; import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.packets.PacketFactory; -import lol.pyr.znpcsplus.util.Viewable; import lol.pyr.znpcsplus.util.NpcLocation; +import lol.pyr.znpcsplus.util.Viewable; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -117,7 +117,7 @@ public class NpcImpl extends Viewable implements Npc { if (value.equals(key.getDefaultValue())) removeProperty(key); else propertyMap.put(key, value); UNSAFE_refreshMeta(); - if (key == EntityPropertyImpl.GLOW) UNSAFE_remakeTeam(); + if (key.getName().equalsIgnoreCase("glow")) UNSAFE_remakeTeam(); } @SuppressWarnings("unchecked") @@ -128,7 +128,7 @@ public class NpcImpl extends Viewable implements Npc { public void removeProperty(EntityPropertyImpl key) { propertyMap.remove(key); UNSAFE_refreshMeta(); - if (key == EntityPropertyImpl.GLOW) UNSAFE_remakeTeam(); + if (key.getName().equalsIgnoreCase("glow")) UNSAFE_remakeTeam(); } public Set> getAppliedProperties() { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcRegistryImpl.java index 27e7f46..c2d4b5b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcRegistryImpl.java @@ -4,6 +4,7 @@ import lol.pyr.znpcsplus.ZNpcsPlus; import lol.pyr.znpcsplus.api.npc.NpcRegistry; import lol.pyr.znpcsplus.api.npc.NpcType; import lol.pyr.znpcsplus.config.ConfigManager; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.interaction.ActionRegistry; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; @@ -22,8 +23,8 @@ public class NpcRegistryImpl implements NpcRegistry { private final PacketFactory packetFactory; private final ConfigManager configManager; - public NpcRegistryImpl(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, TaskScheduler scheduler, NpcTypeRegistry typeRegistry) { - storage = configManager.getConfig().storageType().create(configManager, plugin, packetFactory, actionRegistry, typeRegistry); + public NpcRegistryImpl(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, TaskScheduler scheduler, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry) { + storage = configManager.getConfig().storageType().create(configManager, plugin, packetFactory, actionRegistry, typeRegistry, propertyRegistry); this.packetFactory = packetFactory; this.configManager = configManager; diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java index 6244fc3..e45a050 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java @@ -4,6 +4,7 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import java.util.*; @@ -14,7 +15,7 @@ public class NpcTypeImpl { private final double hologramOffset; private NpcTypeImpl(String name, EntityType type, double hologramOffset, Set> allowedProperties) { - this.name = name.toUpperCase(); + this.name = name.toLowerCase(); this.type = type; this.hologramOffset = hologramOffset; this.allowedProperties = allowedProperties; @@ -37,13 +38,15 @@ public class NpcTypeImpl { } protected static final class Builder { + private final EntityPropertyRegistry propertyRegistry; private final String name; private final EntityType type; private final List> allowedProperties = new ArrayList<>(); private boolean globalProperties = true; private double hologramOffset = 0; - Builder(String name, EntityType type) { + Builder(EntityPropertyRegistry propertyRegistry, String name, EntityType type) { + this.propertyRegistry = propertyRegistry; this.name = name; this.type = type; } @@ -65,11 +68,11 @@ public class NpcTypeImpl { public NpcTypeImpl build() { if (globalProperties) { - allowedProperties.add(EntityPropertyImpl.FIRE); - allowedProperties.add(EntityPropertyImpl.INVISIBLE); - allowedProperties.add(EntityPropertyImpl.SILENT); + allowedProperties.add(propertyRegistry.getByName("fire")); + allowedProperties.add(propertyRegistry.getByName("invisible")); + allowedProperties.add(propertyRegistry.getByName("silent")); if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)) - allowedProperties.add(EntityPropertyImpl.GLOW); + allowedProperties.add(propertyRegistry.getByName("glow")); } return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties)); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistry.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistry.java index 9d7cf70..c425b29 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistry.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistry.java @@ -4,7 +4,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import org.bukkit.plugin.Plugin; import java.util.ArrayList; @@ -24,110 +24,110 @@ public class NpcTypeRegistry { return type; } - public void registerDefault(PacketEventsAPI packetEvents) { + public void registerDefault(PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { ServerVersion version = packetEvents.getServerManager().getVersion(); - register(new NpcTypeImpl.Builder("player", EntityTypes.PLAYER).setHologramOffset(-0.15D) - .addProperties(EntityPropertyImpl.SKIN, EntityPropertyImpl.SKIN_LAYERS)); + register(new NpcTypeImpl.Builder(propertyRegistry, "player", EntityTypes.PLAYER).setHologramOffset(-0.15D) + .addProperties(propertyRegistry.getByName("skin"), propertyRegistry.getByName("skin_layers"))); - register(new NpcTypeImpl.Builder("armor_stand", EntityTypes.ARMOR_STAND)); - register(new NpcTypeImpl.Builder("bat", EntityTypes.BAT).setHologramOffset(-1.365)); - register(new NpcTypeImpl.Builder("blaze", EntityTypes.BLAZE)); - register(new NpcTypeImpl.Builder("cat", EntityTypes.CAT)); - register(new NpcTypeImpl.Builder("cave_spider", EntityTypes.CAVE_SPIDER)); - register(new NpcTypeImpl.Builder("chicken", EntityTypes.CHICKEN)); - register(new NpcTypeImpl.Builder("cow", EntityTypes.COW)); - register(new NpcTypeImpl.Builder("creeper", EntityTypes.CREEPER).setHologramOffset(-0.3D)); - register(new NpcTypeImpl.Builder("donkey", EntityTypes.DONKEY)); - register(new NpcTypeImpl.Builder("elder_guardian", EntityTypes.ELDER_GUARDIAN)); - register(new NpcTypeImpl.Builder("ender_dragon", EntityTypes.ENDER_DRAGON)); - register(new NpcTypeImpl.Builder("enderman", EntityTypes.ENDERMAN)); - register(new NpcTypeImpl.Builder("endermite", EntityTypes.ENDERMITE)); - register(new NpcTypeImpl.Builder("ghast", EntityTypes.GHAST)); - register(new NpcTypeImpl.Builder("giant", EntityTypes.GIANT)); - register(new NpcTypeImpl.Builder("guardian", EntityTypes.GUARDIAN)); - register(new NpcTypeImpl.Builder("horse", EntityTypes.HORSE)); - register(new NpcTypeImpl.Builder("iron_golem", EntityTypes.IRON_GOLEM)); - register(new NpcTypeImpl.Builder("magma_cube", EntityTypes.MAGMA_CUBE)); - register(new NpcTypeImpl.Builder("mooshroom", EntityTypes.MOOSHROOM)); - register(new NpcTypeImpl.Builder("mule", EntityTypes.MULE)); - register(new NpcTypeImpl.Builder("ocelot", EntityTypes.OCELOT)); - register(new NpcTypeImpl.Builder("pig", EntityTypes.PIG)); - register(new NpcTypeImpl.Builder("rabbit", EntityTypes.RABBIT)); - register(new NpcTypeImpl.Builder("sheep", EntityTypes.SHEEP)); - register(new NpcTypeImpl.Builder("silverfish", EntityTypes.SILVERFISH)); - register(new NpcTypeImpl.Builder("skeleton", EntityTypes.SKELETON)); - register(new NpcTypeImpl.Builder("skeleton_horse", EntityTypes.SKELETON_HORSE)); - register(new NpcTypeImpl.Builder("slime", EntityTypes.SLIME)); - register(new NpcTypeImpl.Builder("snow_golem", EntityTypes.SNOW_GOLEM)); - register(new NpcTypeImpl.Builder("spider", EntityTypes.SPIDER)); - register(new NpcTypeImpl.Builder("squid", EntityTypes.SQUID)); - register(new NpcTypeImpl.Builder("villager", EntityTypes.VILLAGER)); - register(new NpcTypeImpl.Builder("witch", EntityTypes.WITCH)); - register(new NpcTypeImpl.Builder("wither", EntityTypes.WITHER)); - register(new NpcTypeImpl.Builder("wither_skeleton", EntityTypes.WITHER_SKELETON)); - register(new NpcTypeImpl.Builder("wolf", EntityTypes.WOLF)); - register(new NpcTypeImpl.Builder("zombie", EntityTypes.ZOMBIE)); - register(new NpcTypeImpl.Builder("zombie_horse", EntityTypes.ZOMBIE_HORSE)); - register(new NpcTypeImpl.Builder("zombie_villager", EntityTypes.ZOMBIE_VILLAGER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "armor_stand", EntityTypes.ARMOR_STAND)); + register(new NpcTypeImpl.Builder(propertyRegistry, "bat", EntityTypes.BAT).setHologramOffset(-1.365)); + register(new NpcTypeImpl.Builder(propertyRegistry, "blaze", EntityTypes.BLAZE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "cat", EntityTypes.CAT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "cave_spider", EntityTypes.CAVE_SPIDER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "chicken", EntityTypes.CHICKEN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "cow", EntityTypes.COW)); + register(new NpcTypeImpl.Builder(propertyRegistry, "creeper", EntityTypes.CREEPER).setHologramOffset(-0.3D)); + register(new NpcTypeImpl.Builder(propertyRegistry, "donkey", EntityTypes.DONKEY)); + register(new NpcTypeImpl.Builder(propertyRegistry, "elder_guardian", EntityTypes.ELDER_GUARDIAN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "ender_dragon", EntityTypes.ENDER_DRAGON)); + register(new NpcTypeImpl.Builder(propertyRegistry, "enderman", EntityTypes.ENDERMAN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "endermite", EntityTypes.ENDERMITE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "ghast", EntityTypes.GHAST)); + register(new NpcTypeImpl.Builder(propertyRegistry, "giant", EntityTypes.GIANT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "guardian", EntityTypes.GUARDIAN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "horse", EntityTypes.HORSE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "iron_golem", EntityTypes.IRON_GOLEM)); + register(new NpcTypeImpl.Builder(propertyRegistry, "magma_cube", EntityTypes.MAGMA_CUBE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "mooshroom", EntityTypes.MOOSHROOM)); + register(new NpcTypeImpl.Builder(propertyRegistry, "mule", EntityTypes.MULE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "ocelot", EntityTypes.OCELOT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "pig", EntityTypes.PIG)); + register(new NpcTypeImpl.Builder(propertyRegistry, "rabbit", EntityTypes.RABBIT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "sheep", EntityTypes.SHEEP)); + register(new NpcTypeImpl.Builder(propertyRegistry, "silverfish", EntityTypes.SILVERFISH)); + register(new NpcTypeImpl.Builder(propertyRegistry, "skeleton", EntityTypes.SKELETON)); + register(new NpcTypeImpl.Builder(propertyRegistry, "skeleton_horse", EntityTypes.SKELETON_HORSE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "slime", EntityTypes.SLIME)); + register(new NpcTypeImpl.Builder(propertyRegistry, "snow_golem", EntityTypes.SNOW_GOLEM)); + register(new NpcTypeImpl.Builder(propertyRegistry, "spider", EntityTypes.SPIDER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "squid", EntityTypes.SQUID)); + register(new NpcTypeImpl.Builder(propertyRegistry, "villager", EntityTypes.VILLAGER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "witch", EntityTypes.WITCH)); + register(new NpcTypeImpl.Builder(propertyRegistry, "wither", EntityTypes.WITHER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "wither_skeleton", EntityTypes.WITHER_SKELETON)); + register(new NpcTypeImpl.Builder(propertyRegistry, "wolf", EntityTypes.WOLF)); + register(new NpcTypeImpl.Builder(propertyRegistry, "zombie", EntityTypes.ZOMBIE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "zombie_horse", EntityTypes.ZOMBIE_HORSE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "zombie_villager", EntityTypes.ZOMBIE_VILLAGER)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_9)) return; - register(new NpcTypeImpl.Builder("shulker", EntityTypes.SHULKER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "shulker", EntityTypes.SHULKER)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_10)) return; - register(new NpcTypeImpl.Builder("husk", EntityTypes.HUSK)); - register(new NpcTypeImpl.Builder("polar_bear", EntityTypes.POLAR_BEAR)); - register(new NpcTypeImpl.Builder("stray", EntityTypes.STRAY)); + register(new NpcTypeImpl.Builder(propertyRegistry, "husk", EntityTypes.HUSK)); + register(new NpcTypeImpl.Builder(propertyRegistry, "polar_bear", EntityTypes.POLAR_BEAR)); + register(new NpcTypeImpl.Builder(propertyRegistry, "stray", EntityTypes.STRAY)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_11)) return; - register(new NpcTypeImpl.Builder("evoker", EntityTypes.EVOKER)); - register(new NpcTypeImpl.Builder("llama", EntityTypes.LLAMA)); - register(new NpcTypeImpl.Builder("vex", EntityTypes.VEX)); - register(new NpcTypeImpl.Builder("vindicator", EntityTypes.VINDICATOR)); + register(new NpcTypeImpl.Builder(propertyRegistry, "evoker", EntityTypes.EVOKER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "llama", EntityTypes.LLAMA)); + register(new NpcTypeImpl.Builder(propertyRegistry, "vex", EntityTypes.VEX)); + register(new NpcTypeImpl.Builder(propertyRegistry, "vindicator", EntityTypes.VINDICATOR)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_12)) return; - register(new NpcTypeImpl.Builder("illusioner", EntityTypes.ILLUSIONER)); - register(new NpcTypeImpl.Builder("parrot", EntityTypes.PARROT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "illusioner", EntityTypes.ILLUSIONER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "parrot", EntityTypes.PARROT)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_13)) return; - register(new NpcTypeImpl.Builder("cod", EntityTypes.COD)); - register(new NpcTypeImpl.Builder("dolphin", EntityTypes.DOLPHIN)); - register(new NpcTypeImpl.Builder("drowned", EntityTypes.DROWNED)); - register(new NpcTypeImpl.Builder("phantom", EntityTypes.PHANTOM)); - register(new NpcTypeImpl.Builder("pufferfish", EntityTypes.PUFFERFISH)); - register(new NpcTypeImpl.Builder("salmon", EntityTypes.SALMON)); - register(new NpcTypeImpl.Builder("tropical_fish", EntityTypes.TROPICAL_FISH)); - register(new NpcTypeImpl.Builder("turtle", EntityTypes.TURTLE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "cod", EntityTypes.COD)); + register(new NpcTypeImpl.Builder(propertyRegistry, "dolphin", EntityTypes.DOLPHIN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "drowned", EntityTypes.DROWNED)); + register(new NpcTypeImpl.Builder(propertyRegistry, "phantom", EntityTypes.PHANTOM)); + register(new NpcTypeImpl.Builder(propertyRegistry, "pufferfish", EntityTypes.PUFFERFISH)); + register(new NpcTypeImpl.Builder(propertyRegistry, "salmon", EntityTypes.SALMON)); + register(new NpcTypeImpl.Builder(propertyRegistry, "tropical_fish", EntityTypes.TROPICAL_FISH)); + register(new NpcTypeImpl.Builder(propertyRegistry, "turtle", EntityTypes.TURTLE)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_14)) return; - register(new NpcTypeImpl.Builder("fox", EntityTypes.FOX)); - register(new NpcTypeImpl.Builder("panda", EntityTypes.PANDA)); - register(new NpcTypeImpl.Builder("pillager", EntityTypes.PILLAGER)); - register(new NpcTypeImpl.Builder("ravager", EntityTypes.RAVAGER)); - register(new NpcTypeImpl.Builder("trader_llama", EntityTypes.TRADER_LLAMA)); - register(new NpcTypeImpl.Builder("wandering_trader", EntityTypes.WANDERING_TRADER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "fox", EntityTypes.FOX)); + register(new NpcTypeImpl.Builder(propertyRegistry, "panda", EntityTypes.PANDA)); + register(new NpcTypeImpl.Builder(propertyRegistry, "pillager", EntityTypes.PILLAGER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "ravager", EntityTypes.RAVAGER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "trader_llama", EntityTypes.TRADER_LLAMA)); + register(new NpcTypeImpl.Builder(propertyRegistry, "wandering_trader", EntityTypes.WANDERING_TRADER)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_15)) return; - register(new NpcTypeImpl.Builder("bee", EntityTypes.BEE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "bee", EntityTypes.BEE)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_16)) return; - register(new NpcTypeImpl.Builder("hoglin", EntityTypes.HOGLIN)); - register(new NpcTypeImpl.Builder("piglin", EntityTypes.PIGLIN)); - register(new NpcTypeImpl.Builder("piglin_brute", EntityTypes.PIGLIN_BRUTE)); - register(new NpcTypeImpl.Builder("strider", EntityTypes.STRIDER)); - register(new NpcTypeImpl.Builder("zoglin", EntityTypes.ZOGLIN)); - register(new NpcTypeImpl.Builder("zombified_piglin", EntityTypes.ZOMBIFIED_PIGLIN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "hoglin", EntityTypes.HOGLIN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "piglin", EntityTypes.PIGLIN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "piglin_brute", EntityTypes.PIGLIN_BRUTE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "strider", EntityTypes.STRIDER)); + register(new NpcTypeImpl.Builder(propertyRegistry, "zoglin", EntityTypes.ZOGLIN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "zombified_piglin", EntityTypes.ZOMBIFIED_PIGLIN)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_17)) return; - register(new NpcTypeImpl.Builder("axolotl", EntityTypes.AXOLOTL)); - register(new NpcTypeImpl.Builder("glow_squid", EntityTypes.GLOW_SQUID)); - register(new NpcTypeImpl.Builder("goat", EntityTypes.GOAT)); + register(new NpcTypeImpl.Builder(propertyRegistry, "axolotl", EntityTypes.AXOLOTL)); + register(new NpcTypeImpl.Builder(propertyRegistry, "glow_squid", EntityTypes.GLOW_SQUID)); + register(new NpcTypeImpl.Builder(propertyRegistry, "goat", EntityTypes.GOAT)); if (!version.isNewerThanOrEquals(ServerVersion.V_1_19)) return; - register(new NpcTypeImpl.Builder("allay", EntityTypes.ALLAY)); - register(new NpcTypeImpl.Builder("frog", EntityTypes.FROG)); - register(new NpcTypeImpl.Builder("tadpole", EntityTypes.TADPOLE)); - register(new NpcTypeImpl.Builder("warden", EntityTypes.WARDEN)); + register(new NpcTypeImpl.Builder(propertyRegistry, "allay", EntityTypes.ALLAY)); + register(new NpcTypeImpl.Builder(propertyRegistry, "frog", EntityTypes.FROG)); + register(new NpcTypeImpl.Builder(propertyRegistry, "tadpole", EntityTypes.TADPOLE)); + register(new NpcTypeImpl.Builder(propertyRegistry, "warden", EntityTypes.WARDEN)); } public Collection getAll() { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_10PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_10PacketFactory.java index f2ef0dc..2d7ba35 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_10PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_10PacketFactory.java @@ -3,6 +3,7 @@ package lol.pyr.znpcsplus.packets; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import lol.pyr.znpcsplus.api.entity.PropertyHolder; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; @@ -12,8 +13,8 @@ import org.bukkit.plugin.Plugin; import java.util.Map; public class V1_10PacketFactory extends V1_9PacketFactory { - public V1_10PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents) { - super(scheduler, metadataFactory, packetEvents); + public V1_10PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { + super(scheduler, metadataFactory, packetEvents, propertyRegistry); } @Override diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_14PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_14PacketFactory.java index fc641f1..b551c20 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_14PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_14PacketFactory.java @@ -4,6 +4,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.util.Vector3d; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; import lol.pyr.znpcsplus.api.entity.PropertyHolder; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; @@ -14,8 +15,8 @@ import org.bukkit.plugin.Plugin; import java.util.Optional; public class V1_14PacketFactory extends V1_10PacketFactory { - public V1_14PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents) { - super(scheduler, metadataFactory, packetEvents); + public V1_14PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { + super(scheduler, metadataFactory, packetEvents, propertyRegistry); } @Override diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_19PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_19PacketFactory.java index 0108060..37d515a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_19PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_19PacketFactory.java @@ -6,6 +6,7 @@ import com.github.retrooper.packetevents.protocol.player.GameMode; import com.github.retrooper.packetevents.protocol.player.UserProfile; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoRemove; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoUpdate; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.api.entity.PropertyHolder; import lol.pyr.znpcsplus.metadata.MetadataFactory; @@ -18,8 +19,8 @@ import java.util.EnumSet; import java.util.concurrent.CompletableFuture; public class V1_19PacketFactory extends V1_14PacketFactory { - public V1_19PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents) { - super(scheduler, metadataFactory, packetEvents); + public V1_19PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { + super(scheduler, metadataFactory, packetEvents, propertyRegistry); } @Override diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java index 76ee30f..ff6fa0c 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java @@ -11,7 +11,8 @@ import com.github.retrooper.packetevents.util.Vector3d; import com.github.retrooper.packetevents.wrapper.PacketWrapper; import com.github.retrooper.packetevents.wrapper.play.server.*; import lol.pyr.znpcsplus.api.entity.PropertyHolder; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; @@ -29,11 +30,13 @@ public class V1_8PacketFactory implements PacketFactory { protected final TaskScheduler scheduler; protected final MetadataFactory metadataFactory; protected final PacketEventsAPI packetEvents; + protected final EntityPropertyRegistry propertyRegistry; - public V1_8PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents) { + public V1_8PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { this.scheduler = scheduler; this.metadataFactory = metadataFactory; this.packetEvents = packetEvents; + this.propertyRegistry = propertyRegistry; } @Override @@ -103,7 +106,7 @@ public class V1_8PacketFactory implements PacketFactory { Component.empty(), Component.empty(), Component.empty(), WrapperPlayServerTeams.NameTagVisibility.NEVER, WrapperPlayServerTeams.CollisionRule.NEVER, - properties.hasProperty(EntityPropertyImpl.GLOW) ? properties.getProperty(EntityPropertyImpl.GLOW) : NamedTextColor.WHITE, + properties.hasProperty(propertyRegistry.getByName("glow")) ? properties.getProperty(propertyRegistry.getByName("glow", NamedTextColor.class)) : NamedTextColor.WHITE, WrapperPlayServerTeams.OptionData.NONE ))); sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.ADD_ENTITIES, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null, @@ -118,10 +121,10 @@ public class V1_8PacketFactory implements PacketFactory { @Override public Map generateMetadata(Player player, PacketEntity entity, PropertyHolder properties) { HashMap data = new HashMap<>(); - if (entity.getType() == EntityTypes.PLAYER) add(data, metadataFactory.skinLayers(properties.getProperty(EntityPropertyImpl.SKIN_LAYERS))); - add(data, metadataFactory.effects(properties.getProperty(EntityPropertyImpl.FIRE), false, properties.getProperty(EntityPropertyImpl.INVISIBLE))); - add(data, metadataFactory.silent(properties.getProperty(EntityPropertyImpl.SILENT))); - if (properties.hasProperty(EntityPropertyImpl.NAME)) addAll(data, metadataFactory.name(properties.getProperty(EntityPropertyImpl.NAME))); + if (entity.getType() == EntityTypes.PLAYER) add(data, metadataFactory.skinLayers(properties.getProperty(propertyRegistry.getByName("skin_layers", Boolean.class)))); + add(data, metadataFactory.effects(properties.getProperty(propertyRegistry.getByName("fire", Boolean.class)), false, properties.getProperty(propertyRegistry.getByName("fire", Boolean.class)))); + add(data, metadataFactory.silent(properties.getProperty(propertyRegistry.getByName("silent", Boolean.class)))); + if (properties.hasProperty(propertyRegistry.getByName("name"))) addAll(data, metadataFactory.name(properties.getProperty(propertyRegistry.getByName("name", Component.class)))); return data; } @@ -140,8 +143,8 @@ public class V1_8PacketFactory implements PacketFactory { } protected CompletableFuture skinned(Player player, PropertyHolder properties, UserProfile profile) { - if (!properties.hasProperty(EntityPropertyImpl.SKIN)) return CompletableFuture.completedFuture(profile); - BaseSkinDescriptor descriptor = (BaseSkinDescriptor) properties.getProperty(EntityPropertyImpl.SKIN); + if (!properties.hasProperty(propertyRegistry.getByName("skin"))) return CompletableFuture.completedFuture(profile); + BaseSkinDescriptor descriptor = (BaseSkinDescriptor) properties.getProperty(propertyRegistry.getByName("skin", SkinDescriptor.class)); if (descriptor.supportsInstant(player)) { descriptor.fetchInstant(player).apply(profile); return CompletableFuture.completedFuture(profile); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_9PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_9PacketFactory.java index 4507894..7dca34f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_9PacketFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_9PacketFactory.java @@ -3,7 +3,7 @@ package lol.pyr.znpcsplus.packets; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import lol.pyr.znpcsplus.api.entity.PropertyHolder; -import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; @@ -13,14 +13,16 @@ import org.bukkit.plugin.Plugin; import java.util.Map; public class V1_9PacketFactory extends V1_8PacketFactory { - public V1_9PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents) { - super(scheduler, metadataFactory, packetEvents); + public V1_9PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI packetEvents, EntityPropertyRegistry propertyRegistry) { + super(scheduler, metadataFactory, packetEvents, propertyRegistry); } @Override public Map generateMetadata(Player player, PacketEntity entity, PropertyHolder properties) { Map data = super.generateMetadata(player, entity, properties); - add(data, metadataFactory.effects(properties.getProperty(EntityPropertyImpl.FIRE), properties.hasProperty(EntityPropertyImpl.GLOW), properties.getProperty(EntityPropertyImpl.INVISIBLE))); + add(data, metadataFactory.effects(properties.getProperty(propertyRegistry.getByName("fire", Boolean.class)), + properties.hasProperty(propertyRegistry.getByName("glow", Boolean.class)), + properties.getProperty(propertyRegistry.getByName("invisible", Boolean.class)))); return data; } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPropertyParser.java b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPropertyParser.java index 7208fbe..b866be6 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPropertyParser.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPropertyParser.java @@ -5,18 +5,22 @@ 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.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import java.util.Deque; @SuppressWarnings("rawtypes") public class EntityPropertyParser extends ParserType*/> { - public EntityPropertyParser(Message message) { + private final EntityPropertyRegistry propertyRegistry; + + public EntityPropertyParser(Message message, EntityPropertyRegistry propertyRegistry) { super(message); + this.propertyRegistry = propertyRegistry; } @Override public EntityPropertyImpl parse(Deque deque) throws CommandExecutionException { - EntityPropertyImpl property = EntityPropertyImpl.getByName(deque.pop()); + EntityPropertyImpl property = propertyRegistry.getByName(deque.pop()); if (property == null) throw new CommandExecutionException(); return property; } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/storage/NpcStorageType.java b/plugin/src/main/java/lol/pyr/znpcsplus/storage/NpcStorageType.java index 09aaffe..db0e406 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/storage/NpcStorageType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/storage/NpcStorageType.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.storage; import lol.pyr.znpcsplus.ZNpcsPlus; import lol.pyr.znpcsplus.config.ConfigManager; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.interaction.ActionRegistry; import lol.pyr.znpcsplus.npc.NpcTypeRegistry; import lol.pyr.znpcsplus.packets.PacketFactory; @@ -12,10 +13,10 @@ import java.io.File; public enum NpcStorageType { YAML { @Override - public NpcStorage create(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry) { - return new YamlStorage(packetFactory, configManager, actionRegistry, typeRegistry, new File(plugin.getDataFolder(), "data")); + public NpcStorage create(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry) { + return new YamlStorage(packetFactory, configManager, actionRegistry, typeRegistry, propertyRegistry, new File(plugin.getDataFolder(), "data")); } }; - public abstract NpcStorage create(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry); + public abstract NpcStorage create(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java b/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java index f93f98d..0ca6378 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.storage.yaml; import lol.pyr.znpcsplus.config.ConfigManager; import lol.pyr.znpcsplus.entity.EntityPropertyImpl; +import lol.pyr.znpcsplus.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.hologram.HologramLine; import lol.pyr.znpcsplus.interaction.ActionRegistry; import lol.pyr.znpcsplus.npc.NpcEntryImpl; @@ -24,13 +25,15 @@ public class YamlStorage implements NpcStorage { private final ConfigManager configManager; private final ActionRegistry actionRegistry; private final NpcTypeRegistry typeRegistry; + private final EntityPropertyRegistry propertyRegistry; private final File folder; - public YamlStorage(PacketFactory packetFactory, ConfigManager configManager, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry, File folder) { + public YamlStorage(PacketFactory packetFactory, ConfigManager configManager, ActionRegistry actionRegistry, NpcTypeRegistry typeRegistry, EntityPropertyRegistry propertyRegistry, File folder) { this.packetFactory = packetFactory; this.configManager = configManager; this.actionRegistry = actionRegistry; this.typeRegistry = typeRegistry; + this.propertyRegistry = propertyRegistry; this.folder = folder; if (!this.folder.exists()) this.folder.mkdirs(); } @@ -49,7 +52,7 @@ public class YamlStorage implements NpcStorage { ConfigurationSection properties = config.getConfigurationSection("properties"); if (properties != null) { for (String key : properties.getKeys(false)) { - EntityPropertyImpl property = EntityPropertyImpl.getByName(key); + EntityPropertyImpl property = propertyRegistry.getByName(key); npc.UNSAFE_setProperty(property, property.deserialize(properties.getString(key))); } }