AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MailDraft Class Reference

#include "Mail.h"

Public Member Functions

 MailDraft (uint16 mailTemplateId, bool need_items=true)
 
 MailDraft (std::string subject, std::string body)
 
uint16 GetMailTemplateId () const
 
std::string const & GetSubject () const
 
uint32 GetMoney () const
 
uint32 GetCOD () const
 
std::string const & GetBody () const
 
MailDraftAddItem (Item *item)
 
MailDraftAddMoney (uint32 money)
 
MailDraftAddCOD (uint32 COD)
 
void SendReturnToSender (uint32 sender_acc, ObjectGuid::LowType sender_guid, ObjectGuid::LowType receiver_guid, CharacterDatabaseTransaction trans)
 
void SendMailTo (CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
 

Private Types

typedef std::map< ObjectGuid, Item * > MailItemMap
 

Private Member Functions

void deleteIncludedItems (CharacterDatabaseTransaction trans, bool inDB=false)
 
void prepareItems (Player *receiver, CharacterDatabaseTransaction trans)
 

Private Attributes

uint16 m_mailTemplateId
 
bool m_mailTemplateItemsNeed
 
std::string m_subject
 
std::string m_body
 
MailItemMap m_items
 
uint32 m_money
 
uint32 m_COD
 

Detailed Description

Member Typedef Documentation

◆ MailItemMap

typedef std::map<ObjectGuid, Item*> MailDraft::MailItemMap
private

Constructor & Destructor Documentation

◆ MailDraft() [1/2]

MailDraft::MailDraft ( uint16  mailTemplateId,
bool  need_items = true 
)
inlineexplicit
125 : m_mailTemplateId(mailTemplateId), m_mailTemplateItemsNeed(need_items), m_money(0), m_COD(0)
126 {}
uint32 m_COD
Definition: Mail.h:157
uint32 m_money
Definition: Mail.h:156
uint16 m_mailTemplateId
Definition: Mail.h:149
bool m_mailTemplateItemsNeed
Definition: Mail.h:150

◆ MailDraft() [2/2]

MailDraft::MailDraft ( std::string  subject,
std::string  body 
)
inline
128 : m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(std::move(subject)), m_body(std::move(body)), m_money(0), m_COD(0) {}
std::string m_subject
Definition: Mail.h:151
std::string m_body
Definition: Mail.h:152

Member Function Documentation

◆ AddCOD()

MailDraft & MailDraft::AddCOD ( uint32  COD)
inline
139{ m_COD = COD; return *this; }

References m_COD.

Referenced by WorldSession::HandleSendMail().

◆ AddItem()

◆ AddMoney()

◆ deleteIncludedItems()

void MailDraft::deleteIncludedItems ( CharacterDatabaseTransaction  trans,
bool  inDB = false 
)
private
134{
135 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
136 {
137 Item* item = mailItemIter->second;
138
139 if (inDB)
140 {
142 stmt->SetData(0, item->GetGUID().GetCounter());
143 trans->Append(stmt);
144 }
145
146 delete item;
147 }
148
149 m_items.clear();
150}
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
@ CHAR_DEL_ITEM_INSTANCE
Definition: CharacterDatabase.h:127
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78
Definition: Item.h:214
LowType GetCounter() const
Definition: ObjectGuid.h:147

References CHAR_DEL_ITEM_INSTANCE, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_items, and PreparedStatementBase::SetData().

Referenced by SendMailTo(), and SendReturnToSender().

◆ GetBody()

std::string const & MailDraft::GetBody ( ) const
inline
134{ return m_body; }

References m_body.

Referenced by SendMailTo().

◆ GetCOD()

uint32 MailDraft::GetCOD ( ) const
inline
133{ return m_COD; }

References m_COD.

Referenced by SendMailTo().

◆ GetMailTemplateId()

uint16 MailDraft::GetMailTemplateId ( ) const
inline
130{ return m_mailTemplateId; }

References m_mailTemplateId.

Referenced by SendMailTo().

◆ GetMoney()

uint32 MailDraft::GetMoney ( ) const
inline
132{ return m_money; }

References m_money.

Referenced by SendMailTo().

◆ GetSubject()

std::string const & MailDraft::GetSubject ( ) const
inline
131{ return m_subject; }

References m_subject.

Referenced by SendMailTo().

◆ prepareItems()

void MailDraft::prepareItems ( Player receiver,
CharacterDatabaseTransaction  trans 
)
private
101{
103 return;
104
106
107 // The mail sent after turning in the quest The Wrath of Neptulon contains 100g
108 // Only quest in the game up to BFA which sends raw gold through mail. So would just be overkill to introduce a new column in the database.
109 if (m_mailTemplateId == 123)
110 {
111 m_money = 1000000;
112 }
113
114 Loot mailLoot;
115
116 // can be empty
117 mailLoot.FillLoot(m_mailTemplateId, LootTemplates_Mail, receiver, true, true);
118
119 uint32 max_slot = mailLoot.GetMaxSlotInLootFor(receiver);
120 for (uint32 i = 0; m_items.size() < MAX_MAIL_ITEMS && i < max_slot; ++i)
121 {
122 if (LootItem* lootitem = mailLoot.LootItemInSlot(i, receiver))
123 {
124 if (Item* item = Item::CreateItem(lootitem->itemid, lootitem->count, receiver))
125 {
126 item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
127 AddItem(item);
128 }
129 }
130 }
131}
std::uint32_t uint32
Definition: Define.h:108
LootStore LootTemplates_Mail("mail_loot_template", "mail template id", false)
#define MAX_MAIL_ITEMS
Definition: Mail.h:34
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1089
Definition: LootMgr.h:155
Definition: LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition: LootMgr.cpp:893
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition: LootMgr.cpp:828
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:553
MailDraft & AddItem(Item *item)
Definition: Mail.cpp:94

References AddItem(), Item::CreateItem(), Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), Loot::LootItemInSlot(), LootTemplates_Mail, m_items, m_mailTemplateId, m_mailTemplateItemsNeed, m_money, and MAX_MAIL_ITEMS.

Referenced by SendMailTo().

◆ SendMailTo()

void MailDraft::SendMailTo ( CharacterDatabaseTransaction  trans,
MailReceiver const &  receiver,
MailSender const &  sender,
MailCheckMask  checked = MAIL_CHECK_MASK_NONE,
uint32  deliver_delay = 0,
uint32  custom_expiration = 0,
bool  deleteMailItemsFromDB = false,
bool  sendMail = true 
)
187{
188 sScriptMgr->OnBeforeMailDraftSendMailTo(this, receiver, sender, checked, deliver_delay, custom_expiration, deleteMailItemsFromDB, sendMail);
189
190 if (deleteMailItemsFromDB) // can be changed in the hook
191 deleteIncludedItems(trans, true);
192
193 if (!sendMail) // can be changed in the hook
194 return;
195
196 Player* pReceiver = receiver.GetPlayer(); // can be nullptr
197
198 if (pReceiver)
199 prepareItems(pReceiver, trans); // generate mail template items
200
201 uint32 mailId = sObjectMgr->GenerateMailID();
202
203 time_t deliver_time = GameTime::GetGameTime().count() + deliver_delay;
204
205 //expire time if COD 3 days, if no COD 30 days, if auction sale pending 1 hour
206 uint32 expire_delay;
207
208 // auction mail without any items and money
209 if (sender.GetMailMessageType() == MAIL_AUCTION && m_items.empty() && !m_money)
210 expire_delay = sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY);
211 // mail from battlemaster (rewardmarks) should last only one day
212 else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattlegroundMgr->GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE)
213 expire_delay = DAY;
214 // default case: expire time if COD 3 days, if no COD 30 days (or 90 days if sender is a game master)
215 else if (m_COD)
216 expire_delay = 3 * DAY;
217 else if (custom_expiration > 0)
218 expire_delay = custom_expiration * DAY;
219 else
220 {
221 Player* pSender = ObjectAccessor::FindPlayerByLowGUID(sender.GetSenderId());
222 expire_delay = pSender && pSender->GetSession()->GetSecurity() ? 90 * DAY : 30 * DAY;
223 }
224
225 time_t expire_time = deliver_time + expire_delay;
226
227 // Add to DB
228 uint8 index = 0;
230 stmt->SetData( index, mailId);
231 stmt->SetData(++index, uint8(sender.GetMailMessageType()));
232 stmt->SetData(++index, int8(sender.GetStationery()));
233 stmt->SetData(++index, GetMailTemplateId());
234 stmt->SetData(++index, sender.GetSenderId());
235 stmt->SetData(++index, receiver.GetPlayerGUIDLow());
236 stmt->SetData(++index, GetSubject());
237 stmt->SetData(++index, GetBody());
238 stmt->SetData(++index, !m_items.empty());
239 stmt->SetData(++index, uint32(expire_time));
240 stmt->SetData(++index, uint32(deliver_time));
241 stmt->SetData(++index, m_money);
242 stmt->SetData(++index, m_COD);
243 stmt->SetData(++index, uint8(checked));
244 trans->Append(stmt);
245
246 for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
247 {
248 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_MAIL_ITEM);
249 stmt->SetData(0, mailId);
250 stmt->SetData(1, mailItemIter->second->GetGUID().GetCounter());
251 stmt->SetData(2, receiver.GetPlayerGUIDLow());
252 trans->Append(stmt);
253 }
254
255 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, receiver.GetPlayerGUIDLow()));
256
257 // For online receiver update in game mail status and data
258 if (pReceiver)
259 {
260 pReceiver->AddNewMailDeliverTime(deliver_time);
261
262 Mail* m = new Mail;
263 m->messageID = mailId;
265 m->subject = GetSubject();
266 m->body = GetBody();
267 m->money = GetMoney();
268 m->COD = GetCOD();
269
270 for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
271 {
272 Item* item = mailItemIter->second;
273 m->AddItem(item->GetGUID().GetCounter(), item->GetEntry());
274 }
275
276 m->messageType = sender.GetMailMessageType();
277 m->stationery = sender.GetStationery();
278 m->sender = sender.GetSenderId();
279 m->receiver = receiver.GetPlayerGUIDLow();
280 m->expire_time = expire_time;
281 m->deliver_time = deliver_time;
282 m->checked = checked;
284
285 pReceiver->AddMail(m); // to insert new mail to beginning of maillist
286
287 if (!m_items.empty())
288 {
289 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
290 {
291 pReceiver->AddMItem(mailItemIter->second);
292 }
293 }
294 }
295 else if (!m_items.empty())
296 {
298 }
299}
constexpr auto DAY
Definition: Common.h:58
std::uint8_t uint8
Definition: Define.h:110
std::int8_t int8
Definition: Define.h:106
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
@ CHAR_INS_MAIL_ITEM
Definition: CharacterDatabase.h:111
@ CHAR_INS_MAIL
Definition: CharacterDatabase.h:109
#define sBattlegroundMgr
Definition: BattlegroundMgr.h:188
#define sCharacterCache
Definition: CharacterCache.h:83
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ MAIL_STATE_UNCHANGED
Definition: Mail.h:69
@ MAIL_AUCTION
Definition: Mail.h:39
@ MAIL_CREATURE
Definition: Mail.h:40
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ CONFIG_MAIL_DELIVERY_DELAY
Definition: IWorld.h:261
@ BATTLEGROUND_TYPE_NONE
Definition: SharedDefines.h:3452
#define sWorld
Definition: World.h:451
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:256
Seconds GetGameTime()
Definition: GameTime.cpp:38
uint32 GetEntry() const
Definition: Object.h:109
Definition: ObjectGuid.h:120
Definition: Player.h:1046
void AddNewMailDeliverTime(time_t deliver_time)
Definition: Player.cpp:2836
void AddMItem(Item *it)
Definition: Player.h:1632
WorldSession * GetSession() const
Definition: Player.h:1948
void AddMail(Mail *mail)
Definition: Player.h:1607
void deleteIncludedItems(CharacterDatabaseTransaction trans, bool inDB=false)
Definition: Mail.cpp:133
uint32 GetCOD() const
Definition: Mail.h:133
uint32 GetMoney() const
Definition: Mail.h:132
std::string const & GetSubject() const
Definition: Mail.h:131
uint16 GetMailTemplateId() const
Definition: Mail.h:130
void prepareItems(Player *receiver, CharacterDatabaseTransaction trans)
Definition: Mail.cpp:100
std::string const & GetBody() const
Definition: Mail.h:134
Definition: Mail.h:168
ObjectGuid::LowType receiver
Definition: Mail.h:174
uint8 messageType
Definition: Mail.h:170
uint32 messageID
Definition: Mail.h:169
time_t expire_time
Definition: Mail.h:179
uint32 sender
Definition: Mail.h:173
uint8 stationery
Definition: Mail.h:171
std::string subject
Definition: Mail.h:175
std::string body
Definition: Mail.h:176
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition: Mail.h:186
time_t deliver_time
Definition: Mail.h:180
uint32 COD
Definition: Mail.h:182
uint32 checked
Definition: Mail.h:183
MailState state
Definition: Mail.h:184
uint32 money
Definition: Mail.h:181
uint16 mailTemplateId
Definition: Mail.h:172
AccountTypes GetSecurity() const
Definition: WorldSession.h:358

References Mail::AddItem(), Player::AddMail(), Player::AddMItem(), Player::AddNewMailDeliverTime(), BATTLEGROUND_TYPE_NONE, Mail::body, CHAR_INS_MAIL, CHAR_INS_MAIL_ITEM, CharacterDatabase, Mail::checked, Mail::COD, CONFIG_MAIL_DELIVERY_DELAY, DAY, deleteIncludedItems(), Mail::deliver_time, Mail::expire_time, ObjectAccessor::FindPlayerByLowGUID(), GetBody(), GetCOD(), ObjectGuid::GetCounter(), Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), MailSender::GetMailMessageType(), GetMailTemplateId(), GetMoney(), MailReceiver::GetPlayer(), MailReceiver::GetPlayerGUIDLow(), WorldSession::GetSecurity(), MailSender::GetSenderId(), Player::GetSession(), MailSender::GetStationery(), GetSubject(), m_COD, m_items, m_money, MAIL_AUCTION, MAIL_CREATURE, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, prepareItems(), Mail::receiver, sBattlegroundMgr, sCharacterCache, Mail::sender, PreparedStatementBase::SetData(), sObjectMgr, sScriptMgr, Mail::state, Mail::stationery, Mail::subject, and sWorld.

Referenced by Player::_LoadBrewOfTheMonth(), Player::_LoadInventory(), Player::AutoUnequipOffhandIfNeed(), AchievementMgr::CompletedAchievement(), Player::GiveLevel(), WorldSession::HandleAuctionRemoveItem(), item_commandscript::HandleItemRefundCommand(), item_commandscript::HandleItemRestoreCommand(), WorldSession::HandleMailTakeItem(), quest_commandscript::HandleQuestComplete(), quest_commandscript::HandleQuestReward(), send_commandscript::HandleSendItemsCommand(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMailCommand(), send_commandscript::HandleSendMoneyCommand(), CalendarMgr::RemoveEvent(), Player::RewardQuest(), AuctionHouseMgr::SendAuctionCancelledToBidderMail(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSalePendingMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), Player::SendItemRetrievalMail(), npc_minigob_manabonk::npc_minigob_manabonkAI::SendMailToPlayer(), SendReturnToSender(), and ObjectMgr::SendServerMail().

◆ SendReturnToSender()

void MailDraft::SendReturnToSender ( uint32  sender_acc,
ObjectGuid::LowType  sender_guid,
ObjectGuid::LowType  receiver_guid,
CharacterDatabaseTransaction  trans 
)
153{
154 Player* receiver = ObjectAccessor::FindPlayerByLowGUID(receiver_guid);
155
156 if (!receiver && !sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, receiver_guid)))
157 {
158 deleteIncludedItems(trans, true);
159 return;
160 }
161
162 if (!m_items.empty())
163 {
164 // if item send to character at another account, then apply item delivery delay
165 //needItemDelay = sender_acc != rc_account;
166
167 // set owner to new receiver (to prevent delete item with sender char deleting)
168 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
169 {
170 Item* item = mailItemIter->second;
171 item->SaveToDB(trans); // item not in inventory and can be save standalone
172 // owner in data will set at mail receive and item extracting
174 stmt->SetData(0, receiver_guid);
175 stmt->SetData(1, item->GetGUID().GetCounter());
176 trans->Append(stmt);
177 }
178 }
179
180 // xinef: WowWiki: "Return mail arrives immediately."
181
182 // will delete item or place to receiver mail list
183 SendMailTo(trans, MailReceiver(receiver, receiver_guid), MailSender(MAIL_NORMAL, sender_guid), MAIL_CHECK_MASK_RETURNED, 0);
184}
@ CHAR_UPD_ITEM_OWNER
Definition: CharacterDatabase.h:118
@ MAIL_CHECK_MASK_RETURNED
Definition: Mail.h:49
@ MAIL_NORMAL
Definition: Mail.h:38
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:338
Definition: Mail.h:84
Definition: Mail.h:106
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition: Mail.cpp:186

References CHAR_UPD_ITEM_OWNER, CharacterDatabase, deleteIncludedItems(), ObjectAccessor::FindPlayerByLowGUID(), ObjectGuid::GetCounter(), Object::GetGUID(), m_items, MAIL_CHECK_MASK_RETURNED, MAIL_NORMAL, Item::SaveToDB(), sCharacterCache, SendMailTo(), and PreparedStatementBase::SetData().

Referenced by Player::DeleteFromDB(), and WorldSession::HandleMailReturnToSender().

Member Data Documentation

◆ m_body

std::string MailDraft::m_body
private

Referenced by GetBody().

◆ m_COD

uint32 MailDraft::m_COD
private

Referenced by AddCOD(), GetCOD(), and SendMailTo().

◆ m_items

◆ m_mailTemplateId

uint16 MailDraft::m_mailTemplateId
private

Referenced by GetMailTemplateId(), and prepareItems().

◆ m_mailTemplateItemsNeed

bool MailDraft::m_mailTemplateItemsNeed
private

Referenced by prepareItems().

◆ m_money

uint32 MailDraft::m_money
private

◆ m_subject

std::string MailDraft::m_subject
private

Referenced by GetSubject().