From b7df0e3a3340d67da77f386c70c8a1970ff23af6 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Fri, 23 Jun 2023 01:16:58 +0530 Subject: [PATCH] Added pose property --- .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 2 ++ .../znpcsplus/commands/PropertyCommand.java | 2 ++ .../entity/EntityPropertyRegistryImpl.java | 3 +++ .../EntityPosePropertySerializer.java | 21 ++++++++++++++++ .../znpcsplus/metadata/MetadataFactory.java | 2 ++ .../metadata/V1_14MetadataFactory.java | 7 ++++++ .../metadata/V1_8MetadataFactory.java | 6 +++++ .../lol/pyr/znpcsplus/npc/NpcTypeImpl.java | 2 ++ .../znpcsplus/packets/V1_14PacketFactory.java | 10 ++++++++ .../znpcsplus/parsers/EntityPoseParser.java | 25 +++++++++++++++++++ 10 files changed, 80 insertions(+) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/EntityPosePropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index d1cd794..4fe3561 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -4,6 +4,7 @@ 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; @@ -232,6 +233,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.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 d5c0883..ca0a5fd 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java @@ -1,5 +1,6 @@ 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; @@ -67,6 +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()); } 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 e2098ef..0ebaea7 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -1,5 +1,6 @@ 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; @@ -26,6 +27,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new ItemStackPropertySerializer()); + registerSerializer(new EntityPosePropertySerializer()); registerType("glow", NamedTextColor.class); registerType("fire", false); @@ -48,6 +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 // 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 new file mode 100644 index 0000000..d882cde --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/EntityPosePropertySerializer.java @@ -0,0 +1,21 @@ +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/metadata/MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java index ef92ecb..40d0b66 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java @@ -1,6 +1,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import net.kyori.adventure.text.Component; import java.util.Collection; @@ -24,4 +25,5 @@ public interface MetadataFactory { EntityData silent(boolean enabled); Collection name(Component name); EntityData noGravity(); + EntityData pose(EntityPose pose); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java index f898ec9..6671efc 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_14MetadataFactory.java @@ -1,10 +1,17 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; public class V1_14MetadataFactory extends V1_13MetadataFactory { @Override public EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat) { return createSkinLayers(15, cape, jacket, leftSleeve, rightSleeve, leftLeg, rightLeg, hat); } + + @Override + public EntityData pose(EntityPose pose) { + return newEntityData(6, EntityDataTypes.ENTITY_POSE, pose); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java index 1c1e247..de298f3 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java @@ -3,6 +3,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.util.adventure.AdventureSerializer; import net.kyori.adventure.text.Component; @@ -34,6 +35,11 @@ public class V1_8MetadataFactory implements MetadataFactory { throw new UnsupportedOperationException("The gravity entity data isn't supported on this version"); } + @Override + public EntityData pose(EntityPose pose) { + throw new UnsupportedOperationException("The pose entity data isn't supported on this version"); + } + @Override public EntityData silent(boolean enabled) { return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0)); 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 12ad3c7..8f19c9a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java @@ -80,6 +80,8 @@ public class NpcTypeImpl implements NpcType { allowedProperties.add(propertyRegistry.getByName("skin_cape")); if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)) allowedProperties.add(propertyRegistry.getByName("glow")); + if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_14)) + allowedProperties.add(propertyRegistry.getByName("pose")); if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17)) allowedProperties.add(propertyRegistry.getByName("shaking")); return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties)); 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 5159583..e0d1c70 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 @@ -1,6 +1,8 @@ package lol.pyr.znpcsplus.packets; import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.util.Vector3d; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; import lol.pyr.znpcsplus.api.entity.PropertyHolder; @@ -12,6 +14,7 @@ import lol.pyr.znpcsplus.util.NpcLocation; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import java.util.Map; import java.util.Optional; public class V1_14PacketFactory extends V1_10PacketFactory { @@ -27,4 +30,11 @@ public class V1_14PacketFactory extends V1_10PacketFactory { sendAllMetadata(player, entity, properties); createTeam(player, entity, properties); } + + @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)))); + return data; + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java new file mode 100644 index 0000000..eda727c --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/EntityPoseParser.java @@ -0,0 +1,25 @@ +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 java.util.Deque; + +public class EntityPoseParser extends ParserType { + + public EntityPoseParser(Message message) { + super(message); + } + + @Override + public EntityPose parse(Deque deque) throws CommandExecutionException { + try { + return EntityPose.valueOf(deque.pop().toUpperCase()); + } catch (IllegalArgumentException e) { + throw new CommandExecutionException(); + } + } +}