fix: Fixes client crash while selling items to NPC (#1296)

This commit is contained in:
Kamron Batman 2022-12-05 20:16:31 -08:00 committed by GitHub
parent f82f61b4c5
commit bfb987c758
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 12 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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);

View file

@ -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
{