From ee58fbedbedbd7a8640a4b5d93222136a82835e8 Mon Sep 17 00:00:00 2001 From: gigosaurus Date: Thu, 3 Mar 2016 21:28:40 +0000 Subject: [PATCH] Fix some MalformedJsonExceptions This should fix the last possible cause of issue #70 --- .../transformers/OutgoingTransformer.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 38cec131f..6f3dedbbe 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -115,6 +115,55 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_PLAYER_LIST_ITEM) { + int action = readVarInt(input); + writeVarInt(action, output); + int players = readVarInt(input); + writeVarInt(players, output); + + // loop through players + for (int i = 0; i < players; i++) { + UUID uuid = readUUID(input); + writeUUID(uuid, output); + if (action == 0) { // add player + writeString(readString(input), output); // name + + int properties = readVarInt(input); + writeVarInt(properties, output); + + // loop through properties + for (int j = 0; j < properties; j++) { + writeString(readString(input), output); // name + writeString(readString(input), output); // value + boolean isSigned = input.readBoolean(); + output.writeBoolean(isSigned); + if (isSigned) { + writeString(readString(input), output); // signature + } + } + + writeVarInt(readVarInt(input), output); // gamemode + writeVarInt(readVarInt(input), output); // ping + boolean hasDisplayName = input.readBoolean(); + output.writeBoolean(hasDisplayName); + if (hasDisplayName) { + writeString(fixJson(readString(input)), output); // display name + } + } else if ((action == 1) || (action == 2)) { // update gamemode || update latency + writeVarInt(readVarInt(input), output); + } else if (action == 3) { // update display name + boolean hasDisplayName = input.readBoolean(); + output.writeBoolean(hasDisplayName); + if (hasDisplayName) { + writeString(fixJson(readString(input)), output); // display name + } + } else if (action == 4) { // remove player + // no fields + } + } + + return; + } if (packet == PacketType.PLAY_PLAYER_LIST_HEADER_FOOTER) { String header = readString(input); String footer = readString(input);