Core/Auction House: Fixed sorting items with itemlevel greater than 255

Port From (https://github.com/TrinityCore/TrinityCore/commit/b98df50addfdf3e55b1deb5ae2c68aa593548287)
This commit is contained in:
Hondacrx
2025-08-31 13:44:22 -04:00
parent 04ae85c5be
commit 2903501994
2 changed files with 39 additions and 48 deletions
+32 -37
View File
@@ -261,9 +261,9 @@ namespace Game
_itemsByGuid[item.GetGUID()] = item; _itemsByGuid[item.GetGUID()] = item;
} }
public bool RemoveAItem(ObjectGuid guid, bool deleteItem = false, SQLTransaction trans = null) public bool RemoveAItem(ObjectGuid itemGuid, bool deleteItem = false, SQLTransaction trans = null)
{ {
var item = _itemsByGuid.LookupByKey(guid); var item = _itemsByGuid.LookupByKey(itemGuid);
if (item == null) if (item == null)
return false; return false;
@@ -273,7 +273,7 @@ namespace Game
item.SaveToDB(trans); item.SaveToDB(trans);
} }
_itemsByGuid.Remove(guid); _itemsByGuid.Remove(itemGuid);
return true; return true;
} }
@@ -663,7 +663,7 @@ namespace Game
_itemsByAuctionId[auction.Id] = auction; _itemsByAuctionId[auction.Id] = auction;
AuctionPosting.Sorter insertSorter = new(Locale.enUS, new AuctionSortDef[] { new AuctionSortDef(AuctionHouseSortOrder.Price, false) }, 1); AuctionPosting.Sorter insertSorter = new(Locale.enUS, [new AuctionSortDef(AuctionHouseSortOrder.Price, false)]);
var auctionIndex = bucket.Auctions.BinarySearch(auction, insertSorter); var auctionIndex = bucket.Auctions.BinarySearch(auction, insertSorter);
if (auctionIndex < 0) if (auctionIndex < 0)
auctionIndex = ~auctionIndex; auctionIndex = ~auctionIndex;
@@ -811,7 +811,7 @@ namespace Game
} }
public void BuildListBuckets(AuctionListBucketsResult listBucketsResult, Player player, string name, byte minLevel, byte maxLevel, AuctionHouseFilterMask filters, AuctionSearchClassFilters classFilters, public void BuildListBuckets(AuctionListBucketsResult listBucketsResult, Player player, string name, byte minLevel, byte maxLevel, AuctionHouseFilterMask filters, AuctionSearchClassFilters classFilters,
byte[] knownPetBits, int knownPetBitsCount, byte maxKnownPetLevel, uint offset, AuctionSortDef[] sorts, int sortCount) byte[] knownPetBits, byte maxKnownPetLevel, uint offset, AuctionSortDef[] sorts)
{ {
List<uint> knownAppearanceIds = new(); List<uint> knownAppearanceIds = new();
BitArray knownPetSpecies = new(knownPetBits); BitArray knownPetSpecies = new(knownPetBits);
@@ -819,12 +819,11 @@ namespace Game
if (filters.HasFlag(AuctionHouseFilterMask.UncollectedOnly)) if (filters.HasFlag(AuctionHouseFilterMask.UncollectedOnly))
{ {
knownAppearanceIds = player.GetSession().GetCollectionMgr().GetAppearanceIds(); knownAppearanceIds = player.GetSession().GetCollectionMgr().GetAppearanceIds();
//todo fix me if (knownPetSpecies.Length < CliDB.BattlePetSpeciesStorage.GetNumRows())
//if (knownPetSpecies.Length < CliDB.BattlePetSpeciesStorage.GetNumRows()) knownPetSpecies.Length = (int)CliDB.BattlePetSpeciesStorage.GetNumRows();
//knownPetSpecies.resize(CliDB.BattlePetSpeciesStorage.GetNumRows());
} }
var sorter = new AuctionsBucketData.Sorter(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); var sorter = new AuctionsBucketData.Sorter(player.GetSession().GetSessionDbcLocale(), sorts);
var builder = new AuctionsResultBuilder<AuctionsBucketData>(offset, sorter, AuctionHouseResultLimits.Browse); var builder = new AuctionsResultBuilder<AuctionsBucketData>(offset, sorter, AuctionHouseResultLimits.Browse);
foreach (var bucket in _buckets) foreach (var bucket in _buckets)
@@ -956,17 +955,17 @@ namespace Game
listBucketsResult.HasMoreResults = builder.HasMoreResults(); listBucketsResult.HasMoreResults = builder.HasMoreResults();
} }
public void BuildListBuckets(AuctionListBucketsResult listBucketsResult, Player player, AuctionBucketKey[] keys, int keysCount, AuctionSortDef[] sorts, int sortCount) public void BuildListBuckets(AuctionListBucketsResult listBucketsResult, Player player, AuctionBucketKey[] keys, AuctionSortDef[] sorts)
{ {
List<AuctionsBucketData> buckets = new(); List<AuctionsBucketData> buckets = new();
for (int i = 0; i < keysCount; ++i) foreach (AuctionBucketKey key in keys)
{ {
var bucketData = _buckets.LookupByKey(new AuctionsBucketKey(keys[i])); var bucketData = _buckets.LookupByKey(new AuctionsBucketKey(key));
if (bucketData != null) if (bucketData != null)
buckets.Add(bucketData); buckets.Add(bucketData);
} }
AuctionsBucketData.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); AuctionsBucketData.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
buckets.Sort(sorter); buckets.Sort(sorter);
foreach (AuctionsBucketData resultBucket in buckets) foreach (AuctionsBucketData resultBucket in buckets)
@@ -979,7 +978,7 @@ namespace Game
listBucketsResult.HasMoreResults = false; listBucketsResult.HasMoreResults = false;
} }
public void BuildListBiddedItems(AuctionListBiddedItemsResult listBidderItemsResult, Player player, uint offset, AuctionSortDef[] sorts, int sortCount) public void BuildListBiddedItems(AuctionListBiddedItemsResult listBidderItemsResult, Player player, uint offset, AuctionSortDef[] sorts)
{ {
// always full list // always full list
List<AuctionPosting> auctions = new(); List<AuctionPosting> auctions = new();
@@ -990,7 +989,7 @@ namespace Game
auctions.Add(auction); auctions.Add(auction);
} }
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
auctions.Sort(sorter); auctions.Sort(sorter);
foreach (var resultAuction in auctions) foreach (var resultAuction in auctions)
@@ -1003,13 +1002,13 @@ namespace Game
listBidderItemsResult.HasMoreResults = false; listBidderItemsResult.HasMoreResults = false;
} }
public void BuildListAuctionItems(AuctionListItemsResult listItemsResult, Player player, AuctionsBucketKey bucketKey, uint offset, AuctionSortDef[] sorts, int sortCount) public void BuildListAuctionItems(AuctionListItemsResult listItemsResult, Player player, AuctionsBucketKey bucketKey, uint offset, AuctionSortDef[] sorts)
{ {
listItemsResult.TotalCount = 0; listItemsResult.TotalCount = 0;
AuctionsBucketData bucket = _buckets.LookupByKey(bucketKey); AuctionsBucketData bucket = _buckets.LookupByKey(bucketKey);
if (bucket != null) if (bucket != null)
{ {
var sorter = new AuctionPosting.Sorter(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); var sorter = new AuctionPosting.Sorter(player.GetSession().GetSessionDbcLocale(), sorts);
var builder = new AuctionsResultBuilder<AuctionPosting>(offset, sorter, AuctionHouseResultLimits.Items); var builder = new AuctionsResultBuilder<AuctionPosting>(offset, sorter, AuctionHouseResultLimits.Items);
foreach (var auction in bucket.Auctions) foreach (var auction in bucket.Auctions)
@@ -1030,9 +1029,9 @@ namespace Game
} }
} }
public void BuildListAuctionItems(AuctionListItemsResult listItemsResult, Player player, uint itemId, uint offset, AuctionSortDef[] sorts, int sortCount) public void BuildListAuctionItems(AuctionListItemsResult listItemsResult, Player player, uint itemId, uint offset, AuctionSortDef[] sorts)
{ {
var sorter = new AuctionPosting.Sorter(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); var sorter = new AuctionPosting.Sorter(player.GetSession().GetSessionDbcLocale(), sorts);
var builder = new AuctionsResultBuilder<AuctionPosting>(offset, sorter, AuctionHouseResultLimits.Items); var builder = new AuctionsResultBuilder<AuctionPosting>(offset, sorter, AuctionHouseResultLimits.Items);
listItemsResult.TotalCount = 0; listItemsResult.TotalCount = 0;
@@ -1059,7 +1058,7 @@ namespace Game
listItemsResult.HasMoreResults = builder.HasMoreResults(); listItemsResult.HasMoreResults = builder.HasMoreResults();
} }
public void BuildListOwnedItems(AuctionListOwnedItemsResult listOwnerItemsResult, Player player, uint offset, AuctionSortDef[] sorts, int sortCount) public void BuildListOwnedItems(AuctionListOwnedItemsResult listOwnerItemsResult, Player player, uint offset, AuctionSortDef[] sorts)
{ {
// always full list // always full list
List<AuctionPosting> auctions = new(); List<AuctionPosting> auctions = new();
@@ -1070,7 +1069,7 @@ namespace Game
auctions.Add(auction); auctions.Add(auction);
} }
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount); AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
auctions.Sort(sorter); auctions.Sort(sorter);
foreach (var resultAuction in auctions) foreach (var resultAuction in auctions)
@@ -1726,20 +1725,19 @@ namespace Game
public class Sorter : IComparer<AuctionPosting> public class Sorter : IComparer<AuctionPosting>
{ {
public Sorter(Locale locale, AuctionSortDef[] sorts, int sortCount) public Sorter(Locale locale, AuctionSortDef[] sorts)
{ {
_locale = locale; _locale = locale;
_sorts = sorts; _sorts = sorts;
_sortCount = sortCount;
} }
public int Compare(AuctionPosting left, AuctionPosting right) public int Compare(AuctionPosting left, AuctionPosting right)
{ {
for (var i = 0; i < _sortCount; ++i) foreach (AuctionSortDef sort in _sorts)
{ {
long ordering = CompareColumns(_sorts[i].SortOrder, left, right); long ordering = CompareColumns(sort.SortOrder, left, right);
if (ordering != 0) if (ordering != 0)
return (ordering < 0).CompareTo(!_sorts[i].ReverseSort); return (ordering < 0).CompareTo(!sort.ReverseSort);
} }
// Auctions are processed in LIFO order // Auctions are processed in LIFO order
@@ -1782,7 +1780,6 @@ namespace Game
Locale _locale; Locale _locale;
AuctionSortDef[] _sorts; AuctionSortDef[] _sorts;
int _sortCount;
} }
} }
@@ -1800,10 +1797,10 @@ namespace Game
public uint[] QualityCounts = new uint[(int)ItemQuality.Max]; public uint[] QualityCounts = new uint[(int)ItemQuality.Max];
public ulong MinPrice; // for sort public ulong MinPrice; // for sort
public (uint Id, uint Count)[] ItemModifiedAppearanceId = new (uint Id, uint Count)[4]; // for uncollected search public (uint Id, uint Count)[] ItemModifiedAppearanceId = new (uint Id, uint Count)[4]; // for uncollected search
public byte RequiredLevel = 0; // for usable search public byte RequiredLevel; // for usable search
public byte SortLevel = 0; public ushort SortLevel;
public byte MinBattlePetLevel = 0; public byte MinBattlePetLevel;
public byte MaxBattlePetLevel = 0; public byte MaxBattlePetLevel;
public string[] FullName = new string[(int)Locale.Total]; public string[] FullName = new string[(int)Locale.Total];
public List<AuctionPosting> Auctions = new(); public List<AuctionPosting> Auctions = new();
@@ -1855,20 +1852,19 @@ namespace Game
public class Sorter : IComparer<AuctionsBucketData> public class Sorter : IComparer<AuctionsBucketData>
{ {
public Sorter(Locale locale, AuctionSortDef[] sorts, int sortCount) public Sorter(Locale locale, AuctionSortDef[] sorts)
{ {
_locale = locale; _locale = locale;
_sorts = sorts; _sorts = sorts;
_sortCount = sortCount;
} }
public int Compare(AuctionsBucketData left, AuctionsBucketData right) public int Compare(AuctionsBucketData left, AuctionsBucketData right)
{ {
for (var i = 0; i < _sortCount; ++i) foreach (AuctionSortDef sort in _sorts)
{ {
long ordering = CompareColumns(_sorts[i].SortOrder, left, right); long ordering = CompareColumns(sort.SortOrder, left, right);
if (ordering != 0) if (ordering != 0)
return (ordering < 0).CompareTo(!_sorts[i].ReverseSort); return (ordering < 0).CompareTo(!sort.ReverseSort);
} }
return left.Key != right.Key ? 1 : 0; return left.Key != right.Key ? 1 : 0;
@@ -1895,7 +1891,6 @@ namespace Game
Locale _locale; Locale _locale;
AuctionSortDef[] _sorts; AuctionSortDef[] _sorts;
int _sortCount;
} }
} }
+7 -11
View File
@@ -65,7 +65,7 @@ namespace Game
} }
auctionHouse.BuildListBuckets(listBucketsResult, _player, browseQuery.Name, browseQuery.MinLevel, browseQuery.MaxLevel, browseQuery.Filters, classFilters, auctionHouse.BuildListBuckets(listBucketsResult, _player, browseQuery.Name, browseQuery.MinLevel, browseQuery.MaxLevel, browseQuery.Filters, classFilters,
browseQuery.KnownPets, browseQuery.KnownPets.Length, (byte)browseQuery.MaxPetLevel, browseQuery.Offset, browseQuery.Sorts, browseQuery.Sorts.Count); browseQuery.KnownPets, (byte)browseQuery.MaxPetLevel, browseQuery.Offset, browseQuery.Sorts);
listBucketsResult.BrowseMode = AuctionHouseBrowseMode.Search; listBucketsResult.BrowseMode = AuctionHouseBrowseMode.Search;
listBucketsResult.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds; listBucketsResult.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
@@ -174,7 +174,7 @@ namespace Game
AuctionListBiddedItemsResult result = new(); AuctionListBiddedItemsResult result = new();
Player player = GetPlayer(); Player player = GetPlayer();
auctionHouse.BuildListBiddedItems(result, player, listBiddedItems.Offset, listBiddedItems.Sorts, listBiddedItems.Sorts.Count); auctionHouse.BuildListBiddedItems(result, player, listBiddedItems.Offset, listBiddedItems.Sorts);
result.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds; result.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
SendPacket(result); SendPacket(result);
} }
@@ -201,9 +201,7 @@ namespace Game
AuctionListBucketsResult listBucketsResult = new(); AuctionListBucketsResult listBucketsResult = new();
auctionHouse.BuildListBuckets(listBucketsResult, _player, auctionHouse.BuildListBuckets(listBucketsResult, _player, listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.Sorts);
listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.BucketKeys.Count,
listBucketsByBucketKeys.Sorts, listBucketsByBucketKeys.Sorts.Count);
listBucketsResult.BrowseMode = AuctionHouseBrowseMode.SpecificKeys; listBucketsResult.BrowseMode = AuctionHouseBrowseMode.SpecificKeys;
listBucketsResult.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds; listBucketsResult.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
@@ -236,8 +234,7 @@ namespace Game
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByBucketKey.BucketKey.ItemID); ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByBucketKey.BucketKey.ItemID);
listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items; listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items;
auctionHouse.BuildListAuctionItems(listItemsResult, _player, new AuctionsBucketKey(listItemsByBucketKey.BucketKey), listItemsByBucketKey.Offset, auctionHouse.BuildListAuctionItems(listItemsResult, _player, new AuctionsBucketKey(listItemsByBucketKey.BucketKey), listItemsByBucketKey.Offset, listItemsByBucketKey.Sorts);
listItemsByBucketKey.Sorts, listItemsByBucketKey.Sorts.Count);
SendPacket(listItemsResult); SendPacket(listItemsResult);
} }
@@ -268,8 +265,7 @@ namespace Game
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByItemID.ItemID); ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByItemID.ItemID);
listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items; listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items;
auctionHouse.BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset, auctionHouse.BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset, listItemsByItemID.Sorts);
listItemsByItemID.Sorts, listItemsByItemID.Sorts.Count);
SendPacket(listItemsResult); SendPacket(listItemsResult);
} }
@@ -296,7 +292,7 @@ namespace Game
AuctionListOwnedItemsResult result = new(); AuctionListOwnedItemsResult result = new();
auctionHouse.BuildListOwnedItems(result, _player, listOwnedItems.Offset, listOwnedItems.Sorts, listOwnedItems.Sorts.Count); auctionHouse.BuildListOwnedItems(result, _player, listOwnedItems.Offset, listOwnedItems.Sorts);
result.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds; result.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
SendPacket(result); SendPacket(result);
} }
@@ -609,7 +605,7 @@ namespace Game
Dictionary<ObjectGuid, (Item Item, ulong UseCount)> items2 = new(); Dictionary<ObjectGuid, (Item Item, ulong UseCount)> items2 = new();
foreach (var itemForSale in sellCommodity.Items) foreach (var itemForSale in sellCommodity.Items)
{ {
Item item = _player.GetItemByGuid(itemForSale.Guid); Item item = _player.GetItemByGuid(itemForSale.Guid);
if (item == null) if (item == null)
{ {