From 8c4c30da7d09c86b4d5f1e74ec10bdaffddcf49a Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sun, 29 Nov 2020 22:20:10 -0800 Subject: [PATCH] Converts secure trade packets (#329) --- .../Outgoing/SecureTradePacketTests.cs | 128 +++++------------- .../Packets/Outgoing}/SecureTradePackets.cs | 24 ---- .../Packets/OutgoingSecureTradePackets.cs | 117 ++++++++++++++++ Projects/Server/SecureTrade.cs | 99 ++++---------- 4 files changed, 184 insertions(+), 184 deletions(-) rename Projects/{Server/Network/Packets => Server.Tests/Tests/Network/Packets/Outgoing}/SecureTradePackets.cs (66%) create mode 100644 Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePacketTests.cs index 1c83ef11b..cd9264d01 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePacketTests.cs @@ -8,8 +8,9 @@ namespace Server.Tests.Network { public class SecureTradePacketTests : IClassFixture { - [Theory, InlineData("short-name"), - InlineData("this is a really long name that is more than 30 characters, probably")] + [Theory] + [InlineData("short-name")] + [InlineData("this is a really long name that is more than 30 characters, probably")] public void TestDisplaySecureTrade(string name) { var m = new Mobile(0x1); @@ -18,26 +19,13 @@ namespace Server.Tests.Network var firstCont = new Container(World.NewItem); var secondCont = new Container(World.NewItem); - var data = new DisplaySecureTrade(m, firstCont, secondCont, name).Compile(); + var expected = new DisplaySecureTrade(m, firstCont, secondCont, name).Compile(); - var hasName = name.Length > 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendDisplaySecureTrade(m, firstCont, secondCont, name); - Span expectedData = stackalloc byte[17 + (hasName ? 30 : 0)]; - var pos = 0; - - expectedData.Write(ref pos, (byte)0x6F); // Packet ID - expectedData.Write(ref pos, (ushort)0x2F); // Length - expectedData.Write(ref pos, (byte)TradeFlag.Display); // Command - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, firstCont.Serial); - expectedData.Write(ref pos, secondCont.Serial); - expectedData.Write(ref pos, hasName); - if (hasName) - { - expectedData.WriteAsciiFixed(ref pos, name, 30); - } - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] @@ -45,17 +33,13 @@ namespace Server.Tests.Network { var cont = new Container(World.NewItem); - var data = new CloseSecureTrade(cont).Compile(); + var expected = new CloseSecureTrade(cont).Compile(); - Span expectedData = stackalloc byte[8]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendCloseSecureTrade(cont); - expectedData.Write(ref pos, (byte)0x6F); // Packet ID - expectedData.Write(ref pos, (ushort)0x8); // Length - expectedData.Write(ref pos, (byte)TradeFlag.Close); // Command - expectedData.Write(ref pos, cont.Serial); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Theory, InlineData(true, false), InlineData(false, true)] @@ -67,38 +51,28 @@ namespace Server.Tests.Network var secondCont = new Container(World.NewItem); var cont = first ? firstCont : secondCont; - var data = new UpdateSecureTrade(cont, first, second).Compile(); + var expected = new UpdateSecureTrade(cont, first, second).Compile(); - Span expectedData = stackalloc byte[16]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendUpdateSecureTrade(cont, first, second); - expectedData.Write(ref pos, (byte)0x6F); // Packet ID - expectedData.Write(ref pos, (ushort)0x10); // Length - expectedData.Write(ref pos, (byte)TradeFlag.Update); // Command - expectedData.Write(ref pos, cont.Serial); - expectedData.Write(ref pos, first ? 1 : 0); // true if first - expectedData.Write(ref pos, second ? 1 : 0); // true if second - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } - [Theory, InlineData(100000, 30, TradeFlag.UpdateGold), InlineData(250000, 50000, TradeFlag.UpdateLedger)] + [Theory] + [InlineData(100000, 30, TradeFlag.UpdateGold)] + [InlineData(250000, 50000, TradeFlag.UpdateLedger)] public void TestUpdateGoldSecureTrade(int gold, int plat, TradeFlag flag) { var cont = new Container(World.NewItem); - var data = new UpdateSecureTrade(cont, flag, gold, plat).Compile(); + var expected = new UpdateSecureTrade(cont, flag, gold, plat).Compile(); - Span expectedData = stackalloc byte[16]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendUpdateSecureTrade(cont, flag, gold, plat); - expectedData.Write(ref pos, (byte)0x6F); // Packet ID - expectedData.Write(ref pos, (ushort)0x10); // Length - expectedData.Write(ref pos, (byte)flag); // Command - expectedData.Write(ref pos, cont.Serial); - expectedData.Write(ref pos, gold); - expectedData.Write(ref pos, plat); - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] @@ -110,25 +84,13 @@ namespace Server.Tests.Network var cont = new Container(World.NewItem); var itemInCont = new Item(World.NewItem) { Parent = cont }; - var data = new SecureTradeEquip(itemInCont, m).Compile(); - Span expectedData = stackalloc byte[20]; - var pos = 0; + var expected = new SecureTradeEquip(itemInCont, m).Compile(); - expectedData.Write(ref pos, (byte)0x25); // Packet ID - expectedData.Write(ref pos, itemInCont.Serial); - expectedData.Write(ref pos, (short)itemInCont.ItemID); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); -#else - pos++; -#endif - expectedData.Write(ref pos, (short)itemInCont.Amount); - expectedData.Write(ref pos, (short)itemInCont.X); - expectedData.Write(ref pos, (short)itemInCont.Y); - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, (short)itemInCont.Hue); + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendSecureTradeEquip(itemInCont, m); - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] @@ -140,31 +102,15 @@ namespace Server.Tests.Network var cont = new Container(World.NewItem); var itemInCont = new Item(World.NewItem) { Parent = cont }; - var data = new SecureTradeEquip6017(itemInCont, m).Compile(); + var expected = new SecureTradeEquip6017(itemInCont, m).Compile(); - Span expectedData = stackalloc byte[21]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.ProtocolChanges |= ProtocolChanges.ContainerGridLines; - expectedData.Write(ref pos, (byte)0x25); // Packet ID - expectedData.Write(ref pos, itemInCont.Serial); - expectedData.Write(ref pos, (short)itemInCont.ItemID); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); -#else - pos++; -#endif - expectedData.Write(ref pos, (short)itemInCont.Amount); - expectedData.Write(ref pos, (short)itemInCont.X); - expectedData.Write(ref pos, (short)itemInCont.Y); -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); -#else - pos++; -#endif - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, (short)itemInCont.Hue); + ns.SendSecureTradeEquip(itemInCont, m); - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } } } diff --git a/Projects/Server/Network/Packets/SecureTradePackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePackets.cs similarity index 66% rename from Projects/Server/Network/Packets/SecureTradePackets.cs rename to Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePackets.cs index e6525c7e8..7936b2496 100644 --- a/Projects/Server/Network/Packets/SecureTradePackets.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/SecureTradePackets.cs @@ -1,18 +1,3 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2020 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: SecureTradePackets.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - using Server.Items; namespace Server.Network @@ -48,15 +33,6 @@ namespace Server.Network } } - public enum TradeFlag : byte - { - Display = 0x0, - Close = 0x1, - Update = 0x2, - UpdateGold = 0x3, - UpdateLedger = 0x4 - } - public sealed class UpdateSecureTrade : Packet { public UpdateSecureTrade(Container cont, bool first, bool second) diff --git a/Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs b/Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs new file mode 100644 index 000000000..ea7f05c33 --- /dev/null +++ b/Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs @@ -0,0 +1,117 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: OutgoingSecureTradePackets.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System.Buffers; +using Server.Items; + +namespace Server.Network +{ + public enum TradeFlag : byte + { + Display, + Close, + Update, + UpdateGold, + UpdateLedger + } + + public static class OutgoingSecureTradePackets + { + public static void SendDisplaySecureTrade( + this NetState ns, Mobile them, Container first, Container second, string name + ) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x6F); // Packet ID + writer.Write((ushort)47); // Length + writer.Write((byte)TradeFlag.Display); + writer.Write(them.Serial); + writer.Write(first.Serial); + writer.Write(second.Serial); + writer.Write(true); + + writer.WriteAscii(name ?? "", 30); + + ns.Send(ref buffer, writer.Position); + } + + public static void SendCloseSecureTrade(this NetState ns, Container cont) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x6F); // Packet ID + writer.Write((ushort)8); // Length + writer.Write((byte)TradeFlag.Close); + writer.Write(cont.Serial); + + ns.Send(ref buffer, writer.Position); + } + + public static void SendUpdateSecureTrade(this NetState ns, Container cont, bool first, bool second) => + ns.SendUpdateSecureTrade(cont, TradeFlag.Update, first ? 1 : 0, second ? 1 : 0); + + public static void SendUpdateSecureTrade(this NetState ns, Container cont, TradeFlag flag, int first, int second) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x6F); // Packet ID + writer.Write((ushort)16); // Length + writer.Write((byte)flag); + writer.Write(cont.Serial); + writer.Write(first); + writer.Write(second); + + ns.Send(ref buffer, writer.Position); + } + + public static void SendSecureTradeEquip(this NetState ns, Item item, Mobile m) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x25); // Packet ID + writer.Write(item.Serial); + writer.Write((short)item.ItemID); + writer.Write((byte)0); + writer.Write((short)item.Amount); + writer.Write((short)item.X); + writer.Write((short)item.Y); + if (ns.ContainerGridLines) + { + writer.Write((byte)0); + } + writer.Write(m.Serial); + writer.Write((short)item.Hue); + + ns.Send(ref buffer, writer.Position); + } + } +} diff --git a/Projects/Server/SecureTrade.cs b/Projects/Server/SecureTrade.cs index 382c73277..53daf3373 100644 --- a/Projects/Server/SecureTrade.cs +++ b/Projects/Server/SecureTrade.cs @@ -14,85 +14,46 @@ namespace Server From = new SecureTradeInfo(this, from, new SecureTradeContainer(this)); To = new SecureTradeInfo(this, to, new SecureTradeContainer(this)); - var from6017 = from.NetState?.ContainerGridLines == true; - var to6017 = to.NetState?.ContainerGridLines == true; - var from704565 = from.NetState?.NewSecureTrading == true; var to704565 = to.NetState?.NewSecureTrading == true; from.Send(new MobileStatus(from, to)); - from.Send(new UpdateSecureTrade(From.Container, false, false)); + from.NetState.SendUpdateSecureTrade(From.Container, false, false); + from.NetState.SendSecureTradeEquip(To.Container, to); - if (from6017) - { - from.Send(new SecureTradeEquip6017(To.Container, to)); - } - else - { - from.Send(new SecureTradeEquip(To.Container, to)); - } + from.NetState.SendUpdateSecureTrade(From.Container, false, false); + from.NetState.SendSecureTradeEquip(From.Container, from); - from.Send(new UpdateSecureTrade(From.Container, false, false)); - - if (from6017) - { - from.Send(new SecureTradeEquip6017(From.Container, from)); - } - else - { - from.Send(new SecureTradeEquip(From.Container, from)); - } - - from.Send(new DisplaySecureTrade(to, From.Container, To.Container, to.Name)); - from.Send(new UpdateSecureTrade(From.Container, false, false)); + from.NetState.SendDisplaySecureTrade(to, From.Container, To.Container, to.Name); + from.NetState.SendUpdateSecureTrade(From.Container, false, false); if (from.Account != null && from704565) { - from.Send( - new UpdateSecureTrade( - From.Container, - TradeFlag.UpdateLedger, - from.Account.TotalGold, - from.Account.TotalPlat - ) + from.NetState.SendUpdateSecureTrade( + From.Container, + TradeFlag.UpdateLedger, + from.Account.TotalGold, + from.Account.TotalPlat ); } to.Send(new MobileStatus(to, from)); - to.Send(new UpdateSecureTrade(To.Container, false, false)); + to.NetState.SendUpdateSecureTrade(To.Container, false, false); + to.NetState.SendSecureTradeEquip(From.Container, from); - if (to6017) - { - to.Send(new SecureTradeEquip6017(From.Container, from)); - } - else - { - to.Send(new SecureTradeEquip(From.Container, from)); - } + to.NetState.SendUpdateSecureTrade(To.Container, false, false); + to.NetState.SendSecureTradeEquip(To.Container, to); - to.Send(new UpdateSecureTrade(To.Container, false, false)); - - if (to6017) - { - to.Send(new SecureTradeEquip6017(To.Container, to)); - } - else - { - to.Send(new SecureTradeEquip(To.Container, to)); - } - - to.Send(new DisplaySecureTrade(from, To.Container, From.Container, from.Name)); - to.Send(new UpdateSecureTrade(To.Container, false, false)); + to.NetState.SendDisplaySecureTrade(from, To.Container, From.Container, from.Name); + to.NetState.SendUpdateSecureTrade(To.Container, false, false); if (to.Account != null && to704565) { - to.Send( - new UpdateSecureTrade( - To.Container, - TradeFlag.UpdateLedger, - to.Account.TotalGold, - to.Account.TotalPlat - ) + to.NetState.SendUpdateSecureTrade( + To.Container, + TradeFlag.UpdateLedger, + to.Account.TotalGold, + to.Account.TotalPlat ); } } @@ -164,8 +125,8 @@ namespace Server return; } - From.Mobile.Send(new CloseSecureTrade(From.Container)); - To.Mobile.Send(new CloseSecureTrade(To.Container)); + From.Mobile.NetState.SendCloseSecureTrade(From.Container); + To.Mobile.NetState.SendCloseSecureTrade(To.Container); Valid = false; @@ -198,12 +159,12 @@ namespace Server var plat = left.Mobile.Account.TotalPlat; var gold = left.Mobile.Account.TotalGold; - left.Mobile.Send(new UpdateSecureTrade(left.Container, TradeFlag.UpdateLedger, gold, plat)); + left.Mobile.NetState.SendUpdateSecureTrade(left.Container, TradeFlag.UpdateLedger, gold, plat); } if (right.Mobile.NetState?.NewSecureTrading == true) { - right.Mobile.Send(new UpdateSecureTrade(right.Container, TradeFlag.UpdateGold, left.Gold, left.Plat)); + right.Mobile.NetState.SendUpdateSecureTrade(right.Container, TradeFlag.UpdateGold, left.Gold, left.Plat); } } @@ -290,8 +251,8 @@ namespace Server From.Accepted = false; To.Accepted = false; - From.Mobile.Send(new UpdateSecureTrade(From.Container, From.Accepted, To.Accepted)); - To.Mobile.Send(new UpdateSecureTrade(To.Container, To.Accepted, From.Accepted)); + From.Mobile.NetState.SendUpdateSecureTrade(From.Container, From.Accepted, To.Accepted); + To.Mobile.NetState.SendUpdateSecureTrade(To.Container, To.Accepted, From.Accepted); return; } @@ -349,8 +310,8 @@ namespace Server } else if (!From.IsDisposed && !To.IsDisposed) { - From.Mobile.Send(new UpdateSecureTrade(From.Container, From.Accepted, To.Accepted)); - To.Mobile.Send(new UpdateSecureTrade(To.Container, To.Accepted, From.Accepted)); + From.Mobile.NetState.SendUpdateSecureTrade(From.Container, From.Accepted, To.Accepted); + To.Mobile.NetState.SendUpdateSecureTrade(To.Container, To.Accepted, From.Accepted); } }