From 66c06fd641bf6b15a2d8fb88dc99d1e366081197 Mon Sep 17 00:00:00 2001 From: fullwall Date: Mon, 29 Apr 2024 23:13:17 +0800 Subject: [PATCH] Create and use EntityPoseTrait --- .../npc/CitizensTraitFactory.java | 5 +- .../citizensnpcs/trait/EntityPoseTrait.java | 67 +++++++++++++++++++ .../net/citizensnpcs/trait/SleepTrait.java | 6 +- .../main/java/net/citizensnpcs/util/NMS.java | 6 ++ .../java/net/citizensnpcs/util/NMSBridge.java | 4 ++ .../nms/v1_14_R1/entity/EntityHumanNPC.java | 6 +- .../nms/v1_14_R1/util/NMSImpl.java | 9 +++ .../nms/v1_15_R1/entity/EntityHumanNPC.java | 6 +- .../nms/v1_15_R1/util/NMSImpl.java | 9 +++ .../nms/v1_16_R3/entity/EntityHumanNPC.java | 6 +- .../nms/v1_16_R3/util/NMSImpl.java | 4 ++ .../nms/v1_17_R1/entity/EntityHumanNPC.java | 6 +- .../nms/v1_17_R1/util/NMSImpl.java | 6 ++ .../nms/v1_18_R2/entity/EntityHumanNPC.java | 6 +- .../nms/v1_18_R2/util/NMSImpl.java | 6 ++ .../nms/v1_19_R3/entity/EntityHumanNPC.java | 6 +- .../nms/v1_19_R3/util/NMSImpl.java | 6 ++ .../nms/v1_20_R4/entity/EntityHumanNPC.java | 6 +- .../nms/v1_20_R4/util/NMSImpl.java | 10 ++- 19 files changed, 146 insertions(+), 34 deletions(-) create mode 100644 main/src/main/java/net/citizensnpcs/trait/EntityPoseTrait.java diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java b/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java index bb60aea69..1f7702f57 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java @@ -19,6 +19,7 @@ import net.citizensnpcs.api.trait.trait.MobType; import net.citizensnpcs.api.trait.trait.Owner; import net.citizensnpcs.api.trait.trait.PlayerFilter; import net.citizensnpcs.api.trait.trait.Spawned; +import net.citizensnpcs.model.ModelTrait; import net.citizensnpcs.trait.Age; import net.citizensnpcs.trait.Anchors; import net.citizensnpcs.trait.ArmorStandTrait; @@ -30,6 +31,7 @@ import net.citizensnpcs.trait.CurrentLocation; import net.citizensnpcs.trait.DropsTrait; import net.citizensnpcs.trait.EnderCrystalTrait; import net.citizensnpcs.trait.EndermanTrait; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.FollowTrait; import net.citizensnpcs.trait.GameModeTrait; import net.citizensnpcs.trait.Gravity; @@ -82,6 +84,7 @@ public class CitizensTraitFactory implements TraitFactory { registerTrait(TraitInfo.create(DropsTrait.class).optInToStats()); registerTrait(TraitInfo.create(EnderCrystalTrait.class)); registerTrait(TraitInfo.create(EndermanTrait.class)); + registerTrait(TraitInfo.create(EntityPoseTrait.class)); registerTrait(TraitInfo.create(Equipment.class)); registerTrait(TraitInfo.create(FollowTrait.class).optInToStats()); registerTrait(TraitInfo.create(GameModeTrait.class)); @@ -93,7 +96,7 @@ public class CitizensTraitFactory implements TraitFactory { registerTrait(TraitInfo.create(ItemFrameTrait.class)); registerTrait(TraitInfo.create(LookClose.class)); registerTrait(TraitInfo.create(PaintingTrait.class)); - registerTrait(TraitInfo.create(MirrorTrait.class).optInToStats()); + registerTrait(TraitInfo.create(MirrorTrait.class).optInToStats()); registerTrait(TraitInfo.create(MountTrait.class)); registerTrait(TraitInfo.create(MobType.class).asDefaultTrait()); registerTrait(TraitInfo.create(OcelotModifiers.class)); diff --git a/main/src/main/java/net/citizensnpcs/trait/EntityPoseTrait.java b/main/src/main/java/net/citizensnpcs/trait/EntityPoseTrait.java new file mode 100644 index 000000000..08f0183a3 --- /dev/null +++ b/main/src/main/java/net/citizensnpcs/trait/EntityPoseTrait.java @@ -0,0 +1,67 @@ +package net.citizensnpcs.trait; + +import net.citizensnpcs.api.persistence.Persist; +import net.citizensnpcs.api.trait.Trait; +import net.citizensnpcs.api.trait.TraitName; +import net.citizensnpcs.util.NMS; + +@TraitName("entitypose") +public class EntityPoseTrait extends Trait { + @Persist + private EntityPose pose; + + public EntityPoseTrait() { + super("entitypose"); + } + + public EntityPose getPose() { + return pose; + } + + @Override + public void run() { + if (pose == null || !npc.isSpawned()) + return; + NMS.setPose(npc.getEntity(), pose); + } + + public void setPose(EntityPose pose) { + this.pose = pose; + + } + + public enum EntityPose { + CROAKING(8), + CROUCHING(5), + DIGGING(14), + DYING(7), + EMERGING(13), + FALL_FLYING(1), + INHALING(17), + LONG_JUMPING(6), + ROARING(11), + SHOOTING(16), + SITTING(10), + SLEEPING(2), + SLIDING(15), + SNIFFING(12), + SPIN_ATTACK(4), + STANDING(0), + SWIMMING(3), + USING_TONGUE(9); + + private final int id; + + private EntityPose(int id) { + this.id = id; + } + + @Deprecated + /** + * Internal minecraft ID + */ + public int id() { + return id; + } + } +} diff --git a/main/src/main/java/net/citizensnpcs/trait/SleepTrait.java b/main/src/main/java/net/citizensnpcs/trait/SleepTrait.java index 793cc8a79..fb2c1aa6b 100644 --- a/main/src/main/java/net/citizensnpcs/trait/SleepTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/SleepTrait.java @@ -6,10 +6,10 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; -import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitName; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.util.NMS; @TraitName("sleeptrait") @@ -40,7 +40,7 @@ public class SleepTrait extends Trait { } if (npc.getEntity() instanceof Player) { Player player = (Player) npc.getEntity(); - npc.data().set(NPC.Metadata.ENTITY_POSE, "SLEEPING"); + npc.getOrAddTrait(EntityPoseTrait.class).setPose(EntityPose.SLEEPING); if (SUPPORT_BLOCKDATA) { try { if (at.getBlock().getBlockData() instanceof Bed || at.getBlock().getState() instanceof Bed) { @@ -67,7 +67,7 @@ public class SleepTrait extends Trait { } private void wakeup() { - npc.data().remove(NPC.Metadata.ENTITY_POSE); + npc.getOrAddTrait(EntityPoseTrait.class).setPose(null); if (npc.getEntity() instanceof Player) { NMS.sleep((Player) npc.getEntity(), false); } else if (npc.getEntity() instanceof Villager) { diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index c2d43d6ce..c27e7db7f 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -59,6 +59,7 @@ import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.MirrorTrait; import net.citizensnpcs.trait.PacketNPC; import net.citizensnpcs.trait.versioned.ArmadilloTrait.ArmadilloState; @@ -879,6 +880,10 @@ public class NMS { BRIDGE.setPolarBearRearing(entity, rearing); } + public static void setPose(Entity entity, EntityPose pose) { + BRIDGE.setPose(entity, pose); + } + public static void setProfile(SkullMeta meta, GameProfile profile) { BRIDGE.setProfile(meta, profile); } @@ -978,6 +983,7 @@ public class NMS { private static MethodHandle UNSAFE_PUT_INT; private static MethodHandle UNSAFE_PUT_LONG; private static MethodHandle UNSAFE_PUT_OBJECT; + private static MethodHandle UNSAFE_STATIC_FIELD_OFFSET; static { diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index d4046eebe..618965b53 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -41,6 +41,7 @@ import net.citizensnpcs.api.util.EntityDim; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.MirrorTrait; import net.citizensnpcs.trait.SneakTrait; import net.citizensnpcs.trait.versioned.ArmadilloTrait.ArmadilloState; @@ -255,6 +256,9 @@ public interface NMSBridge { throw new UnsupportedOperationException(); } + public default void setPose(Entity entity, EntityPose pose) { + } + public void setProfile(SkullMeta meta, GameProfile profile); public void setShouldJump(Entity entity); diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java index 5c570d6f4..1b4fb8746 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java @@ -35,6 +35,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -47,7 +48,6 @@ import net.minecraft.server.v1_14_R1.DamageSource; import net.minecraft.server.v1_14_R1.Entity; import net.minecraft.server.v1_14_R1.EntityHuman; import net.minecraft.server.v1_14_R1.EntityPlayer; -import net.minecraft.server.v1_14_R1.EntityPose; import net.minecraft.server.v1_14_R1.EnumGamemode; import net.minecraft.server.v1_14_R1.EnumItemSlot; import net.minecraft.server.v1_14_R1.EnumProtocolDirection; @@ -358,9 +358,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(EntityPose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { dB(); } } diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java index 77b32e90b..c9d4c02cb 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java @@ -1408,6 +1408,15 @@ public class NMSImpl implements NMSBridge { ((EntityPolarBear) getHandle(entity)).r(rearing); } + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + try { + ENTITY_SETPOSE_METHOD.invoke(getHandle(entity), + net.minecraft.server.v1_14_R1.EntityPose.valueOf(pose.name())); + } catch (Throwable e) { + e.printStackTrace(); + } + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SKULL_PROFILE_FIELD == null) { diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java index 508972d6e..f8bf66b47 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java @@ -34,6 +34,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -46,7 +47,6 @@ import net.minecraft.server.v1_15_R1.DamageSource; import net.minecraft.server.v1_15_R1.Entity; import net.minecraft.server.v1_15_R1.EntityHuman; import net.minecraft.server.v1_15_R1.EntityPlayer; -import net.minecraft.server.v1_15_R1.EntityPose; import net.minecraft.server.v1_15_R1.EnumGamemode; import net.minecraft.server.v1_15_R1.EnumItemSlot; import net.minecraft.server.v1_15_R1.EnumProtocolDirection; @@ -404,9 +404,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(EntityPose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { dX(); } } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java index 341a9b39b..382595eb5 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java @@ -1450,6 +1450,15 @@ public class NMSImpl implements NMSBridge { ((EntityPolarBear) getHandle(entity)).r(rearing); } + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + try { + ENTITY_SETPOSE_METHOD.invoke(getHandle(entity), + net.minecraft.server.v1_15_R1.EntityPose.valueOf(pose.name())); + } catch (Throwable e) { + e.printStackTrace(); + } + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) { diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java index b65059331..c3775bfe4 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java @@ -34,6 +34,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -45,7 +46,6 @@ import net.minecraft.server.v1_16_R3.DamageSource; import net.minecraft.server.v1_16_R3.Entity; import net.minecraft.server.v1_16_R3.EntityHuman; import net.minecraft.server.v1_16_R3.EntityPlayer; -import net.minecraft.server.v1_16_R3.EntityPose; import net.minecraft.server.v1_16_R3.EnumGamemode; import net.minecraft.server.v1_16_R3.EnumItemSlot; import net.minecraft.server.v1_16_R3.EnumProtocolDirection; @@ -369,9 +369,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(EntityPose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { eu(); } } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java index fcfc2c9fb..c0d620c38 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java @@ -1484,6 +1484,10 @@ public class NMSImpl implements NMSBridge { ((EntityPolarBear) getHandle(entity)).t(rearing); } + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + getHandle(entity).setPose(net.minecraft.server.v1_16_R3.EntityPose.valueOf(pose.name())); + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) { diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java index bc8b9c998..343f0c472 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java @@ -32,6 +32,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -48,7 +49,6 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.stats.ServerStatsCounter; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.Pose; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -162,9 +162,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable entity.playerTouch(this); } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(Pose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { updatePlayerPose(); } } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java index f8388b5f8..e8198a6f4 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java @@ -195,6 +195,7 @@ import net.citizensnpcs.npc.EntityControllers; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.RotationTrait; import net.citizensnpcs.trait.versioned.AxolotlTrait; import net.citizensnpcs.trait.versioned.BeeTrait; @@ -1481,6 +1482,11 @@ public class NMSImpl implements NMSBridge { ((PolarBear) getHandle(entity)).setStanding(rearing); } + @Override + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + getHandle(entity).setPose(Pose.valueOf(pose.name())); + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) { diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java index 3bb990e33..7cfeaa8d8 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java @@ -33,6 +33,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -49,7 +50,6 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.stats.ServerStatsCounter; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.Pose; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -163,9 +163,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable entity.playerTouch(this); } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(Pose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { updatePlayerPose(); } } diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java index 30a5fcbd4..4c1bc5e03 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java @@ -196,6 +196,7 @@ import net.citizensnpcs.npc.EntityControllers; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.RotationTrait; import net.citizensnpcs.trait.versioned.AxolotlTrait; import net.citizensnpcs.trait.versioned.BeeTrait; @@ -1491,6 +1492,11 @@ public class NMSImpl implements NMSBridge { ((PolarBear) getHandle(entity)).setStanding(rearing); } + @Override + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + getHandle(entity).setPose(Pose.valueOf(pose.name())); + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) { diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java index 2349abb78..e40dcb33a 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java @@ -31,6 +31,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -49,7 +50,6 @@ import net.minecraft.stats.ServerStatsCounter; import net.minecraft.tags.TagKey; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.Pose; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; @@ -156,9 +156,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable entity.playerTouch(this); } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(Pose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { updatePlayerPose(); } } diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java index 3e968ae35..311908850 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java @@ -213,6 +213,7 @@ import net.citizensnpcs.npc.EntityControllers; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.MirrorTrait; import net.citizensnpcs.trait.RotationTrait; import net.citizensnpcs.trait.versioned.AllayTrait; @@ -1634,6 +1635,11 @@ public class NMSImpl implements NMSBridge { ((PolarBear) getHandle(entity)).setStanding(rearing); } + @Override + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + getHandle(entity).setPose(Pose.valueOf(pose.name())); + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) { diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java index 488bc8faf..89ceb0fbe 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java @@ -29,6 +29,7 @@ import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.EntityPoseTrait; import net.citizensnpcs.trait.Gravity; import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.NMS; @@ -49,7 +50,6 @@ import net.minecraft.stats.ServerStatsCounter; import net.minecraft.tags.TagKey; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.Pose; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; @@ -158,9 +158,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable entity.playerTouch(this); } } - if (npc.data().has(NPC.Metadata.ENTITY_POSE)) { - setPose(Pose.valueOf(npc.data().get(NPC.Metadata.ENTITY_POSE))); - } else { + if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { updatePlayerPose(); } } diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java index 3f75e7237..7a03ad376 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java @@ -209,6 +209,7 @@ import net.citizensnpcs.npc.EntityControllers; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.EntityPoseTrait.EntityPose; import net.citizensnpcs.trait.MirrorTrait; import net.citizensnpcs.trait.RotationTrait; import net.citizensnpcs.trait.versioned.AllayTrait; @@ -888,9 +889,9 @@ public class NMSImpl implements NMSBridge { @Override public boolean isSneaking(org.bukkit.entity.Entity entity) { - if (entity instanceof Player) { + if (entity instanceof Player) return ((Player) entity).isSneaking(); - } + return getHandle(entity).getPose() == Pose.CROUCHING; } @@ -1633,6 +1634,11 @@ public class NMSImpl implements NMSBridge { ((PolarBear) getHandle(entity)).setStanding(rearing); } + @Override + public void setPose(org.bukkit.entity.Entity entity, EntityPose pose) { + getHandle(entity).setPose(Pose.BY_ID.apply(pose.id())); + } + @Override public void setProfile(SkullMeta meta, GameProfile profile) { if (SET_PROFILE_METHOD == null) {