@Override public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { if (protocolVersion < ProtocolConstants.MINECRAFT_SNAPSHOT) { items = new Item[1]; Item item = items[0] = new Item(); item.displayName = item.username = readString(buf); action = !buf.readBoolean() ? Action.REMOVE_PLAYER : Action.ADD_PLAYER; item.ping = buf.readShort(); } else { action = Action.values()[DefinedPacket.readVarInt(buf)]; items = new Item[DefinedPacket.readVarInt(buf)]; for (int i = 0; i < items.length; i++) { Item item = items[i] = new Item(); item.setUuid(DefinedPacket.readUUID(buf)); switch (action) { case ADD_PLAYER: item.username = DefinedPacket.readString(buf); item.properties = new String[DefinedPacket.readVarInt(buf)][]; for (int j = 0; j < item.properties.length; j++) { String name = DefinedPacket.readString(buf); String value = DefinedPacket.readString(buf); if (buf.readBoolean()) { item.properties[j] = new String[] {name, value, DefinedPacket.readString(buf)}; } else { item.properties[j] = new String[] {name, value}; } } item.gamemode = DefinedPacket.readVarInt(buf); item.ping = DefinedPacket.readVarInt(buf); if (buf.readBoolean()) { item.displayName = DefinedPacket.readString(buf); } break; case UPDATE_GAMEMODE: item.gamemode = DefinedPacket.readVarInt(buf); break; case UPDATE_LATENCY: item.ping = DefinedPacket.readVarInt(buf); break; case UPDATE_DISPLAY_NAME: if (buf.readBoolean()) { item.displayName = DefinedPacket.readString(buf); } } } } }