From 90393fea2a0e636a539162c0021b5660a89fabcb Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 21 Dec 2020 23:43:45 -0800 Subject: [PATCH] fix(core): Converts death animation (#356) - [X] Converts death animation - [X] Fixes tests for movement packets --- .../Packets/Outgoing/MobilePacketTests.cs | 16 ++-- .../Packets/Outgoing/MovementPacketTests.cs | 84 +++++++------------ .../Packets/Outgoing/TargetPacketsTests.cs | 1 - .../Packets/Outgoing/VendorBuyPacketTests.cs | 3 - .../Tests/Utility/IPAddressTests.cs | 1 - Projects/Server/Mobiles/Mobile.cs | 18 +--- .../Network/Packets/OutgoingMobilePackets.cs | 28 ++++++- .../Packets/OutgoingMovementPackets.cs | 3 + 8 files changed, 65 insertions(+), 89 deletions(-) diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs index 25dd9ff66..bd7b5502d 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs @@ -13,19 +13,13 @@ namespace Server.Tests.Network Serial killed = 0x1; Serial corpse = 0x1000; - var data = new DeathAnimation(killed, corpse).Compile(); + var expected = new DeathAnimation(killed, corpse).Compile(); - Span expectedData = stackalloc byte[13]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendDeathAnimation(killed, corpse); - expectedData.Write(ref pos, (byte)0xAF); // Packet ID - expectedData.Write(ref pos, killed); - expectedData.Write(ref pos, corpse); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, 0); -#endif - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MovementPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MovementPacketTests.cs index 82b64df15..36e4e82e6 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MovementPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MovementPacketTests.cs @@ -1,5 +1,4 @@ using System; -using System.Buffers; using Server.Network; using Xunit; @@ -7,35 +6,32 @@ namespace Server.Tests.Network { public class MovementPacketTests : IClassFixture { - [Theory, InlineData(0), InlineData(1), InlineData(2)] + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] public void TestSpeedControl(byte speedControl) { - var data = new SpeedControl(speedControl).Compile(); + var expected = new SpeedControl(speedControl).Compile(); - Span expectedData = stackalloc byte[6]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendSpeedControl((SpeedControlSetting)speedControl); - expectedData.Write(ref pos, (byte)0xBF); // Packet ID - expectedData.Write(ref pos, (ushort)6); // Length - expectedData.Write(ref pos, (ushort)0x26); // Command - expectedData.Write(ref pos, speedControl); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] public void TestMovePlayer() { const Direction d = Direction.Left; - var data = new MovePlayer(d).Compile(); + var expected = new MovePlayer(d).Compile(); - Span expectedData = stackalloc byte[2]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMovePlayer(d); - expectedData.Write(ref pos, (byte)0x97); // Packet ID - expectedData.Write(ref pos, (byte)d); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] @@ -46,19 +42,13 @@ namespace Server.Tests.Network const byte seq = 100; - var data = new MovementRej(seq, m).Compile(); + var expected = new MovementRej(seq, m).Compile(); - Span expectedData = stackalloc byte[8]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMovementRej(seq, m); - expectedData.Write(ref pos, (byte)0x21); // Packet ID - expectedData.Write(ref pos, seq); - expectedData.Write(ref pos, (short)m.X); - expectedData.Write(ref pos, (short)m.Y); - 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); } [Fact] @@ -68,42 +58,26 @@ namespace Server.Tests.Network m.DefaultMobileInit(); const byte seq = 100; - var noto = Notoriety.Compute(m, m); - var data = MovementAck.Instantiate(seq, m).Compile(); + var expected = MovementAck.Instantiate(seq, m).Compile(); - Span expectedData = stackalloc byte[3]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMovementAck(seq, m); - expectedData.Write(ref pos, (byte)0x22); // Packet ID - expectedData.Write(ref pos, seq); - expectedData.Write(ref pos, (byte)noto); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] public void TestNullFastwalkStack() { - var data = new NullFastwalkStack().Compile(); + var expected = new NullFastwalkStack().Compile(); - Span expectedData = stackalloc byte[29]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendInitialFastwalkStack(new uint[]{ 0, 0, 0, 0, 0, 0 }); - expectedData.Write(ref pos, (byte)0xBF); // Packet ID - expectedData.Write(ref pos, (ushort)29); // Length - expectedData.Write(ref pos, (short)0x1); // Sub-packet - -#if NO_LOCAL_INIT - expectedData.Write(ref pos, 0); // Key 1 - expectedData.Write(ref pos, 0); // Key 2 - expectedData.Write(ref pos, 0); // Key 3 - expectedData.Write(ref pos, 0); // Key 4 - expectedData.Write(ref pos, 0); // Key 5 - expectedData.Write(ref pos, 0); // Key 6 -#endif - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } } } diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/TargetPacketsTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/TargetPacketsTests.cs index 92a1f976a..ba120af58 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/TargetPacketsTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/TargetPacketsTests.cs @@ -1,5 +1,4 @@ using System; -using System.Buffers; using Server.Network; using Server.Targeting; using Xunit; diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorBuyPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorBuyPacketTests.cs index 138d478c0..639a64e86 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorBuyPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorBuyPacketTests.cs @@ -1,8 +1,5 @@ using System; -using System.Buffers; using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; using Server.Items; using Server.Network; using Xunit; diff --git a/Projects/Server.Tests/Tests/Utility/IPAddressTests.cs b/Projects/Server.Tests/Tests/Utility/IPAddressTests.cs index 2766899ed..63f9bb1d8 100644 --- a/Projects/Server.Tests/Tests/Utility/IPAddressTests.cs +++ b/Projects/Server.Tests/Tests/Utility/IPAddressTests.cs @@ -1,6 +1,5 @@ using System; using System.Buffers.Binary; -using System.Collections.Generic; using System.Net; using Xunit; diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index cff424d00..649220f66 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -5072,21 +5072,13 @@ namespace Server var c = CreateCorpseHandler?.Invoke(this, hair, facialhair, content, equip); - /*m_Corpse = c; - - for ( int i = 0; c != null && i < content.Count; ++i ) - c.DropItem( (Item)content[i] ); - - if (c != null) - c.MoveToWorld( this.Location, this.Map );*/ - if (m_Map != null) { - Packet animPacket = null; - var eable = m_Map.GetClientsInRange(m_Location); var corpseSerial = c?.Serial ?? Serial.Zero; + Span deathAnimation = stackalloc byte[OutgoingMobilePackets.DeathAnimationPacketLength]; + OutgoingMobilePackets.CreateDeathAnimation(ref deathAnimation, Serial, corpseSerial); Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength]; OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial); @@ -5094,9 +5086,7 @@ namespace Server { if (state != m_NetState) { - animPacket ??= Packet.Acquire(new DeathAnimation(Serial, corpseSerial)); - - state.Send(animPacket); + state.Send(deathAnimation); if (!state.Mobile.CanSee(this)) { @@ -5105,8 +5095,6 @@ namespace Server } } - Packet.Release(animPacket); - eable.Free(); } diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs index 9056710a3..cf94ef353 100644 --- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs @@ -21,6 +21,7 @@ namespace Server.Network public static class OutgoingMobilePackets { public const int BondedStatusPacketLength = 11; + public const int DeathAnimationPacketLength = 13; public static void CreateBondedStatus(ref Span buffer, Serial serial, bool bonded) { @@ -41,14 +42,35 @@ namespace Server.Network } var writer = new CircularBufferWriter(buffer); - writer.Write((byte)0xBF); // Packet ID - writer.Write((ushort)11); // Length + writer.Write((byte)0xBF); // Packet ID + writer.Write((ushort)11); // Length writer.Write((ushort)0x19); // Subpacket ID - writer.Write((byte)0); // Command + writer.Write((byte)0); // Command writer.Write(serial); writer.Write(bonded); ns.Send(ref buffer, writer.Position); } + + public static void CreateDeathAnimation(ref Span buffer, Serial killed, Serial corpse) + { + var writer = new SpanWriter(buffer); + writer.Write((byte)0xAF); // Packet ID + writer.Write(killed); + writer.Write(corpse); + writer.Write(0); // ?? + } + + public static void SendDeathAnimation(this NetState ns, Serial killed, Serial corpse) + { + if (ns == null) + { + return; + } + + Span span = stackalloc byte[DeathAnimationPacketLength]; + CreateDeathAnimation(ref span, killed, corpse); + ns.Send(span); + } } } diff --git a/Projects/Server/Network/Packets/OutgoingMovementPackets.cs b/Projects/Server/Network/Packets/OutgoingMovementPackets.cs index 6418a2485..37d5f9c6a 100644 --- a/Projects/Server/Network/Packets/OutgoingMovementPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMovementPackets.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System.Buffers; +using System.IO; namespace Server.Network { @@ -99,6 +100,7 @@ namespace Server.Network var writer = new CircularBufferWriter(buffer); writer.Write((byte)0xBF); // Packet ID + writer.Seek(2, SeekOrigin.Current); writer.Write((ushort)0x1); // Subpacket writer.Write(keys[0]); writer.Write(keys[1]); @@ -107,6 +109,7 @@ namespace Server.Network writer.Write(keys[4]); writer.Write(keys[5]); + writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }