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;
}
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)
return false;
@@ -273,7 +273,7 @@ namespace Game
item.SaveToDB(trans);
}
_itemsByGuid.Remove(guid);
_itemsByGuid.Remove(itemGuid);
return true;
}
@@ -663,7 +663,7 @@ namespace Game
_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);
if (auctionIndex < 0)
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,
byte[] knownPetBits, int knownPetBitsCount, byte maxKnownPetLevel, uint offset, AuctionSortDef[] sorts, int sortCount)
byte[] knownPetBits, byte maxKnownPetLevel, uint offset, AuctionSortDef[] sorts)
{
List<uint> knownAppearanceIds = new();
BitArray knownPetSpecies = new(knownPetBits);
@@ -819,12 +819,11 @@ namespace Game
if (filters.HasFlag(AuctionHouseFilterMask.UncollectedOnly))
{
knownAppearanceIds = player.GetSession().GetCollectionMgr().GetAppearanceIds();
//todo fix me
//if (knownPetSpecies.Length < CliDB.BattlePetSpeciesStorage.GetNumRows())
//knownPetSpecies.resize(CliDB.BattlePetSpeciesStorage.GetNumRows());
if (knownPetSpecies.Length < CliDB.BattlePetSpeciesStorage.GetNumRows())
knownPetSpecies.Length = (int)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);
foreach (var bucket in _buckets)
@@ -956,17 +955,17 @@ namespace Game
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();
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)
buckets.Add(bucketData);
}
AuctionsBucketData.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount);
AuctionsBucketData.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
buckets.Sort(sorter);
foreach (AuctionsBucketData resultBucket in buckets)
@@ -979,7 +978,7 @@ namespace Game
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
List<AuctionPosting> auctions = new();
@@ -990,7 +989,7 @@ namespace Game
auctions.Add(auction);
}
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount);
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
auctions.Sort(sorter);
foreach (var resultAuction in auctions)
@@ -1003,13 +1002,13 @@ namespace Game
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;
AuctionsBucketData bucket = _buckets.LookupByKey(bucketKey);
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);
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);
listItemsResult.TotalCount = 0;
@@ -1059,7 +1058,7 @@ namespace Game
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
List<AuctionPosting> auctions = new();
@@ -1070,7 +1069,7 @@ namespace Game
auctions.Add(auction);
}
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts, sortCount);
AuctionPosting.Sorter sorter = new(player.GetSession().GetSessionDbcLocale(), sorts);
auctions.Sort(sorter);
foreach (var resultAuction in auctions)
@@ -1726,20 +1725,19 @@ namespace Game
public class Sorter : IComparer<AuctionPosting>
{
public Sorter(Locale locale, AuctionSortDef[] sorts, int sortCount)
public Sorter(Locale locale, AuctionSortDef[] sorts)
{
_locale = locale;
_sorts = sorts;
_sortCount = sortCount;
}
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)
return (ordering < 0).CompareTo(!_sorts[i].ReverseSort);
return (ordering < 0).CompareTo(!sort.ReverseSort);
}
// Auctions are processed in LIFO order
@@ -1782,7 +1780,6 @@ namespace Game
Locale _locale;
AuctionSortDef[] _sorts;
int _sortCount;
}
}
@@ -1800,10 +1797,10 @@ namespace Game
public uint[] QualityCounts = new uint[(int)ItemQuality.Max];
public ulong MinPrice; // for sort
public (uint Id, uint Count)[] ItemModifiedAppearanceId = new (uint Id, uint Count)[4]; // for uncollected search
public byte RequiredLevel = 0; // for usable search
public byte SortLevel = 0;
public byte MinBattlePetLevel = 0;
public byte MaxBattlePetLevel = 0;
public byte RequiredLevel; // for usable search
public ushort SortLevel;
public byte MinBattlePetLevel;
public byte MaxBattlePetLevel;
public string[] FullName = new string[(int)Locale.Total];
public List<AuctionPosting> Auctions = new();
@@ -1855,20 +1852,19 @@ namespace Game
public class Sorter : IComparer<AuctionsBucketData>
{
public Sorter(Locale locale, AuctionSortDef[] sorts, int sortCount)
public Sorter(Locale locale, AuctionSortDef[] sorts)
{
_locale = locale;
_sorts = sorts;
_sortCount = sortCount;
}
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)
return (ordering < 0).CompareTo(!_sorts[i].ReverseSort);
return (ordering < 0).CompareTo(!sort.ReverseSort);
}
return left.Key != right.Key ? 1 : 0;
@@ -1895,7 +1891,6 @@ namespace Game
Locale _locale;
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,
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.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
@@ -174,7 +174,7 @@ namespace Game
AuctionListBiddedItemsResult result = new();
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;
SendPacket(result);
}
@@ -201,9 +201,7 @@ namespace Game
AuctionListBucketsResult listBucketsResult = new();
auctionHouse.BuildListBuckets(listBucketsResult, _player,
listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.BucketKeys.Count,
listBucketsByBucketKeys.Sorts, listBucketsByBucketKeys.Sorts.Count);
auctionHouse.BuildListBuckets(listBucketsResult, _player, listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.Sorts);
listBucketsResult.BrowseMode = AuctionHouseBrowseMode.SpecificKeys;
listBucketsResult.DesiredDelay = (uint)throttle.DelayUntilNext.TotalSeconds;
@@ -236,8 +234,7 @@ namespace Game
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByBucketKey.BucketKey.ItemID);
listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items;
auctionHouse.BuildListAuctionItems(listItemsResult, _player, new AuctionsBucketKey(listItemsByBucketKey.BucketKey), listItemsByBucketKey.Offset,
listItemsByBucketKey.Sorts, listItemsByBucketKey.Sorts.Count);
auctionHouse.BuildListAuctionItems(listItemsResult, _player, new AuctionsBucketKey(listItemsByBucketKey.BucketKey), listItemsByBucketKey.Offset, listItemsByBucketKey.Sorts);
SendPacket(listItemsResult);
}
@@ -268,8 +265,7 @@ namespace Game
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(listItemsByItemID.ItemID);
listItemsResult.ListType = itemTemplate != null && itemTemplate.GetMaxStackSize() > 1 ? AuctionHouseListType.Commodities : AuctionHouseListType.Items;
auctionHouse.BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset,
listItemsByItemID.Sorts, listItemsByItemID.Sorts.Count);
auctionHouse.BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset, listItemsByItemID.Sorts);
SendPacket(listItemsResult);
}
@@ -296,7 +292,7 @@ namespace Game
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;
SendPacket(result);
}
@@ -609,7 +605,7 @@ namespace Game
Dictionary<ObjectGuid, (Item Item, ulong UseCount)> items2 = new();
foreach (var itemForSale in sellCommodity.Items)
{
{
Item item = _player.GetItemByGuid(itemForSale.Guid);
if (item == null)
{