56 TC_LOG_DEBUG(
"auctionHouse",
"Auctionhouse search {}, searchedname: {}, levelmin: {}, levelmax: {}, filters: {}",
68 classFilters.emplace();
72 if (!classFilter.SubClassFilters.empty())
74 for (
auto const& subClassFilter : classFilter.SubClassFilters)
78 classFilters->Classes[classFilter.ItemClass].SubclassMask |= 1 << subClassFilter.ItemSubclass;
80 classFilters->Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask;
107 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionCancelCommoditiesPurchase - {} not found or you can't interact with him.",
129 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionConfirmCommoditiesPurchase - {} not found or you can't interact with him.", confirmCommoditiesPurchase.
Auctioneer.
ToString());
144 if (GetPlayer() && GetPlayer()->GetGUID() == buyerGuid)
148 GetPlayer()->UpdateCriteria(CriteriaType::AuctionsWon, 1);
149 SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::Ok, throttle.DelayUntilNext);
152 SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::CommodityPurchaseFailed, throttle.DelayUntilNext);
167 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionStartCommoditiesPurchase - {} not found or you can't interact with him.",
182 commodityQuoteResult.
TotalPrice = quote->TotalPrice;
183 commodityQuoteResult.
Quantity = quote->Quantity;
198 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionHelloOpcode - Unit ({}) not found or you can't interact with him.", hello.
Guid.
ToString());
218 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListBidderItems - {} not found or you can't interact with him.", listBiddedItems.
Auctioneer.
ToString());
245 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListBucketsByBucketKeys - {} not found or you can't interact with him.",
274 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListItemsByBucketKey - {} not found or you can't interact with him.", listItemsByBucketKey.
Auctioneer.
ToString());
304 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListItemsByItemID - {} not found or you can't interact with him.", listItemsByItemID.
Auctioneer.
ToString());
335 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListOwnerItems - {} not found or you can't interact with him.", listOwnedItems.
Auctioneer.
ToString());
395 bool canBid = auction->
MinBid != 0;
406 if (canBid && placeBid.
BidAmount < minBid)
442 std::map<uint32, AuctionPosting>::node_type removedAuctionNode = auctionHouse->
RemoveAuction(trans, auction);
444 auctionHouse->
SendAuctionSold(&removedAuctionNode.mapped(),
nullptr, trans);
445 auctionHouse->
SendAuctionWon(&removedAuctionNode.mapped(), player, trans);
467 owner->GetSession()->SendAuctionOwnerBidNotification(auction);
474 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
478 GetPlayer()->UpdateCriteria(CriteriaType::HighestAuctionBid, bidAmount);
479 SendAuctionCommandResult(auctionId, AuctionCommand::PlaceBid, AuctionResult::Ok, throttle.DelayUntilNext);
482 SendAuctionCommandResult(auctionId, AuctionCommand::PlaceBid, AuctionResult::DatabaseError, throttle.DelayUntilNext);
530 TC_LOG_ERROR(
"entities.player.cheat",
"CHEATER : {} tried to cancel auction (id: {}) of another player or auction is NULL", player->
GetGUID().
ToString(), removeItem.
AuctionID);
541 [
this, auctionIdForClient, auctionPlayerGuid =
_player->
GetGUID(), throttle](
bool success)
543 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
546 SendAuctionCommandResult(auctionIdForClient, AuctionCommand::Cancel, AuctionResult::Ok, throttle.DelayUntilNext);
548 SendAuctionCommandResult(0, AuctionCommand::Cancel, AuctionResult::DatabaseError, throttle.DelayUntilNext);
585 if (favoriteAuctionResult)
587 favoriteItems.
Items.reserve(favoriteAuctionResult->GetRowCount());
591 Field* fields = favoriteAuctionResult->Fetch();
600 }
while (favoriteAuctionResult->NextRow());
636 if (!auctionHouseEntry)
658 std::unordered_map<ObjectGuid, std::pair<Item*, uint64>> items2;
685 item->
GetCount() < itemForSale.UseCount)
691 std::pair<Item*, uint64>& soldItem = items2[item->
GetGUID()];
692 soldItem.first = item;
693 soldItem.second += itemForSale.UseCount;
694 if (item->
GetCount() < soldItem.second)
701 totalCount += itemForSale.UseCount;
722 auction.
Id = auctionId;
731 std::unordered_map<
Item* , std::unique_ptr<Item> > clones;
732 for (std::pair<
ObjectGuid const, std::pair<Item*, uint64>>& it : items2)
735 if (it.second.first->GetCount() != it.second.second)
740 TC_LOG_ERROR(
"network",
"CMSG_AUCTION_SELL_COMMODITY: Could not create clone of item {}", it.second.first->GetEntry());
745 clones.emplace(it.second.first, itemForSale);
755 TC_LOG_INFO(
"network",
"CMSG_AUCTION_SELL_COMMODITY: {} {} is selling item {} {} to auctioneer {} with count {} with with unit price {} and with time {} (in sec) in auctionhouse {}",
759 std::stringstream ss;
760 auto itr = items2.begin();
761 ss << (itr++)->first.ToString();
762 for (; itr != items2.end(); ++itr)
763 ss <<
',' << itr->first.ToString();
770 Item* logItem = items2.begin()->second.first;
771 sLog->OutCommand(
GetAccountId(),
"GM {} (Account: {}) create auction: {} (Entry: {} Count: {})",
777 for (std::pair<
ObjectGuid const, std::pair<Item*, uint64>>
const& it : items2)
779 Item* itemForSale = it.second.first;
780 auto cloneItr = clones.find(it.second.first);
781 if (cloneItr != clones.end())
783 Item* original = itemForSale;
789 itemForSale = cloneItr->second.release();
798 auction.
Items.push_back(itemForSale);
801 auctionHouse->
AddAuction(trans, std::move(auction));
806 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
810 GetPlayer()->UpdateCriteria(CriteriaType::ItemsPostedAtAuction, 1);
811 SendAuctionCommandResult(auctionId, AuctionCommand::SellItem, AuctionResult::Ok, throttle.DelayUntilNext);
814 SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
825 if (sellItem.
Items.size() != 1 || sellItem.
Items[0].UseCount != 1)
860 if (!auctionHouseEntry)
915 auction.
Id = auctionId;
927 sLog->OutCommand(
GetAccountId(),
"GM {} (Account: {}) create auction: {} (Entry: {} Count: {})",
931 auction.
Items.push_back(item);
933 TC_LOG_INFO(
"network",
"CMSG_AUCTION_SELL_ITEM: {} {} is selling item {} {} to auctioneer {} with count {} with initial bid {} with buyout {} and with time {} (in sec) in auctionhouse {}",
950 auctionHouse->
AddAuction(trans, std::move(auction));
954 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
958 GetPlayer()->UpdateCriteria(CriteriaType::ItemsPostedAtAuction, 1);
959 SendAuctionCommandResult(auctionId, AuctionCommand::SellItem, AuctionResult::Ok, throttle.DelayUntilNext);
962 SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
1020 auctionCommandResult.
AuctionID = auctionId;
uint32 constexpr MIN_AUCTION_TIME
@ CHAR_DEL_CHARACTER_FAVORITE_AUCTION
@ CHAR_SEL_CHARACTER_FAVORITE_AUCTIONS
@ CHAR_INS_AUCTION_BIDDER
@ CHAR_INS_CHARACTER_FAVORITE_AUCTION
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
@ EQUIP_ERR_TOO_MUCH_GOLD
#define MAX_ITEM_SUBCLASS_TOTAL
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
constexpr uint64 MAX_MONEY_AMOUNT
@ UNIT_NPC_FLAG_AUCTIONEER
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)
T & AddCallback(T &&query)
static uint64 GetItemAuctionDeposit(Player const *player, Item const *item, Minutes time)
static uint64 GetCommodityAuctionDeposit(ItemTemplate const *item, Minutes time, uint32 quantity)
static AuctionHouseEntry const * GetAuctionHouseEntry(uint32 factionTemplateId, uint32 *houseId)
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)
void AddAuction(CharacterDatabaseTransaction trans, AuctionPosting auction)
void BuildListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItemsResult &listBiddedItemsResult, Player const *player, uint32 offset, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts) const
void SendAuctionRemoved(AuctionPosting const *auction, Player *owner, CharacterDatabaseTransaction trans) const
void SendAuctionSold(AuctionPosting const *auction, Player *owner, CharacterDatabaseTransaction trans) const
void BuildListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItemsResult &listOwnedItemsResult, Player const *player, uint32 offset, std::span< WorldPackets::AuctionHouse::AuctionSortDef const > sorts) const
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)
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
ObjectGuid const & GetGUID() const
constexpr std::underlying_type_t< T > AsUnderlyingType() const
Class used to access individual fields of database query result.
uint32 GetUInt32() const noexcept
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Item * CloneItem(uint32 count, Player const *player=nullptr) const
bool CanBeTraded(bool mail=false, bool trade=false) const
void SetCount(uint32 value)
ItemTemplate const * GetTemplate() const
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
std::string GetNameForLocaleIdx(LocaleConstant locale) const override
bool IsNotEmptyBag() const
LowType GetCounter() const
std::string ToString() const
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
bool ModifyMoney(int64 amount, bool sendError=true)
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, NPCFlags npcFlags, NPCFlags2 npcFlags2) const
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Item * GetItemByGuid(ObjectGuid guid) const
std::unique_ptr< PlayerMenu > PlayerTalkClass
bool HasEnoughMoney(uint64 amount) const
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
void AfterComplete(std::function< void(bool)> callback) &
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
uint32 GetFaction() const override
std::string const & GetName() const
std::vector< uint8 > KnownPets
Array< AuctionSortDef, 2 > Sorts
Optional< Addon::AddOnInfo > TaintedBy
Array< AuctionListFilterClass, 7 > ItemClassFilters
AuctionHouseFilterMask Filters
Optional< Addon::AddOnInfo > TaintedBy
WorldPacket const * Write() override
AuctionOwnerNotification Info
int32 BagResult
the bid error. Possible values are AuctionError
int32 ErrorCode
the error code that was generated when trying to perform the action. Possible values are AuctionError
int32 AuctionID
the id of the auction that triggered this notification
WorldPacket const * Write() override
int32 Command
the type of action that triggered this notification. Possible values are AuctionAction
Optional< Addon::AddOnInfo > TaintedBy
std::vector< AuctionFavoriteInfo > Items
WorldPacket const * Write() override
Optional< uint32 > Quantity
WorldPacket const * Write() override
Optional< uint64 > TotalPrice
Optional< Duration< Milliseconds > > QuoteDuration
Optional< Addon::AddOnInfo > TaintedBy
WorldPacket const * Write() override
WorldPacket const * Write() override
Array< AuctionSortDef, 2 > Sorts
Optional< Addon::AddOnInfo > TaintedBy
Optional< Addon::AddOnInfo > TaintedBy
Array< AuctionSortDef, 2 > Sorts
Array< AuctionBucketKey, 100 > BucketKeys
AuctionHouseBrowseMode BrowseMode
WorldPacket const * Write() override
Optional< Addon::AddOnInfo > TaintedBy
AuctionBucketKey BucketKey
Array< AuctionSortDef, 2 > Sorts
Array< AuctionSortDef, 2 > Sorts
Optional< Addon::AddOnInfo > TaintedBy
AuctionBucketKey BucketKey
WorldPacket const * Write() override
AuctionHouseListType ListType
WorldPacket const * Write() override
Optional< Addon::AddOnInfo > TaintedBy
Array< AuctionSortDef, 2 > Sorts
AuctionOwnerNotification Info
WorldPacket const * Write() override
Optional< Addon::AddOnInfo > TaintedBy
Optional< Addon::AddOnInfo > TaintedBy
uint32 ChangeNumberTombstone
uint32 ChangeNumberCursor
uint32 ChangeNumberGlobal
WorldPacket const * Write() override
Array< AuctionItemForSale, 64 > Items
Optional< Addon::AddOnInfo > TaintedBy
Array< AuctionItemForSale, 1 > Items
Optional< Addon::AddOnInfo > TaintedBy
void HandleAuctionConfirmCommoditiesPurchase(WorldPackets::AuctionHouse::AuctionConfirmCommoditiesPurchase &confirmCommoditiesPurchase)
void SendAuctionClosedNotification(AuctionPosting const *auction, float mailDelay, bool sold)
void HandleAuctionListItemsByBucketKey(WorldPackets::AuctionHouse::AuctionListItemsByBucketKey &listItemsByBucketKey)
char const * GetTrinityString(uint32 entry) const
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,...
void SendNotification(char const *format,...) ATTR_PRINTF(2
void HandleAuctionRemoveItem(WorldPackets::AuctionHouse::AuctionRemoveItem &removeItem)
void HandleAuctionSetFavoriteItem(WorldPackets::AuctionHouse::AuctionSetFavoriteItem &setFavoriteItem)
void HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSellItem &sellItem)
ObjectGuid GetAccountGUID() const
void HandleAuctionReplicateItems(WorldPackets::AuctionHouse::AuctionReplicateItems &replicateItems)
void HandleAuctionCancelCommoditiesPurchase(WorldPackets::AuctionHouse::AuctionCancelCommoditiesPurchase &cancelCommoditiesPurchase)
Player * GetPlayer() const
void HandleAuctionListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItems &listBiddedItems)
void SendAuctionFavoriteList()
void HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlaceBid &placeBid)
void HandleAuctionListItemsByItemID(WorldPackets::AuctionHouse::AuctionListItemsByItemID &listItemsByItemID)
QueryCallbackProcessor & GetQueryProcessor()
TransactionCallback & AddTransactionCallback(TransactionCallback &&callback)
bool HasPermission(uint32 permissionId)
void HandleAuctionSellCommodity(WorldPackets::AuctionHouse::AuctionSellCommodity &sellCommodity)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetAccountId() const
void HandleAuctionBrowseQuery(WorldPackets::AuctionHouse::AuctionBrowseQuery &browseQuery)
void SendAuctionHello(ObjectGuid guid, Unit const *unit)
void HandleAuctionGetCommodityQuote(WorldPackets::AuctionHouse::AuctionGetCommodityQuote &startCommoditiesPurchase)
void HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionHelloRequest &hello)
void HandleAuctionListBucketsByBucketKeys(WorldPackets::AuctionHouse::AuctionListBucketsByBucketKeys &listBucketsByBucketKeys)
void SendAuctionOwnerBidNotification(AuctionPosting const *auction)
std::string const & GetPlayerName() const
void HandleAuctionListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItems &listOwnedItems)
@ CONFIG_AUCTION_LEVEL_REQ
@ CONFIG_AUCTION_SEARCH_DELAY
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
TimePoint Now()
Current chrono steady_clock time point.
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
std::vector< Item * > Items
static uint64 CalculateMinIncrement(uint64 bidAmount)
EnumFlag< AuctionPostingServerFlag > ServerFlags
SystemTimePoint StartTime
GuidUnorderedSet BidderHistory
Milliseconds DelayUntilNext
static AuctionsBucketKey ForItem(Item const *item)
uint32 GetMaxStackSize() const
bool HasFlag(ItemFlags flag) const
char const * GetDefaultLocaleName() const
uint32 BattlePetSpeciesID
uint32 SuffixItemNameDescriptionID
void Initialize(::AuctionPosting const *auction)