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: {})",
191 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
212 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
243 ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->
owner);
266 ObjectGuid oldBidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->
bidder);
269 uint32 oldBidder_accId = 0;
271 oldBidder_accId =
sCharacterCache->GetCharacterAccountIdByGuid(oldBidder_guid);
276 if (oldBidder && newBidder)
288 ObjectGuid bidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->
bidder);
293 bidder_accId =
sCharacterCache->GetCharacterAccountIdByGuid(bidder_guid);
312 for (ItemMap::iterator itr =
mAitems.begin(); itr !=
mAitems.end(); ++itr)
324 TC_LOG_INFO(
"server.loading",
">> Loaded 0 auction items. DB table `auctionhouse` or `item_instance` is empty!");
333 Field* fields = result->Fetch();
341 TC_LOG_ERROR(
"misc",
"AuctionHouseMgr::LoadAuctionItems: Unknown item (GUID: {} item entry: #{}) in auction, skipped.", item_guid, itemEntry);
355 while (result->NextRow());
370 TC_LOG_INFO(
"server.loading",
">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
376 std::unordered_map<uint32, std::unordered_set<ObjectGuid>> biddersByAuction;
384 Field* fields = resultBidders->Fetch();
385 biddersByAuction[fields[0].
GetUInt32()].insert(ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt32()));
388 while (resultBidders->NextRow());
396 Field* fields = resultAuctions->Fetch();
406 auto it = biddersByAuction.find(aItem->
Id);
407 if (it != biddersByAuction.end())
408 aItem->
bidders = std::move(it->second);
412 }
while (resultAuctions->NextRow());
427 ItemMap::iterator i =
mAitems.find(
id);
435 i->second->SaveToDB(*trans);
448 thisAH = itr->second.first;
453 totalDeposit += thisAuction->deposit;
456 totalDeposit += aEntry->
deposit;
466 thisAH->push_back(aEntry);
474 return itr->second.first->size();
488 auto itrAH = thisAH->begin();
489 for (; itrAH != thisAH->end(); ++itrAH)
499 if (itrAH != thisAH->end())
510 }
while (itrAH != thisAH->end());
542 TC_LOG_WARN(
"auctionHouse",
"Player {} was offline, unable to retrieve deposit!", playerGUID.
ToString());
546 for (
auto AHitr = thisAH->begin(); AHitr != thisAH->end();)
606 bool wasInMap =
AuctionsMap.erase(auction->
Id) ? true :
false;
627 if (itr->second <= curTime)
647 if (!auction->
bidder && auction->
bid == 0)
649 sAuctionMgr->SendAuctionExpiredMail(auction, trans);
658 sAuctionMgr->SendAuctionSuccessfulMail(auction, trans);
660 sScriptMgr->OnAuctionSuccessful(
this, auction);
681 if (itr->second->BuildAuctionInfo(data))
717 if (getall && throttleTime <= curTime)
754 if (itemClass != 0xffffffff && proto->
Class != itemClass)
757 if (itemSubClass != 0xffffffff && proto->
SubClass != itemSubClass)
760 if (inventoryType != 0xffffffff && proto->
InventoryType != inventoryType)
767 if (quality != 0xffffffff && proto->
Quality != quality)
778 if (!wsearchedname.empty())
780 std::string name = proto->
Name1;
800 std::array<char const*, 16>
const* suffix =
nullptr;
806 suffix = &itemRandSuffix->
Name;
812 suffix = &itemRandProp->
Name;
821 name += (*suffix)[locdbc_idx >= 0 ? locdbc_idx :
LOCALE_enUS];
831 if (count < 50 && totalcount >= listfrom)
878 return std::max(cut, 0);
885 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_COPIED
This mail was returned. Do not allow returning mail back again.
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.
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 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, size_t 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