From 3425ed94e031492ba17db0a8c892240d80dd9017 Mon Sep 17 00:00:00 2001 From: Paulomart Date: Tue, 1 Mar 2016 21:38:35 +0100 Subject: [PATCH] Fix support for paintings, also add a read and write position method. --- .../java/us/myles/ViaVersion/PacketUtil.java | 13 +++++++++++++ .../transformers/OutgoingTransformer.java | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/us/myles/ViaVersion/PacketUtil.java b/src/main/java/us/myles/ViaVersion/PacketUtil.java index cacd6929a..12d4836e6 100644 --- a/src/main/java/us/myles/ViaVersion/PacketUtil.java +++ b/src/main/java/us/myles/ViaVersion/PacketUtil.java @@ -363,4 +363,17 @@ public class PacketUtil { e.printStackTrace(); } } + + public static long[] readBlockPosition(ByteBuf buf) { + long val = buf.readLong(); + long x = (val >> 38); // signed + long y = (val >> 26) & 0xfff; // unsigned + // this shifting madness is used to preserve sign + long z = (val << 38) >> 38; // signed + return new long[]{x, y, z}; + } + + public static void writeBlockPosition(ByteBuf buf, long x, long y, long z) { + buf.writeLong(((x & 0x3ffffff) << 38) | ((y & 0xfff) << 26) | (z & 0x3ffffff)); + } } diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 57a07b75f..ad8437b3a 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -267,6 +267,23 @@ public class OutgoingTransformer { return; } + if (packet == PacketType.PLAY_SPAWN_PAINTING) { + int id = PacketUtil.readVarInt(input); + PacketUtil.writeVarInt(id, output); + + PacketUtil.writeUUID(getUUID(id), output); + + String title = PacketUtil.readString(input); + PacketUtil.writeString(title, output); + + long[] position = PacketUtil.readBlockPosition(input); + PacketUtil.writeBlockPosition(output, position[0], position[1], position[2]); + + byte direction = input.readByte(); + output.writeByte(direction); + + return; + } if (packet == PacketType.PLAY_OPEN_WINDOW) { int windowId = input.readUnsignedByte(); String type = readString(input);