diff --git a/Projects/Server/Network/Packets/OutgoingDamagePackets.cs b/Projects/Server/Network/Packets/OutgoingDamagePackets.cs index 876ce6635..02e3b989b 100644 --- a/Projects/Server/Network/Packets/OutgoingDamagePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingDamagePackets.cs @@ -22,12 +22,12 @@ namespace Server.Network { public static void SendDamage(this NetState ns, Serial serial, int amount) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[ns.DamagePacket ? 7 : 11]); if (ns.DamagePacket) { @@ -45,7 +45,7 @@ namespace Server.Network writer.Write((byte)Math.Clamp(amount, 0, 0xFF)); } - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingEffectPackets.cs b/Projects/Server/Network/Packets/OutgoingEffectPackets.cs index b293a370d..1a45cde20 100644 --- a/Projects/Server/Network/Packets/OutgoingEffectPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingEffectPackets.cs @@ -306,12 +306,12 @@ namespace Server.Network public static void SendScreenEffect(this NetState ns, ScreenEffectType type) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[28]); writer.Write((byte)0x70); // Packet ID writer.Write((byte)0x4); @@ -319,7 +319,7 @@ namespace Server.Network writer.Write((ushort)type); writer.Clear(16); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs b/Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs index 119cd4b43..1df50738a 100644 --- a/Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs @@ -39,7 +39,7 @@ namespace Server.Network Serial serial, int number, string crafterName, bool unidentified, List attrs ) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } @@ -51,7 +51,7 @@ namespace Server.Network (unidentified ? 4 : 0) + attrs.Count * 6; - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[length]); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)length); writer.Write((ushort)0x10); // Subpacket @@ -80,7 +80,7 @@ namespace Server.Network writer.Write(-1); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendEquipUpdate(this NetState ns, Item item) @@ -111,7 +111,7 @@ namespace Server.Network } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[15]); writer.Write((byte)0x2E); // Packet ID writer.Write(item.Serial); writer.Write((short)item.ItemID); @@ -119,7 +119,7 @@ namespace Server.Network writer.Write(parentSerial); writer.Write((short)hue); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingGumpPackets.cs b/Projects/Server/Network/Packets/OutgoingGumpPackets.cs index 716aca4df..00e5f38ae 100644 --- a/Projects/Server/Network/Packets/OutgoingGumpPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingGumpPackets.cs @@ -21,12 +21,12 @@ namespace Server.Network { public static void SendCloseGump(this NetState ns, int typeId, int buttonId) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[13]); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)13); @@ -34,7 +34,7 @@ namespace Server.Network writer.Write(typeId); writer.Write(buttonId); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingLightPackets.cs b/Projects/Server/Network/Packets/OutgoingLightPackets.cs index ae25836f1..03393c88c 100644 --- a/Projects/Server/Network/Packets/OutgoingLightPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingLightPackets.cs @@ -21,30 +21,20 @@ namespace Server.Network { public static void SendPersonalLightLevel(this NetState ns, Serial serial, int level) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[6]); writer.Write((byte)0x4E); // Packet ID writer.Write(serial); writer.Write((byte)level); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } - public static void SendGlobalLightLevel(this NetState ns, int level = 0) - { - if (ns == null || !ns.GetSendBuffer(out var buffer)) - { - return; - } - - buffer[0] = 0x4F; // Packet ID - buffer[1] = (byte)level; - - ns.Send(ref buffer, 2); - } + public static void SendGlobalLightLevel(this NetState ns, int level = 0) => + ns?.Send(stackalloc byte[] { 0x4F, (byte)level }); } } diff --git a/Projects/Server/Network/Packets/OutgoingMapPackets.cs b/Projects/Server/Network/Packets/OutgoingMapPackets.cs index be4fb66d2..a1d3ef12a 100644 --- a/Projects/Server/Network/Packets/OutgoingMapPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMapPackets.cs @@ -21,12 +21,12 @@ namespace Server.Network { public static void SendMapPatches(this NetState ns) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[41]); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)41); // Length writer.Write((ushort)0x18); // Subpacket @@ -44,35 +44,19 @@ namespace Server.Network writer.Write(Map.Malas.Tiles.Patch.StaticBlocks); writer.Write(Map.Malas.Tiles.Patch.LandBlocks); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } - public static void SendInvalidMap(this NetState ns) - { - if (ns == null || !ns.GetSendBuffer(out var buffer)) - { - return; - } - - buffer[0] = 0xC6; // Packet ID - - ns.Send(ref buffer, 1); - } + public static void SendInvalidMap(this NetState ns) => ns?.Send(stackalloc byte[] { 0xC6 }); public static void SendMapChange(this NetState ns, Map map) { - if (ns == null || map == null || !ns.GetSendBuffer(out var buffer)) + if (map == null) { return; } - var writer = new CircularBufferWriter(buffer); - writer.Write((byte)0xBF); // Packet ID - writer.Write((ushort)6); // Length - writer.Write((ushort)0x08); // Subpacket - writer.Write((byte)map.MapID); - - ns.Send(ref buffer, writer.Position); + ns?.Send(stackalloc byte[] { 0xBF, 0x00, 0x06, 0x00, 0x08, (byte)map.MapID }); } } } diff --git a/Projects/Server/Network/Packets/OutgoingMenuPackets.cs b/Projects/Server/Network/Packets/OutgoingMenuPackets.cs index 2f5969c63..75c059d07 100644 --- a/Projects/Server/Network/Packets/OutgoingMenuPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMenuPackets.cs @@ -21,34 +21,36 @@ namespace Server.Network { public static void SendDisplayItemListMenu(this NetState ns, ItemListMenu menu) { - if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null || menu == null) { return; } - var writer = new CircularBufferWriter(buffer); + var question = menu.Question?.Trim(); + var questionLength = question?.Length ?? 0; + + var entries = menu.Entries; + int entriesLength = (byte)entries.Length; + + var maxLength = 11 + questionLength; + for (int i = 0; i < entriesLength; i++) + { + maxLength += 5 + entries[i].Name?.Length ?? 0; // could be trimmed + } + + var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x7C); // Packet ID - writer.Seek(2, SeekOrigin.Current); // Length + writer.Seek(2, SeekOrigin.Current); writer.Write(menu.Serial); writer.Write((ushort)0); - var question = menu.Question?.Trim(); + writer.Write((byte)questionLength); - if (question == null) + if (question != null) { - writer.Write((byte)0); - } - else - { - var questionLength = question.Length; - writer.Write((byte)questionLength); writer.WriteAscii(question); } - var entries = menu.Entries; - - int entriesLength = (byte)entries.Length; - writer.Write((byte)entriesLength); for (var i = 0; i < entriesLength; ++i) @@ -73,40 +75,40 @@ namespace Server.Network } writer.WritePacketLength(); - - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendDisplayQuestionMenu(this NetState ns, QuestionMenu menu) { - if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null || menu == null) { return; } - var writer = new CircularBufferWriter(buffer); - writer.Write((byte)0x7C); // Packet ID - writer.Seek(2, SeekOrigin.Current); // Length - writer.Write(menu.Serial); - writer.Write((ushort)0); - var question = menu.Question?.Trim(); - - if (question == null) - { - writer.Write((byte)0); - } - else - { - var questionLength = question.Length; - writer.Write((byte)questionLength); - writer.WriteAscii(question); - } + var questionLength = question?.Length ?? 0; var answers = menu.Answers; - int answersLength = (byte)answers.Length; + var maxLength = 11 + questionLength; + for (int i = 0; i < answersLength; i++) + { + maxLength += 5 + answers[i]?.Length ?? 0; // could be trimmed + } + + var writer = new SpanWriter(stackalloc byte[maxLength]); + writer.Write((byte)0x7C); // Packet ID + writer.Seek(2, SeekOrigin.Current); + writer.Write(menu.Serial); + writer.Write((ushort)0); + writer.Write((byte)questionLength); + + if (question != null) + { + writer.WriteAscii(question); + } + writer.Write((byte)answersLength); for (var i = 0; i < answersLength; ++i) @@ -128,13 +130,12 @@ namespace Server.Network } writer.WritePacketLength(); - - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendDisplayContextMenu(this NetState ns, ContextMenu menu) { - if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null || menu == null) { return; } @@ -143,8 +144,9 @@ namespace Server.Network var entries = menu.Entries; var entriesLength = (byte)entries.Length; + var maxLength = 12 + entriesLength * 8; - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0xBF); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length writer.Write((short)0x14); // Subpacket @@ -206,8 +208,7 @@ namespace Server.Network } writer.WritePacketLength(); - - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } }