private async Task <ICollection <Zone> > HandleZoneListRequest() { var zones = new List <Zone>(); var builder = new PacketBuilder(); builder.AddInt16(0x0005); builder.AddBytes(new byte[26]); var buffer = builder.GetBytes(); await this.networkClient.SendAsync(buffer, buffer.Length); int chunkBufferLength; int chunk; int offset = 0; byte[] chunkBuffer = null; PacketReader reader; do { buffer = await this.networkClient.ReceiveAsync(); reader = new PacketReader(buffer); reader.ReadInt16(); reader.ReadInt16(); chunk = reader.ReadByte(); reader.ReadBytes(7); chunkBufferLength = reader.ReadLittleEndianInt16(); reader.ReadInt16(); if (chunkBuffer == null) { chunkBuffer = new byte[chunkBufferLength]; } offset += reader.CopyBytes(chunkBuffer, offset); builder = new PacketBuilder(); builder.AddInt16(0x000b); builder.AddInt16(0); builder.AddByte((byte)chunk); builder.AddPadding(3); buffer = builder.GetBytes(); await this.networkClient.SendAsync(buffer, buffer.Length); chunk++; } while (offset < (chunkBufferLength)); reader = new PacketReader(chunkBuffer); // Discard the 0x01 at the beginning reader.ReadByte(); while (reader.CanRead()) { var zone = new Zone(); zone.ServerAddress = reader.ReadIPAddress(); zone.ServerPort = reader.ReadUInt16(); reader.ReadBytes(6); zone.Name = reader.ReadString(32); reader.ReadInt16(); zone.IsAdvanced = reader.ReadBoolean(); reader.ReadBytes(29); zone.Description = reader.ReadString(); zones.Add(zone); } return(zones); }