Exemplo n.º 1
0
        public void Add(int number, string arguments = null)
        {
            if (number == 0)
            {
                return;
            }

            arguments ??= "";

            if (Header == 0)
            {
                Header     = number;
                HeaderArgs = arguments;
            }

            AddHash(number);
            if (arguments.Length > 0)
            {
                AddHash(arguments.GetHashCode(StringComparison.Ordinal));
            }

            int strLength = Utility.Unicode.GetByteCount(arguments);

            int length = _position + 6 + strLength;

            while (length > _buffer.Length)
            {
                Flush();
            }

            var writer = new SpanWriter(_buffer);

            writer.Seek(_position, SeekOrigin.Begin);
            writer.Write(number);
            writer.Write((ushort)strLength);
            writer.WriteBigUni(arguments);
        }
Exemplo n.º 2
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 layoutWriter = new SpanWriter(_layoutBuffer);

            if (!gump.Draggable)
            {
                layoutWriter.Write(Gump.NoMove);
            }

            if (!gump.Closable)
            {
                layoutWriter.Write(Gump.NoClose);
            }

            if (!gump.Disposable)
            {
                layoutWriter.Write(Gump.NoDispose);
            }

            if (!gump.Resizable)
            {
                layoutWriter.Write(Gump.NoResize);
            }

            var stringsList = new OrderedHashSet <string>(11);

            foreach (var entry in gump.Entries)
            {
                entry.AppendTo(ref layoutWriter, stringsList, ref entries, ref switches);
            }

            var stringsWriter = new SpanWriter(_stringsBuffer);

            foreach (var str in stringsList)
            {
                var s = str ?? "";
                stringsWriter.Write((ushort)s.Length);
                stringsWriter.WriteBigUni(s);
            }

            int maxLength;

            if (packed)
            {
                var worstLayoutLength  = Zlib.MaxPackSize(layoutWriter.BytesWritten);
                var worstStringsLength = Zlib.MaxPackSize(stringsWriter.BytesWritten);
                maxLength = 40 + worstLayoutLength + worstStringsLength;
            }
            else
            {
                maxLength = 23 + layoutWriter.BytesWritten + stringsWriter.BytesWritten;
            }

            var writer = new SpanWriter(stackalloc byte[maxLength]);

            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);

            if (packed)
            {
                layoutWriter.Write((byte)0); // Layout text terminator
                WritePacked(layoutWriter.Span, ref writer);

                writer.Write(stringsList.Count);
                WritePacked(stringsWriter.Span, ref writer);
            }
            else
            {
                writer.Write((ushort)layoutWriter.BytesWritten);
                writer.Write(layoutWriter.Span);

                writer.Write((ushort)stringsList.Count);
                writer.Write(stringsWriter.Span);
            }

            writer.WritePacketLength();

            ns.Send(writer.Span);
        }
Exemplo n.º 3
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
        }