aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp206
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h93
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp17
3 files changed, 111 insertions, 205 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index c5b9340cda7..15b577d4642 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -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);
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 9cccec7bb95..c5bb8cffc19 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -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:
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index f0f9a9cee9c..2082b67d451 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -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());
}