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