diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/data/VirtualHologramEntity.java b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/data/VirtualHologramEntity.java index 9290e3887..32cd0789e 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/data/VirtualHologramEntity.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/data/VirtualHologramEntity.java @@ -24,6 +24,7 @@ import com.viaversion.viarewind.protocol.v1_7_6_10to1_7_2_5.packet.ClientboundPackets1_7_2_5; import com.viaversion.viarewind.protocol.v1_8to1_7_6_10.Protocol1_8To1_7_6_10; import com.viaversion.viarewind.protocol.v1_8to1_7_6_10.rewriter.EntityPacketRewriter1_8; +import com.viaversion.viarewind.protocol.v1_8to1_7_6_10.storage.EntityTracker1_8; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_8; import com.viaversion.viaversion.api.minecraft.entitydata.EntityData; @@ -46,6 +47,8 @@ public class VirtualHologramEntity { private String name = null; private float yaw, pitch; private float headYaw; + private byte flags = 0; + private byte armorStandFlags = 0; private boolean small = false; private boolean marker = false; private boolean sneaking = false; @@ -99,8 +102,6 @@ public void syncState(final EntityPacketRewriter1_8 entityRewriter, final List mounted offset 0.0 + return baseOffset; + } else { + // 1.8 Normal ArmorStand height is 1.975 -> mounted offset 1.975 * 0.75 = 1.48125 + return baseOffset + 1.48125; + } } else { return -0.4; } @@ -291,6 +304,13 @@ public void sendSpawnPacket(final EntityPacketRewriter1_8 entityRewriter) { this.entityIds = entityIds; } + for (int extraId : entityIds) { + if (extraId != entityId) { + ((EntityTracker1_8) user.getEntityTracker(Protocol1_8To1_7_6_10.class)).setExtraHologramId(entityId, extraId); + } + } + + sendEntityDataUpdate(entityRewriter); if (entityIds == null) { return; @@ -326,6 +346,13 @@ public void deleteEntity() { if (entityIds == null) { return; } + + for (int extraId : entityIds) { + if (extraId != entityId) { + ((EntityTracker1_8) user.getEntityTracker(Protocol1_8To1_7_6_10.class)).removeExtraHologramId(extraId); + } + } + final PacketWrapper despawn = PacketWrapper.create(ClientboundPackets1_7_2_5.REMOVE_ENTITIES, user); despawn.write(Types.BYTE, (byte) entityIds.length); for (int id : entityIds) { diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/PlayerPacketRewriter1_8.java b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/PlayerPacketRewriter1_8.java index ccfac6dd6..85b9e24ab 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/PlayerPacketRewriter1_8.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/PlayerPacketRewriter1_8.java @@ -532,13 +532,15 @@ public void register() { if (mode != 0) { return; } - final int entityId = wrapper.get(Types.VAR_INT, 0); final EntityTracker1_8 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_7_6_10.class); + final int entityId = tracker.getHologramIdWithExtra(wrapper.get(Types.VAR_INT, 0)); final PlayerSessionStorage position = wrapper.user().get(PlayerSessionStorage.class); - if (!tracker.getHolograms().containsKey(entityId)) { + if (entityId == -1) { return; } + + wrapper.set(Types.VAR_INT, 0, entityId); final AABB boundingBox = tracker.getHolograms().get(entityId).getBoundingBox(); Vector3d pos = new Vector3d(position.getPosX(), position.getPosY() + 1.8, position.getPosZ()); diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/EntityTracker1_8.java b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/EntityTracker1_8.java index ad7c0bd31..bd3227af7 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/EntityTracker1_8.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/EntityTracker1_8.java @@ -46,6 +46,7 @@ public class EntityTracker1_8 extends EntityTrackerBase { private final Int2ObjectMap holograms = new Int2ObjectArrayMap<>(); + private final Int2IntMap extraHologramIds = new Int2IntArrayMap(); private final Int2IntMap vehicles = new Int2IntArrayMap(); private final Int2ObjectMap entityIdToUUID = new Int2ObjectArrayMap<>(); private final Object2IntMap entityUUIDToId = new Object2IntOpenHashMap<>(); @@ -88,6 +89,8 @@ public void removeEntity(int entityId) { @Override public void clearEntities() { super.clearEntities(); + holograms.clear(); + extraHologramIds.clear(); vehicles.clear(); } @@ -189,6 +192,21 @@ public Int2ObjectMap getHolograms() { return holograms; } + public void setExtraHologramId(final int entityId, final int extraId) { + extraHologramIds.put(extraId, entityId); + } + + public void removeExtraHologramId(int extraId) { + extraHologramIds.remove(extraId); + } + + public int getHologramIdWithExtra(final int id) { + if (holograms.containsKey(id)) { + return id; + } + return extraHologramIds.getOrDefault(id, -1); + } + public boolean isSpectator() { return clientEntityGameMode == 3; }