From 739bbe71168d3ae2575990b0c60e59ae975a06e0 Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Tue, 27 Jun 2023 17:36:42 +0530 Subject: [PATCH] Implemented armor stand properties --- .../java/lol/pyr/znpcsplus/util/Vector3f.java | 46 +++++++++++++++++++ .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 2 + .../znpcsplus/commands/PropertyCommand.java | 2 + .../entity/EntityPropertyRegistryImpl.java | 21 +++++---- .../Vector3fPropertySerializer.java | 22 +++++++++ .../znpcsplus/metadata/MetadataFactory.java | 8 ++++ .../metadata/V1_10MetadataFactory.java | 36 +++++++++++++++ .../metadata/V1_14MetadataFactory.java | 36 +++++++++++++++ .../metadata/V1_15MetadataFactory.java | 42 +++++++++++++++++ .../metadata/V1_16MetadataFactory.java | 2 +- .../metadata/V1_17MetadataFactory.java | 38 +++++++++++++++ .../metadata/V1_8MetadataFactory.java | 36 +++++++++++++++ .../znpcsplus/npc/NpcTypeRegistryImpl.java | 4 +- .../znpcsplus/packets/V1_8PacketFactory.java | 14 ++++++ .../pyr/znpcsplus/parsers/Vector3fParser.java | 23 ++++++++++ 15 files changed, 320 insertions(+), 12 deletions(-) create mode 100644 api/src/main/java/lol/pyr/znpcsplus/util/Vector3f.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/Vector3fPropertySerializer.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/parsers/Vector3fParser.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/Vector3f.java b/api/src/main/java/lol/pyr/znpcsplus/util/Vector3f.java new file mode 100644 index 0000000..d63b35d --- /dev/null +++ b/api/src/main/java/lol/pyr/znpcsplus/util/Vector3f.java @@ -0,0 +1,46 @@ +package lol.pyr.znpcsplus.util; + +public class Vector3f { + public final float x; + public final float y; + public final float z; + + public Vector3f() { + this.x = 0.0F; + this.y = 0.0F; + this.z = 0.0F; + } + + public Vector3f(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Vector3f(String s) { + String[] split = s.split(","); + this.x = Float.parseFloat(split[0]); + this.y = Float.parseFloat(split[1]); + this.z = Float.parseFloat(split[2]); + } + + public float getX() { + return this.x; + } + + public float getY() { + return this.y; + } + + public float getZ() { + return this.z; + } + + public String toString() { + return this.x + "," + this.y + "," + this.z; + } + + public static Vector3f zero() { + return new Vector3f(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 868e5df..9c21191 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -239,6 +239,7 @@ public class ZNpcsPlus extends JavaPlugin { versions.put(ServerVersion.V_1_11, LazyLoader.of(V1_11MetadataFactory::new)); versions.put(ServerVersion.V_1_13, LazyLoader.of(V1_13MetadataFactory::new)); versions.put(ServerVersion.V_1_14, LazyLoader.of(V1_14MetadataFactory::new)); + versions.put(ServerVersion.V_1_15, LazyLoader.of(V1_15MetadataFactory::new)); versions.put(ServerVersion.V_1_16, LazyLoader.of(V1_16MetadataFactory::new)); versions.put(ServerVersion.V_1_17, LazyLoader.of(V1_17MetadataFactory::new)); @@ -270,6 +271,7 @@ public class ZNpcsPlus extends JavaPlugin { manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage)); manager.registerParser(InteractionType.class, new InteractionTypeParser(incorrectUsageMessage)); manager.registerParser(Color.class, new ColorParser(incorrectUsageMessage)); + manager.registerParser(Vector3f.class, new Vector3fParser(incorrectUsageMessage)); registerEnumParser(manager, NpcPose.class, incorrectUsageMessage); registerEnumParser(manager, DyeColor.class, incorrectUsageMessage); 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 6c6e7f7..a76eec3 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/PropertyCommand.java @@ -11,6 +11,7 @@ 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 lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Color; @@ -77,6 +78,7 @@ public class PropertyCommand implements CommandHandler { if (type == NamedTextColor.class) return context.suggestCollection(NamedTextColor.NAMES.keys()); if (type == NpcPose.class) return context.suggestEnum(NpcPose.values()); if (type == Color.class) return context.suggestLiteral("0x0F00FF", "#FFFFFF", "16711935"); + if (type == Vector3f.class) return context.suggestLiteral("0 0 0", "0.0 0.0 0.0"); } 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 a1b8763..efcbe7c 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java @@ -7,6 +7,7 @@ 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 lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Color; @@ -30,6 +31,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new ItemStackPropertySerializer()); registerSerializer(new ColorPropertySerializer()); + registerSerializer(new Vector3fPropertySerializer()); registerEnumSerializer(NpcPose.class); registerEnumSerializer(DyeColor.class); @@ -71,17 +73,16 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry { registerType("show_base", true); // TODO // Armor Stand - registerType("small", false); // TODO - registerType("arms", false); // TODO - registerType("base_plate", true); // TODO + registerType("small", false); + registerType("arms", false); + registerType("base_plate", true); - // TODO: Make a vector3f class for all of these - registerType("head_rotation", null); // TODO - registerType("body_rotation", null); // TODO - registerType("left_arm_rotation", null); // TODO - registerType("right_arm_rotation", null); // TODO - registerType("left_leg_rotation", null); // TODO - registerType("right_leg_rotation", null); // TODO + registerType("head_rotation", Vector3f.zero()); + registerType("body_rotation", Vector3f.zero()); + registerType("left_arm_rotation", new Vector3f(-10, 0, -10)); + registerType("right_arm_rotation", new Vector3f(-15, 0, 10)); + registerType("left_leg_rotation", new Vector3f(-1 , 0, -1)); + registerType("right_leg_rotation", new Vector3f(1, 0, 1)); // Bat registerType("hanging", false); // TODO diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/Vector3fPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/Vector3fPropertySerializer.java new file mode 100644 index 0000000..efecbd2 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/Vector3fPropertySerializer.java @@ -0,0 +1,22 @@ +package lol.pyr.znpcsplus.entity.serializers; + +import lol.pyr.znpcsplus.entity.PropertySerializer; +import lol.pyr.znpcsplus.util.Vector3f; + +public class Vector3fPropertySerializer implements PropertySerializer { + + @Override + public String serialize(Vector3f property) { + return property.toString(); + } + + @Override + public Vector3f deserialize(String property) { + return new Vector3f(property); + } + + @Override + public Class getTypeClass() { + return Vector3f.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 e3f5b20..1fd2318 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java @@ -2,6 +2,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 lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; /** @@ -29,4 +30,11 @@ public interface MetadataFactory { EntityData usingItem(boolean enabled, boolean offhand, boolean riptide); EntityData potionColor(int color); EntityData potionAmbient(boolean ambient); + EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate); + EntityData armorStandHeadRotation(Vector3f headRotation); + EntityData armorStandBodyRotation(Vector3f bodyRotation); + EntityData armorStandLeftArmRotation(Vector3f leftArmRotation); + EntityData armorStandRightArmRotation(Vector3f rightArmRotation); + EntityData armorStandLeftLegRotation(Vector3f leftLegRotation); + EntityData armorStandRightLegRotation(Vector3f rightLegRotation); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java index 7936ce0..a0973cd 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_10MetadataFactory.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import lol.pyr.znpcsplus.util.Vector3f; public class V1_10MetadataFactory extends V1_9MetadataFactory { @Override @@ -23,4 +24,39 @@ public class V1_10MetadataFactory extends V1_9MetadataFactory { public EntityData potionAmbient(boolean ambient) { return newEntityData(9, EntityDataTypes.BOOLEAN, ambient); } + + @Override + public EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate) { + return newEntityData(11, EntityDataTypes.BYTE, (byte) ((small ? 0x01 : 0) | (arms ? 0x04 : 0) | (noBasePlate ? 0x08 : 0))); + } + + @Override + public EntityData armorStandHeadRotation(Vector3f headRotation) { + return newEntityData(12, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(headRotation.getX(), headRotation.getY(), headRotation.getZ())); + } + + @Override + public EntityData armorStandBodyRotation(Vector3f bodyRotation) { + return newEntityData(13, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(bodyRotation.getX(), bodyRotation.getY(), bodyRotation.getZ())); + } + + @Override + public EntityData armorStandLeftArmRotation(Vector3f leftArmRotation) { + return newEntityData(14, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftArmRotation.getX(), leftArmRotation.getY(), leftArmRotation.getZ())); + } + + @Override + public EntityData armorStandRightArmRotation(Vector3f rightArmRotation) { + return newEntityData(15, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightArmRotation.getX(), rightArmRotation.getY(), rightArmRotation.getZ())); + } + + @Override + public EntityData armorStandLeftLegRotation(Vector3f leftLegRotation) { + return newEntityData(16, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftLegRotation.getX(), leftLegRotation.getY(), leftLegRotation.getZ())); + } + + @Override + public EntityData armorStandRightLegRotation(Vector3f rightLegRotation) { + return newEntityData(17, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightLegRotation.getX(), rightLegRotation.getY(), rightLegRotation.getZ())); + } } 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 a10b0e7..d9face6 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 @@ -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.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; +import lol.pyr.znpcsplus.util.Vector3f; public class V1_14MetadataFactory extends V1_13MetadataFactory { @Override @@ -29,4 +30,39 @@ public class V1_14MetadataFactory extends V1_13MetadataFactory { public EntityData potionAmbient(boolean ambient) { return newEntityData(10, EntityDataTypes.BOOLEAN, ambient); } + + @Override + public EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate) { + return newEntityData(13, EntityDataTypes.BYTE, (byte) ((small ? 0x01 : 0) | (arms ? 0x04 : 0) | (noBasePlate ? 0x08 : 0))); + } + + @Override + public EntityData armorStandHeadRotation(Vector3f headRotation) { + return newEntityData(14, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(headRotation.getX(), headRotation.getY(), headRotation.getZ())); + } + + @Override + public EntityData armorStandBodyRotation(Vector3f bodyRotation) { + return newEntityData(15, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(bodyRotation.getX(), bodyRotation.getY(), bodyRotation.getZ())); + } + + @Override + public EntityData armorStandLeftArmRotation(Vector3f leftArmRotation) { + return newEntityData(16, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftArmRotation.getX(), leftArmRotation.getY(), leftArmRotation.getZ())); + } + + @Override + public EntityData armorStandRightArmRotation(Vector3f rightArmRotation) { + return newEntityData(17, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightArmRotation.getX(), rightArmRotation.getY(), rightArmRotation.getZ())); + } + + @Override + public EntityData armorStandLeftLegRotation(Vector3f leftLegRotation) { + return newEntityData(18, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftLegRotation.getX(), leftLegRotation.getY(), leftLegRotation.getZ())); + } + + @Override + public EntityData armorStandRightLegRotation(Vector3f rightLegRotation) { + return newEntityData(19, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightLegRotation.getX(), rightLegRotation.getY(), rightLegRotation.getZ())); + } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java new file mode 100644 index 0000000..815109d --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_15MetadataFactory.java @@ -0,0 +1,42 @@ +package lol.pyr.znpcsplus.metadata; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityData; +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import lol.pyr.znpcsplus.util.Vector3f; + +public class V1_15MetadataFactory extends V1_14MetadataFactory { + @Override + public EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate) { + return newEntityData(14, EntityDataTypes.BYTE, (byte) ((small ? 0x01 : 0) | (arms ? 0x04 : 0) | (!noBasePlate ? 0x08 : 0))); + } + + @Override + public EntityData armorStandHeadRotation(Vector3f headRotation) { + return newEntityData(15, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(headRotation.getX(), headRotation.getY(), headRotation.getZ())); + } + + @Override + public EntityData armorStandBodyRotation(Vector3f bodyRotation) { + return newEntityData(16, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(bodyRotation.getX(), bodyRotation.getY(), bodyRotation.getZ())); + } + + @Override + public EntityData armorStandLeftArmRotation(Vector3f leftArmRotation) { + return newEntityData(17, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftArmRotation.getX(), leftArmRotation.getY(), leftArmRotation.getZ())); + } + + @Override + public EntityData armorStandRightArmRotation(Vector3f rightArmRotation) { + return newEntityData(18, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightArmRotation.getX(), rightArmRotation.getY(), rightArmRotation.getZ())); + } + + @Override + public EntityData armorStandLeftLegRotation(Vector3f leftLegRotation) { + return newEntityData(19, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftLegRotation.getX(), leftLegRotation.getY(), leftLegRotation.getZ())); + } + + @Override + public EntityData armorStandRightLegRotation(Vector3f rightLegRotation) { + return newEntityData(20, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightLegRotation.getX(), rightLegRotation.getY(), rightLegRotation.getZ())); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_16MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_16MetadataFactory.java index 2d97c2b..0160d87 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_16MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_16MetadataFactory.java @@ -2,7 +2,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; -public class V1_16MetadataFactory extends V1_14MetadataFactory { +public class V1_16MetadataFactory extends V1_15MetadataFactory { @Override public EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat) { return createSkinLayers(16, cape, jacket, leftSleeve, rightSleeve, leftLeg, rightLeg, hat); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java index 8416420..ab550ef 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_17MetadataFactory.java @@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.metadata; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import lol.pyr.znpcsplus.util.Vector3f; public class V1_17MetadataFactory extends V1_16MetadataFactory { @Override @@ -33,4 +34,41 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory { public EntityData potionAmbient(boolean ambient) { return newEntityData(11, EntityDataTypes.BOOLEAN, ambient); } + + @Override + public EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate) { + return newEntityData(15, EntityDataTypes.BYTE, (byte) ((small ? 0x01 : 0) | (arms ? 0x04 : 0) | (noBasePlate ? 0x08 : 0))); + } + + @Override + public EntityData armorStandHeadRotation(Vector3f headRotation) { + return newEntityData(16, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(headRotation.getX(), headRotation.getY(), headRotation.getZ())); + } + + @Override + public EntityData armorStandBodyRotation(Vector3f bodyRotation) { + return newEntityData(17, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(bodyRotation.getX(), bodyRotation.getY(), bodyRotation.getZ())); + } + + @Override + public EntityData armorStandLeftArmRotation(Vector3f leftArmRotation) { + return newEntityData(18, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftArmRotation.getX(), leftArmRotation.getY(), leftArmRotation.getZ())); + } + + @Override + public EntityData armorStandRightArmRotation(Vector3f rightArmRotation) { + return newEntityData(19, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightArmRotation.getX(), rightArmRotation.getY(), rightArmRotation.getZ())); + } + + @Override + public EntityData armorStandLeftLegRotation(Vector3f leftLegRotation) { + return newEntityData(20, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftLegRotation.getX(), leftLegRotation.getY(), leftLegRotation.getZ())); + } + + @Override + public EntityData armorStandRightLegRotation(Vector3f rightLegRotation) { + return newEntityData(21, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightLegRotation.getX(), rightLegRotation.getY(), rightLegRotation.getZ())); + } + + } 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 9df386c..179cbec 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 @@ -5,6 +5,7 @@ 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 lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; public class V1_8MetadataFactory implements MetadataFactory { @@ -58,6 +59,41 @@ public class V1_8MetadataFactory implements MetadataFactory { return newEntityData(8, EntityDataTypes.BYTE, (byte) (ambient ? 1 : 0)); } + @Override + public EntityData armorStandProperties(boolean small, boolean arms, boolean noBasePlate) { + return newEntityData(10, EntityDataTypes.BYTE, (byte) ((small ? 0x01 : 0) | (arms ? 0x04 : 0) | (noBasePlate ? 0x08 : 0))); + } + + @Override + public EntityData armorStandHeadRotation(Vector3f headRotation) { + return newEntityData(11, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(headRotation.getX(), headRotation.getY(), headRotation.getZ())); + } + + @Override + public EntityData armorStandBodyRotation(Vector3f bodyRotation) { + return newEntityData(12, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(bodyRotation.getX(), bodyRotation.getY(), bodyRotation.getZ())); + } + + @Override + public EntityData armorStandLeftArmRotation(Vector3f leftArmRotation) { + return newEntityData(13, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftArmRotation.getX(), leftArmRotation.getY(), leftArmRotation.getZ())); + } + + @Override + public EntityData armorStandRightArmRotation(Vector3f rightArmRotation) { + return newEntityData(14, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightArmRotation.getX(), rightArmRotation.getY(), rightArmRotation.getZ())); + } + + @Override + public EntityData armorStandLeftLegRotation(Vector3f leftLegRotation) { + return newEntityData(15, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(leftLegRotation.getX(), leftLegRotation.getY(), leftLegRotation.getZ())); + } + + @Override + public EntityData armorStandRightLegRotation(Vector3f rightLegRotation) { + return newEntityData(16, EntityDataTypes.ROTATION, new com.github.retrooper.packetevents.util.Vector3f(rightLegRotation.getX(), rightLegRotation.getY(), rightLegRotation.getZ())); + } + @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/NpcTypeRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java index cb61b19..380f3c3 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java @@ -41,7 +41,9 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry { // Most hologram offsets generated using Entity#getHeight() in 1.19.4 register(builder(p, "armor_stand", EntityTypes.ARMOR_STAND) - .setHologramOffset(-0.15).addEquipmentProperties()); + .setHologramOffset(-0.15) + .addEquipmentProperties() + .addProperties("small", "arms", "base_plate", "head_rotation", "body_rotation", "left_arm_rotation", "right_arm_rotation", "left_leg_rotation", "right_leg_rotation")); register(builder(p, "bat", EntityTypes.BAT) .setHologramOffset(-1.075)); 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 24a1f71..e6e0262 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 @@ -18,6 +18,7 @@ import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.skin.BaseSkinDescriptor; import lol.pyr.znpcsplus.util.NpcLocation; import lol.pyr.znpcsplus.util.PapiUtil; +import lol.pyr.znpcsplus.util.Vector3f; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Color; @@ -145,6 +146,19 @@ public class V1_8PacketFactory implements PacketFactory { add(data, metadataFactory.silent(properties.getProperty(propertyRegistry.getByName("silent", Boolean.class)))); add(data, metadataFactory.potionColor(properties.getProperty(propertyRegistry.getByName("potion_color", Color.class)).asRGB())); add(data, metadataFactory.potionAmbient(properties.getProperty(propertyRegistry.getByName("potion_ambient", Boolean.class)))); + if (entity.getType() == EntityTypes.ARMOR_STAND) { + add(data, metadataFactory.armorStandProperties( + properties.getProperty(propertyRegistry.getByName("small", Boolean.class)), + properties.getProperty(propertyRegistry.getByName("arms", Boolean.class)), + !properties.getProperty(propertyRegistry.getByName("base_plate", Boolean.class)) + )); + add(data, metadataFactory.armorStandHeadRotation(properties.getProperty(propertyRegistry.getByName("head_rotation", Vector3f.class)))); + add(data, metadataFactory.armorStandBodyRotation(properties.getProperty(propertyRegistry.getByName("body_rotation", Vector3f.class)))); + add(data, metadataFactory.armorStandLeftArmRotation(properties.getProperty(propertyRegistry.getByName("left_arm_rotation", Vector3f.class)))); + add(data, metadataFactory.armorStandRightArmRotation(properties.getProperty(propertyRegistry.getByName("right_arm_rotation", Vector3f.class)))); + add(data, metadataFactory.armorStandLeftLegRotation(properties.getProperty(propertyRegistry.getByName("left_leg_rotation", Vector3f.class)))); + add(data, metadataFactory.armorStandRightLegRotation(properties.getProperty(propertyRegistry.getByName("right_leg_rotation", Vector3f.class)))); + } if (properties.hasProperty(propertyRegistry.getByName("name"))) { add(data, metadataFactory.name(PapiUtil.set(player, properties.getProperty(propertyRegistry.getByName("name", Component.class))))); add(data, metadataFactory.nameShown()); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/parsers/Vector3fParser.java b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/Vector3fParser.java new file mode 100644 index 0000000..07bf898 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/parsers/Vector3fParser.java @@ -0,0 +1,23 @@ +package lol.pyr.znpcsplus.parsers; + +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.Vector3f; + +import java.util.Deque; + +public class Vector3fParser extends ParserType { + public Vector3fParser(Message message) { + super(message); + } + + @Override + public Vector3f parse(Deque deque) throws CommandExecutionException { + return new Vector3f( + Float.parseFloat(deque.pop()), + Float.parseFloat(deque.pop()), + Float.parseFloat(deque.pop())); + } +}