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

This commit is contained in:
Shauren
2023-06-07 20:03:20 +02:00
parent 8d1a57eb96
commit b98df50add
3 changed files with 111 additions and 205 deletions

View File

@@ -65,7 +65,7 @@ std::size_t AuctionsBucketKey::Hash(AuctionsBucketKey const& key)
return hashVal;
}
AuctionsBucketKey AuctionsBucketKey::ForItem(Item* item)
AuctionsBucketKey AuctionsBucketKey::ForItem(Item const* item)
{
ItemTemplate const* itemTemplate = item->GetTemplate();
if (itemTemplate->GetMaxStackSize() == 1)
@@ -87,30 +87,7 @@ AuctionsBucketKey AuctionsBucketKey::ForCommodity(ItemTemplate const* itemTempla
return { itemTemplate->GetId(), uint16(itemTemplate->GetBaseItemLevel()), 0, 0 };
}
bool operator<(AuctionsBucketKey const& left, AuctionsBucketKey const& right)
{
if (left.ItemId < right.ItemId)
return true;
if (left.ItemId > right.ItemId)
return false;
if (left.ItemLevel < right.ItemLevel)
return true;
if (left.ItemLevel > right.ItemLevel)
return false;
if (left.BattlePetSpeciesId < right.BattlePetSpeciesId)
return true;
if (left.BattlePetSpeciesId > right.BattlePetSpeciesId)
return false;
if (left.SuffixItemNameDescriptionId < right.SuffixItemNameDescriptionId)
return true;
//if (left.SuffixItemNameDescriptionId > right.SuffixItemNameDescriptionId)
// return false;
// everything equal
return false;
}
void AuctionsBucketData::BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo* bucketInfo, Player* player) const
void AuctionsBucketData::BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo* bucketInfo, Player const* player) const
{
bucketInfo->Key = Key;
bucketInfo->MinPrice = MinPrice;
@@ -158,7 +135,7 @@ bool AuctionPosting::IsCommodity() const
uint32 AuctionPosting::GetTotalItemCount() const
{
return std::accumulate(Items.begin(), Items.end(), 0u, [](uint32 totalCount, Item* item)
return std::accumulate(Items.begin(), Items.end(), 0u, [](uint32 totalCount, Item const* item)
{
return totalCount + item->GetCount();
});
@@ -258,16 +235,16 @@ uint64 AuctionPosting::CalculateMinIncrement(uint64 bidAmount)
class AuctionsBucketData::Sorter
{
public:
Sorter(LocaleConstant locale, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount)
: _locale(locale), _sorts(sorts), _sortCount(sortCount) { }
Sorter(LocaleConstant locale, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
: _locale(locale), _sorts(sorts) { }
bool operator()(AuctionsBucketData const* left, AuctionsBucketData const* right) const
{
for (std::size_t i = 0; i < _sortCount; ++i)
for (WorldPackets::AuctionHouse::AuctionSortDef const& sort : _sorts)
{
int64 ordering = CompareColumns(_sorts[i].SortOrder, left, right);
int64 ordering = CompareColumns(sort.SortOrder, left, right);
if (ordering != 0)
return (ordering < 0) == !_sorts[i].ReverseSort;
return (ordering < 0) == !sort.ReverseSort;
}
return left->Key < right->Key;
@@ -294,23 +271,22 @@ private:
}
LocaleConstant _locale;
WorldPackets::AuctionHouse::AuctionSortDef const* _sorts;
std::size_t _sortCount;
std::span<WorldPackets::AuctionHouse::AuctionSortDef const> _sorts;
};
class AuctionPosting::Sorter
{
public:
Sorter(LocaleConstant locale, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount)
: _locale(locale), _sorts(sorts), _sortCount(sortCount) { }
Sorter(LocaleConstant locale, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
: _locale(locale), _sorts(sorts) { }
bool operator()(AuctionPosting const* left, AuctionPosting const* right) const
{
for (std::size_t i = 0; i < _sortCount; ++i)
for (WorldPackets::AuctionHouse::AuctionSortDef const& sort : _sorts)
{
int64 ordering = CompareColumns(_sorts[i].SortOrder, left, right);
int64 ordering = CompareColumns(sort.SortOrder, left, right);
if (ordering != 0)
return (ordering < 0) == !_sorts[i].ReverseSort;
return (ordering < 0) == !sort.ReverseSort;
}
// Auctions are processed in LIFO order
@@ -355,8 +331,7 @@ private:
}
LocaleConstant _locale;
WorldPackets::AuctionHouse::AuctionSortDef const* _sorts;
std::size_t _sortCount;
std::span<WorldPackets::AuctionHouse::AuctionSortDef const> _sorts;
};
template<typename T>
@@ -365,8 +340,8 @@ class AuctionsResultBuilder
public:
using Sorter = typename T::Sorter;
AuctionsResultBuilder(uint32 offset, LocaleConstant locale, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount, AuctionHouseResultLimits maxResults)
: _offset(offset), _sorter(locale, sorts, sortCount), _maxResults(AsUnderlyingType(maxResults)), _hasMoreResults(false)
AuctionsResultBuilder(uint32 offset, LocaleConstant locale, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts, AuctionHouseResultLimits maxResults)
: _offset(offset), _sorter(locale, sorts), _maxResults(AsUnderlyingType(maxResults)), _hasMoreResults(false)
{
_items.reserve(_maxResults + offset + 1);
}
@@ -385,7 +360,7 @@ public:
Trinity::IteratorPair<typename std::vector<T const*>::const_iterator> GetResultRange() const
{
return std::make_pair(_items.begin() + _offset, _items.end());
return Trinity::Containers::MakeIteratorPair(_items.begin() + _offset, _items.end());
}
bool HasMoreResults() const
@@ -464,7 +439,7 @@ uint64 AuctionHouseMgr::GetCommodityAuctionDeposit(ItemTemplate const* item, Min
return uint64(std::ceil(std::floor(fmax(0.15 * quantity * sellPrice, 100.0)) / int64(SILVER)) * int64(SILVER)) * (time.count() / (MIN_AUCTION_TIME / MINUTE));
}
uint64 AuctionHouseMgr::GetItemAuctionDeposit(Player* player, Item* item, Minutes time)
uint64 AuctionHouseMgr::GetItemAuctionDeposit(Player const* player, Item const* item, Minutes time)
{
uint32 sellPrice = item->GetSellPrice(player);
return uint64(std::ceil(std::floor(fmax(sellPrice * 0.15, 100.0)) / int64(SILVER)) * int64(SILVER)) * (time.count() / (MIN_AUCTION_TIME / MINUTE));
@@ -655,9 +630,9 @@ void AuctionHouseMgr::AddAItem(Item* item)
_itemsByGuid[item->GetGUID()] = item;
}
bool AuctionHouseMgr::RemoveAItem(ObjectGuid id, bool deleteItem /*= false*/, CharacterDatabaseTransaction* trans /*= nullptr*/)
bool AuctionHouseMgr::RemoveAItem(ObjectGuid itemGuid, bool deleteItem /*= false*/, CharacterDatabaseTransaction* trans /*= nullptr*/)
{
auto i = _itemsByGuid.find(id);
auto i = _itemsByGuid.find(itemGuid);
if (i == _itemsByGuid.end())
return false;
@@ -672,7 +647,7 @@ bool AuctionHouseMgr::RemoveAItem(ObjectGuid id, bool deleteItem /*= false*/, Ch
return true;
}
bool AuctionHouseMgr::PendingAuctionAdd(Player* player, uint32 auctionHouseId, uint32 auctionId, uint64 deposit)
bool AuctionHouseMgr::PendingAuctionAdd(Player const* player, uint32 auctionHouseId, uint32 auctionId, uint64 deposit)
{
auto itr = _pendingAuctionsByPlayer.find(player->GetGUID());
if (itr != _pendingAuctionsByPlayer.end())
@@ -812,7 +787,7 @@ uint32 AuctionHouseMgr::GenerateReplicationId()
return ++_replicateIdGenerator;
}
AuctionThrottleResult AuctionHouseMgr::CheckThrottle(Player* player, bool addonTainted, AuctionCommand command /*= AuctionCommand::SellItem*/)
AuctionThrottleResult AuctionHouseMgr::CheckThrottle(Player const* player, bool addonTainted, AuctionCommand command /*= AuctionCommand::SellItem*/)
{
TimePoint now = GameTime::Now();
auto itr = _playerThrottleObjects.emplace(std::piecewise_construct, std::forward_as_tuple(player->GetGUID()), std::forward_as_tuple());
@@ -1027,7 +1002,7 @@ void AuctionHouseObject::AddAuction(CharacterDatabaseTransaction trans, AuctionP
AuctionPosting* addedAuction = &(_itemsByAuctionId[auction.Id] = std::move(auction));
WorldPackets::AuctionHouse::AuctionSortDef priceSort{ AuctionHouseSortOrder::Price, false };
AuctionPosting::Sorter insertSorter(LOCALE_enUS, &priceSort, 1);
AuctionPosting::Sorter insertSorter(LOCALE_enUS, std::span(&priceSort, 1));
bucket->Auctions.insert(std::lower_bound(bucket->Auctions.begin(), bucket->Auctions.end(), addedAuction, std::cref(insertSorter)), addedAuction);
sScriptMgr->OnAuctionAdd(this, addedAuction);
@@ -1176,9 +1151,9 @@ void AuctionHouseObject::Update()
CharacterDatabase.CommitTransaction(trans);
}
void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player* player,
void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player const* player,
std::wstring const& name, uint8 minLevel, uint8 maxLevel, EnumFlag<AuctionHouseFilterMask> filters, Optional<AuctionSearchClassFilters> const& classFilters,
uint8 const* knownPetBits, std::size_t knownPetBitsCount, uint8 maxKnownPetLevel, uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount)
std::span<uint8 const> knownPetBits, uint8 maxKnownPetLevel, uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
std::unordered_set<uint32> knownAppearanceIds;
boost::dynamic_bitset<uint8> knownPetSpecies;
@@ -1186,12 +1161,12 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis
if (filters.HasFlag(AuctionHouseFilterMask::UncollectedOnly))
{
knownAppearanceIds = player->GetSession()->GetCollectionMgr()->GetAppearanceIds();
knownPetSpecies.init_from_block_range(knownPetBits, knownPetBits + knownPetBitsCount);
knownPetSpecies.init_from_block_range(knownPetBits.begin(), knownPetBits.end());
if (knownPetSpecies.size() < sBattlePetSpeciesStore.GetNumRows())
knownPetSpecies.resize(sBattlePetSpeciesStore.GetNumRows());
}
AuctionsResultBuilder<AuctionsBucketData> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, sortCount, AuctionHouseResultLimits::Browse);
AuctionsResultBuilder<AuctionsBucketData> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, AuctionHouseResultLimits::Browse);
for (std::pair<AuctionsBucketKey const, AuctionsBucketData> const& bucket : _buckets)
{
@@ -1318,20 +1293,20 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis
listBucketsResult.HasMoreResults = builder.HasMoreResults();
}
void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player* player,
WorldPackets::AuctionHouse::AuctionBucketKey const* keys, std::size_t keysCount,
WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount)
void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player const* player,
std::span<WorldPackets::AuctionHouse::AuctionBucketKey const> keys,
std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
std::vector<AuctionsBucketData const*> buckets;
buckets.reserve(keysCount);
for (std::size_t i = 0; i < keysCount; ++i)
buckets.reserve(keys.size());
for (WorldPackets::AuctionHouse::AuctionBucketKey const& key : keys)
{
auto bucketItr = _buckets.find(AuctionsBucketKey(keys[i]));
auto bucketItr = _buckets.find(AuctionsBucketKey(key));
if (bucketItr != _buckets.end())
buckets.push_back(&bucketItr->second);
}
AuctionsBucketData::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts, sortCount);
AuctionsBucketData::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts);
std::sort(buckets.begin(), buckets.end(), std::cref(sorter));
for (AuctionsBucketData const* resultBucket : buckets)
@@ -1342,11 +1317,10 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis
}
listBucketsResult.HasMoreResults = false;
}
void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult& listBiddedItemsResult, Player* player,
uint32 /*offset*/, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const
void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult& listBiddedItemsResult, Player const* player,
uint32 /*offset*/, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
// always full list
std::vector<AuctionPosting const*> auctions;
@@ -1354,7 +1328,7 @@ void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::Auctio
if (AuctionPosting const* auction = Trinity::Containers::MapGetValuePtr(_itemsByAuctionId, auctionId.second))
auctions.push_back(auction);
AuctionPosting::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts, sortCount);
AuctionPosting::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts);
std::sort(auctions.begin(), auctions.end(), std::cref(sorter));
for (AuctionPosting const* resultAuction : auctions)
@@ -1367,13 +1341,13 @@ void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::Auctio
listBiddedItemsResult.HasMoreResults = false;
}
void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player* player, AuctionsBucketKey const& bucketKey,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const
void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player const* player, AuctionsBucketKey const& bucketKey,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
listItemsResult.TotalCount = 0;
if (AuctionsBucketData const* bucket = Trinity::Containers::MapGetValuePtr(_buckets, bucketKey))
{
AuctionsResultBuilder<AuctionPosting> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, sortCount, AuctionHouseResultLimits::Items);
AuctionsResultBuilder<AuctionPosting> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, AuctionHouseResultLimits::Items);
for (AuctionPosting const* auction : bucket->Auctions)
{
@@ -1394,10 +1368,10 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti
}
}
void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player* player, uint32 itemId,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const
void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player const* player, uint32 itemId,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
AuctionsResultBuilder<AuctionPosting> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, sortCount, AuctionHouseResultLimits::Items);
AuctionsResultBuilder<AuctionPosting> builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, AuctionHouseResultLimits::Items);
auto itr = _buckets.lower_bound(AuctionsBucketKey(itemId, 0, 0, 0));
auto end = _buckets.lower_bound(AuctionsBucketKey(itemId + 1, 0, 0, 0));
listItemsResult.TotalCount = 0;
@@ -1424,8 +1398,8 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti
listItemsResult.HasMoreResults = builder.HasMoreResults();
}
void AuctionHouseObject::BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult& listOwnedItemsResult, Player* player,
uint32 /*offset*/, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount)
void AuctionHouseObject::BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult& listOwnedItemsResult, Player const* player,
uint32 /*offset*/, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const
{
// always full list
std::vector<AuctionPosting const*> auctions;
@@ -1433,7 +1407,7 @@ void AuctionHouseObject::BuildListOwnedItems(WorldPackets::AuctionHouse::Auction
if (AuctionPosting const* auction = Trinity::Containers::MapGetValuePtr(_itemsByAuctionId, auctionId.second))
auctions.push_back(auction);
AuctionPosting::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts, sortCount);
AuctionPosting::Sorter sorter(player->GetSession()->GetSessionDbcLocale(), sorts);
std::sort(auctions.begin(), auctions.end(), std::cref(sorter));
for (AuctionPosting const* resultAuction : auctions)
@@ -1446,76 +1420,6 @@ void AuctionHouseObject::BuildListOwnedItems(WorldPackets::AuctionHouse::Auction
listOwnedItemsResult.HasMoreResults = false;
}
/*
void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& packet, Player* player,
std::wstring const& searchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, EnumClassFlag<AuctionHouseFilterMask> filters,
Optional<AuctionSearchClassFilters> const& classFilters)
{
time_t curTime = GameTime::GetGameTime();
for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr)
{
AuctionEntry* Aentry = itr->second;
// Skip expired auctions
if (Aentry->expire_time < curTime)
continue;
Item* item = sAuctionMgr->GetAItem(Aentry->itemGUIDLow);
if (!item)
continue;
ItemTemplate const* proto = item->GetTemplate();
if (classFilters)
{
// if we dont want any class filters, Optional is not initialized
// if we dont want this class included, SubclassMask is set to FILTER_SKIP_CLASS
// if we want this class and did not specify and subclasses, its set to FILTER_SKIP_SUBCLASS
// otherwise full restrictions apply
if (classFilters->Classes[proto->GetClass()].SubclassMask == AuctionSearchClassFilters::FILTER_SKIP_CLASS)
continue;
if (classFilters->Classes[proto->GetClass()].SubclassMask != AuctionSearchClassFilters::FILTER_SKIP_SUBCLASS)
{
if (!(classFilters->Classes[proto->GetClass()].SubclassMask & (1 << proto->GetSubClass())))
continue;
if (!(classFilters->Classes[proto->GetClass()].InvTypes[proto->GetSubClass()] & (1 << proto->GetInventoryType())))
continue;
}
}
if (!filters.HasFlag(static_cast<AuctionHouseFilterMask>(1 << (proto->GetQuality() + 4))))
continue;
if (levelmin != 0 && (item->GetRequiredLevel() < levelmin || (levelmax != 0 && item->GetRequiredLevel() > levelmax)))
continue;
if (filters.HasFlag(AuctionHouseFilterMask::UsableOnly) && player->CanUseItem(item) != EQUIP_ERR_OK)
continue;
// Allow search by suffix (ie: of the Monkey) or partial name (ie: Monkey)
// No need to do any of this if no search term was entered
if (!searchedname.empty())
{
std::string name = proto->GetName(player->GetSession()->GetSessionDbcLocale());
if (name.empty())
continue;
// TODO: Generate name using ItemNameDescription
// Perform the search (with or without suffix)
if (!Utf8FitTo(name, searchedname))
continue;
}
// Add the item if no search term or if entered search term was found
if (packet.Items.size() < 50 && packet.TotalCount >= listfrom)
Aentry->BuildAuctionInfo(packet.Items, true, item);
++packet.TotalCount;
}
}
*/
void AuctionHouseObject::BuildReplicate(WorldPackets::AuctionHouse::AuctionReplicateResponse& replicateResponse, Player* player,
uint32 global, uint32 cursor, uint32 tombstone, uint32 count)
{
@@ -1562,7 +1466,7 @@ uint64 AuctionHouseObject::CalculateAuctionHouseCut(uint64 bidAmount) const
return std::max(int64(CalculatePct(bidAmount, _auctionHouse->ConsignmentRate) * double(sWorld->getRate(RATE_AUCTION_CUT))), SI64LIT(0));
}
CommodityQuote const* AuctionHouseObject::CreateCommodityQuote(Player* player, uint32 itemId, uint32 quantity)
CommodityQuote const* AuctionHouseObject::CreateCommodityQuote(Player const* player, uint32 itemId, uint32 quantity)
{
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
if (!itemTemplate)
@@ -1824,7 +1728,7 @@ bool AuctionHouseObject::BuyCommodity(CharacterDatabaseTransaction trans, Player
}
// this function notified old bidder that his bid is no longer highest
void AuctionHouseObject::SendAuctionOutbid(AuctionPosting const* auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionOutbid(AuctionPosting const* auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans) const
{
Player* oldBidder = ObjectAccessor::FindConnectedPlayer(auction->Bidder);
@@ -1848,7 +1752,7 @@ void AuctionHouseObject::SendAuctionOutbid(AuctionPosting const* auction, Object
}
}
void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* bidder, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* bidder, CharacterDatabaseTransaction trans) const
{
uint32 bidderAccId = 0;
if (!bidder)
@@ -1923,7 +1827,7 @@ void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* b
}
//call this method to send mail to auction owner, when auction is successful, it does not clear ram
void AuctionHouseObject::SendAuctionSold(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionSold(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const
{
if (!owner)
owner = ObjectAccessor::FindConnectedPlayer(auction->Owner);
@@ -1950,7 +1854,7 @@ void AuctionHouseObject::SendAuctionSold(AuctionPosting const* auction, Player*
}
}
void AuctionHouseObject::SendAuctionExpired(AuctionPosting const* auction, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionExpired(AuctionPosting const* auction, CharacterDatabaseTransaction trans) const
{
Player* owner = ObjectAccessor::FindConnectedPlayer(auction->Owner);
// owner exist
@@ -1978,7 +1882,7 @@ void AuctionHouseObject::SendAuctionExpired(AuctionPosting const* auction, Chara
}
}
void AuctionHouseObject::SendAuctionRemoved(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionRemoved(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const
{
auto itemItr = auction->Items.begin();
while (itemItr != auction->Items.end())
@@ -1993,7 +1897,7 @@ void AuctionHouseObject::SendAuctionRemoved(AuctionPosting const* auction, Playe
}
//this function sends mail, when auction is cancelled to old bidder
void AuctionHouseObject::SendAuctionCancelledToBidder(AuctionPosting const* auction, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionCancelledToBidder(AuctionPosting const* auction, CharacterDatabaseTransaction trans) const
{
Player* bidder = ObjectAccessor::FindConnectedPlayer(auction->Bidder);
@@ -2004,7 +1908,7 @@ void AuctionHouseObject::SendAuctionCancelledToBidder(AuctionPosting const* auct
.SendMailTo(trans, MailReceiver(bidder, auction->Bidder), this, MAIL_CHECK_MASK_COPIED);
}
void AuctionHouseObject::SendAuctionInvoice(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans)
void AuctionHouseObject::SendAuctionInvoice(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const
{
if (!owner)
owner = ObjectAccessor::FindConnectedPlayer(auction->Owner);

View File

@@ -26,6 +26,7 @@
#include "ObjectGuid.h"
#include "Optional.h"
#include <map>
#include <span>
#include <unordered_map>
class Item;
@@ -177,30 +178,28 @@ struct AuctionsBucketKey
return !(*this == right);
}
static std::size_t Hash(AuctionsBucketKey const& bucket);
static AuctionsBucketKey ForItem(Item* item);
friend std::strong_ordering operator<=>(AuctionsBucketKey const& left, AuctionsBucketKey const& right) = default;
static std::size_t Hash(AuctionsBucketKey const& key);
static AuctionsBucketKey ForItem(Item const* item);
static AuctionsBucketKey ForCommodity(ItemTemplate const* itemTemplate);
};
bool operator<(AuctionsBucketKey const& left, AuctionsBucketKey const& right);
namespace std
template<>
struct std::hash<AuctionsBucketKey>
{
template<>
struct hash<AuctionsBucketKey>
size_t operator()(AuctionsBucketKey const& key) const noexcept
{
size_t operator()(AuctionsBucketKey const& key) const noexcept
{
return AuctionsBucketKey::Hash(key);
}
};
}
return AuctionsBucketKey::Hash(key);
}
};
struct AuctionPosting;
struct AuctionsBucketData
{
AuctionsBucketKey Key;
AuctionsBucketKey Key{};
// filter helpers
uint8 ItemClass = 0;
@@ -211,14 +210,14 @@ struct AuctionsBucketData
uint64 MinPrice = 0; // for sort
std::array<std::pair<uint32, uint32>, 4> ItemModifiedAppearanceId = { }; // for uncollected search
uint8 RequiredLevel = 0; // for usable search
uint8 SortLevel = 0;
uint16 SortLevel = 0;
uint8 MinBattlePetLevel = 0;
uint8 MaxBattlePetLevel = 0;
std::array<std::wstring, TOTAL_LOCALES> FullName = { };
std::vector<AuctionPosting*> Auctions;
void BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo* bucketInfo, Player* player) const;
void BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo* bucketInfo, Player const* player) const;
class Sorter;
};
@@ -254,7 +253,7 @@ struct AuctionPosting
bool IsCommodity() const;
uint32 GetTotalItemCount() const;
void BuildAuctionItem(WorldPackets::AuctionHouse::AuctionItem* auctionItem, bool alwaysSendItem, bool sendKey, bool censorServerInfo, bool censorBidInfo) const;
static uint64 CalculateMinIncrement(uint64 currentBid);
static uint64 CalculateMinIncrement(uint64 bidAmount);
uint64 CalculateMinIncrement() const { return CalculateMinIncrement(BidAmount); }
class Sorter;
@@ -278,7 +277,10 @@ class TC_GAME_API AuctionHouseObject
{
public:
explicit AuctionHouseObject(uint32 auctionHouseId);
AuctionHouseObject(AuctionHouseObject const&) = delete;
AuctionHouseObject(AuctionHouseObject&&) = delete;
AuctionHouseObject& operator=(AuctionHouseObject const&) = delete;
AuctionHouseObject& operator=(AuctionHouseObject&&) = delete;
~AuctionHouseObject();
struct PlayerReplicateThrottleData
@@ -304,37 +306,37 @@ public:
void Update();
void BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player* player,
void BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player const* player,
std::wstring const& name, uint8 minLevel, uint8 maxLevel, EnumFlag<AuctionHouseFilterMask> filters, Optional<AuctionSearchClassFilters> const& classFilters,
uint8 const* knownPetBits, std::size_t knownPetBitsCount, uint8 maxKnownPetLevel,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount);
void BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player* player,
WorldPackets::AuctionHouse::AuctionBucketKey const* keys, std::size_t keysCount,
WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount);
void BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult& listBiddedItemsResult, Player* player,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const;
void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player* player, AuctionsBucketKey const& bucketKey,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const;
void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player* player, uint32 itemId,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount) const;
void BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult& listOwnedItemsResult, Player* player,
uint32 offset, WorldPackets::AuctionHouse::AuctionSortDef const* sorts, std::size_t sortCount);
std::span<uint8 const> knownPetBits, uint8 maxKnownPetLevel,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult& listBucketsResult, Player const* player,
std::span<WorldPackets::AuctionHouse::AuctionBucketKey const> keys,
std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult& listBiddedItemsResult, Player const* player,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player const* player, AuctionsBucketKey const& bucketKey,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player const* player, uint32 itemId,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult& listOwnedItemsResult, Player const* player,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts) const;
void BuildReplicate(WorldPackets::AuctionHouse::AuctionReplicateResponse& replicateResponse, Player* player,
uint32 global, uint32 cursor, uint32 tombstone, uint32 count);
uint64 CalculateAuctionHouseCut(uint64 bidAmount) const;
CommodityQuote const* CreateCommodityQuote(Player* player, uint32 itemId, uint32 quantity);
CommodityQuote const* CreateCommodityQuote(Player const* player, uint32 itemId, uint32 quantity);
void CancelCommodityQuote(ObjectGuid guid);
bool BuyCommodity(CharacterDatabaseTransaction trans, Player* player, uint32 itemId, uint32 quantity, Milliseconds delayForNextAction);
void SendAuctionOutbid(AuctionPosting const* auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans);
void SendAuctionWon(AuctionPosting const* auction, Player* player, CharacterDatabaseTransaction trans);
void SendAuctionSold(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans);
void SendAuctionExpired(AuctionPosting const* auction, CharacterDatabaseTransaction trans);
void SendAuctionRemoved(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans);
void SendAuctionCancelledToBidder(AuctionPosting const* auction, CharacterDatabaseTransaction trans);
void SendAuctionInvoice(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans);
void SendAuctionOutbid(AuctionPosting const* auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans) const;
void SendAuctionWon(AuctionPosting const* auction, Player* bidder, CharacterDatabaseTransaction trans) const;
void SendAuctionSold(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const;
void SendAuctionExpired(AuctionPosting const* auction, CharacterDatabaseTransaction trans) const;
void SendAuctionRemoved(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const;
void SendAuctionCancelledToBidder(AuctionPosting const* auction, CharacterDatabaseTransaction trans) const;
void SendAuctionInvoice(AuctionPosting const* auction, Player* owner, CharacterDatabaseTransaction trans) const;
private:
AuctionHouseEntry const* _auctionHouse;
@@ -359,6 +361,11 @@ class TC_GAME_API AuctionHouseMgr
~AuctionHouseMgr();
public:
AuctionHouseMgr(AuctionHouseMgr const&) = delete;
AuctionHouseMgr(AuctionHouseMgr&&) = delete;
AuctionHouseMgr& operator=(AuctionHouseMgr const&) = delete;
AuctionHouseMgr& operator=(AuctionHouseMgr&&) = delete;
static AuctionHouseMgr* instance();
AuctionHouseObject* GetAuctionsMap(uint32 factionTemplateId);
@@ -375,7 +382,7 @@ class TC_GAME_API AuctionHouseMgr
static std::string BuildAuctionInvoiceMailBody(ObjectGuid guid, uint64 bid, uint64 buyout, uint32 deposit, uint64 consignment, uint32 moneyDelay, uint32 eta);
static uint64 GetCommodityAuctionDeposit(ItemTemplate const* item, Minutes time, uint32 quantity);
static uint64 GetItemAuctionDeposit(Player* player, Item* item, Minutes time);
static uint64 GetItemAuctionDeposit(Player const* player, Item const* item, Minutes time);
static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId, uint32* houseId);
public:
@@ -384,7 +391,7 @@ class TC_GAME_API AuctionHouseMgr
void AddAItem(Item* item);
bool RemoveAItem(ObjectGuid itemGuid, bool deleteItem = false, CharacterDatabaseTransaction* trans = nullptr);
bool PendingAuctionAdd(Player* player, uint32 auctionHouseId, uint32 auctionId, uint64 deposit);
bool PendingAuctionAdd(Player const* player, uint32 auctionHouseId, uint32 auctionId, uint64 deposit);
std::size_t PendingAuctionCount(Player const* player) const;
void PendingAuctionProcess(Player* player);
void UpdatePendingAuctions();
@@ -392,7 +399,7 @@ class TC_GAME_API AuctionHouseMgr
uint32 GenerateReplicationId();
AuctionThrottleResult CheckThrottle(Player* player, bool addonTainted, AuctionCommand command = AuctionCommand::SellItem);
AuctionThrottleResult CheckThrottle(Player const* player, bool addonTainted, AuctionCommand command = AuctionCommand::SellItem);
private:

View File

@@ -87,8 +87,7 @@ void WorldSession::HandleAuctionBrowseQuery(WorldPackets::AuctionHouse::AuctionB
auctionHouse->BuildListBuckets(listBucketsResult, _player,
name, browseQuery.MinLevel, browseQuery.MaxLevel, browseQuery.Filters, classFilters,
browseQuery.KnownPets.data(), browseQuery.KnownPets.size(), browseQuery.MaxPetLevel,
browseQuery.Offset, browseQuery.Sorts.data(), browseQuery.Sorts.size());
browseQuery.KnownPets, browseQuery.MaxPetLevel, browseQuery.Offset, browseQuery.Sorts);
listBucketsResult.BrowseMode = AuctionHouseBrowseMode::Search;
listBucketsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
@@ -228,7 +227,7 @@ void WorldSession::HandleAuctionListBiddedItems(WorldPackets::AuctionHouse::Auct
WorldPackets::AuctionHouse::AuctionListBiddedItemsResult result;
Player* player = GetPlayer();
auctionHouse->BuildListBiddedItems(result, player, listBiddedItems.Offset, listBiddedItems.Sorts.data(), listBiddedItems.Sorts.size());
auctionHouse->BuildListBiddedItems(result, player, listBiddedItems.Offset, listBiddedItems.Sorts);
result.DesiredDelay = uint32(throttle.DelayUntilNext.count());
SendPacket(result.Write());
}
@@ -255,9 +254,7 @@ void WorldSession::HandleAuctionListBucketsByBucketKeys(WorldPackets::AuctionHou
WorldPackets::AuctionHouse::AuctionListBucketsResult listBucketsResult;
auctionHouse->BuildListBuckets(listBucketsResult, _player,
listBucketsByBucketKeys.BucketKeys.data(), listBucketsByBucketKeys.BucketKeys.size(),
listBucketsByBucketKeys.Sorts.data(), listBucketsByBucketKeys.Sorts.size());
auctionHouse->BuildListBuckets(listBucketsResult, _player, listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.Sorts);
listBucketsResult.BrowseMode = AuctionHouseBrowseMode::SpecificKeys;
listBucketsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
@@ -289,8 +286,7 @@ void WorldSession::HandleAuctionListItemsByBucketKey(WorldPackets::AuctionHouse:
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(listItemsByBucketKey.BucketKey.ItemID);
listItemsResult.ListType = itemTemplate && itemTemplate->GetMaxStackSize() > 1 ? AuctionHouseListType::Commodities : AuctionHouseListType::Items;
auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByBucketKey.BucketKey, listItemsByBucketKey.Offset,
listItemsByBucketKey.Sorts.data(), listItemsByBucketKey.Sorts.size());
auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByBucketKey.BucketKey, listItemsByBucketKey.Offset, listItemsByBucketKey.Sorts);
SendPacket(listItemsResult.Write());
}
@@ -320,8 +316,7 @@ void WorldSession::HandleAuctionListItemsByItemID(WorldPackets::AuctionHouse::Au
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(listItemsByItemID.ItemID);
listItemsResult.ListType = itemTemplate && itemTemplate->GetMaxStackSize() > 1 ? AuctionHouseListType::Commodities : AuctionHouseListType::Items;
auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset,
listItemsByItemID.Sorts.data(), listItemsByItemID.Sorts.size());
auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset, listItemsByItemID.Sorts);
SendPacket(listItemsResult.Write());
}
@@ -348,7 +343,7 @@ void WorldSession::HandleAuctionListOwnedItems(WorldPackets::AuctionHouse::Aucti
WorldPackets::AuctionHouse::AuctionListOwnedItemsResult result;
auctionHouse->BuildListOwnedItems(result, _player, listOwnedItems.Offset, listOwnedItems.Sorts.data(), listOwnedItems.Sorts.size());
auctionHouse->BuildListOwnedItems(result, _player, listOwnedItems.Offset, listOwnedItems.Sorts);
result.DesiredDelay = uint32(throttle.DelayUntilNext.count());
SendPacket(result.Write());
}