diff --git a/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java b/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java index 10fa7626b..bcc8b6be5 100644 --- a/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java +++ b/main/src/main/java/net/citizensnpcs/ProtocolLibListener.java @@ -18,6 +18,7 @@ import com.comphenix.protocol.wrappers.EnumWrappers; import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.trait.RotationTrait; import net.citizensnpcs.trait.RotationTrait.PacketRotationSession; @@ -33,23 +34,15 @@ public ProtocolLibListener(Citizens plugin) { flagsClass = MinecraftReflection.getMinecraftClass("EnumPlayerTeleportFlags", "PacketPlayOutPosition$EnumPlayerTeleportFlags", "network.protocol.game.PacketPlayOutPosition$EnumPlayerTeleportFlags"); + manager.addPacketListener( new PacketAdapter(plugin, ListenerPriority.MONITOR, Server.ENTITY_HEAD_ROTATION, Server.ENTITY_LOOK) { @Override public void onPacketSending(PacketEvent event) { - PacketContainer packet = event.getPacket(); - Entity entity = null; - try { - entity = manager.getEntityFromID(event.getPlayer().getWorld(), - packet.getIntegers().getValues().get(0)); - } catch (FieldAccessException ex) { - return; - } - - if (!(entity instanceof NPCHolder)) + NPC npc = getNPCFromPacket(event); + if (npc == null) return; - NPC npc = ((NPCHolder) entity).getNPC(); RotationTrait trait = npc.getTraitNullable(RotationTrait.class); if (trait == null) return; @@ -58,6 +51,7 @@ public void onPacketSending(PacketEvent event) { if (session == null || !session.isActive()) return; + PacketContainer packet = event.getPacket(); PacketType type = event.getPacketType(); if (type == Server.ENTITY_HEAD_ROTATION) { packet.getBytes().write(0, degToByte(session.getHeadYaw())); @@ -83,6 +77,29 @@ private StructureModifier> getFlagsModifier(PacketContai return handle.getSets(EnumWrappers.getGenericConverter(flagsClass, PlayerTeleportFlag.class)); } + private NPC getNPCFromPacket(PacketEvent event) { + PacketContainer packet = event.getPacket(); + Entity entity = null; + try { + Integer id = packet.getIntegers().readSafely(0); + if (id == null) + return null; + entity = manager.getEntityFromID(event.getPlayer().getWorld(), id); + } catch (FieldAccessException | IllegalArgumentException ex) { + if (!LOGGED_ERROR) { + Messaging.severe( + "Error retrieving entity from ID: ProtocolLib error? Suppressing further exceptions unless debugging."); + ex.printStackTrace(); + LOGGED_ERROR = true; + } else if (Messaging.isDebugging()) { + ex.printStackTrace(); + } + return null; + } + + return entity instanceof NPCHolder ? ((NPCHolder) entity).getNPC() : null; + } + public enum PlayerTeleportFlag { X, Y, @@ -94,4 +111,6 @@ public enum PlayerTeleportFlag { private static byte degToByte(float in) { return (byte) (in * 256.0F / 360.0F); } + + private static boolean LOGGED_ERROR = false; } diff --git a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java index d477a1212..0cf1016a4 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java @@ -73,7 +73,7 @@ private Team getTeam() { @Override public void onDespawn() { - previosuGlowingColor = null; + previousGlowingColor = null; if (npc.getEntity() == null) return; String name = npc.getEntity() instanceof Player ? npc.getEntity().getName() : npc.getUniqueId().toString();