public static void SendDisplayGump(this NetState ns, Gump gump, out int switches, out int entries) { switches = 0; entries = 0; if (ns == null) { return; } var packed = ns.Unpack; var writer = new SpanWriter(512, true); writer.Write((byte)(packed ? 0xDD : 0xB0)); // Packet ID writer.Seek(2, SeekOrigin.Current); writer.Write(gump.Serial); writer.Write(gump.TypeID); writer.Write(gump.X); writer.Write(gump.Y); var spanWriter = new SpanWriter(512, true); if (!gump.Draggable) { spanWriter.Write(Gump.NoMove); } if (!gump.Closable) { spanWriter.Write(Gump.NoClose); } if (!gump.Disposable) { spanWriter.Write(Gump.NoDispose); } if (!gump.Resizable) { spanWriter.Write(Gump.NoResize); } var stringsList = new OrderedHashSet <string>(11); foreach (var entry in gump.Entries) { entry.AppendTo(ref spanWriter, stringsList, ref entries, ref switches); } if (packed) { spanWriter.Write((byte)0); // Layout text terminator WritePacked(ref writer, spanWriter.Span); } else { writer.Write((ushort)spanWriter.BytesWritten); writer.Write(spanWriter.Span); } if (packed) { writer.Write(stringsList.Count); } else { writer.Write((ushort)stringsList.Count); } spanWriter.Seek(0, SeekOrigin.Begin); foreach (var str in stringsList) { var s = str ?? ""; spanWriter.Write((ushort)s.Length); spanWriter.WriteBigUni(s); } if (packed) { WritePacked(ref writer, spanWriter.Span); } else { writer.Write(spanWriter.Span); } writer.WritePacketLength(); ns.Send(writer.Span); spanWriter.Dispose(); // Can't use using and refs, so we dispose manually }