fix: Fixes client crash while selling items to NPC (#1296)
This commit is contained in:
parent
f82f61b4c5
commit
bfb987c758
4 changed files with 19 additions and 12 deletions
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Server.Network;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -18,14 +19,14 @@ namespace Server.Tests.Network
|
|||
var item2 = new Item(World.NewItem) { Name = "Second Item" };
|
||||
var item3 = new Item(World.NewItem);
|
||||
|
||||
var sellStates = new List<SellItemState>
|
||||
var sellStates = new HashSet<SellItemState>
|
||||
{
|
||||
new(item1, 100, "Item 1"),
|
||||
new(item2, 100000, "Item 2"),
|
||||
new(item3, 1, "Item 3")
|
||||
};
|
||||
|
||||
var expected = new VendorSellList(vendor, sellStates).Compile();
|
||||
var expected = new VendorSellList(vendor, sellStates.ToList()).Compile();
|
||||
|
||||
var ns = PacketTestUtilities.CreateTestNetState();
|
||||
ns.SendVendorSellList(vendor.Serial, sellStates);
|
||||
|
|
|
|||
|
|
@ -51,6 +51,14 @@ public class SellItemResponse
|
|||
public int Amount { get; }
|
||||
}
|
||||
|
||||
public class SellItemStateComparer : IEqualityComparer<SellItemState>
|
||||
{
|
||||
public bool Equals(SellItemState l, SellItemState r) =>
|
||||
l == null && r == null || l != null && r != null && l.Item == r.Item;
|
||||
|
||||
public int GetHashCode(SellItemState obj) => obj.Item.GetHashCode();
|
||||
}
|
||||
|
||||
public class SellItemState
|
||||
{
|
||||
public SellItemState(Item item, int price, string name)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ namespace Server.Network;
|
|||
|
||||
public static class OutgoingVendorSellPackets
|
||||
{
|
||||
public static void SendVendorSellList(this NetState ns, Serial vendor, List<SellItemState> list)
|
||||
public static void SendVendorSellList(this NetState ns, Serial vendor, HashSet<SellItemState> set)
|
||||
{
|
||||
if (ns.CannotSendPackets())
|
||||
{
|
||||
|
|
@ -30,9 +30,8 @@ public static class OutgoingVendorSellPackets
|
|||
}
|
||||
|
||||
var maxLength = 9;
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
foreach (var sis in set)
|
||||
{
|
||||
var sis = list[i];
|
||||
var item = sis.Item;
|
||||
maxLength += 14 + Math.Max(item.Name?.Length ?? 0, sis.Name?.Length ?? 0);
|
||||
}
|
||||
|
|
@ -42,11 +41,10 @@ public static class OutgoingVendorSellPackets
|
|||
writer.Seek(2, SeekOrigin.Current);
|
||||
|
||||
writer.Write(vendor);
|
||||
writer.Write((ushort)list.Count);
|
||||
writer.Write((ushort)set.Count);
|
||||
|
||||
for (var i = 0; i < list.Count; i++)
|
||||
foreach (var sis in set)
|
||||
{
|
||||
var sis = list[i];
|
||||
var item = sis.Item;
|
||||
writer.Write(item.Serial);
|
||||
writer.Write((ushort)item.ItemID);
|
||||
|
|
|
|||
|
|
@ -1042,7 +1042,7 @@ namespace Server.Mobiles
|
|||
|
||||
var info = GetSellInfo();
|
||||
|
||||
var list = new List<SellItemState>();
|
||||
var set = new HashSet<SellItemState>(new SellItemStateComparer());
|
||||
|
||||
foreach (var ssi in info)
|
||||
{
|
||||
|
|
@ -1055,16 +1055,16 @@ namespace Server.Mobiles
|
|||
|
||||
if (item.IsStandardLoot() && item.Movable && ssi.IsSellable(item))
|
||||
{
|
||||
list.Add(new SellItemState(item, ssi.GetSellPriceFor(item), ssi.GetNameFor(item)));
|
||||
set.Add(new SellItemState(item, ssi.GetSellPriceFor(item), ssi.GetNameFor(item)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (list.Count > 0)
|
||||
if (set.Count > 0)
|
||||
{
|
||||
SendPacksTo(from);
|
||||
|
||||
from.NetState.SendVendorSellList(Serial, list);
|
||||
from.NetState.SendVendorSellList(Serial, set);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue