Esempio n. 1
0
        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
        }