55 TC_LOG_DEBUG(
"auctionHouse",
"Auctionhouse search {}, searchedname: {}, levelmin: {}, levelmax: {}, filters: {}",
67 classFilters.emplace();
71 if (!classFilter.SubClassFilters.empty())
73 for (
auto const& subClassFilter : classFilter.SubClassFilters)
77 classFilters->Classes[classFilter.ItemClass].SubclassMask |= 1 << subClassFilter.ItemSubclass;
79 classFilters->Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask;
106 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionCancelCommoditiesPurchase - {} not found or you can't interact with him.",
128 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionConfirmCommoditiesPurchase - {} not found or you can't interact with him.", confirmCommoditiesPurchase.
Auctioneer.
ToString());
143 if (GetPlayer() && GetPlayer()->GetGUID() == buyerGuid)
147 GetPlayer()->UpdateCriteria(CriteriaType::AuctionsWon, 1);
148 SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::Ok, throttle.DelayUntilNext);
151 SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::CommodityPurchaseFailed, throttle.DelayUntilNext);
166 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionStartCommoditiesPurchase - {} not found or you can't interact with him.",
181 commodityQuoteResult.
TotalPrice = quote->TotalPrice;
182 commodityQuoteResult.
Quantity = quote->Quantity;
197 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionHelloOpcode - Unit ({}) not found or you can't interact with him.", hello.
Guid.
ToString());
217 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListBidderItems - {} not found or you can't interact with him.", listBiddedItems.
Auctioneer.
ToString());
244 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListBucketsByBucketKeys - {} not found or you can't interact with him.",
273 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListItemsByBucketKey - {} not found or you can't interact with him.", listItemsByBucketKey.
Auctioneer.
ToString());
303 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListItemsByItemID - {} not found or you can't interact with him.", listItemsByItemID.
Auctioneer.
ToString());
334 TC_LOG_DEBUG(
"network",
"WORLD: HandleAuctionListOwnerItems - {} not found or you can't interact with him.", listOwnedItems.
Auctioneer.
ToString());
394 bool canBid = auction->
MinBid != 0;
405 if (canBid && placeBid.
BidAmount < minBid)
466 owner->GetSession()->SendAuctionOwnerBidNotification(auction);
473 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
477 GetPlayer()->UpdateCriteria(CriteriaType::HighestAuctionBid, bidAmount);
478 SendAuctionCommandResult(auctionId, AuctionCommand::PlaceBid, AuctionResult::Ok, throttle.DelayUntilNext);
481 SendAuctionCommandResult(auctionId, AuctionCommand::PlaceBid, AuctionResult::DatabaseError, throttle.DelayUntilNext);
529 TC_LOG_ERROR(
"entities.player.cheat",
"CHEATER : {} tried to cancel auction (id: {}) of another player or auction is NULL", player->
GetGUID().
ToString(), removeItem.
AuctionID);
540 [
this, auctionIdForClient, auctionPlayerGuid =
_player->
GetGUID(), throttle](
bool success)
542 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
545 SendAuctionCommandResult(auctionIdForClient, AuctionCommand::Cancel, AuctionResult::Ok, throttle.DelayUntilNext);
547 SendAuctionCommandResult(0, AuctionCommand::Cancel, AuctionResult::DatabaseError, throttle.DelayUntilNext);
584 if (favoriteAuctionResult)
586 favoriteItems.
Items.reserve(favoriteAuctionResult->GetRowCount());
590 Field* fields = favoriteAuctionResult->Fetch();
592 WorldPackets::AuctionHouse::AuctionFavoriteInfo& item = favoriteItems.Items.emplace_back();
593 item.Order = fields[0].GetUInt32();
594 item.ItemID = fields[1].GetUInt32();
595 item.ItemLevel = fields[2].GetUInt32();
596 item.BattlePetSpeciesID = fields[3].GetUInt32();
597 item.SuffixItemNameDescriptionID = fields[4].GetUInt32();
599 } while (favoriteAuctionResult->NextRow());
635 if (!auctionHouseEntry)
657 std::unordered_map<ObjectGuid, std::pair<Item*, uint64>> items2;
690 std::pair<Item*, uint64>& soldItem = items2[item->
GetGUID()];
691 soldItem.first = item;
692 soldItem.second += itemForSale.
UseCount;
693 if (item->
GetCount() < soldItem.second)
721 auction.
Id = auctionId;
730 std::unordered_map<
Item* , std::unique_ptr<Item> > clones;
731 for (std::pair<
ObjectGuid const, std::pair<Item*, uint64>>& it : items2)
734 if (it.second.first->GetCount() != it.second.second)
739 TC_LOG_ERROR(
"network",
"CMSG_AUCTION_SELL_COMMODITY: Could not create clone of item {}", it.second.first->GetEntry());
744 clones.emplace(it.second.first, itemForSale);
754 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 {}",
758 std::stringstream ss;
759 auto itr = items2.begin();
760 ss << (itr++)->first.ToString();
761 for (; itr != items2.end(); ++itr)
762 ss <<
',' << itr->first.ToString();
769 Item* logItem = items2.begin()->second.first;
770 sLog->OutCommand(
GetAccountId(),
"GM {} (Account: {}) create auction: {} (Entry: {} Count: {})",
776 for (std::pair<
ObjectGuid const, std::pair<Item*, uint64>>
const& it : items2)
778 Item* itemForSale = it.second.first;
779 auto cloneItr = clones.find(it.second.first);
780 if (cloneItr != clones.end())
782 Item* original = itemForSale;
788 itemForSale = cloneItr->second.release();
797 auction.
Items.push_back(itemForSale);
800 auctionHouse->
AddAuction(trans, std::move(auction));
805 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
809 GetPlayer()->UpdateCriteria(CriteriaType::ItemsPostedAtAuction, 1);
810 SendAuctionCommandResult(auctionId, AuctionCommand::SellItem, AuctionResult::Ok, throttle.DelayUntilNext);
813 SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
824 if (sellItem.
Items.size() != 1 || sellItem.
Items[0].UseCount != 1)
859 if (!auctionHouseEntry)
914 auction.
Id = auctionId;
926 sLog->OutCommand(
GetAccountId(),
"GM {} (Account: {}) create auction: {} (Entry: {} Count: {})",
930 auction.
Items.push_back(item);
932 TC_LOG_INFO(
"network",
"CMSG_AuctionAction::SellItem: {} {} is selling item {} {} to auctioneer {} with count {} with initial bid {} with buyout {} and with time {} (in sec) in auctionhouse {}",
949 auctionHouse->
AddAuction(trans, std::move(auction));
953 if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
957 GetPlayer()->UpdateCriteria(CriteriaType::ItemsPostedAtAuction, 1);
958 SendAuctionCommandResult(auctionId, AuctionCommand::SellItem, AuctionResult::Ok, throttle.DelayUntilNext);
961 SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
1008 auctionHelloResponse.
Guid = guid;
1016 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::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
@ EQUIP_ERR_TOO_MUCH_GOLD
#define MAX_ITEM_SUBCLASS_TOTAL
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
uint64 const 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)
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 RemoveAuction(CharacterDatabaseTransaction trans, AuctionPosting *auction, std::map< uint32, AuctionPosting >::iterator *auctionItr=nullptr)
void SendAuctionOutbid(AuctionPosting const *auction, ObjectGuid newBidder, uint64 newBidAmount, CharacterDatabaseTransaction trans) const
constexpr std::underlying_type_t< T > AsUnderlyingType() const
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
std::string GetNameForLocaleIdx(LocaleConstant locale) const override
bool IsNotEmptyBag() const
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
LowType GetCounter() const
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
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
bool HasEnoughMoney(uint64 amount) const
void setUInt8(const uint8 index, const uint8 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt64(const uint8 index, const uint64 value)
QueryCallback && WithPreparedCallback(std::function< void(PreparedQueryResult)> &&callback)
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 SendAuctionHello(ObjectGuid guid, Creature *unit)
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 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 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 HandleAuctionGetCommodityQuote(WorldPackets::AuctionHouse::AuctionGetCommodityQuote &startCommoditiesPurchase)
void HandleAuctionRequestFavoriteList(WorldPackets::AuctionHouse::AuctionRequestFavoriteList &requestFavoriteList)
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)
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,...
@ 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)