diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java b/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java new file mode 100644 index 0000000..4036e94 --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java @@ -0,0 +1,24 @@ +package lol.pyr.znpcsplus.util; + +// TODO: Seperate this out into multiple classes and multiple properties depending on the npc type +// TODO: For example USING_TONGUE is only for the frog type but its usable everywhere + +// TODO #2: Add some backwards compatibility to some of these, like for example CROUCHING can be done +// TODO #2: on older versions using the general Entity number 0 bitmask +public enum NpcPose { + STANDING, + FALL_FLYING, + SLEEPING, + SWIMMING, + SPIN_ATTACK, + CROUCHING, + LONG_JUMPING, + DYING, + CROAKING, + USING_TONGUE, + SITTING, + ROARING, + SNIFFING, + EMERGING, + DIGGING +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 4fe3561..9c6d2a8 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -4,7 +4,6 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.event.PacketListenerPriority; import com.github.retrooper.packetevents.manager.server.ServerVersion; -import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.command.CommandManager; @@ -233,7 +232,7 @@ 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(EntityPose.class, new EntityPoseParser(incorrectUsageMessage)); + manager.registerParser(NpcPose.class, new NpcPoseParser(incorrectUsageMessage)); manager.registerCommand("npc", new MultiCommand(loadHelpMessage("root")) .addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry)) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java index ca0a5fd..e181f35 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java @@ -1,6 +1,5 @@ package lol.pyr.znpcsplus.commands; -import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.item.ItemStack; import io.github.retrooper.packetevents.util.SpigotConversionUtil; import lol.pyr.director.adventure.command.CommandContext; @@ -11,6 +10,7 @@ import lol.pyr.znpcsplus.entity.EntityPropertyImpl; import lol.pyr.znpcsplus.npc.NpcEntryImpl; import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.util.NpcPose; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -68,7 +68,7 @@ public class PropertyCommand implements CommandHandler { Class type = property.getType(); if (type == Boolean.class) return context.suggestLiteral("true", "false"); if (type == NamedTextColor.class) return context.suggestCollection(NamedTextColor.NAMES.keys()); - if (type == EntityPose.class) return context.suggestEnum(EntityPose.values()); + if (type == NpcPose.class) return context.suggestEnum(NpcPose.values()); } return Collections.emptyList(); } 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 fb51022..a27a42b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -1,12 +1,12 @@ package lol.pyr.znpcsplus.entity; -import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.item.ItemStack; import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.entity.serializers.*; import lol.pyr.znpcsplus.skin.cache.SkinCache; +import lol.pyr.znpcsplus.util.NpcPose; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -27,7 +27,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new ItemStackPropertySerializer()); - registerSerializer(new EntityPosePropertySerializer()); + registerSerializer(new NpcPosePropertySerializer()); registerType("glow", NamedTextColor.class); registerType("fire", false); @@ -37,6 +37,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("name", Component.class); registerType("look", false); + // TODO: make all of these bukkit itemstack classes so api users wont have to add packetevents as a dependency registerType("helmet", ItemStack.class); registerType("chestplate", ItemStack.class); registerType("leggings", ItemStack.class); @@ -49,7 +50,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("potion_ambient", false); // TODO registerType("shaking", false); registerType("baby", false); // TODO - registerType("pose", EntityPose.STANDING, EntityPose.class); // TODO + registerType("pose", NpcPose.STANDING); // Player registerType("skin_cape", true); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/EntityPosePropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/EntityPosePropertySerializer.java deleted file mode 100644 index d882cde..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/EntityPosePropertySerializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package lol.pyr.znpcsplus.entity.serializers; - -import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; -import lol.pyr.znpcsplus.entity.PropertySerializer; - -public class EntityPosePropertySerializer implements PropertySerializer { - @Override - public String serialize(EntityPose property) { - return property.name(); - } - - @Override - public EntityPose deserialize(String property) { - return EntityPose.valueOf(property.toUpperCase()); - } - - @Override - public Class getTypeClass() { - return EntityPose.class; - } -} 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 new file mode 100644 index 0000000..d8ca9be --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/NpcPosePropertySerializer.java @@ -0,0 +1,21 @@ +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/packets/V1_14PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_14PacketFactory.java index e0d1c70..9350f6b 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 @@ -11,6 +11,7 @@ import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.metadata.MetadataFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.util.NpcLocation; +import lol.pyr.znpcsplus.util.NpcPose; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -34,7 +35,11 @@ public class V1_14PacketFactory extends V1_10PacketFactory { @Override public Map generateMetadata(Player player, PacketEntity entity, PropertyHolder properties) { Map data = super.generateMetadata(player, entity, properties); - add(data, metadataFactory.pose(properties.getProperty(propertyRegistry.getByName("pose", EntityPose.class)))); + add(data, metadataFactory.pose(adaptNpcPose(properties.getProperty(propertyRegistry.getByName("pose", NpcPose.class))))); return data; } + + protected EntityPose adaptNpcPose(NpcPose pose) { + return EntityPose.valueOf(pose.name()); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java similarity index 56% rename from plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java rename to plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java index eda727c..9f10488 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/NpcPoseParser.java @@ -1,23 +1,22 @@ package lol.pyr.znpcsplus.parsers; -import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; 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 EntityPoseParser extends ParserType { - - public EntityPoseParser(Message message) { +public class NpcPoseParser extends ParserType { + public NpcPoseParser(Message message) { super(message); } @Override - public EntityPose parse(Deque deque) throws CommandExecutionException { + public NpcPose parse(Deque deque) throws CommandExecutionException { try { - return EntityPose.valueOf(deque.pop().toUpperCase()); + return NpcPose.valueOf(deque.pop().toUpperCase()); } catch (IllegalArgumentException e) { throw new CommandExecutionException(); }