From dc73dc292fc6b425c5564a2c65a806cb8bf476ae Mon Sep 17 00:00:00 2001 From: Beanes Date: Thu, 9 Apr 2026 16:02:33 +0200 Subject: [PATCH 1/3] Fix metadata flags not saving cross packets syncing --- .../protocol/v1_8to1_7_6_10/data/VirtualHologramEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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..e5e866c81 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 @@ -46,6 +46,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 +101,6 @@ public void syncState(final EntityPacketRewriter1_8 entityRewriter, final List Date: Thu, 9 Apr 2026 16:50:31 +0200 Subject: [PATCH 2/3] Fix marker zombie no gravity offsets --- .../v1_8to1_7_6_10/data/VirtualHologramEntity.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 e5e866c81..c41c0c6aa 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 @@ -167,6 +167,18 @@ private double getOffset() { } else { return baseOffset + (0.9875 * 2); } + } else if (currentState == State.ZOMBIE_NO_GRAVITY) { + // 1.7 ride stack offset sum: Squid (0.95 * 0.75) + Zombie (1.8 * 0.75) = 2.0625 + // By starting at -2.0625, we zero out the 1.7 passenger height so we can apply 1.8's offsets. + double baseOffset = -2.0625; + + if (marker) { + // 1.8 Marker ArmorStand height is 0.0 -> 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; } From 6f38dcef3d3790ba487adcec3edf561675605628 Mon Sep 17 00:00:00 2001 From: Beanes Date: Sat, 11 Apr 2026 00:54:59 +0200 Subject: [PATCH 3/3] Improve interaction by rewriting "extra" entity ids of holograms to normal hologram id --- .../data/VirtualHologramEntity.java | 15 +++++++++++++++ .../rewriter/PlayerPacketRewriter1_8.java | 6 ++++-- .../storage/EntityTracker1_8.java | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) 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 c41c0c6aa..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; @@ -303,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; @@ -338,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; }