From a61c4cd816c6c1678fa52155fd5b80c684ae6dfb Mon Sep 17 00:00:00 2001 From: Graphica Date: Sat, 27 May 2017 17:29:48 -0500 Subject: [PATCH] Fix holograms not following players in 1.9+ --- .../src/mineplex/core/hologram/Hologram.java | 77 ++++++++++++------- .../core/hologram/HologramManager.java | 1 + 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index 56b4b6cb3..880190c79 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -34,7 +34,7 @@ public class Hologram { /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ - private ArrayList _entityIds = new ArrayList(); + private ArrayList _entityIds = new ArrayList<>(); private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; @@ -50,7 +50,7 @@ public class Hologram { private Packet[] _packets1_8; private Packet[] _packets1_9; private HashSet _playersInList = new HashSet<>(); - private ArrayList _playersTracking = new ArrayList(); + private ArrayList _playersTracking = new ArrayList<>(); private boolean _removeEntityDeath; private HologramTarget _target = HologramTarget.BLACKLIST; private int _viewDistance = 70; @@ -70,7 +70,7 @@ public class Hologram { */ public Hologram(HologramManager hologramManager, Location location, String... text) { - this(hologramManager, location, false, -1l, text); + this(hologramManager, location, false, -1L, text); } /** @@ -83,7 +83,7 @@ public class Hologram { */ public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) { - this(hologramManager, location, hideBoundingBox, -1l, text); + this(hologramManager, location, hideBoundingBox, -1L, text); } /** @@ -431,9 +431,14 @@ public class Hologram { * * @return the original hologram object. */ - public Hologram setFollowEntity(Entity entityToFollow) { + public Hologram setFollowEntity(Entity entityToFollow) + { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null : _location.clone().subtract(entityToFollow.getLocation()).toVector(); + + if (entityToFollow != null) + { + relativeToEntity = _location.clone().subtract(entityToFollow.getLocation()).toVector(); + } return this; } @@ -447,7 +452,8 @@ public class Hologram { * * @retuen the original hologram object. */ - public Hologram setHologramTarget(HologramTarget newTarget) { + public Hologram setHologramTarget(HologramTarget newTarget) + { _target = newTarget; return this; } @@ -516,9 +522,32 @@ public class Hologram { int z = (int) Math.floor(32 * _lastMovement.getZ()); Packet[] packets1_8 = new Packet[_hologramText.length]; + Packet[] packets1_9 = new Packet[_hologramText.length]; int i = 0; + // Generate packets for 1.9 clients + x = (int) Math.floor(32 * newLocation.getX()); + z = (int) Math.floor(32 * newLocation.getZ()); + + _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); + + for (Integer entityId : _entityIds) + { + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); + teleportPacket.a = entityId; + teleportPacket.b = x; + teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); + teleportPacket.d = z; + + packets1_9[i] = teleportPacket; + + i++; + } + + i = 0; + + // Generate move packets for 1.8 clients if the move is small enough. if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); @@ -536,32 +565,26 @@ public class Hologram { i++; } } - else + else // Use teleport packets { - x = (int) Math.floor(32 * newLocation.getX()); - z = (int) Math.floor(32 * newLocation.getZ()); - - _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - - for (Integer entityId : _entityIds) - { - PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); - teleportPacket.a = entityId; - teleportPacket.b = x; - teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); - teleportPacket.d = z; - - packets1_8[i] = teleportPacket; - - i++; - } + packets1_8 = packets1_9; } for (Player player : canSee) { - for (Packet packet : packets1_8) + if (UtilPlayer.is1_9(player)) { - UtilPlayer.sendPacket(player, packet); + for (Packet packet : packets1_9) + { + UtilPlayer.sendPacket(player, packet); + } + } + else + { + for (Packet packet : packets1_8) + { + UtilPlayer.sendPacket(player, packet); + } } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index a68ce5944..88f6547cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -81,6 +81,7 @@ public class HologramManager extends MiniPlugin implements IPacketHandler hologram.stop(); continue; } + if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) { // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky.