48 for (ItemMap::iterator itr =
mAitems.begin(); itr !=
mAitems.end(); ++itr)
80 switch(auctionHouseId)
96 uint32 timeHr = (((time / 60) / 60) / 12);
100 deposit *= timeHr * count;
103 while (i > 0 && (remainderbase * i) !=
uint32(remainderbase * i))
107 deposit += remainderbase * i * timeHr;
111 TC_LOG_DEBUG(
"auctionHouse",
"Multiplier: {}", multiplier);
113 TC_LOG_DEBUG(
"auctionHouse",
"Deposit rm: {}", remainderbase * count);
129 ObjectGuid bidderGuid = ObjectGuid::Create<HighGuid::Player>(auction->
bidder);
132 std::string bidderName;
138 bidderName = bidder->
GetName();
142 bidderAccId =
sCharacterCache->GetCharacterAccountIdByGuid(bidderGuid);
144 if (logGmTrade && !
sCharacterCache->GetCharacterNameByGuid(bidderGuid, bidderName))
150 ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
151 std::string ownerName;
157 sLog->OutCommand(bidderAccId,
"GM {} (Account: {}) won item in auction: {} (Entry: {} Count: {}) and pay money: {}. Original owner {} (Account: {})",
192 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
213 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
244 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
267 ObjectGuid oldBidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->
bidder);
270 uint32 oldBidder_accId = 0;
272 oldBidder_accId =
sCharacterCache->GetCharacterAccountIdByGuid(oldBidder_guid);
277 if (oldBidder && newBidder)
289 ObjectGuid bidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->
bidder);
294 bidder_accId =
sCharacterCache->GetCharacterAccountIdByGuid(bidder_guid);
313 for (ItemMap::iterator itr =
mAitems.begin(); itr !=
mAitems.end(); ++itr)
325 TC_LOG_INFO(
"server.loading",
">> Loaded 0 auction items. DB table `auctionhouse` or `item_instance` is empty!");
334 Field* fields = result->Fetch();
342 TC_LOG_ERROR(
"misc",
"AuctionHouseMgr::LoadAuctionItems: Unknown item (GUID: {} item entry: #{}) in auction, skipped.", item_guid, itemEntry);
356 while (result->NextRow());
371 TC_LOG_INFO(
"server.loading",
">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
377 std::unordered_map<uint32, std::unordered_set<ObjectGuid>> biddersByAuction;
385 Field* fields = resultBidders->Fetch();
386 biddersByAuction[fields[0].
GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt32()));
389 while (resultBidders->NextRow());
397 Field* fields = resultAuctions->Fetch();
407 auto it = biddersByAuction.find(aItem->
Id);
408 if (it != biddersByAuction.end())
409 aItem->
bidders = std::move(it->second);
413 }
while (resultAuctions->NextRow());
428 ItemMap::iterator i =
mAitems.find(
id);
436 i->second->SaveToDB(*trans);
449 thisAH = itr->second.first;
454 totalDeposit += thisAuction->deposit;
457 totalDeposit += aEntry->
deposit;
467 thisAH->push_back(aEntry);
475 return itr->second.first->size();
489 auto itrAH = thisAH->begin();
490 for (; itrAH != thisAH->end(); ++itrAH)
500 if (itrAH != thisAH->end())
511 }
while (itrAH != thisAH->end());
543 TC_LOG_WARN(
"auctionHouse",
"Player {} was offline, unable to retrieve deposit!", playerGUID.
ToString());
547 for (
auto AHitr = thisAH->begin(); AHitr != thisAH->end();)
607 bool wasInMap =
AuctionsMap.erase(auction->
Id) ? true :
false;
628 if (itr->second <= curTime)
648 if (!auction->
bidder && auction->
bid == 0)
650 sAuctionMgr->SendAuctionExpiredMail(auction, trans);
659 sAuctionMgr->SendAuctionSuccessfulMail(auction, trans);
661 sScriptMgr->OnAuctionSuccessful(
this, auction);
682 if (itr->second->BuildAuctionInfo(data))
718 if (getall && throttleTime <= curTime)
755 if (itemClass != 0xffffffff && proto->
GetClass() != itemClass)
758 if (itemSubClass != 0xffffffff && proto->
GetSubClass() != itemSubClass)
761 if (inventoryType != 0xffffffff && proto->
GetInventoryType() != inventoryType)
768 if (quality != 0xffffffff && proto->
GetQuality() != quality)
779 if (!wsearchedname.empty())
801 std::array<char const*, 16>
const* suffix =
nullptr;
807 suffix = &itemRandSuffix->
Name;
813 suffix = &itemRandProp->
Name;
822 name += (*suffix)[locdbc_idx >= 0 ? locdbc_idx :
LOCALE_enUS];
832 if (count < 50 && totalcount >= listfrom)
879 return std::max(cut, 0);
886 return outbid ? outbid : 1;
#define sAuctionBotConfig
@ AUCTION_CANCELLED_TO_BIDDER
@ AUCTION_ENTRY_FLAG_NONE
@ AUCTION_ENTRY_FLAG_GM_LOG_BUYER
#define MAX_GETALL_RETURN
Item * NewItemOrBag(ItemTemplate const *proto)
@ CHAR_SEL_AUCTION_BIDDERS
@ CHAR_DEL_AUCTION_BIDDERS
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS
@ ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
DBCStorage< ItemRandomPropertiesEntry > sItemRandomPropertiesStore(ItemRandomPropertiesfmt)
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
DBCStorage< AuctionHouseEntry > sAuctionHouseStore(AuctionHouseEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::seconds Seconds
Seconds shorthand typedef.
#define ASSERT_WITH_SIDE_EFFECTS
@ MAX_INSPECTED_ENCHANTMENT_SLOT
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ MAIL_CHECK_MASK_AUCTION_WON
This mail is delivering won auction items.
@ MAIL_CHECK_MASK_COPIED
This mail was copied. Do not allow making a copy of items in mail.
@ MAIL_CHECK_MASK_AUCTION
This mail came from auction house.
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
bool Utf8FitTo(std::string_view str, std::wstring_view search)
T CalculatePct(T base, U pct)
void PendingAuctionProcess(Player *player)
void SendAuctionExpiredMail(AuctionEntry *auction, CharacterDatabaseTransaction trans)
bool RemoveAItem(ObjectGuid::LowType id, bool deleteItem=false, CharacterDatabaseTransaction *trans=nullptr)
AuctionHouseObject * GetAuctionsMapByHouseId(uint8 auctionHouseId)
static AuctionHouseEntry const * GetAuctionHouseEntry(uint32 factionTemplateId)
std::pair< PlayerAuctions *, uint32 > AuctionPair
void SendAuctionSuccessfulMail(AuctionEntry *auction, CharacterDatabaseTransaction trans)
static AuctionHouseEntry const * GetAuctionHouseEntryFromHouse(uint8 houseId)
void SendAuctionWonMail(AuctionEntry *auction, CharacterDatabaseTransaction trans)
static uint32 GetAuctionDeposit(AuctionHouseEntry const *entry, uint32 time, Item *pItem, uint32 count)
void SendAuctionOutbiddedMail(AuctionEntry *auction, uint32 newPrice, Player *newBidder, CharacterDatabaseTransaction trans)
void SendAuctionSalePendingMail(AuctionEntry *auction, CharacterDatabaseTransaction trans)
AuctionHouseObject * GetAuctionsMap(uint32 factionTemplateId)
AuctionHouseObject mNeutralAuctions
std::vector< AuctionEntry * > PlayerAuctions
std::map< ObjectGuid, AuctionPair > pendingAuctionMap
AuctionHouseObject mHordeAuctions
AuctionHouseObject mAllianceAuctions
Item * GetAItem(ObjectGuid::LowType id)
void AddAItem(Item *item)
void SendAuctionCancelledToBidderMail(AuctionEntry *auction, CharacterDatabaseTransaction trans, Item *item)
bool PendingAuctionAdd(Player *player, AuctionEntry *aEntry)
uint32 PendingAuctionCount(Player const *player) const
static AuctionHouseMgr * instance()
void UpdatePendingAuctions()
void BuildListBidderItems(WorldPacket &data, Player *player, uint32 &count, uint32 &totalcount)
PlayerGetAllThrottleMap GetAllThrottleMap
AuctionEntryMap AuctionsMap
void AddAuction(AuctionEntry *auction)
void BuildListAuctionItems(WorldPacket &data, Player *player, std::wstring const &searchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, uint8 usable, uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32 &count, uint32 &totalcount, bool getall=false)
void BuildListOwnerItems(WorldPacket &data, Player *player, uint32 &count, uint32 &totalcount)
bool RemoveAuction(AuctionEntry *auction)
Class used to access individual fields of database query result.
std::string const & GetNameForLocaleIdx(LocaleConstant locale) const override
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
uint32 GetEnchantmentId(EnchantmentSlot slot) const
int32 GetSpellCharges(uint8 index=0) const
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
int32 GetItemRandomPropertyId() const
ItemTemplate const * GetTemplate() const
uint32 GetItemSuffixFactor() const
uint32 GetSellPrice(bool forVendor=false) const
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
MailDraft & AddMoney(uint32 money)
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0)
MailDraft & AddItem(Item *item)
LowType GetCounter() const
static ObjectGuid const Empty
uint64 GetRawValue() const
std::string ToString() const
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
uint32 GetUInt32Value(uint16 index) const
static ObjectGuid GetGUID(Object const *o)
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
bool ModifyMoney(int32 amount, bool sendError=true)
WorldSession * GetSession() const
bool HasEnoughMoney(uint32 amount) const
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
void setUInt32(uint8 index, uint32 value)
void setUInt8(uint8 index, uint8 value)
std::string const & GetName() const
LocaleConstant GetSessionDbLocaleIndex() const
void SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId)
Minutes GetTimezoneOffset() const
LocaleConstant GetSessionDbcLocale() const
void SendAuctionOwnerNotification(AuctionEntry *auction)
uint32 GetAccountId() const
void SendAuctionBidderNotification(uint32 location, uint32 auctionId, ObjectGuid bidder, uint32 bidSum, uint32 diff, uint32 item_template)
uint32 GetPackedTime() const
@ CONFIG_AUCTION_GETALL_DELAY
@ CONFIG_MAIL_DELIVERY_DELAY
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION
WowTime const * GetUtcWowTime()
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
ObjectGuid::LowType bidder
static std::string BuildAuctionInvoiceMailBody(ObjectGuid guid, uint32 bid, uint32 buyout, uint32 deposit, uint32 consignment, uint32 moneyDelay, uint32 eta)
uint32 GetAuctionOutBid() const
the sum of outbid is (1% from current bid)*5, if bid is very small, it is 1c
void DeleteFromDB(CharacterDatabaseTransaction trans) const
AuctionHouseEntry const * auctionHouseEntry
std::unordered_set< ObjectGuid > bidders
void SaveToDB(CharacterDatabaseTransaction trans) const
ObjectGuid::LowType owner
std::string BuildAuctionMailSubject(MailAuctionAnswers response) const
uint32 GetAuctionCut() const
static std::string BuildAuctionWonMailBody(ObjectGuid guid, uint32 bid, uint32 buyout)
bool LoadFromDB(Field *fields)
ObjectGuid::LowType itemGUIDLow
static std::string BuildAuctionSoldMailBody(ObjectGuid guid, uint32 bid, uint32 buyout, uint32 deposit, uint32 consignment)
bool BuildAuctionInfo(WorldPacket &data, Item *sourceItem=nullptr) const
std::array< char const *, 16 > Name
std::array< char const *, 16 > Name
std::string const & GetDefaultLocaleName() const
uint32 GetQuality() const
int32 GetRequiredLevel() const
uint32 GetSubClass() const
::InventoryType GetInventoryType() const