From ffc26459ff62e478029e5625346fd3ff7a937e1f Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 4 Jan 2021 23:47:20 -0800 Subject: [PATCH] fix(core): Converts message, mobile, movement, player packets (#384) - [X] Converts message packets - [X] Convers mobile packets - [X] Converts movement packets - [X] Converts player packets --- .../Network/Packets/OutgoingAccountPackets.cs | 5 + .../Network/Packets/OutgoingCombatPackets.cs | 2 + .../Network/Packets/OutgoingLightPackets.cs | 2 + .../Network/Packets/OutgoingMapPackets.cs | 2 + .../Network/Packets/OutgoingMessagePackets.cs | 24 ++-- .../Network/Packets/OutgoingMobilePackets.cs | 23 ++-- .../Packets/OutgoingMovementPackets.cs | 78 ++++------- .../Network/Packets/OutgoingPlayerPackets.cs | 121 +++++++----------- 8 files changed, 108 insertions(+), 149 deletions(-) diff --git a/Projects/Server/Network/Packets/OutgoingAccountPackets.cs b/Projects/Server/Network/Packets/OutgoingAccountPackets.cs index 4093eba55..b33b255ad 100644 --- a/Projects/Server/Network/Packets/OutgoingAccountPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingAccountPackets.cs @@ -16,6 +16,7 @@ using System; using System.IO; using System.Buffers; +using System.Runtime.CompilerServices; using Server.Accounting; namespace Server.Network @@ -107,6 +108,7 @@ namespace Server.Network * * Sends a requests for the client version */ + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendClientVersionRequest(this NetState ns) => ns?.Send(stackalloc byte[] { 0xBD, 0x00, 0x03 }); /** @@ -115,6 +117,7 @@ namespace Server.Network * * Sends the result of a deletion request */ + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendCharacterDeleteResult(this NetState ns, DeleteResultType res) => ns?.Send(stackalloc byte[] { 0x85, (byte)res }); @@ -124,6 +127,7 @@ namespace Server.Network * * Sends a PopupMessage with a predetermined message */ + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendPopupMessage(this NetState ns, PMMessage msg) => ns?.Send(stackalloc byte[] { 0x53, (byte)msg }); @@ -384,6 +388,7 @@ namespace Server.Network * * Sends a reason for rejecting the login */ + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendAccountLoginRejected(this NetState ns, ALRReason reason) => ns?.Send(stackalloc byte[] { 0x82, (byte)reason }); diff --git a/Projects/Server/Network/Packets/OutgoingCombatPackets.cs b/Projects/Server/Network/Packets/OutgoingCombatPackets.cs index 7cd05caad..e272a79cf 100644 --- a/Projects/Server/Network/Packets/OutgoingCombatPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingCombatPackets.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System.Buffers; +using System.Runtime.CompilerServices; namespace Server.Network { @@ -35,6 +36,7 @@ namespace Server.Network ns.Send(writer.Span); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void SendSetWarMode(this NetState ns, bool warmode) => ns?.Send(stackalloc byte[] { 0x72, *(byte*)&warmode, 0x00, 0x32, 0x00 }); diff --git a/Projects/Server/Network/Packets/OutgoingLightPackets.cs b/Projects/Server/Network/Packets/OutgoingLightPackets.cs index 03393c88c..7f738a004 100644 --- a/Projects/Server/Network/Packets/OutgoingLightPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingLightPackets.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System.Buffers; +using System.Runtime.CompilerServices; namespace Server.Network { @@ -34,6 +35,7 @@ namespace Server.Network ns.Send(writer.Span); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] 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 a1d3ef12a..8813821cd 100644 --- a/Projects/Server/Network/Packets/OutgoingMapPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMapPackets.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System.Buffers; +using System.Runtime.CompilerServices; namespace Server.Network { @@ -47,6 +48,7 @@ namespace Server.Network ns.Send(writer.Span); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendInvalidMap(this NetState ns) => ns?.Send(stackalloc byte[] { 0xC6 }); public static void SendMapChange(this NetState ns, Map map) diff --git a/Projects/Server/Network/Packets/OutgoingMessagePackets.cs b/Projects/Server/Network/Packets/OutgoingMessagePackets.cs index 8f95f8e3e..056693023 100644 --- a/Projects/Server/Network/Packets/OutgoingMessagePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMessagePackets.cs @@ -217,53 +217,53 @@ namespace Server.Network public static void SendFollowMessage(this NetState ns, Serial s1, Serial s2) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[9]); writer.Write((byte)0x15); // Packet ID writer.Write(s1); writer.Write(s2); - ns.Send(ref buffer, 9); + ns.Send(writer.Span); } public static void SendPrompt(this NetState ns, Prompt prompt) { - if (ns == null || prompt == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null || prompt == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[21]); writer.Write((byte)0xC2); // Packet ID writer.Write((ushort)21); writer.Write(prompt.Serial); writer.Write(prompt.Serial); - writer.Write((long)0); - writer.Write((short)0); + writer.Clear(10); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendHelpResponse(this NetState ns, Serial s, string text) { text = text?.Trim() ?? ""; - if (ns == null || text.Length == 0 || !ns.GetSendBuffer(out var buffer)) + if (ns == null || text.Length == 0) { return; } - var writer = new CircularBufferWriter(buffer); + var length = 9 + text.Length * 2; + var writer = new SpanWriter(stackalloc byte[length]); writer.Write((byte)0xB7); - writer.Write((ushort)(9 + text.Length * 2)); + writer.Write((ushort)length); writer.Write(s); writer.WriteBigUniNull(text); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs index 773406355..4fc594a77 100644 --- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs @@ -48,12 +48,12 @@ namespace Server.Network public static void SendBondedStatus(this NetState ns, Serial serial, bool bonded) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[11]); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)11); // Length writer.Write((ushort)0x19); // Subpacket ID @@ -61,7 +61,7 @@ namespace Server.Network writer.Write(serial); writer.Write(bonded); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void CreateDeathAnimation(Span buffer, Serial killed, Serial corpse) @@ -263,19 +263,19 @@ namespace Server.Network public static void SendMobileName(this NetState ns, Mobile m) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[37]); writer.Write((byte)0x98); // Packet ID writer.Write((ushort)37); writer.Write(m.Serial); writer.WriteAscii(m.Name ?? "", 29); writer.Write((byte)0); // Null terminator - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void CreateMobileAnimation( @@ -521,7 +521,7 @@ namespace Server.Network return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[19]); writer.Write((byte)0x20); // Packet ID writer.Write(m.Serial); writer.Write((short)m.Body); @@ -534,7 +534,7 @@ namespace Server.Network writer.Write((byte)m.Direction); writer.Write((sbyte)m.Z); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendMobileIncoming(this NetState ns, Mobile beholder, Mobile beheld) @@ -549,7 +549,9 @@ namespace Server.Network layers.Clear(); #endif - var writer = new CircularBufferWriter(buffer); + var eq = beheld.Items; + var maxLength = 23 + (eq.Count + 2) * 9; + var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x78); // Packet ID writer.Seek(2, SeekOrigin.Current); @@ -569,7 +571,6 @@ namespace Server.Network writer.Write((byte)beheld.GetPacketFlags(sa)); writer.Write((byte)Notoriety.Compute(beholder, beheld)); - var eq = beheld.Items; for (var i = 0; i < eq.Count; ++i) { var item = eq[i]; @@ -650,7 +651,7 @@ namespace Server.Network writer.Write(0); // terminate writer.WritePacketLength(); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingMovementPackets.cs b/Projects/Server/Network/Packets/OutgoingMovementPackets.cs index 37d5f9c6a..65ee87e7b 100644 --- a/Projects/Server/Network/Packets/OutgoingMovementPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMovementPackets.cs @@ -15,6 +15,7 @@ using System.Buffers; using System.IO; +using System.Runtime.CompilerServices; namespace Server.Network { @@ -27,60 +28,29 @@ namespace Server.Network public static class OutgoingMovementPackets { - public static void SendSpeedControl(this NetState ns, SpeedControlSetting speedControl) - { - if (ns == null || !ns.GetSendBuffer(out var buffer)) - { - return; - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void SendSpeedControl(this NetState ns, SpeedControlSetting speedControl) => + ns?.Send(stackalloc byte[] { 0xBF, 0x00, 0x6, 0x00, 0x26, (byte)speedControl }); - var writer = new CircularBufferWriter(buffer); - writer.Write((byte)0xBF); // Packet ID - writer.Write((ushort)06); - writer.Write((ushort)0x26); // Subpacket - writer.Write((byte)speedControl); - - ns.Send(ref buffer, writer.Position); - } - - public static void SendMovePlayer(this NetState ns, Direction d) - { - if (ns == null || !ns.GetSendBuffer(out var buffer)) - { - return; - } - - buffer[0] = 0x97; // Packet ID - buffer[1] = (byte)d; - - ns.Send(ref buffer, 2); - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void SendMovePlayer(this NetState ns, Direction d) => ns?.Send(stackalloc byte[] { 0x97, (byte)d }); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SendMovementAck(this NetState ns, int seq, Mobile m) => ns.SendMovementAck(seq, Notoriety.Compute(m, m)); - public static void SendMovementAck(this NetState ns, int seq, int noto) - { - if (ns == null || !ns.GetSendBuffer(out var buffer)) - { - return; - } - - buffer[0] = 0x22; // Packet ID - buffer[1] = (byte)seq; - buffer[2] = (byte)noto; - - ns.Send(ref buffer, 3); - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void SendMovementAck(this NetState ns, int seq, int noto) => + ns?.Send(stackalloc byte[] { 0x22, (byte)seq, (byte)noto }); public static void SendMovementRej(this NetState ns, int seq, Mobile m) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[8]); writer.Write((byte)0x21); // Packet ID writer.Write((byte)seq); writer.Write((short)m.X); @@ -88,19 +58,19 @@ namespace Server.Network writer.Write((byte)m.Direction); writer.Write((sbyte)m.Z); - ns.Send(ref buffer, 8); + ns.Send(writer.Span); } public static void SendInitialFastwalkStack(this NetState ns, uint[] keys) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[29]); writer.Write((byte)0xBF); // Packet ID - writer.Seek(2, SeekOrigin.Current); + writer.Write((ushort)29); writer.Write((ushort)0x1); // Subpacket writer.Write(keys[0]); writer.Write(keys[1]); @@ -109,40 +79,40 @@ namespace Server.Network writer.Write(keys[4]); writer.Write(keys[5]); - writer.WritePacketLength(); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendFastwalkStackKey(this NetState ns, uint key = 0) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[9]); writer.Write((byte)0xBF); // Packet ID + writer.Write((ushort)9); writer.Write((ushort)0x2); // Subpacket writer.Write(key); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendTimeSyncResponse(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[25]); writer.Write((byte)0xF2); // Packet ID writer.Write(Core.TickCount); // ?? writer.Write(Core.TickCount); // ?? writer.Write(Core.TickCount); // ?? - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } } diff --git a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs index a62435801..cde6ccd5a 100644 --- a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs @@ -36,12 +36,12 @@ namespace Server.Network public static void SendStatLockInfo(this NetState ns, Mobile m) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[12]); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)12); writer.Write((short)0x19); @@ -53,20 +53,16 @@ namespace Server.Network writer.Write((byte)lockBits); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendChangeUpdateRange(this NetState ns, byte range) - { + public static void SendChangeUpdateRange(this NetState ns, byte range) => ns?.Send(stackalloc byte[] { 0xC8, range }); - } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendDeathStatus(this NetState ns, bool dead) - { + public static void SendDeathStatus(this NetState ns, bool dead) => ns?.Send(stackalloc byte[] { 0x2C, dead ? 0 : 2 }); - } public static void SendToggleSpecialAbility(this NetState ns, int abilityId, bool active) { @@ -109,31 +105,24 @@ namespace Server.Network } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendLiftReject(this NetState ns, LRReason reason) - { + public static void SendLiftReject(this NetState ns, LRReason reason) => ns?.Send(stackalloc byte[] { 0x27, (byte)reason }); - } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendLogoutAck(this NetState ns) - { - ns?.Send(stackalloc byte[] { 0xD1, 0x01 }); - } + public static void SendLogoutAck(this NetState ns) => ns?.Send(stackalloc byte[] { 0xD1, 0x01 }); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendWeather(this NetState ns, byte type, byte density, byte temp) - { + public static void SendWeather(this NetState ns, byte type, byte density, byte temp) => ns?.Send(stackalloc byte[] { 0x65, type, density, temp }); - } public static void SendServerChange(this NetState ns, Point3D p, Map map) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[16]); writer.Write((byte)0x76); // Packet ID writer.Write((short)p.X); writer.Write((short)p.Y); @@ -144,20 +133,20 @@ namespace Server.Network writer.Write((short)map.Width); writer.Write((short)map.Height); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendSkillsUpdate(this NetState ns, Skills skills) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var length = 6 + 9 * skills.Length; + var writer = new SpanWriter(stackalloc byte[length]); writer.Write((byte)0x3A); // Packet ID - writer.Seek(2, SeekOrigin.Current); - + writer.Write((ushort)length); writer.Write((byte)0x02); // type: absolute, capped for (var i = 0; i < skills.Length; ++i) @@ -176,24 +165,20 @@ namespace Server.Network writer.Write((short)0); // terminate - writer.WritePacketLength(); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendSequence(this NetState ns, byte sequence) - { - ns?.Send(stackalloc byte[] { 0x7B, sequence }); - } + public static void SendSequence(this NetState ns, byte sequence) => ns?.Send(stackalloc byte[] { 0x7B, sequence }); public static void SendSkillChange(this NetState ns, Skill skill) { - 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)0x3A); // Packet ID writer.Write((ushort)13); @@ -207,24 +192,25 @@ namespace Server.Network writer.Write((byte)skill.Lock); writer.Write((ushort)skill.CapFixedPoint); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendLaunchBrowser(this NetState ns, string uri) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + uri ??= ""; + + var length = 4 + uri.Length; + var writer = new SpanWriter(stackalloc byte[length]); writer.Write((byte)0xA5); // Packet ID - writer.Seek(2, SeekOrigin.Current); - writer.WriteAsciiNull(uri ?? ""); + writer.Write((ushort)length); + writer.WriteAsciiNull(uri); - writer.WritePacketLength(); - - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void CreateDragEffect( @@ -268,14 +254,12 @@ namespace Server.Network } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static unsafe void SendSeasonChange(this NetState ns, byte season, bool playSound) - { + public static unsafe void SendSeasonChange(this NetState ns, byte season, bool playSound) => ns?.Send(stackalloc byte[]{ 0xBC, season, *(byte*)&playSound }); - } public static void SendDisplayPaperdoll(this NetState ns, Serial m, string title, bool warmode, bool canLift) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } @@ -292,48 +276,48 @@ namespace Server.Network flags |= 0x02; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[66]); writer.Write((byte)0x88); // Packet ID writer.Write(m); writer.WriteAscii(title, 60); writer.Write(flags); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendPlayMusic(this NetState ns, MusicName music) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[3]); writer.Write((byte)0x6D); // Packet ID writer.Write((short)music); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } public static void SendScrollMessage(this NetState ns, int type, int tip, string text) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } text ??= ""; - var writer = new CircularBufferWriter(buffer); + var length = 10 + text.Length; + var writer = new SpanWriter(stackalloc byte[length]); writer.Write((byte)0xA6); // Packet ID - writer.Seek(2, SeekOrigin.Current); + writer.Write((ushort)length); writer.Write((byte)type); writer.Write(tip); writer.Write((ushort)text.Length); writer.WriteAscii(text); - writer.WritePacketLength(); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } // TODO: Use DateTime caching against core loop @@ -341,53 +325,46 @@ namespace Server.Network public static void SendCurrentTime(this NetState ns) => ns.SendCurrentTime(DateTime.UtcNow); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendCurrentTime(this NetState ns, DateTime date) - { + public static void SendCurrentTime(this NetState ns, DateTime date) => ns?.Send(stackalloc byte[] { 0x5B, (byte)date.Hour, (byte)date.Minute, (byte)date.Second }); - } public static void SendPathfindMessage(this NetState ns, Point3D p) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[7]); writer.Write((byte)0x38); // Packet ID writer.Write((short)p.X); writer.Write((short)p.Y); writer.Write((short)p.Z); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendPingAck(this NetState ns, byte ping) - { - ns?.Send(stackalloc byte[] { 0x73, ping }); - } + public static void SendPingAck(this NetState ns, byte ping) => ns?.Send(stackalloc byte[] { 0x73, ping }); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendClearWeaponAbility(this NetState ns) - { + public static void SendClearWeaponAbility(this NetState ns) => ns?.Send(stackalloc byte[] { 0xBF, 0x00, 0x5, 0x00, 0x21 }); - } public static void SendDisplayHuePicker(this NetState ns, Serial huePickerSerial, int huePickerItemID) { - if (ns == null || !ns.GetSendBuffer(out var buffer)) + if (ns == null) { return; } - var writer = new CircularBufferWriter(buffer); + var writer = new SpanWriter(stackalloc byte[9]); writer.Write((byte)0x95); // Packet ID writer.Write(huePickerSerial); writer.Write((short)0); writer.Write((short)huePickerItemID); - ns.Send(ref buffer, writer.Position); + ns.Send(writer.Span); } } }