From def3bf9d4ad5c62e9b6de3ef7e7b5c5e0463f986 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Fri, 6 Oct 2023 08:54:53 +1000 Subject: [PATCH] Add remaining packet transformers, missing actual component conversion --- .../Protocol1_13_1To1_13.java | 5 +- .../Protocol1_13To1_12_2.java | 2 +- .../Protocol1_20_3To1_20_2.java | 104 ++++++++++++++++-- .../rewriter/EntityPacketRewriter1_20_3.java | 6 +- .../viaversion/rewriter/ItemRewriter.java | 3 +- 5 files changed, 103 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java index 654682021..195dea704 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java @@ -103,10 +103,7 @@ public class Protocol1_13_1To1_13 extends AbstractProtocol { private static final BitSetType PROFILE_ACTIONS_ENUM_TYPE = new BitSetType(6); + private static final ByteArrayType.OptionalByteArrayType OPTIONAL_SIGNATURE_BYTES_TYPE = new ByteArrayType.OptionalByteArrayType(256); + private static final ByteArrayType SIGNATURE_BYTES_TYPE = new ByteArrayType(256); private final EntityPacketRewriter1_20_3 entityRewriter = new EntityPacketRewriter1_20_3(this); public Protocol1_20_3To1_20_2() { @@ -54,24 +57,111 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol { - wrapper.cancel(); + wrapper.passthrough(Type.BOOLEAN); // Reset/clear + final int size = wrapper.passthrough(Type.VAR_INT); // Mapping size + for (int i = 0; i < size; i++) { + wrapper.passthrough(Type.STRING); // Identifier + + // Parent + if (wrapper.passthrough(Type.BOOLEAN)) { + wrapper.passthrough(Type.STRING); + } + + // Display data + if (wrapper.passthrough(Type.BOOLEAN)) { + convertComponent(wrapper); // Title + convertComponent(wrapper); // Description + wrapper.passthrough(Type.ITEM1_20_2); // Icon + wrapper.passthrough(Type.VAR_INT); // Frame type + final int flags = wrapper.passthrough(Type.INT); + if ((flags & 1) != 0) { + wrapper.passthrough(Type.STRING); // Background texture + } + wrapper.passthrough(Type.FLOAT); // X + wrapper.passthrough(Type.FLOAT); // Y + } + + final int requirements = wrapper.passthrough(Type.VAR_INT); + for (int array = 0; array < requirements; array++) { + wrapper.passthrough(Type.STRING_ARRAY); + } + + wrapper.passthrough(Type.BOOLEAN); // Send telemetry + } }); registerClientbound(ClientboundPackets1_20_2.TAB_COMPLETE, wrapper -> { - wrapper.cancel(); + wrapper.passthrough(Type.VAR_INT); // Transaction id + wrapper.passthrough(Type.VAR_INT); // Start + wrapper.passthrough(Type.VAR_INT); // Length + + final int suggestions = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < suggestions; i++) { + wrapper.passthrough(Type.STRING); // Suggestion + convertOptionalComponent(wrapper); // Tooltip + } }); registerClientbound(ClientboundPackets1_20_2.MAP_DATA, wrapper -> { - wrapper.cancel(); + wrapper.passthrough(Type.VAR_INT); // Map id + wrapper.passthrough(Type.BYTE); // Scale + wrapper.passthrough(Type.BOOLEAN); // Locked + if (wrapper.passthrough(Type.BOOLEAN)) { + final int icons = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < icons; i++) { + wrapper.passthrough(Type.BYTE); // Type + wrapper.passthrough(Type.BYTE); // X + wrapper.passthrough(Type.BYTE); // Y + wrapper.passthrough(Type.BYTE); // Rotation + convertOptionalComponent(wrapper); // Display name + } + } }); registerClientbound(ClientboundPackets1_20_2.PLAYER_CHAT, wrapper -> { - wrapper.cancel(); + wrapper.passthrough(Type.UUID); // Sender + wrapper.passthrough(Type.VAR_INT); // Index + wrapper.passthrough(OPTIONAL_SIGNATURE_BYTES_TYPE); // Signature + wrapper.passthrough(Type.STRING); // Plain content + wrapper.passthrough(Type.LONG); // Timestamp + wrapper.passthrough(Type.LONG); // Salt + + final int lastSeen = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < lastSeen; i++) { + final int index = wrapper.passthrough(Type.VAR_INT); + if (index == 0) { + wrapper.passthrough(SIGNATURE_BYTES_TYPE); + } + } + + convertOptionalComponent(wrapper); // Unsigned content + + final int filterMaskType = wrapper.passthrough(Type.VAR_INT); + if (filterMaskType == 2) { + wrapper.passthrough(Type.LONG_ARRAY_PRIMITIVE); // Mask + } + + wrapper.passthrough(Type.VAR_INT); // Chat type + convertComponent(wrapper); // Sender + convertOptionalComponent(wrapper); // Target }); registerClientbound(ClientboundPackets1_20_2.SCOREBOARD_OBJECTIVE, wrapper -> { - wrapper.cancel(); + wrapper.passthrough(Type.STRING); // Objective Name + final byte action = wrapper.passthrough(Type.BYTE); // Mode + if (action == 0 || action == 2) { + convertComponent(wrapper); // Display Name + } }); registerClientbound(ClientboundPackets1_20_2.TEAMS, wrapper -> { - wrapper.cancel(); + wrapper.passthrough(Type.STRING); // Team Name + final byte action = wrapper.passthrough(Type.BYTE); // Mode + if (action == 0 || action == 2) { + convertComponent(wrapper); // Display Name + wrapper.passthrough(Type.BYTE); // Flags + wrapper.passthrough(Type.STRING); // Name Tag Visibility + wrapper.passthrough(Type.STRING); // Collision rule + wrapper.passthrough(Type.VAR_INT); // Color + convertComponent(wrapper); // Prefix + convertComponent(wrapper); // Suffix + } }); registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.DISCONNECT.getId(), ClientboundConfigurationPackets1_20_2.DISCONNECT.getId(), this::convertComponent); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java index 40f395546..916bb8f3b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java @@ -42,25 +42,23 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter { wrapper.send(Protocol1_20_3To1_20_2.class); + wrapper.cancel(); // Make sure the loading screen is closed, continues old client behavior final PacketWrapper gameEventPacket = wrapper.create(ClientboundPackets1_20_2.GAME_EVENT); gameEventPacket.write(Type.UNSIGNED_BYTE, (short) 13); gameEventPacket.write(Type.FLOAT, 0F); gameEventPacket.send(Protocol1_20_3To1_20_2.class); - - wrapper.cancel(); }); protocol.registerClientbound(ClientboundPackets1_20_2.RESPAWN, wrapper -> { wrapper.send(Protocol1_20_3To1_20_2.class); + wrapper.cancel(); // Make sure the loading screen is closed, continues old client behavior final PacketWrapper gameEventPacket = wrapper.create(ClientboundPackets1_20_2.GAME_EVENT); gameEventPacket.write(Type.UNSIGNED_BYTE, (short) 13); gameEventPacket.write(Type.FLOAT, 0F); gameEventPacket.send(Protocol1_20_3To1_20_2.class); - - wrapper.cancel(); }); } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java index 750026c76..c2f44d832 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java @@ -319,8 +319,9 @@ public abstract class ItemRewriter