@Override public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { if (protocolVersion < ProtocolConstants.MINECRAFT_SNAPSHOT) { Item item = items[0]; // Only one at a time writeString(item.displayName, buf); // TODO: Server unique only! buf.writeBoolean(action != Action.REMOVE_PLAYER); buf.writeShort(item.ping); } else { DefinedPacket.writeVarInt(action.ordinal(), buf); DefinedPacket.writeVarInt(items.length, buf); for (Item item : items) { DefinedPacket.writeUUID(item.uuid, buf); switch (action) { case ADD_PLAYER: DefinedPacket.writeString(item.username, buf); DefinedPacket.writeVarInt(item.properties.length, buf); for (String[] prop : item.properties) { DefinedPacket.writeString(prop[0], buf); DefinedPacket.writeString(prop[1], buf); if (prop.length >= 3) { buf.writeBoolean(true); DefinedPacket.writeString(prop[2], buf); } else { buf.writeBoolean(false); } } DefinedPacket.writeVarInt(item.gamemode, buf); DefinedPacket.writeVarInt(item.ping, buf); buf.writeBoolean(item.displayName != null); if (item.displayName != null) { DefinedPacket.writeString(item.displayName, buf); } break; case UPDATE_GAMEMODE: DefinedPacket.writeVarInt(item.gamemode, buf); break; case UPDATE_LATENCY: DefinedPacket.writeVarInt(item.ping, buf); break; case UPDATE_DISPLAY_NAME: buf.writeBoolean(item.displayName != null); if (item.displayName != null) { DefinedPacket.writeString(item.displayName, buf); } break; } } } }