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))
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));
358 _items.insert(where, item);
391 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
392 delete itemPair.second;
420 switch (auctionHouseId)
465 ItemContext context, std::vector<int32>
const& bonusListIds)
468 itemId,
AsUnderlyingType(type), auctionId, itemCount, battlePetSpeciesId, context, bonusListIds.size(), fmt::join(bonusListIds,
":"));
493 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
494 delete itemPair.second;
501 std::unordered_map<uint32, std::vector<Item*>> itemsByAuction;
502 std::unordered_map<uint32, GuidUnorderedSet> biddersByAuction;
508 Field* fields = result->Fetch();
516 TC_LOG_ERROR(
"misc",
"AuctionHouseMgr::LoadAuctionItems: Unknown item (GUID: {} item entry: #{}) in auction, skipped.", itemGuid, itemEntry);
521 if (!item->
LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[52].
GetUInt64()), fields, itemEntry))
527 itemsByAuction[auctionId].push_back(item);
530 }
while (result->NextRow());
543 Field* fields = result->Fetch();
544 biddersByAuction[fields[0].
GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64()));
546 }
while (result->NextRow());
560 Field* fields = result->Fetch();
568 TC_LOG_ERROR(
"misc",
"Auction {} has wrong auctionHouseId {}", auction.
Id, auctionHouseId);
575 auto itemsItr = itemsByAuction.find(auction.
Id);
576 if (itemsItr == itemsByAuction.end())
585 auction.
Items = std::move(itemsItr->second);
586 auction.
Owner = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64());
588 if (
uint64 bidder = fields[3].GetUInt64())
589 auction.
Bidder = ObjectGuid::Create<HighGuid::Player>(bidder);
595 auction.
StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64());
596 auction.
EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64());
599 auto biddersItr = biddersByAuction.find(auction.
Id);
600 if (biddersItr != biddersByAuction.end())
603 auctionHouse->
AddAuction(
nullptr, std::move(auction));
606 }
while (result->NextRow());
630 i->second->SaveToDB(*trans);
645 totalDeposit += thisAuction.Deposit;
648 totalDeposit += deposit;
656 itr->second.Auctions.push_back({ auctionId, auctionHouseId, deposit });
664 return itr->second.Auctions.size();
676 auto itrAH = iterMap->second.Auctions.begin();
677 for (; itrAH != iterMap->second.Auctions.end(); ++itrAH)
682 totaldeposit += itrAH->Deposit;
686 if (itrAH != iterMap->second.Auctions.end())
701 }
while (itrAH != iterMap->second.Auctions.end());
731 TC_LOG_WARN(
"auctionHouse",
"Player {} was offline, unable to retrieve deposit!", playerGUID.
ToString());
741 stmt->
setUInt32(1, pendingAuction.AuctionId);
762 if (itr->second.PeriodEnd < now)
781 if (itr.second || now > itr.first->second.PeriodEnd)
783 itr.first->second.PeriodEnd = now +
Minutes(1);
784 itr.first->second.QueriesRemaining = 100;
787 if (!itr.first->second.QueriesRemaining)
793 if (!--itr.first->second.QueriesRemaining)
794 return { std::chrono::duration_cast<Milliseconds>(itr.first->second.PeriodEnd - now),
false };
808 switch (factionTemplateId)
810 case 120: houseid = 7;
break;
811 case 474: houseid = 7;
break;
812 case 855: houseid = 7;
break;
854 auto [bucketItr, isNew] =
_buckets.try_emplace(key);
898 std::wstring utf16name;
899 if (!
Utf8toWStr(auction.
Items[0]->GetNameForLocaleIdx(locale), utf16name))
908 if (!bucket->
MinPrice || priceToDisplay < bucket->MinPrice)
913 auto itr = std::ranges::find(bucket->
ItemModifiedAppearanceId, itemModifiedAppearance->ID, Trinity::TupleElement<0>);
920 itr->first = itemModifiedAppearance->ID;
929 quality = auction.
Items[0]->GetQuality();
962 stmt->
setInt64(9, std::chrono::system_clock::to_time_t(auction.
EndTime));
970 stmt->
setUInt64(1, item->GetGUID().GetCounter());
987 bucket->
Auctions.insert(std::ranges::lower_bound(bucket->
Auctions, addedAuction, std::cref(insertSorter)), addedAuction);
993 std::map<uint32, AuctionPosting>::iterator* auctionItr )
997 std::erase(bucket->
Auctions, auction);
1002 if (bucket->
MinPrice == priceToDisplay)
1004 bucket->
MinPrice = std::numeric_limits<uint64>::max();
1006 bucket->
MinPrice = std::min(bucket->
MinPrice, remainingAuction->BuyoutOrUnitPrice ? remainingAuction->BuyoutOrUnitPrice : remainingAuction->BidAmount);
1012 [itemModifiedAppearance](std::pair<uint32, uint32>
const& appearance)
1014 return appearance.first == itemModifiedAppearance->ID;
1026 quality = auction->
Items[0]->GetQuality();
1035 for (
Item* item : remainingAuction->Items)
1053 auction->
Bucket =
nullptr;
1059 trans->Append(stmt);
1085 if (itr->second.NextAllowedReplication <= curTimeSteady)
1093 if (itr->second.ValidTo < curTimeSteady)
1108 if (auction->
EndTime > curTime + 1min)
1114 std::map<uint32, AuctionPosting>::node_type removedAuctionNode =
RemoveAuction(trans, auction, &it);
1115 auction = &removedAuctionNode.mapped();
1126 sScriptMgr->OnAuctionSuccessful(
this, auction);
1141 std::span<uint8 const> knownPetBits,
uint8 maxKnownPetLevel,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1143 std::unordered_set<uint32> knownAppearanceIds;
1144 boost::dynamic_bitset<uint8> knownPetSpecies;
1149 knownPetSpecies.resize(std::max(knownPetSpecies.size() * 32, std::size_t(
sBattlePetSpeciesStore.GetNumRows())));
1150 boost::from_block_range(knownPetBits.begin(), knownPetBits.end(), knownPetSpecies);
1155 for (std::pair<AuctionsBucketKey const, AuctionsBucketData>
const& bucket :
_buckets)
1208 if (!knownAppearanceIds.contains(itemModifiedAppearance->ItemAppearanceID))
1220 else if (bucket.first.BattlePetSpeciesId)
1222 if (knownPetSpecies.test(bucket.first.BattlePetSpeciesId))
1226 else if (
sDB2Manager.IsToyItem(bucket.first.ItemId))
1237 if (itemTemplate->
Effects.size() >= 2 && (itemTemplate->
Effects[0]->SpellID == 483 || itemTemplate->
Effects[0]->SpellID == 55884))
1243 if (knownPetSpecies.test(battlePetSpecies->ID))
1279 listBucketsResult.
Buckets.emplace_back();
1281 resultBucket->BuildBucketInfo(&bucketInfo, player);
1288 std::span<WorldPackets::AuctionHouse::AuctionBucketKey const> keys,
1289 std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1291 std::vector<AuctionsBucketData const*> buckets;
1292 buckets.reserve(keys.size());
1297 buckets.push_back(&bucketItr->second);
1301 std::ranges::sort(buckets, std::cref(sorter));
1305 listBucketsResult.
Buckets.emplace_back();
1307 resultBucket->BuildBucketInfo(&bucketInfo, player);
1314 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1317 std::vector<AuctionPosting const*> auctions;
1320 auctions.push_back(auction);
1323 std::ranges::sort(auctions, std::cref(sorter));
1327 listBiddedItemsResult.
Items.emplace_back();
1329 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
true,
false);
1336 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1346 for (
Item* item : auction->Items)
1347 listItemsResult.
TotalCount += item->GetCount();
1352 listItemsResult.
Items.emplace_back();
1354 resultAuction->BuildAuctionItem(&auctionItem,
false,
false, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1355 resultAuction->Bidder.
IsEmpty());
1363 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1369 while (itr != end && itr->first.ItemId == itemId)
1374 for (
Item* item : auction->Items)
1375 listItemsResult.
TotalCount += item->GetCount();
1383 listItemsResult.
Items.emplace_back();
1385 resultAuction->BuildAuctionItem(&auctionItem,
false,
true, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1386 resultAuction->Bidder.
IsEmpty());
1393 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1396 std::vector<AuctionPosting const*> auctions;
1399 auctions.push_back(auction);
1402 std::ranges::sort(auctions, std::cref(sorter));
1406 listOwnedItemsResult.
Items.emplace_back();
1408 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
false,
false);
1422 if (throttleItr->second.Global != global || throttleItr->second.Cursor != cursor || throttleItr->second.Tombstone != tombstone)
1425 if (!throttleItr->second.IsReplicationInProgress() && throttleItr->second.NextAllowedReplication > curTime)
1432 throttleItr->second.Global =
sAuctionMgr->GenerateReplicationId();
1443 replicateResponse.
Items.emplace_back();
1451 replicateResponse.
ChangeNumberCursor = throttleItr->second.Cursor = !replicateResponse.
Items.empty() ? replicateResponse.
Items.back().AuctionID : 0;
1471 uint32 remainingQuantity = quantity;
1477 for (
Item* auctionItem : auction->Items)
1479 if (auctionItem->GetCount() >= remainingQuantity)
1481 totalPrice += auction->BuyoutOrUnitPrice * remainingQuantity;
1482 remainingQuantity = 0;
1486 totalPrice += auction->BuyoutOrUnitPrice * auctionItem->GetCount();
1487 remainingQuantity -= auctionItem->GetCount();
1492 if (remainingQuantity)
1531 uint32 remainingQuantity = quantity;
1532 std::vector<AuctionPosting*> auctions;
1533 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1539 auctions.push_back(auction);
1540 for (
Item* auctionItem : auction->
Items)
1542 if (auctionItem->GetCount() >= remainingQuantity)
1545 remainingQuantity = 0;
1546 auctionItr = bucketItr->second.Auctions.end();
1551 remainingQuantity -= auctionItem->GetCount();
1556 if (remainingQuantity)
1564 if (totalPrice > quote.mapped().TotalPrice)
1579 struct MailedItemsBatch
1581 std::array<Item*, MAX_MAIL_ITEMS>
Items = { };
1585 std::size_t ItemsCount = 0;
1587 bool IsFull()
const {
return ItemsCount >=
Items.size(); }
1590 Items[ItemsCount++] = item;
1592 TotalPrice += unitPrice * item->
GetCount();
1596 std::vector<MailedItemsBatch> items;
1597 items.emplace_back();
1599 remainingQuantity = quantity;
1600 std::vector<std::size_t> removedItemsFromAuction;
1602 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1609 uniqueSeller = auction->
Owner;
1610 else if (*uniqueSeller != auction->
Owner)
1613 uint32 boughtFromAuction = 0;
1614 std::size_t removedItems = 0;
1615 for (
Item* auctionItem : auction->
Items)
1617 MailedItemsBatch* itemsBatch = &items.back();
1618 if (itemsBatch->IsFull())
1620 items.emplace_back();
1621 itemsBatch = &items.back();
1624 if (auctionItem->GetCount() > remainingQuantity)
1626 Item* clonedItem = auctionItem->
CloneItem(remainingQuantity, player);
1633 auctionItem->SetCount(auctionItem->GetCount() - remainingQuantity);
1635 auctionItem->SaveToDB(trans);
1637 boughtFromAuction += remainingQuantity;
1638 remainingQuantity = 0;
1639 auctionItr = bucketItr->second.Auctions.end();
1644 boughtFromAuction += auctionItem->GetCount();
1645 remainingQuantity -= auctionItem->GetCount();
1649 removedItemsFromAuction.push_back(removedItems);
1654 std::string ownerName;
1658 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) bought commodity in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1659 player->
GetName(), bidderAccId, items[0].Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1660 items[0].Items[0]->GetEntry(), boughtFromAuction, auction->
BuyoutOrUnitPrice * boughtFromAuction, ownerName,
1685 for (MailedItemsBatch
const& batch : items)
1690 for (std::size_t i = 0; i < batch.ItemsCount; ++i)
1693 stmt->
setUInt64(0, batch.Items[i]->GetGUID().GetCounter());
1694 trans->Append(stmt);
1696 batch.Items[i]->SetOwnerGUID(player->
GetGUID());
1697 batch.Items[i]->SaveToDB(trans);
1708 for (std::size_t i = 0; i < auctions.size(); ++i)
1710 if (removedItemsFromAuction[i] == auctions[i]->
Items.size())
1712 else if (removedItemsFromAuction[i])
1714 auto lastRemovedItem = auctions[i]->Items.begin() + removedItemsFromAuction[i];
1715 for (
auto itr = auctions[i]->
Items.begin(); itr != lastRemovedItem; ++itr)
1718 auctions[i]->Items.erase(auctions[i]->
Items.begin(), lastRemovedItem);
1757 std::string bidderName;
1763 bidderName = bidder->
GetName();
1775 std::string ownerName;
1781 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) won item in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1782 bidderName, bidderAccId, auction->
Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1798 stmt->
setUInt64(1, item->GetGUID().GetCounter());
1799 trans->Append(stmt);
1822 item->SaveToDB(trans);
1864 auto itemItr = auction->
Items.begin();
1865 while (itemItr != auction->
Items.end())
1869 for (std::size_t i = 0; i <
MAX_MAIL_ITEMS && itemItr != auction->
Items.end(); ++i, ++itemItr)
1881 item->SaveToDB(trans);
1888 auto itemItr = auction->
Items.begin();
1889 while (itemItr != auction->
Items.end())
1893 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_COPIED
This mail was returned. Do not allow returning mail back again.
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
bool HasMoreResults() const
ObjectGuid const & GetGUID() const
static BattlePetSpeciesEntry const * GetBattlePetSpeciesBySpell(uint32 spellId)
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
BonusData const * GetBonus() const
uint32 GetItemLevel(Player const *owner) const
uint32 GetSellPrice(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 HasSpell(uint32 spell) const override
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
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)