diff --git a/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java b/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java index 66ce076ba..35df97632 100644 --- a/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java +++ b/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java @@ -125,18 +125,20 @@ public class ProtocolLibListener implements Listener { uuid -> mirrorTraits.get(uuid)); return; } + List list = event.getPacket().getPlayerInfoDataLists().readSafely(0); if (list == null) return; + boolean changed = false; for (int i = 0; i < list.size(); i++) { PlayerInfoData npcInfo = list.get(i); if (npcInfo == null) continue; MirrorTrait trait = mirrorTraits.get(npcInfo.getProfile().getUUID()); - if (trait == null || !trait.isMirroring(event.getPlayer())) { + if (trait == null || !trait.isMirroring(event.getPlayer())) continue; - } + GameProfile playerProfile = NMS.getProfile(event.getPlayer()); if (trait.mirrorName()) { list.set(i, @@ -166,7 +168,7 @@ public class ProtocolLibListener implements Listener { } }); manager.addPacketListener(new PacketAdapter( - plugin, ListenerPriority.MONITOR, Arrays.asList(Server.ENTITY_HEAD_ROTATION, Server.ENTITY_LOOK, + plugin, ListenerPriority.HIGHEST, Arrays.asList(Server.ENTITY_HEAD_ROTATION, Server.ENTITY_LOOK, Server.REL_ENTITY_MOVE_LOOK, Server.ENTITY_MOVE_LOOK, Server.POSITION, Server.ENTITY_TELEPORT), ListenerOptions.ASYNC) { @Override diff --git a/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java b/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java index 85f557602..a599c09c7 100644 --- a/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java @@ -33,7 +33,7 @@ public class RotationTrait extends Trait { @Persist(reify = true) private final RotationParams globalParameters = new RotationParams(); private final RotationSession globalSession = new RotationSession(globalParameters); - private final List packetSessions = Lists.newArrayList(); + private final List packetSessions = Lists.newCopyOnWriteArrayList(); private final Map packetSessionsByUUID = Maps.newConcurrentMap(); public RotationTrait() { @@ -60,6 +60,7 @@ public class RotationTrait extends Trait { } else { packetSessions.add(lrs); } + return lrs; } @@ -79,11 +80,13 @@ public class RotationTrait extends Trait { PacketRotationSession lrs = packetSessionsByUUID.get(player.getUniqueId()); if (lrs != null && lrs.triple != null) return lrs; + for (PacketRotationSession session : packetSessions) { if (session.accepts(player) && session.triple != null) { return session; } } + return null; } @@ -95,6 +98,7 @@ public class RotationTrait extends Trait { public void run() { if (!npc.isSpawned()) return; + if (npc.data().get(NPC.Metadata.RESET_PITCH_ON_TICK, false)) { NMS.setPitch(npc.getEntity(), 0); } @@ -180,6 +184,7 @@ public class RotationTrait extends Trait { public void onPacketOverwritten() { if (triple == null) return; + triple.record(); } @@ -224,7 +229,7 @@ public class RotationTrait extends Trait { private boolean linkedBody; private float maxPitchPerTick = 10; private float maxYawPerTick = 40; - private boolean persist = false; + private volatile boolean persist = false; private float[] pitchRange = { -180, 180 }; private List uuidFilter; private float[] yawRange = { -180, 180 }; @@ -383,7 +388,7 @@ public class RotationTrait extends Trait { public class RotationSession { private final RotationParams params; - private int t = -1; + private volatile int t = -1; private Supplier targetPitch = () -> 0F; private Supplier targetYaw = targetPitch;