diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java index 480b458b..bf62b4ae 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_19_4to1_20/packets/EntityPackets1_20.java @@ -20,8 +20,10 @@ package com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.packets; import com.google.common.collect.Sets; import com.viaversion.viabackwards.api.rewriters.EntityRewriter; import com.viaversion.viabackwards.protocol.protocol1_19_4to1_20.Protocol1_19_4To1_20; +import com.viaversion.viaversion.api.data.entity.TrackedEntity; import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_4Types; import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.version.Types1_19_4; @@ -45,10 +47,97 @@ public final class EntityPackets1_20 extends EntityRewriter { + final int entityId = wrapper.get(Type.VAR_INT, 0); + final EntityType entityType = tracker(wrapper.user()).entityType(entityId); + if (entityType == Entity1_19_4Types.ITEM_DISPLAY) { + // Turn it upside down + wrapper.set(Type.BYTE, 0, (byte) -wrapper.get(Type.BYTE, 0)); + wrapper.set(Type.BYTE, 1, (byte) (wrapper.get(Type.BYTE, 1) - 128)); + } + }); + } + }); + + final PacketHandler displayYawPitchHandler = wrapper -> { + final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(wrapper.get(Type.VAR_INT, 0)); + if (trackedEntity == null || trackedEntity.entityType() != Entity1_19_4Types.ITEM_DISPLAY) { + return; + } + + // Turn it upside down + wrapper.set(Type.BYTE, 0, (byte) (wrapper.get(Type.BYTE, 0) - 128)); + wrapper.set(Type.BYTE, 1, (byte) -wrapper.get(Type.BYTE, 1)); + }; + protocol.registerClientbound(ClientboundPackets1_19_4.ENTITY_POSITION_AND_ROTATION, new PacketHandlers() { + @Override + protected void register() { + map(Type.VAR_INT); // Entity id + map(Type.SHORT); // Delta X + map(Type.SHORT); // Delta Y + map(Type.SHORT); // Delta Z + map(Type.BYTE); // Yaw + map(Type.BYTE); // Pitch + handler(displayYawPitchHandler); + } + }); + protocol.registerClientbound(ClientboundPackets1_19_4.ENTITY_ROTATION, new PacketHandlers() { + @Override + protected void register() { + map(Type.VAR_INT); // Entity id + map(Type.BYTE); // Yaw + map(Type.BYTE); // Pitch + handler(displayYawPitchHandler); + } + }); + + protocol.registerClientbound(ClientboundPackets1_19_4.ENTITY_HEAD_LOOK, wrapper -> { + final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(wrapper.passthrough(Type.VAR_INT)); + if (trackedEntity == null || trackedEntity.entityType() != Entity1_19_4Types.ITEM_DISPLAY) { + return; + } + + wrapper.write(Type.BYTE, (byte) (wrapper.read(Type.BYTE) - 128)); + }); + + protocol.registerClientbound(ClientboundPackets1_19_4.ENTITY_TELEPORT, new PacketHandlers() { + @Override + protected void register() { + map(Type.VAR_INT); // Entity id + map(Type.DOUBLE); // X + map(Type.DOUBLE); // Y + map(Type.DOUBLE); // Z + map(Type.BYTE); // Yaw + map(Type.BYTE); // Pitch + handler(wrapper -> { + final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(wrapper.get(Type.VAR_INT, 0)); + if (trackedEntity == null || trackedEntity.entityType() != Entity1_19_4Types.ITEM_DISPLAY) { + return; + } + + wrapper.set(Type.BYTE, 0, (byte) (wrapper.get(Type.BYTE, 0) - 128)); + wrapper.set(Type.BYTE, 1, (byte) -wrapper.get(Type.BYTE, 1)); + }); + } + }); + protocol.registerClientbound(ClientboundPackets1_19_4.JOIN_GAME, new PacketHandlers() { @Override public void register() {