From 1cd8e1913e3d74eade86fef851842948fce2cb9c Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 21 Mar 2020 18:30:52 +0800 Subject: [PATCH] Add head yaw persistence --- .../net/citizensnpcs/npc/CitizensNPC.java | 2 + .../citizensnpcs/trait/CurrentLocation.java | 8 +++ .../main/java/net/citizensnpcs/util/NMS.java | 4 ++ .../java/net/citizensnpcs/util/NMSBridge.java | 2 + .../nms/v1_10_R1/util/NMSImpl.java | 5 ++ .../nms/v1_11_R1/util/NMSImpl.java | 5 ++ .../nms/v1_12_R1/util/NMSImpl.java | 5 ++ .../nms/v1_13_R2/util/NMSImpl.java | 5 ++ .../nms/v1_14_R1/util/NMSImpl.java | 5 ++ .../entity/HorseZombieController.java | 61 +++++++++---------- .../nms/v1_15_R1/util/NMSImpl.java | 8 ++- .../nms/v1_8_R3/util/NMSImpl.java | 5 ++ 12 files changed, 81 insertions(+), 34 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index e91909b82..e7f2ff131 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -154,6 +154,7 @@ public class CitizensNPC extends AbstractNPC { CurrentLocation spawnLocation = getTrait(CurrentLocation.class); if (getTrait(Spawned.class).shouldSpawn() && spawnLocation.getLocation() != null) { spawn(spawnLocation.getLocation(), SpawnReason.RESPAWN); + NMS.setHeadYaw(getEntity(), spawnLocation.getHeadYaw()); } if (getTrait(Spawned.class).shouldSpawn() && spawnLocation.getLocation() == null) { Messaging.debug("Tried to spawn", getId(), "on load but world was null"); @@ -261,6 +262,7 @@ public class CitizensNPC extends AbstractNPC { getEntity().teleport(at); + NMS.setBodyYaw(getEntity(), at.getYaw()); NMS.setHeadYaw(getEntity(), at.getYaw()); // Set the spawned state diff --git a/main/src/main/java/net/citizensnpcs/trait/CurrentLocation.java b/main/src/main/java/net/citizensnpcs/trait/CurrentLocation.java index dc66d338e..c3604170e 100644 --- a/main/src/main/java/net/citizensnpcs/trait/CurrentLocation.java +++ b/main/src/main/java/net/citizensnpcs/trait/CurrentLocation.java @@ -5,12 +5,15 @@ import org.bukkit.Location; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitName; +import net.citizensnpcs.util.NMS; /** * Persists the current {@link Location} of the {@link NPC}. Will cache last known location if despawned. */ @TraitName("location") public class CurrentLocation extends Trait { + @Persist + private float headYaw; @Persist(value = "", required = true) private Location location = new Location(null, 0, 0, 0); @@ -18,6 +21,10 @@ public class CurrentLocation extends Trait { super("location"); } + public float getHeadYaw() { + return headYaw; + } + public Location getLocation() { return location.getWorld() == null ? null : location; } @@ -27,6 +34,7 @@ public class CurrentLocation extends Trait { if (!npc.isSpawned()) return; location = npc.getEntity().getLocation(location); + headYaw = NMS.getHeadYaw(npc.getEntity()); } public void setLocation(Location loc) { diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index 1dcfca703..f27ffe552 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -358,6 +358,10 @@ public class NMS { BRIDGE.sendTabListRemove(recipient, listPlayer); } + public static void setBodyYaw(Entity entity, float yaw) { + BRIDGE.setBodyYaw(entity, yaw); + } + public static void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { BRIDGE.setDestination(entity, x, y, z, speed); } diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index 19ce31d44..b22880732 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -115,6 +115,8 @@ public interface NMSBridge { public void sendTabListRemove(Player recipient, Player listPlayer); + public void setBodyYaw(Entity entity, float yaw); + public void setDestination(Entity entity, double x, double y, double z, float speed); public void setDummyAdvancement(Player entity); diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index 4736a55af..26b94a881 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -843,6 +843,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java index 5c1da614c..b83273305 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java @@ -899,6 +899,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java index 171afe0d7..065aff768 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java @@ -907,6 +907,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java index d54155114..99784c564 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java @@ -942,6 +942,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); 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 e31841e43..92bfe26f5 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 @@ -995,6 +995,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HorseZombieController.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HorseZombieController.java index 16e4cd149..0e5691780 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HorseZombieController.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HorseZombieController.java @@ -48,11 +48,8 @@ public class HorseZombieController extends MobEntityController { public static class EntityHorseZombieNPC extends EntityHorseZombie implements NPCHolder { private double baseMovementSpeed; - boolean calledNMSHeight = false; - private final CitizensNPC npc; - private boolean riding; public EntityHorseZombieNPC(EntityTypes types, World world) { @@ -96,6 +93,13 @@ public class HorseZombieController extends MobEntityController { return false; } + @Override + public void checkDespawn() { + if (npc == null) { + super.checkDespawn(); + } + } + @Override public boolean cj() { if (npc != null && riding) { @@ -104,13 +108,6 @@ public class HorseZombieController extends MobEntityController { return super.cj(); } - @Override - public void checkDespawn() { - if (npc == null) { - super.checkDespawn(); - } - } - @Override public void collide(net.minecraft.server.v1_15_R1.Entity entity) { // this method is called by both the entities involved - cancelling @@ -148,28 +145,6 @@ public class HorseZombieController extends MobEntityController { } } - @Override - public void h(double x, double y, double z) { - if (npc == null) { - super.h(x, y, z); - return; - } - if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) { - if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) - super.h(x, y, z); - return; - } - Vector vector = new Vector(x, y, z); - NPCPushEvent event = Util.callPushEvent(npc, vector); - if (!event.isCancelled()) { - vector = event.getCollisionVector(); - super.h(vector.getX(), vector.getY(), vector.getZ()); - } - // when another entity collides, this method is called to push the - // NPC so we prevent it from doing anything if the event is - // cancelled. - } - @Override public CraftEntity getBukkitEntity() { if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { @@ -198,6 +173,28 @@ public class HorseZombieController extends MobEntityController { return NMSImpl.getSoundEffect(npc, super.getSoundHurt(damagesource), NPC.HURT_SOUND_METADATA); } + @Override + public void h(double x, double y, double z) { + if (npc == null) { + super.h(x, y, z); + return; + } + if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) { + if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + super.h(x, y, z); + return; + } + Vector vector = new Vector(x, y, z); + NPCPushEvent event = Util.callPushEvent(npc, vector); + if (!event.isCancelled()) { + vector = event.getCollisionVector(); + super.h(vector.getX(), vector.getY(), vector.getZ()); + } + // when another entity collides, this method is called to push the + // NPC so we prevent it from doing anything if the event is + // cancelled. + } + @Override public boolean isClimbing() { if (npc == null || !npc.isFlyable()) { 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 0b78576a7..3a345346a 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 @@ -435,7 +435,7 @@ public class NMSImpl implements NMSBridge { if (!(entity instanceof LivingEntity)) { return entity.getLocation().getYaw(); } - return getHandle((LivingEntity) entity).aM; + return getHandle((LivingEntity) entity).aK; } @Override @@ -998,6 +998,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity); @@ -1729,7 +1734,6 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "advancementDataPlayer"); - private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java index 0534e12f3..b18977097 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java @@ -779,6 +779,11 @@ public class NMSImpl implements NMSBridge { new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entity)); } + @Override + public void setBodyYaw(org.bukkit.entity.Entity entity, float yaw) { + getHandle(entity).yaw = yaw; + } + @Override public void setDestination(org.bukkit.entity.Entity entity, double x, double y, double z, float speed) { Entity handle = NMSImpl.getHandle(entity);