41#include <boost/dynamic_bitset.hpp>
52 ItemId(key.ItemID), ItemLevel(key.ItemLevel), BattlePetSpeciesId(key.BattlePetSpeciesID.value_or(0)),
53 SuffixItemNameDescriptionId(key.SuffixItemNameDescriptionID.value_or(0))
59 std::size_t hashVal = 0;
98 for (
Item* item : auction->Items)
105 uint32 breedId = breedData & 0xFFFFFF;
106 uint8 quality =
uint8((breedData >> 24) & 0xFF);
121 if (appearance.first)
132 return Items.size() > 1 ||
Items[0]->GetTemplate()->GetMaxStackSize() > 1;
139 return totalCount + item->GetCount();
144 bool alwaysSendItem,
bool sendKey,
bool censorServerInfo,
bool censorBidInfo)
const
151 auctionItem->
Flags =
Items[0]->m_itemData->DynamicFlags;
160 auctionItem->
Item.emplace();
168 auctionItem->
Item.emplace();
170 auctionItem->
Charges = std::max({
Items[0]->GetSpellCharges(0),
Items[0]->GetSpellCharges(1),
Items[0]->GetSpellCharges(2),
Items[0]->GetSpellCharges(3),
Items[0]->GetSpellCharges(4) });
180 for (
uint8 i = 0; i <
Items[0]->m_itemData->Gems.size(); ++i)
188 auctionItem->
Gems.push_back(gem);
225 if (!
Items[0]->m_itemData->Creator->IsEmpty())
246 return (ordering < 0) == !sort.ReverseSort;
249 return left->
Key < right->
Key;
273 std::span<WorldPackets::AuctionHouse::AuctionSortDef const>
_sorts;
288 return (ordering < 0) == !sort.ReverseSort;
295 return left->
Id > right->
Id;
307 return leftPrice - rightPrice;
319 return leftLevel - rightLevel;
333 std::span<WorldPackets::AuctionHouse::AuctionSortDef const>
_sorts;
352 _items.insert(where, item);
385 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
386 delete itemPair.second;
414 switch (auctionHouseId)
459 ItemContext context, std::vector<int32>
const& bonusListIds)
461 std::ostringstream strm;
468 << battlePetSpeciesId <<
':'
474 << bonusListIds.size();
476 for (
int32 bonusListId : bonusListIds)
477 strm <<
':' << bonusListId;
504 for (std::pair<ObjectGuid const, Item*>& itemPair :
_itemsByGuid)
505 delete itemPair.second;
512 std::unordered_map<uint32, std::vector<Item*>> itemsByAuction;
513 std::unordered_map<uint32, GuidUnorderedSet> biddersByAuction;
519 Field* fields = result->Fetch();
527 TC_LOG_ERROR(
"misc",
"AuctionHouseMgr::LoadAuctionItems: Unknown item (GUID: {} item entry: #{}) in auction, skipped.", itemGuid, itemEntry);
532 if (!item->
LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[51].
GetUInt64()), fields, itemEntry))
538 itemsByAuction[auctionId].push_back(item);
541 }
while (result->NextRow());
554 Field* fields = result->Fetch();
555 biddersByAuction[fields[0].
GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64()));
557 }
while (result->NextRow());
571 Field* fields = result->Fetch();
579 TC_LOG_ERROR(
"misc",
"Auction {} has wrong auctionHouseId {}", auction.
Id, auctionHouseId);
586 auto itemsItr = itemsByAuction.find(auction.
Id);
587 if (itemsItr == itemsByAuction.end())
596 auction.
Items = std::move(itemsItr->second);
597 auction.
Owner = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64());
599 if (
uint64 bidder = fields[3].GetUInt64())
600 auction.
Bidder = ObjectGuid::Create<HighGuid::Player>(bidder);
606 auction.
StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64());
607 auction.
EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64());
610 auto biddersItr = biddersByAuction.find(auction.
Id);
611 if (biddersItr != biddersByAuction.end())
614 auctionHouse->
AddAuction(
nullptr, std::move(auction));
617 }
while (result->NextRow());
642 i->second->SaveToDB(*trans);
657 totalDeposit += thisAuction.
Deposit;
660 totalDeposit += deposit;
668 itr->second.Auctions.push_back({ auctionId, auctionHouseId, deposit });
676 return itr->second.Auctions.size();
688 auto itrAH = iterMap->second.Auctions.begin();
689 for (; itrAH != iterMap->second.Auctions.end(); ++itrAH)
694 totaldeposit += itrAH->Deposit;
698 if (itrAH != iterMap->second.Auctions.end())
713 }
while (itrAH != iterMap->second.Auctions.end());
743 TC_LOG_WARN(
"auctionHouse",
"Player {} was offline, unable to retrieve deposit!", playerGUID.
ToString());
774 if (itr->second.PeriodEnd < now)
793 if (itr.second || now > itr.first->second.PeriodEnd)
795 itr.first->second.PeriodEnd = now +
Minutes(1);
796 itr.first->second.QueriesRemaining = 100;
799 if (!itr.first->second.QueriesRemaining)
805 if (!--itr.first->second.QueriesRemaining)
806 return { std::chrono::duration_cast<Milliseconds>(itr.first->second.PeriodEnd - now),
false };
820 switch (factionTemplateId)
822 case 120: houseid = 7;
break;
823 case 474: houseid = 7;
break;
824 case 855: houseid = 7;
break;
867 auto bucketItr =
_buckets.find(key);
871 bucketItr =
_buckets.emplace(std::piecewise_construct, std::forward_as_tuple(key), std::forward_as_tuple()).first;
872 bucket = &bucketItr->second;
912 std::wstring utf16name;
913 if (!
Utf8toWStr(auction.
Items[0]->GetNameForLocaleIdx(locale), utf16name))
920 bucket = &bucketItr->second;
924 if (!bucket->
MinPrice || priceToDisplay < bucket->MinPrice)
930 [itemModifiedAppearance](std::pair<uint32, uint32>
const& appearance) { return appearance.first == itemModifiedAppearance->ID; });
934 [](std::pair<uint32, uint32>
const& appearance) { return appearance.first == 0; });
938 itr->first = itemModifiedAppearance->ID;
947 quality = auction.
Items[0]->GetQuality();
980 stmt->
setInt64(9, std::chrono::system_clock::to_time_t(auction.
EndTime));
1005 bucket->
Auctions.insert(std::lower_bound(bucket->
Auctions.begin(), bucket->
Auctions.end(), addedAuction, std::cref(insertSorter)), addedAuction);
1007 sScriptMgr->OnAuctionAdd(
this, addedAuction);
1019 if (bucket->
MinPrice == priceToDisplay)
1021 bucket->
MinPrice = std::numeric_limits<uint64>::max();
1029 [itemModifiedAppearance](std::pair<uint32, uint32>
const& appearance)
1031 return appearance.first == itemModifiedAppearance->ID;
1043 quality = auction->
Items[0]->GetQuality();
1052 for (
Item* item : remainingAuction->
Items)
1073 trans->Append(stmt);
1099 if (itr->second.NextAllowedReplication <= curTimeSteady)
1107 if (itr->second.ValidTo < curTimeSteady)
1122 if (auction->
EndTime > curTime + 1min)
1150 sScriptMgr->OnAuctionSuccessful(
this, auction);
1160 std::span<uint8 const> knownPetBits,
uint8 maxKnownPetLevel,
uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1162 std::unordered_set<uint32> knownAppearanceIds;
1163 boost::dynamic_bitset<uint8> knownPetSpecies;
1168 knownPetSpecies.init_from_block_range(knownPetBits.begin(), knownPetBits.end());
1175 for (std::pair<AuctionsBucketKey const, AuctionsBucketData>
const& bucket :
_buckets)
1228 if (knownAppearanceIds.find(itemModifiedAppearance->ItemAppearanceID) == knownAppearanceIds.end())
1240 else if (bucket.first.BattlePetSpeciesId)
1242 if (knownPetSpecies.test(bucket.first.BattlePetSpeciesId))
1246 else if (
sDB2Manager.IsToyItem(bucket.first.ItemId))
1257 if (itemTemplate->
Effects.size() >= 2 && (itemTemplate->
Effects[0]->SpellID == 483 || itemTemplate->
Effects[0]->SpellID == 55884))
1263 if (knownPetSpecies.test(battlePetSpecies->ID))
1292 listBucketsResult.
Buckets.emplace_back();
1294 resultBucket->BuildBucketInfo(&bucketInfo, player);
1301 std::span<WorldPackets::AuctionHouse::AuctionBucketKey const> keys,
1302 std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1304 std::vector<AuctionsBucketData const*> buckets;
1305 buckets.reserve(keys.size());
1310 buckets.push_back(&bucketItr->second);
1314 std::sort(buckets.begin(), buckets.end(), std::cref(sorter));
1318 listBucketsResult.
Buckets.emplace_back();
1320 resultBucket->BuildBucketInfo(&bucketInfo, player);
1327 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1330 std::vector<AuctionPosting const*> auctions;
1333 auctions.push_back(auction);
1336 std::sort(auctions.begin(), auctions.end(), std::cref(sorter));
1340 listBiddedItemsResult.
Items.emplace_back();
1342 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
true,
false);
1349 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1365 listItemsResult.
Items.emplace_back();
1367 resultAuction->BuildAuctionItem(&auctionItem,
false,
false, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1368 resultAuction->Bidder.
IsEmpty());
1376 uint32 offset, std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1396 listItemsResult.
Items.emplace_back();
1398 resultAuction->BuildAuctionItem(&auctionItem,
false,
true, resultAuction->OwnerAccount != player->
GetSession()->
GetAccountGUID(),
1399 resultAuction->Bidder.
IsEmpty());
1406 uint32 , std::span<WorldPackets::AuctionHouse::AuctionSortDef const> sorts)
const
1409 std::vector<AuctionPosting const*> auctions;
1412 auctions.push_back(auction);
1415 std::sort(auctions.begin(), auctions.end(), std::cref(sorter));
1419 listOwnedItemsResult.
Items.emplace_back();
1421 resultAuction->BuildAuctionItem(&auctionItem,
true,
true,
false,
false);
1435 if (throttleItr->second.Global != global || throttleItr->second.Cursor != cursor || throttleItr->second.Tombstone != tombstone)
1438 if (!throttleItr->second.IsReplicationInProgress() && throttleItr->second.NextAllowedReplication > curTime)
1445 throttleItr->second.Global =
sAuctionMgr->GenerateReplicationId();
1456 replicateResponse.
Items.emplace_back();
1464 replicateResponse.
ChangeNumberCursor = throttleItr->second.Cursor = !replicateResponse.
Items.empty() ? replicateResponse.
Items.back().AuctionID : 0;
1484 uint32 remainingQuantity = quantity;
1487 for (
Item* auctionItem : auction->
Items)
1489 if (auctionItem->
GetCount() >= remainingQuantity)
1492 remainingQuantity = 0;
1497 remainingQuantity -= auctionItem->
GetCount();
1502 if (remainingQuantity)
1540 std::shared_ptr<std::nullptr_t> removeQuote(
nullptr, [
this, quote](std::nullptr_t)
1546 uint32 remainingQuantity = quantity;
1547 std::vector<AuctionPosting*> auctions;
1548 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1551 auctions.push_back(auction);
1552 for (
Item* auctionItem : auction->
Items)
1554 if (auctionItem->
GetCount() >= remainingQuantity)
1557 remainingQuantity = 0;
1558 auctionItr = bucketItr->second.Auctions.end();
1563 remainingQuantity -= auctionItem->
GetCount();
1568 if (remainingQuantity)
1576 if (totalPrice > quote->second.TotalPrice)
1591 struct MailedItemsBatch
1593 std::array<Item*, MAX_MAIL_ITEMS>
Items = { };
1597 std::size_t ItemsCount = 0;
1599 bool IsFull()
const {
return ItemsCount >=
Items.size(); }
1602 Items[ItemsCount++] = item;
1604 TotalPrice += unitPrice * item->
GetCount();
1608 std::vector<MailedItemsBatch> items;
1609 items.emplace_back();
1611 remainingQuantity = quantity;
1612 std::vector<std::size_t> removedItemsFromAuction;
1614 for (
auto auctionItr = bucketItr->second.Auctions.begin(); auctionItr != bucketItr->second.Auctions.end();)
1618 uniqueSeller = auction->
Owner;
1619 else if (*uniqueSeller != auction->
Owner)
1622 uint32 boughtFromAuction = 0;
1623 std::size_t removedItems = 0;
1624 for (
Item* auctionItem : auction->
Items)
1626 MailedItemsBatch* itemsBatch = &items.back();
1627 if (itemsBatch->IsFull())
1629 items.emplace_back();
1630 itemsBatch = &items.back();
1633 if (auctionItem->
GetCount() > remainingQuantity)
1635 Item* clonedItem = auctionItem->
CloneItem(remainingQuantity, player);
1646 boughtFromAuction += remainingQuantity;
1647 remainingQuantity = 0;
1648 auctionItr = bucketItr->second.Auctions.end();
1653 boughtFromAuction += auctionItem->
GetCount();
1654 remainingQuantity -= auctionItem->
GetCount();
1658 removedItemsFromAuction.push_back(removedItems);
1663 std::string ownerName;
1667 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) bought commodity in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1668 player->
GetName(), bidderAccId, items[0].Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1669 items[0].Items[0]->GetEntry(), boughtFromAuction, auction->
BuyoutOrUnitPrice * boughtFromAuction, ownerName,
1694 for (MailedItemsBatch
const& batch : items)
1699 for (std::size_t i = 0; i < batch.ItemsCount; ++i)
1702 stmt->
setUInt64(0, batch.Items[i]->GetGUID().GetCounter());
1703 trans->Append(stmt);
1705 batch.Items[i]->SetOwnerGUID(player->
GetGUID());
1706 batch.Items[i]->SaveToDB(trans);
1717 for (std::size_t i = 0; i < auctions.size(); ++i)
1719 if (removedItemsFromAuction[i] == auctions[i]->
Items.size())
1721 else if (removedItemsFromAuction[i])
1723 auto lastRemovedItem = auctions[i]->Items.begin() + removedItemsFromAuction[i];
1724 for (
auto itr = auctions[i]->
Items.begin(); itr != lastRemovedItem; ++itr)
1727 auctions[i]->Items.erase(auctions[i]->
Items.begin(), lastRemovedItem);
1766 std::string bidderName;
1772 bidderName = bidder->
GetName();
1784 std::string ownerName;
1790 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) won item in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
1791 bidderName, bidderAccId, auction->
Items[0]->GetNameForLocaleIdx(
sWorld->GetDefaultDbcLocale()),
1808 trans->Append(stmt);
1870 auto itemItr = auction->
Items.begin();
1871 while (itemItr != auction->
Items.end())
1875 for (std::size_t i = 0; i <
MAX_MAIL_ITEMS && itemItr != auction->
Items.end(); ++i, ++itemItr)
1891 auto itemItr = auction->
Items.begin();
1892 while (itemItr != auction->
Items.end())
1896 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::hours Hours
Hours shorthand typedef.
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
#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_WARN(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ 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)
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 RemoveAuction(CharacterDatabaseTransaction trans, AuctionPosting *auction, std::map< uint32, AuctionPosting >::iterator *auctionItr=nullptr)
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)
Trinity::IteratorPair< typename std::vector< T const * >::const_iterator > GetResultRange() const
typename T::Sorter Sorter
bool HasMoreResults() 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.
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Item * CloneItem(uint32 count, Player const *player=nullptr) const
void SetCount(uint32 value)
ItemTemplate const * GetTemplate() const
BonusData const * GetBonus() const
void FSetState(ItemUpdateState state)
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
static ObjectGuid GetGUID(Object const *o)
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 setUInt8(const uint8 index, const uint8 value)
void setInt64(const uint8 index, const int64 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt64(const uint8 index, const uint64 value)
Utility class to enable range for loop syntax for multimap.equal_range uses.
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)
ObjectGuid GetAccountGUID() const
Minutes GetTimezoneOffset() const
LocaleConstant GetSessionDbcLocale() const
bool HasPermission(uint32 permissionId)
uint32 GetAccountId() const
CollectionMgr * GetCollectionMgr() const
void SendAuctionCommandResult(uint32 auctionId, AuctionCommand command, AuctionResult errorCode, Milliseconds delayForNextAction, InventoryResult bagError=InventoryResult(0))
Notifies the client of the result of his last auction operation. It is called when the player bids,...
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)
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
void MultimapErasePair(M< K, V, Rest... > &multimap, K const &key, V const &value)
void hash_combine(std::size_t &seed, T const &val)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
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
UpdateField< int32, 0, 1 > ItemID
void Initialize(::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< uint8 > MaxBattlePetLevel
Optional< uint8 > MaxBattlePetQuality
std::vector< int32 > ItemModifiedAppearanceIDs
void Initialize(::Item const *item)