diff --git a/type.generic/src/main/java/net/swofty/type/generic/entity/hologram/PlayerHolograms.java b/type.generic/src/main/java/net/swofty/type/generic/entity/hologram/PlayerHolograms.java index 05776703a..489c68208 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/entity/hologram/PlayerHolograms.java +++ b/type.generic/src/main/java/net/swofty/type/generic/entity/hologram/PlayerHolograms.java @@ -130,6 +130,21 @@ public static void removeExternalPlayerHologram(ExternalPlayerHologram hologram) externalPlayerHolograms.remove(hologram); } + public static void relocateExternalPlayerHologram(ExternalPlayerHologram hologram, Pos newPosition) { + List entities = externalPlayerHolograms.get(hologram); + if (entities == null) return; + + double spacing = hologram.getSpacing(); + double startY = hologram.text.length * spacing - spacing; + for (int i = 0; i < entities.size(); i++) { + HologramEntity entity = entities.get(i); + entity.setInstance( + hologram.getInstance() != null ? hologram.getInstance() : HypixelConst.getInstanceContainer(), + newPosition.add(0, startY - (i * spacing), 0) + ); + } + } + public static void removeExternalPlayerHologramsAt(HypixelPlayer player, Pos position) { List toRemove = new ArrayList<>(); for (ExternalPlayerHologram hologram : externalPlayerHolograms.keySet()) { diff --git a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java index 3634f66ae..df3fda2b4 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java +++ b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java @@ -154,9 +154,20 @@ public static void updateForPlayer(HypixelPlayer player) { } if (needsUpdate && !needsFullUpdate) { - entity.setView(npcPosition.yaw(), npcPosition.pitch()); - entity.setInstance(config.instance(), npcPosition); - return; + boolean onlyViewChanged = entity.getPosition().x() == npcPosition.x() && entity.getPosition().z() == npcPosition.z() && entity.getPosition().y() == npcPosition.y(); + entity.setView(npcPosition.yaw(), npcPosition.pitch()); + entity.setInstance(config.instance(), npcPosition); + if (!onlyViewChanged) { + boolean overflowing = npcHolograms[npcHolograms.length - 1].length() > 16; + float yOffset = overflowing ? -0.2f : 0.0f; + if (config instanceof VillagerConfiguration) { + yOffset = 0.2f; + } else if (config instanceof AnimalConfiguration animalConfig) { + yOffset = animalConfig.hologramYOffset(); + } + PlayerHolograms.relocateExternalPlayerHologram(holo, npcPosition.add(0, 1.1f + yOffset, 0)); + } + return; } if (needsFullUpdate) { entity.remove();