41#include <boost/dynamic_bitset.hpp>
42#include <fmt/ranges.h>
52 ItemId(key.ItemID), ItemLevel(key.ItemLevel), BattlePetSpeciesId(key.BattlePetSpeciesID.value_or(0)),
53 SuffixItemNameDescriptionId(key.ItemSuffix.value_or(0))
75 uint16(
Item::GetItemLevel(itemTemplate, *item->
GetBonus(), 0, item->
GetRequiredLevel(), 0, 0, 0,
false, 0, 0)),
98 for (
Item* item : auction->Items)
105 uint32 breedId = breedData & 0xFFFFFF;
106 uint8 quality =
uint8((breedData >> 24) & 0xFF);
125 if (appearance.first)
136 return Items.size() > 1 ||
Items[0]->GetTemplate()->GetMaxStackSize() > 1;
143 return totalCount + item->GetCount();
148 bool alwaysSendItem,
bool sendKey,
bool censorServerInfo,
bool censorBidInfo)
const
155 auctionItem->
Flags =
Items[0]->m_itemData->DynamicFlags;
164 auctionItem->
Item.emplace();
172 auctionItem->
Item.emplace();
184 for (
uint8 i = 0; i <
Items[0]->m_itemData->Gems.size(); ++i)
192 auctionItem->
Gems.push_back(gem);
229 if (!
Items[0]->m_itemData->Creator->IsEmpty())
250 return (ordering < 0) == !sort.ReverseSort;
253 return left->
Key < right->
Key;
277 std::span<WorldPackets::AuctionHouse::AuctionSortDef const>
_sorts;
292 return (ordering < 0) == !sort.ReverseSort;
299 return left->
Id > right->
Id;
311 return leftPrice - rightPrice;
323 return leftLevel - rightLevel;
339 std::span<WorldPackets::AuctionHouse::AuctionSortDef const>
_sorts;
356 auto where = std::ranges::lower_bound(
_items, item, std::cref(
_sorter));
359 _items.insert(where, item);
394 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
395 delete itemPair.second;
423 switch (auctionHouseId)
468 ItemContext context, std::vector<int32>
const& bonusListIds)
471 itemId,
AsUnderlyingType(type), auctionId, itemCount, battlePetSpeciesId, context, bonusListIds.size(), fmt::join(bonusListIds,
":"));
496 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
497 delete itemPair.second;
504 std::unordered_map<uint32, std::vector<Item*>> itemsByAuction;
505 std::unordered_map<uint32, GuidUnorderedSet> biddersByAuction;
511 Field* fields = result->Fetch();
519 TC_LOG_ERROR(
"misc",
"AuctionHouseMgr::LoadAuctionItems: Unknown item (GUID: {} item entry: #{}) in auction, skipped.", itemGuid, itemEntry);
524 if (!item->
LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[52].
GetUInt64()), fields, itemEntry))
530 itemsByAuction[auctionId].push_back(item);
533 }
while (result->NextRow());
546 Field* fields = result->Fetch();
547 biddersByAuction[fields[0].
GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64()));
549 }
while (result->NextRow());
563 Field* fields = result->Fetch();
571 TC_LOG_ERROR(
"misc",
"Auction {} has wrong auctionHouseId {}", auction.
Id, auctionHouseId);
578 auto itemsItr = itemsByAuction.find(auction.
Id);
579 if (itemsItr == itemsByAuction.end())
588 auction.
Items = std::move(itemsItr->second);
589 auction.
Owner = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64());
591 if (
uint64 bidder = fields[3].GetUInt64())
592 auction.
Bidder = ObjectGuid::Create<HighGuid::Player>(bidder);
598 auction.
StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64());
599 auction.
EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64());
602 auto biddersItr = biddersByAuction.find(auction.
Id);
603 if (biddersItr != biddersByAuction.end())
606 auctionHouse->
AddAuction(
nullptr, std::move(auction));
609 }
while (result->NextRow());
633 i->second->SaveToDB(*trans);
648 totalDeposit += thisAuction.Deposit;
651 totalDeposit += deposit;
659 itr->second.Auctions.push_back({ auctionId, auctionHouseId, deposit });
667 return itr->second.Auctions.size();
679 auto itrAH = iterMap->second.Auctions.begin();
680 for (; itrAH != iterMap->second.Auctions.end(); ++itrAH)
685 totaldeposit += itrAH->Deposit;
689 if (itrAH != iterMap->second.Auctions.end())
704 }
while (itrAH != iterMap->second.Auctions.end());
734 TC_LOG_WARN(
"auctionHouse",
"Player {} was offline, unable to retrieve deposit!", playerGUID.
ToString());
744 stmt->
setUInt32(1, pendingAuction.AuctionId);
765 if (itr->second.PeriodEnd < now)
784 if (itr.second || now > itr.first->second.PeriodEnd)
786 itr.first->second.PeriodEnd = now +
Minutes(1);
787 itr.first->second.QueriesRemaining = 100;
790 if (!itr.first->second.QueriesRemaining)
796 if (!--itr.first->second.QueriesRemaining)
797 return { std::chrono::duration_cast<Milliseconds>(itr.first->second.PeriodEnd - now),
false };
811 switch (factionTemplateId)
813 case 120: houseid = 7;
break;
814 case 474: houseid = 7;
break;
815 case 855: houseid = 7;
break;
857 auto [bucketItr, isNew] =
_buckets.try_emplace(key);
901 std::wstring utf16name;
902 if (!
Utf8toWStr(auction.
Items[0]->GetNameForLocaleIdx(locale), utf16name))
911 if (!bucket->
MinPrice || priceToDisplay < bucket->MinPrice)
916 auto itr = std::ranges::find(bucket->
ItemModifiedAppearanceId, itemModifiedAppearance->ID, Trinity::TupleElement<0>);
923 itr->first = itemModifiedAppearance->ID;
932 quality = auction.
Items[0]->GetQuality();
965 stmt->
setInt64(9, std::chrono::system_clock::to_time_t(auction.
EndTime));
973 stmt->
setUInt64(1, item->GetGUID().GetCounter());
990 bucket->
Auctions.insert(std::ranges::lower_bound(bucket->
Auctions, addedAuction, std::cref(insertSorter)), addedAuction);
996 std::map<uint32, AuctionPosting>::iterator* auctionItr )
1000 std::erase(bucket->
Auctions, auction);
1005 if (bucket->
MinPrice == priceToDisplay)
1007 bucket->
MinPrice = std::numeric_limits<uint64>::max();
1009 bucket->
MinPrice = std::min(bucket->
MinPrice, remainingAuction->BuyoutOrUnitPrice ? remainingAuction->BuyoutOrUnitPrice : remainingAuction->BidAmount);
1015 [itemModifiedAppearance](std::pair<uint32, uint32>
const& appearance)
1017 return appearance.first == itemModifiedAppearance->ID;
1029 quality = auction->
Items[0]->GetQuality();
1038 for (
Item* item : remainingAuction->Items)
1056 auction->
Bucket =
nullptr;
1062 trans->Append(stmt);
1088 if (itr->second.NextAllowedReplication <= curTimeSteady)
1096 if (itr->second.ValidTo < curTimeSteady)
1111 if (auction->
EndTime > curTime + 1min)
1117 std::map<uint32, AuctionPosting>::node_type removedAuctionNode =
RemoveAuction(trans, auction, &it);
1118 auction = &removedAuctionNode.mapped();
1129 sScriptMgr->OnAuctionSuccessful(
this, auction);
1144 std::span<uint8 const> knownPetBits,
uint8 maxKnownPetLevel,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1146 std::unordered_set<uint32> knownAppearanceIds;
1147 boost::dynamic_bitset<uint8> knownPetSpecies;
1152 knownPetSpecies.resize(std::max(knownPetSpecies.size() * 32, std::size_t(
sBattlePetSpeciesStore.GetNumRows())));
1153 boost::from_block_range(knownPetBits.begin(), knownPetBits.end(), knownPetSpecies);
1158 for (std::pair<AuctionsBucketKey const, AuctionsBucketData>
const& bucket :
_buckets)
1211 if (!knownAppearanceIds.contains(itemModifiedAppearance->ItemAppearanceID))
1223 else if (bucket.first.BattlePetSpeciesId)
1225 if (knownPetSpecies.test(bucket.first.BattlePetSpeciesId))
1229 else if (
sDB2Manager.IsToyItem(bucket.first.ItemId))
1240 bool hasUnlearned = std::ranges::any_of(itemTemplate->
Effects, [player, &knownPetSpecies](
ItemEffectEntry const* itemEffect)
1242 if (itemEffect->TriggerType != ITEM_SPELLTRIGGER_ON_LEARN)
1244 if (player->HasSpell(itemEffect->SpellID))
1246 if (BattlePetSpeciesEntry const* battlePetSpecies = BattlePets::BattlePetMgr::GetBattlePetSpeciesBySpell(itemEffect->SpellID))
1247 if (knownPetSpecies.test(battlePetSpecies->ID))
1287 resultBucket->BuildBucketInfo(&bucketInfo, player);
1290 listBucketsResult.
Filters = filters;
1296 std::span<WorldPackets::AuctionHouse::AuctionBucketKey const> keys,
1297 std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1299 std::vector<AuctionsBucketData const*> buckets;
1300 buckets.reserve(keys.size());
1305 buckets.push_back(&bucketItr->second);
1309 std::ranges::sort(buckets, std::cref(sorter));
1314 resultBucket->BuildBucketInfo(&bucketInfo, player);
1317 listBucketsResult.
TotalCount = buckets.size();
1322 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1325 std::vector<AuctionPosting const*> auctions;
1328 auctions.push_back(auction);
1331 std::ranges::sort(auctions, std::cref(sorter));
1336 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
true,
false);
1343 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1353 for (
Item* item : auction->Items)
1360 resultAuction->BuildAuctionItem(&auctionItem,
false,
false, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1361 resultAuction->Bidder.
IsEmpty());
1370 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1376 while (itr != end && itr->first.ItemId == itemId)
1381 for (
Item* item : auction->Items)
1391 resultAuction->BuildAuctionItem(&auctionItem,
false,
true, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1392 resultAuction->Bidder.
IsEmpty());
1400 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1403 std::vector<AuctionPosting const*> auctions;
1406 auctions.push_back(auction);
1409 std::ranges::sort(auctions, std::cref(sorter));
1414 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
false,
false);
1428 if (throttleItr->second.Global != global || throttleItr->second.Cursor != cursor || throttleItr->second.Tombstone != tombstone)
1431 if (!throttleItr->second.IsReplicationInProgress() && throttleItr->second.NextAllowedReplication > curTime)
1438 throttleItr->second.Global =
sAuctionMgr->GenerateReplicationId();
1456 replicateResponse.
ChangeNumberCursor = throttleItr->second.Cursor = !replicateResponse.
Items.empty() ? replicateResponse.
Items.back().AuctionID : 0;
1476 uint32 remainingQuantity = quantity;
1482 for (
Item* auctionItem : auction->Items)
1484 if (auctionItem->GetCount() >= remainingQuantity)
1486 totalPrice += auction->BuyoutOrUnitPrice * remainingQuantity;
1487 remainingQuantity = 0;
1491 totalPrice += auction->BuyoutOrUnitPrice * auctionItem->GetCount();
1492 remainingQuantity -= auctionItem->GetCount();
1497 if (remainingQuantity)
1536 uint32 remainingQuantity = quantity;
1537 std::vector<AuctionPosting*> auctions;
1538 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1544 auctions.push_back(auction);
1545 for (
Item* auctionItem : auction->
Items)
1547 if (auctionItem->GetCount() >= remainingQuantity)
1550 remainingQuantity = 0;
1551 auctionItr = bucketItr->second.Auctions.end();
1556 remainingQuantity -= auctionItem->GetCount();
1561 if (remainingQuantity)
1569 if (totalPrice > quote.mapped().TotalPrice)
1584 struct MailedItemsBatch
1586 std::array<Item*, MAX_MAIL_ITEMS>
Items = { };
1590 std::size_t ItemsCount = 0;
1592 bool IsFull()
const {
return ItemsCount >=
Items.size(); }
1595 Items[ItemsCount++] = item;
1597 TotalPrice += unitPrice * item->
GetCount();
1601 std::vector<MailedItemsBatch> items;
1602 items.emplace_back();
1604 remainingQuantity = quantity;
1605 std::vector<std::size_t> removedItemsFromAuction;
1607 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1614 uniqueSeller = auction->
Owner;
1615 else if (*uniqueSeller != auction->
Owner)
1618 uint32 boughtFromAuction = 0;
1619 std::size_t removedItems = 0;
1620 for (
Item* auctionItem : auction->
Items)
1622 MailedItemsBatch* itemsBatch = &items.back();
1623 if (itemsBatch->IsFull())
1625 items.emplace_back();
1626 itemsBatch = &items.back();
1629 if (auctionItem->GetCount() > remainingQuantity)
1631 Item* clonedItem = auctionItem->
CloneItem(remainingQuantity, player);
1638 auctionItem->SetCount(auctionItem->GetCount() - remainingQuantity);
1640 auctionItem->SaveToDB(trans);
1642 boughtFromAuction += remainingQuantity;
1643 remainingQuantity = 0;
1644 auctionItr = bucketItr->second.Auctions.end();
1649 boughtFromAuction += auctionItem->GetCount();
1650 remainingQuantity -= auctionItem->GetCount();
1654 removedItemsFromAuction.push_back(removedItems);
1659 std::string ownerName;
1663 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) bought commodity in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1664 player->
GetName(), bidderAccId, items[0].Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1665 items[0].Items[0]->GetEntry(), boughtFromAuction, auction->
BuyoutOrUnitPrice * boughtFromAuction, ownerName,
1690 for (MailedItemsBatch
const& batch : items)
1695 for (std::size_t i = 0; i < batch.ItemsCount; ++i)
1698 stmt->
setUInt64(0, batch.Items[i]->GetGUID().GetCounter());
1699 trans->Append(stmt);
1701 batch.Items[i]->SetOwnerGUID(player->
GetGUID());
1702 batch.Items[i]->SaveToDB(trans);
1713 for (std::size_t i = 0; i < auctions.size(); ++i)
1715 if (removedItemsFromAuction[i] == auctions[i]->
Items.size())
1717 else if (removedItemsFromAuction[i])
1719 auto lastRemovedItem = auctions[i]->Items.begin() + removedItemsFromAuction[i];
1720 for (
auto itr = auctions[i]->
Items.begin(); itr != lastRemovedItem; ++itr)
1723 auctions[i]->Items.erase(auctions[i]->
Items.begin(), lastRemovedItem);
1762 std::string bidderName;
1768 bidderName = bidder->
GetName();
1780 std::string ownerName;
1786 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) won item in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1787 bidderName, bidderAccId, auction->
Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1803 stmt->
setUInt64(1, item->GetGUID().GetCounter());
1804 trans->Append(stmt);
1827 item->SaveToDB(trans);
1869 auto itemItr = auction->
Items.begin();
1870 while (itemItr != auction->
Items.end())
1874 for (std::size_t i = 0; i <
MAX_MAIL_ITEMS && itemItr != auction->
Items.end(); ++i, ++itemItr)
1886 item->SaveToDB(trans);
1893 auto itemItr = auction->
Items.begin();
1894 while (itemItr != auction->
Items.end())
1898 for (std::size_t i = 0; i <
MAX_MAIL_ITEMS && itemItr != auction->
Items.end(); ++i, ++itemItr)
#define sAuctionBotConfig
uint32 constexpr MIN_AUCTION_TIME
@ CommodityPurchaseFailed
@ CHAR_SEL_AUCTION_BIDDERS
@ CHAR_UPD_AUCTION_EXPIRATION
@ CHAR_DEL_AUCTION_ITEMS_BY_ITEM
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance)
DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance)
DB2Storage< FactionTemplateEntry > sFactionTemplateStore("FactionTemplate.db2", &FactionTemplateLoadInfo::Instance)
DB2Storage< AuctionHouseEntry > sAuctionHouseStore("AuctionHouse.db2", &AuctionHouseLoadInfo::Instance)
@ MoneyEarnedFromAuctions
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::system_clock::time_point SystemTimePoint
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
std::chrono::hours Hours
Hours shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
#define ASSERT_WITH_SIDE_EFFECTS
#define ASSERT_NOTNULL(pointer)
@ MAX_INSPECTED_ENCHANTMENT_SLOT
@ ITEM_MODIFIER_BATTLE_PET_BREED_DATA
@ ITEM_MODIFIER_BATTLE_PET_SPECIES_ID
@ ITEM_MODIFIER_BATTLE_PET_LEVEL
@ ITEM_CLASS_ITEM_ENHANCEMENT
@ ITEM_CLASS_MISCELLANEOUS
Item * NewItemOrBag(ItemTemplate const *proto)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
@ MAIL_CHECK_MASK_AUCTION_WON
This mail is delivering won auction items.
@ MAIL_CHECK_MASK_COPIED
This mail was copied. Do not allow making a copy of items in mail.
@ MAIL_CHECK_MASK_AUCTION
This mail came from auction house.
std::optional< T > Optional
Optional helper class to wrap optional values within.
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
std::wstring wstrCaseAccentInsensitiveParse(std::wstring_view wstr, LocaleConstant locale)
bool Utf8toWStr(char const *utf8str, size_t csize, wchar_t *wstr, size_t &wsize)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
T CalculatePct(T base, U pct)
void PendingAuctionProcess(Player *player)
static uint64 GetItemAuctionDeposit(Player const *player, Item const *item, Minutes time)
AuctionThrottleResult CheckThrottle(Player const *player, bool addonTainted, AuctionCommand command=AuctionCommand::SellItem)
static std::string BuildAuctionInvoiceMailBody(ObjectGuid guid, uint64 bid, uint64 buyout, uint32 deposit, uint64 consignment, uint32 moneyDelay, uint32 eta)
static std::string BuildAuctionMailSubject(uint32 itemId, AuctionMailType type, uint32 auctionId, uint32 itemCount, uint32 battlePetSpeciesId, ItemContext context, std::vector< int32 > const &bonusListIds)
static uint64 GetCommodityAuctionDeposit(ItemTemplate const *item, Minutes time, uint32 quantity)
static std::string BuildItemAuctionMailSubject(AuctionMailType type, AuctionPosting const *auction)
static std::string BuildAuctionSoldMailBody(ObjectGuid guid, uint64 bid, uint64 buyout, uint32 deposit, uint64 consignment)
TimePoint _playerThrottleObjectsCleanupTime
AuctionHouseObject mGoblinAuctions
uint32 _replicateIdGenerator
AuctionHouseObject * GetAuctionsMap(uint32 factionTemplateId)
std::size_t PendingAuctionCount(Player const *player) const
static std::string BuildAuctionWonMailBody(ObjectGuid guid, uint64 bid, uint64 buyout)
AuctionHouseObject mNeutralAuctions
uint32 GenerateReplicationId()
bool PendingAuctionAdd(Player const *player, uint32 auctionHouseId, uint32 auctionId, uint64 deposit)
AuctionHouseObject mHordeAuctions
AuctionHouseObject mAllianceAuctions
void AddAItem(Item *item)
bool RemoveAItem(ObjectGuid itemGuid, bool deleteItem=false, CharacterDatabaseTransaction *trans=nullptr)
static std::string BuildCommodityAuctionMailSubject(AuctionMailType type, uint32 itemId, uint32 itemCount)
std::unordered_map< ObjectGuid, PlayerThrottleObject > _playerThrottleObjects
AuctionHouseObject * GetAuctionsById(uint32 auctionHouseId)
std::unordered_map< ObjectGuid, PlayerPendingAuctions > _pendingAuctionsByPlayer
static AuctionHouseEntry const * GetAuctionHouseEntry(uint32 factionTemplateId, uint32 *houseId)
std::unordered_map< ObjectGuid, Item * > _itemsByGuid
static AuctionHouseMgr * instance()
void UpdatePendingAuctions()
Item * GetAItem(ObjectGuid itemGuid)
std::map< uint32, AuctionPosting >::node_type RemoveAuction(CharacterDatabaseTransaction trans, AuctionPosting *auction, std::map< uint32, AuctionPosting >::iterator *auctionItr=nullptr)
void SendAuctionWon(AuctionPosting const *auction, Player *bidder, CharacterDatabaseTransaction trans) const
AuctionPosting * GetAuction(uint32 auctionId)
std::unordered_multimap< ObjectGuid, uint32 > _playerBidderAuctions
void AddAuction(CharacterDatabaseTransaction trans, AuctionPosting auction)
std::unordered_map< ObjectGuid, CommodityQuote > _commodityQuotes
void BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult &listBiddedItemsResult, Player const *player, uint32 offset, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts) const
AuctionHouseObject(uint32 auctionHouseId)
std::map< uint32, AuctionPosting > _itemsByAuctionId
std::unordered_multimap< ObjectGuid, uint32 > _playerOwnedAuctions
void SendAuctionRemoved(AuctionPosting const *auction, Player *owner, CharacterDatabaseTransaction trans) const
void SendAuctionSold(AuctionPosting const *auction, Player *owner, CharacterDatabaseTransaction trans) const
uint64 CalculateAuctionHouseCut(uint64 bidAmount) const
void BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult &listOwnedItemsResult, Player const *player, uint32 offset, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts) const
std::map< AuctionsBucketKey, AuctionsBucketData > _buckets
void SendAuctionInvoice(AuctionPosting const *auction, Player *owner, CharacterDatabaseTransaction trans) const
std::unordered_map< ObjectGuid, PlayerReplicateThrottleData > _replicateThrottleMap
uint32 GetAuctionHouseId() const
void BuildListBuckets(WorldPackets::AuctionHouse::AuctionListBucketsResult &listBucketsResult, Player const *player, std::wstring const &name, uint8 minLevel, uint8 maxLevel, EnumFlag< AuctionHouseFilterMask > filters, Optional< AuctionSearchClassFilters > const &classFilters, std::span< uint8 const > knownPetBits, uint8 maxKnownPetLevel, 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)
void SendAuctionCancelledToBidder(AuctionPosting const *auction, CharacterDatabaseTransaction trans) const
void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult &listItemsResult, Player const *player, AuctionsBucketKey const &bucketKey, uint32 offset, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts) const
void CancelCommodityQuote(ObjectGuid guid)
AuctionHouseEntry const * _auctionHouse
CommodityQuote const * CreateCommodityQuote(Player const *player, uint32 itemId, uint32 quantity)
bool BuyCommodity(CharacterDatabaseTransaction trans, Player *player, uint32 itemId, uint32 quantity, Milliseconds delayForNextAction)
void SendAuctionOutbid(AuctionPosting const *auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans) const
void SendAuctionExpired(AuctionPosting const *auction, CharacterDatabaseTransaction trans) const
int64 CompareColumns(AuctionHouseSortOrder column, AuctionPosting const *left, AuctionPosting const *right) const
bool operator()(AuctionPosting const *left, AuctionPosting const *right) const
std::span< WorldPackets::AuctionHouse::AuctionSortDef const > _sorts
Sorter(LocaleConstant locale, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts)
Sorter(LocaleConstant locale, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts)
bool operator()(AuctionsBucketData const *left, AuctionsBucketData const *right) const
int64 CompareColumns(AuctionHouseSortOrder column, AuctionsBucketData const *left, AuctionsBucketData const *right) const
std::span< WorldPackets::AuctionHouse::AuctionSortDef const > _sorts
std::vector< T const * > _items
void AddItem(T const *item)
AuctionsResultBuilder(uint32 offset, LocaleConstant locale, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts, AuctionHouseResultLimits maxResults)
std::span< T const *const > GetResultRange() const
typename T::Sorter Sorter
std::size_t GetTotalCount() const
bool HasMoreResults() const
ObjectGuid const & GetGUID() const
bool HasToy(uint32 itemId) const
std::unordered_set< uint32 > GetAppearanceIds() const
std::pair< bool, bool > HasItemAppearance(uint32 itemModifiedAppearanceId) const
constexpr bool HasFlag(T flag) const
constexpr std::underlying_type_t< T > AsUnderlyingType() const
Class used to access individual fields of database query result.
uint64 GetUInt64() const noexcept
uint32 GetUInt32() const noexcept
uint8 GetUInt8() const noexcept
Item * CloneItem(uint32 count, Player const *player=nullptr) const
ItemTemplate const * GetTemplate() const
uint32 GetSellPrice(Player const *owner, bool forVendor=false) const
BonusData const * GetBonus() const
uint32 GetItemLevel(Player const *owner) const
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field *fields, uint32 entry)
uint32 GetModifier(ItemModifier modifier) const
int32 GetRequiredLevel() const
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0)
MailDraft & AddItem(Item *item)
MailDraft & AddMoney(uint64 money)
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
bool ModifyMoney(int64 amount, bool sendError=true)
void SendDirectMessage(WorldPacket const *data) const
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
WorldSession * GetSession() const
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
bool HasEnoughMoney(uint64 amount) const
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
std::string const & GetName() const
std::vector< AuctionItem > Items
std::vector< BucketInfo > Buckets
AuctionHouseFilterMask Filters
uint32 TotalQuantity
number of items (summing stack counts)
uint32 TotalCount
number of auctions
std::vector< AuctionItem > Items
std::vector< AuctionItem > Items
WorldPacket const * Write() override
AuctionBidderNotification Info
uint32 ChangeNumberGlobal
std::vector< AuctionItem > Items
uint32 ChangeNumberTombstone
uint32 ChangeNumberCursor
WorldPacket const * Write() override
AuctionBidderNotification Info
void SendAuctionClosedNotification(AuctionPosting const *auction, float mailDelay, bool sold)
void SendAuctionCommandResult(uint32 auctionId, AuctionCommand command, AuctionResult errorCode, Milliseconds delayForNextAction, InventoryResult bagResult=InventoryResult(0))
Notifies the client of the result of his last auction operation. It is called when the player bids,...
ObjectGuid GetAccountGUID() const
Minutes GetTimezoneOffset() const
LocaleConstant GetSessionDbcLocale() const
bool HasPermission(uint32 permissionId)
uint32 GetAccountId() const
CollectionMgr * GetCollectionMgr() const
uint32 GetPackedTime() const
@ CONFIG_AUCTION_TAINTED_SEARCH_DELAY
@ CONFIG_MAIL_DELIVERY_DELAY
@ CONFIG_AUCTION_REPLICATE_DELAY
@ CONFIG_AUCTION_SEARCH_DELAY
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION
WowTime const * GetUtcWowTime()
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
TimePoint Now()
Current chrono steady_clock time point.
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
auto MapEqualRange(M &map, typename M::key_type const &key)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
void MultimapErasePair(M &multimap, typename M::key_type const &key, typename M::mapped_type const &value)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
void BuildAuctionItem(WorldPackets::AuctionHouse::AuctionItem *auctionItem, bool alwaysSendItem, bool sendKey, bool censorServerInfo, bool censorBidInfo) const
std::vector< Item * > Items
AuctionsBucketData * Bucket
EnumFlag< AuctionPostingServerFlag > ServerFlags
SystemTimePoint StartTime
uint32 GetTotalItemCount() const
GuidUnorderedSet BidderHistory
uint64 CalculateMinIncrement() const
std::array< std::wstring, TOTAL_LOCALES > FullName
AuctionHouseFilterMask QualityMask
std::array< std::pair< uint32, uint32 >, 4 > ItemModifiedAppearanceId
void BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo *bucketInfo, Player const *player) const
std::vector< AuctionPosting * > Auctions
std::array< uint32, MAX_ITEM_QUALITY > QualityCounts
uint16 SuffixItemNameDescriptionId
static AuctionsBucketKey ForCommodity(ItemTemplate const *itemTemplate)
static AuctionsBucketKey ForItem(Item const *item)
AuctionsBucketKey()=default
static std::size_t Hash(AuctionsBucketKey const &key)
uint16 BattlePetSpeciesId
uint32 GetRequiredSkillRank() const
uint32 GetBaseItemLevel() const
uint32 GetContainerSlots() const
uint32 GetMaxStackSize() const
InventoryType GetInventoryType() const
std::vector< ItemEffectEntry const * > Effects
int32 GetBaseRequiredLevel() const
uint32 GetSubClass() const
uint32 GetSellPrice() const
uint8 GetRequiredExpansion() const
constexpr void UpdateData(std::span< V, Extent > data) noexcept
UpdateField< int32, 0, 1 > ItemID
void Initialize(int32 auctionHouseId, ::AuctionPosting const *auction, ::Item const *item)
Optional< uint64 > BuyoutPrice
Optional< uint64 > UnitPrice
Optional< uint64 > BidAmount
std::vector< Item::ItemGemData > Gems
Optional< uint64 > MinIncrement
Optional< WorldPackets::AuctionHouse::AuctionBucketKey > AuctionBucketKey
std::vector< Item::ItemEnchantData > Enchantments
Optional< uint64 > MinBid
ObjectGuid OwnerAccountID
Optional< ObjectGuid > Bidder
bool CensorServerSideInfo
Optional< Item::ItemInstance > Item
Optional< ObjectGuid > Creator
bool ContainsOnlyCollectedAppearances
Optional< uint8 > BattlePetBreedID
Optional< uint32 > BattlePetLevelMask
Optional< uint8 > MaxBattlePetLevel
Optional< uint8 > MaxBattlePetQuality
std::vector< int32 > ItemModifiedAppearanceIDs
void Initialize(::Item const *item)