diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPacketTests.cs index 49d494087..9786b8604 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPacketTests.cs @@ -12,7 +12,7 @@ namespace Server.Tests.Network [Fact] public void TestVendorSellList() { - var vendor = new Mobile(0x1); + var vendor = new Mobile(0x1024u); vendor.DefaultMobileInit(); var item1 = new Item(World.NewItem); @@ -26,57 +26,28 @@ namespace Server.Tests.Network new(item3, 1, "Item 3") }; - var data = new VendorSellList(vendor, sellStates).Compile(); + var expected = new VendorSellList(vendor, sellStates).Compile(); - var length = 9 + 14 * 3 + sellStates.Sum( - state => - (string.IsNullOrWhiteSpace(state.Item.Name) ? state.Name ?? "" : state.Item.Name.Trim()).Length - ); + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendVendorSellList(vendor.Serial, sellStates); - Span expectedData = stackalloc byte[length]; - var pos = 0; - - expectedData.Write(ref pos, (byte)0x9E); // Packet ID - expectedData.Write(ref pos, (ushort)length); - expectedData.Write(ref pos, vendor.Serial); - expectedData.Write(ref pos, (ushort)sellStates.Count); - - for (var i = 0; i < sellStates.Count; i++) - { - var state = sellStates[i]; - expectedData.Write(ref pos, state.Item.Serial); - expectedData.Write(ref pos, (ushort)state.Item.ItemID); - expectedData.Write(ref pos, (ushort)state.Item.Hue); - expectedData.Write(ref pos, (ushort)state.Item.Amount); - expectedData.Write(ref pos, (ushort)state.Price); - var name = string.IsNullOrWhiteSpace(state.Item.Name) ? state.Name ?? "" : state.Item.Name.Trim(); - expectedData.Write(ref pos, (ushort)name.Length); - expectedData.WriteAscii(ref pos, name); - } - - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] public void TestEndVendorSell() { - var vendor = new Mobile(0x1); + var vendor = new Mobile(0x1024u); vendor.DefaultMobileInit(); - var data = new EndVendorBuy(vendor.Serial).Compile(); + var expected = new EndVendorBuy(vendor.Serial).Compile(); - Span expectedData = stackalloc byte[8]; - var pos = 0; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendEndVendorSell(vendor.Serial); - expectedData.Write(ref pos, (byte)0x3B); // Packet ID - expectedData.Write(ref pos, (ushort)0x08); // Length - expectedData.Write(ref pos, vendor.Serial); - -#if NO_LOCAL_INIT - expectedData.Write(ref pos, (byte)0); -#endif - - 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/VendorSellPackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPackets.cs similarity index 100% rename from Projects/Server/Network/Packets/VendorSellPackets.cs rename to Projects/Server.Tests/Tests/Network/Packets/Outgoing/VendorSellPackets.cs diff --git a/Projects/Server/Network/Packets/IncomingVendorPackets.cs b/Projects/Server/Network/Packets/IncomingVendorPackets.cs index e716f03e4..b8b1984eb 100644 --- a/Projects/Server/Network/Packets/IncomingVendorPackets.cs +++ b/Projects/Server/Network/Packets/IncomingVendorPackets.cs @@ -77,7 +77,7 @@ namespace Server.Network if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10)) { - state.Send(new EndVendorSell(vendor)); + state.SendEndVendorSell(vendor.Serial); return; } @@ -103,7 +103,7 @@ namespace Server.Network if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList)) { - state.Send(new EndVendorSell(vendor)); + state.SendEndVendorSell(vendor.Serial); } } } diff --git a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs index 2724f81f5..a62435801 100644 --- a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs @@ -17,7 +17,6 @@ using System; using System.Buffers; using System.IO; using System.Runtime.CompilerServices; -using Server.HuePickers; namespace Server.Network { diff --git a/Projects/Server/Network/Packets/OutgoingVendorSellPackets.cs b/Projects/Server/Network/Packets/OutgoingVendorSellPackets.cs new file mode 100644 index 000000000..7897b42a0 --- /dev/null +++ b/Projects/Server/Network/Packets/OutgoingVendorSellPackets.cs @@ -0,0 +1,74 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: OutgoingVendorSellPackets.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 System.Collections.Generic; +using System.IO; + +namespace Server.Network +{ + public static class OutgoingVendorSellPackets + { + public static void SendVendorSellList(this NetState ns, Serial vendor, List list) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x9E); // Packet ID + writer.Seek(2, SeekOrigin.Current); + + writer.Write(vendor); + writer.Write((ushort)list.Count); + + for (var i = 0; i < list.Count; i++) + { + var sis = list[i]; + var item = sis.Item; + writer.Write(item.Serial); + writer.Write((ushort)item.ItemID); + writer.Write((ushort)item.Hue); + writer.Write((ushort)item.Amount); + writer.Write((ushort)sis.Price); + + var name = (item.Name?.Trim()).DefaultIfNullOrEmpty(sis.Name ?? ""); + + writer.Write((ushort)name.Length); + writer.WriteAscii(name); + } + + writer.WritePacketLength(); + ns.Send(ref buffer, writer.Position); + } + + public static void SendEndVendorSell(this NetState ns, Serial vendor) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0x3B); // Packet ID + writer.Write((ushort)8); + writer.Write(vendor); + writer.Write((byte)0); + + ns.Send(ref buffer, writer.Position); + } + } +} diff --git a/Projects/Server/Utilities/StringHelpers.cs b/Projects/Server/Utilities/StringHelpers.cs index 7d044d3d4..ef93584e4 100644 --- a/Projects/Server/Utilities/StringHelpers.cs +++ b/Projects/Server/Utilities/StringHelpers.cs @@ -23,7 +23,8 @@ namespace Server public static class StringHelpers { [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string DefaultIfNullOrEmpty(this string value, string def) => value?.Trim().Length > 0 ? value : def; + public static string DefaultIfNullOrEmpty(this string value, string def) => + string.IsNullOrWhiteSpace(value) ? def : value; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Remove( diff --git a/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs b/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs index e1c1c46ca..072401ba0 100644 --- a/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs +++ b/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs @@ -1042,7 +1042,7 @@ namespace Server.Mobiles { SendPacksTo(from); - from.Send(new VendorSellList(this, list)); + from.NetState.SendVendorSellList(Serial, list); } else {