From 9d4161b3e4d9a6ea02899093fc3809dea76bbf8d Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 28 Dec 2020 01:50:17 -0800 Subject: [PATCH] fix(core): Converts MobileUpdate packet (#369) - [X] Converts mobile update packet --- .../Packets/Outgoing/MobilePacketTests.cs | 75 +++---------------- .../Network/Packets/Outgoing/MobilePackets.cs | 24 ++++++ Projects/Server/Mobiles/Mobile.cs | 21 +++--- .../Network/Packets/IncomingAccountPackets.cs | 8 +- .../Network/Packets/IncomingPlayerPackets.cs | 3 +- .../Server/Network/Packets/MobilePackets.cs | 24 ------ .../Network/Packets/OutgoingMobilePackets.cs | 23 ++++++ 7 files changed, 72 insertions(+), 106 deletions(-) diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs index 89117bb1e..5873b1f6f 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs @@ -256,76 +256,23 @@ namespace Server.Tests.Network AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } - [Fact] - public void TestMobileUpdate() + [Theory] + [InlineData(ProtocolChanges.None, 0)] + [InlineData(ProtocolChanges.StygianAbyss, 100)] + public void TestMobileUpdate(ProtocolChanges changes, int solidHueOverride) { var m = new Mobile(0x1); m.DefaultMobileInit(); + m.SolidHueOverride = solidHueOverride; - var data = new MobileUpdate(m, true).Compile(); + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.ProtocolChanges = changes; - Span expectedData = stackalloc byte[19]; - var pos = 0; + var expected = new MobileUpdate(m, ns.StygianAbyss).Compile(); + ns.SendMobileUpdate(m); - var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue; - - expectedData.Write(ref pos, (byte)0x20); // Packet ID - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, (ushort)m.Body); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); // Unknown -#else - pos++; -#endif - expectedData.Write(ref pos, (ushort)hue); - expectedData.Write(ref pos, (byte)m.GetPacketFlags(true)); - expectedData.Write(ref pos, (ushort)m.X); - expectedData.Write(ref pos, (ushort)m.Y); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (ushort)2); // Unknown -#else - pos += 2; -#endif - expectedData.Write(ref pos, (byte)m.Direction); - expectedData.Write(ref pos, (byte)m.Z); - - AssertThat.Equal(data, expectedData); - } - - [Fact] - public void TestMobileUpdateOld() - { - var m = new Mobile(0x1); - m.DefaultMobileInit(); - - var data = new MobileUpdate(m, false).Compile(); - - Span expectedData = stackalloc byte[19]; - var pos = 0; - - var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue; - - expectedData.Write(ref pos, (byte)0x20); // Packet ID - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, (ushort)m.Body); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); // Unknown -#else - pos++; -#endif - expectedData.Write(ref pos, (ushort)hue); - expectedData.Write(ref pos, (byte)m.GetPacketFlags(false)); - expectedData.Write(ref pos, (ushort)m.X); - expectedData.Write(ref pos, (ushort)m.Y); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (ushort)2); // Unknown -#else - pos += 2; -#endif - expectedData.Write(ref pos, (byte)m.Direction); - expectedData.Write(ref pos, (byte)m.Z); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Theory] diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs index 115c96ffc..8f9d94b8d 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs @@ -462,4 +462,28 @@ namespace Server.Tests.Network AttributeNormalizer.WriteReverse(Stream, current, maximum); } } + + public sealed class MobileUpdate : Packet + { + public MobileUpdate(Mobile m, bool stygianAbyss) : base(0x20, 19) + { + var hue = m.Hue; + + if (m.SolidHueOverride >= 0) + { + hue = m.SolidHueOverride; + } + + Stream.Write(m.Serial); + Stream.Write((short)m.Body); + Stream.Write((byte)0); + Stream.Write((short)hue); + Stream.Write((byte)m.GetPacketFlags(stygianAbyss)); + Stream.Write((short)m.X); + Stream.Write((short)m.Y); + Stream.Write((short)0); + Stream.Write((byte)m.Direction); + Stream.Write((sbyte)m.Z); + } + } } diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index f6643208d..ca8062a9f 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -2827,27 +2827,24 @@ namespace Server ns.Send(SeasonChange.Instantiate(GetSeason(), true)); - ns.Send(new MobileUpdate(this, ns.StygianAbyss)); + ns.SendMobileUpdate(this); Send(new ServerChange(m_Location, m_Map)); } ns.Send(new MobileIncoming(ns, this, this)); - ns.Send(new MobileUpdate(this, ns.StygianAbyss)); + ns.SendMobileUpdate(this); CheckLightLevels(true); - ns.Send(new MobileUpdate(this, ns.StygianAbyss)); + ns.SendMobileUpdate(this); } SendEverything(); SendIncomingPacket(); - if (ns != null) - { - ns.Send(new MobileIncoming(ns, this, this)); - ns.SendSupportedFeature(); - ns.Send(new MobileUpdate(this, ns.StygianAbyss)); - ns.SendMobileAttributes(this); - } + ns?.Send(new MobileIncoming(ns, this, this)); + ns.SendSupportedFeature(); + ns.SendMobileUpdate(this); + ns.SendMobileAttributes(this); OnMapChange(oldMap); } @@ -3042,7 +3039,7 @@ namespace Server if (sendUpdate) { ourState.Sequence = 0; - ourState.Send(new MobileUpdate(this, ourState.StygianAbyss)); + ourState.SendMobileUpdate(this); } if (sendIncoming) @@ -7513,7 +7510,7 @@ namespace Server if (isTeleport && m_NetState != null && (!m_NetState.HighSeas || !NoMoveHS)) { m_NetState.Sequence = 0; - m_NetState.Send(new MobileUpdate(this, m_NetState.StygianAbyss)); + m_NetState.SendMobileUpdate(this); } var map = m_Map; diff --git a/Projects/Server/Network/Packets/IncomingAccountPackets.cs b/Projects/Server/Network/Packets/IncomingAccountPackets.cs index 979179a21..c62df0adc 100644 --- a/Projects/Server/Network/Packets/IncomingAccountPackets.cs +++ b/Projects/Server/Network/Packets/IncomingAccountPackets.cs @@ -316,12 +316,12 @@ namespace Server.Network state.Sequence = 0; - state.Send(new MobileUpdate(m, state.StygianAbyss)); - state.Send(new MobileUpdate(m, state.StygianAbyss)); + state.SendMobileUpdate(m); + state.SendMobileUpdate(m); m.CheckLightLevels(true); - state.Send(new MobileUpdate(m, state.StygianAbyss)); + state.SendMobileUpdate(m); state.Send(new MobileIncoming(state, m, m)); @@ -331,7 +331,7 @@ namespace Server.Network m.SendEverything(); state.SendSupportedFeature(); - state.Send(new MobileUpdate(m, state.StygianAbyss)); + state.SendMobileUpdate(m); state.SendMobileStatus(m); state.SendSetWarMode(m.Warmode); diff --git a/Projects/Server/Network/Packets/IncomingPlayerPackets.cs b/Projects/Server/Network/Packets/IncomingPlayerPackets.cs index 7e037aa30..1c51c924e 100644 --- a/Projects/Server/Network/Packets/IncomingPlayerPackets.cs +++ b/Projects/Server/Network/Packets/IncomingPlayerPackets.cs @@ -473,8 +473,7 @@ namespace Server.Network return; } - state.Send(new MobileUpdate(from, state.StygianAbyss)); - + state.SendMobileUpdate(from); state.Send(new MobileIncoming(state, from, from)); from.SendEverything(); diff --git a/Projects/Server/Network/Packets/MobilePackets.cs b/Projects/Server/Network/Packets/MobilePackets.cs index a439e168c..2b6ba6869 100644 --- a/Projects/Server/Network/Packets/MobilePackets.cs +++ b/Projects/Server/Network/Packets/MobilePackets.cs @@ -17,30 +17,6 @@ using System.Threading; namespace Server.Network { - public sealed class MobileUpdate : Packet - { - public MobileUpdate(Mobile m, bool stygianAbyss) : base(0x20, 19) - { - var hue = m.Hue; - - if (m.SolidHueOverride >= 0) - { - hue = m.SolidHueOverride; - } - - Stream.Write(m.Serial); - Stream.Write((short)m.Body); - Stream.Write((byte)0); - Stream.Write((short)hue); - Stream.Write((byte)m.GetPacketFlags(stygianAbyss)); - Stream.Write((short)m.X); - Stream.Write((short)m.Y); - Stream.Write((short)0); - Stream.Write((byte)m.Direction); - Stream.Write((sbyte)m.Z); - } - } - public sealed class MobileIncoming : Packet { private static readonly ThreadLocal m_DupedLayersTL = new(() => new int[256]); diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs index 8fddde255..9f3d72287 100644 --- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs @@ -513,5 +513,28 @@ namespace Server.Network return writer.Position; } + + public static void SendMobileUpdate(this NetState ns, Mobile m) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x20); // Packet ID + writer.Write(m.Serial); + writer.Write((short)m.Body); + writer.Write((byte)0); + writer.Write((short)(m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue)); + writer.Write((byte)m.GetPacketFlags(ns.StygianAbyss)); + writer.Write((short)m.X); + writer.Write((short)m.Y); + writer.Write((short)0); + writer.Write((byte)m.Direction); + writer.Write((sbyte)m.Z); + + ns.Send(ref buffer, writer.Position); + } } }