84 TC_LOG_INFO(
"network",
"Player {} is sending mail to {} (GUID: non-existing!) with subject {} "
85 "and body {} includes {} items, {} copper and {} COD copper with StationeryID = {}, PackageID = {}",
95 TC_LOG_WARN(
"cheat",
"Player {} attempted to send mail to {} ({}) with negative money value (SendMoney: {})",
103 TC_LOG_WARN(
"cheat",
"Player {} attempted to send mail to {} ({}) with negative COD value (Cod: {})",
108 TC_LOG_INFO(
"network",
"Player {} is sending mail to {} ({}) with subject {} and body {} "
109 "including {} items, {} copper and {} COD copper with StationeryID = {}, PackageID = {}",
113 if (player->
GetGUID() == receiverGuid)
130 auto mailCountCheckContinuation = [
this, player =
_player, receiverGuid, mailInfo = std::move(sendMail.
Info), reqmoney, cost](
uint32 receiverTeam,
uint64 mailsCount,
uint8 receiverLevel,
uint32 receiverAccountId)
mutable
142 if (mailsCount > 100)
149 bool accountBound = !mailInfo.Attachments.empty();
150 for (
auto const& att : mailInfo.Attachments)
157 accountBound =
false;
175 std::vector<Item*> items;
177 for (
auto const& att : mailInfo.Attachments)
179 if (att.ItemGUID.IsEmpty())
225 items.push_back(item);
233 bool needItemDelay =
false;
235 MailDraft draft(mailInfo.Subject, mailInfo.Body);
239 if (!mailInfo.Attachments.empty() || mailInfo.SendMoney > 0)
242 if (!mailInfo.Attachments.empty())
244 for (
Item* item : items)
248 sLog->OutCommand(
GetAccountId(),
"GM {} ({}) (Account: {}) mail item: {} (Entry: {} Count: {}) "
250 item->GetTemplate()->Name1, item->GetEntry(), item->GetCount(),
251 mailInfo.Target, receiverGuid.
ToString(), receiverAccountId);
257 item->DeleteFromInventoryDB(trans);
258 item->SetOwnerGUID(receiverGuid);
260 item->SaveToDB(trans);
269 if (log && mailInfo.SendMoney > 0)
271 sLog->OutCommand(
GetAccountId(),
"GM {} ({}) (Account: {}) mail money: {} to: {} ({}) (Account: {})",
280 if (mailInfo.Attachments.empty())
295 mailCountCheckContinuation(receiver->GetTeam(), receiver->GetMailSize(), receiver->GetLevel(), receiver->GetSession()->GetAccountId());
303 .WithPreparedCallback([continuation = std::move(mailCountCheckContinuation), receiverGuid](
PreparedQueryResult result)
mutable
305 if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(receiverGuid))
306 continuation(Player::TeamForRace(characterInfo->Race), result ? (*result)[0].GetUInt64() : UI64LIT(0), characterInfo->Level, characterInfo->AccountId);
386 for (MailItemInfoVec::iterator itr2 = m->
items.begin(); itr2 != m->
items.end(); ++itr2)
450 std::string sender_name;
454 sender_name = receiver->
GetName();
459 sender_accId =
sCharacterCache->GetCharacterAccountIdByGuid(sender_guid);
461 if (!
sCharacterCache->GetCharacterNameByGuid(sender_guid, sender_name))
464 sLog->OutCommand(
GetAccountId(),
"GM {} (Account: {}) receiver mail item: {} (Entry: {} Count: {}) and send COD money: {} to player: {} (Account: {})",
468 sender_accId =
sCharacterCache->GetCharacterAccountIdByGuid(sender_guid);
471 if (receiver || sender_accId)
584 ASSERT(mailTemplateEntry);
595 TC_LOG_INFO(
"network",
"HandleMailCreateTextItem mailid={}", createTextItem.
MailID);
624 std::set<ObjectGuid::LowType> sentSenders;
632 if (now < m->deliver_time)
636 if (sentSenders.count(m->sender))
639 result.
Next.emplace_back(m);
641 sentSenders.insert(m->sender);
644 if (sentSenders.size() > 2)
@ CHAR_DEL_MAIL_ITEM_BY_ID
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
@ EQUIP_ERR_TOO_MUCH_GOLD
@ EQUIP_ERR_MAIL_BOUND_ITEM
@ EQUIP_ERR_DESTROY_NONEMPTY_BAG
@ EQUIP_ERR_NOT_SAME_ACCOUNT
@ ITEM_FLAG_MAIL_TEXT_MASK
@ ITEM_FLAG_IS_BOUND_TO_ACCOUNT
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ MAIL_CHECK_MASK_HAS_BODY
@ MAIL_CHECK_MASK_COD_PAYMENT
This mail was copied. Do not allow making a copy of items in mail.
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
#define MAIL_BODY_ITEM_TEMPLATE
bool normalizePlayerName(std::string &name)
std::vector< ItemPosCount > ItemPosCountVec
@ GAMEOBJECT_TYPE_MAILBOX
@ MAIL_RETURNED_TO_SENDER
@ MAIL_ERR_NOT_ENOUGH_MONEY
@ MAIL_ERR_CANT_SEND_WRAPPED_COD
@ MAIL_ERR_RECIPIENT_CAP_REACHED
@ MAIL_ERR_RECIPIENT_NOT_FOUND
@ MAIL_ERR_MAIL_ATTACHMENT_INVALID
@ MAIL_ERR_INTERNAL_ERROR
@ MAIL_ERR_CANNOT_SEND_TO_SELF
T & AddCallback(T &&query)
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
void SetText(std::string const &text)
bool IsBoundAccountWide() const
bool CanBeTraded(bool mail=false, bool trade=false) const
ItemTemplate const * GetTemplate() const
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, Player const *owner)
bool IsNotEmptyBag() 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 & AddCOD(uint32 COD)
void SendReturnToSender(uint32 sender_acc, ObjectGuid::LowType sender_guid, ObjectGuid::LowType receiver_guid, CharacterDatabaseTransaction trans)
MailDraft & AddItem(Item *item)
LowType GetCounter() const
std::string ToString() const
bool IsGameObject() const
bool IsAnyTypeCreature() const
uint32 GetUInt32Value(uint16 index) const
void SetFlag(uint16 index, uint32 newFlag)
void SetGuidValue(uint16 index, ObjectGuid value)
static ObjectGuid GetGUID(Object const *o)
void UpdateNextMailTimeAndUnreads()
void SaveGoldToDB(CharacterDatabaseTransaction trans) const
Item * GetMItem(ObjectGuid::LowType id)
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid const &guid) const
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
bool ModifyMoney(int32 amount, bool sendError=true)
void RemoveMail(uint32 id)
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
WorldSession * GetSession() const
PlayerMails const & GetMails() const
bool HasEnoughMoney(uint32 amount) const
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, NPCFlags npcFlags) const
void MoveItemToInventory(ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
void _SaveMail(CharacterDatabaseTransaction trans)
void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0) const
bool RemoveMItem(ObjectGuid::LowType id)
bool IsGameMaster() const
Item * GetItemByGuid(ObjectGuid guid) const
Mail * GetMail(uint32 id)
void setUInt32(uint8 index, uint32 value)
std::string const & GetName() const
WorldPacket const * Write() override
void AddMail(::Mail const *mail, Player *player)
WorldPacket const * Write() override
std::vector< MailNextTimeEntry > Next
char const * GetTrinityString(uint32 entry) const
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
void SendNotification(const char *format,...) ATTR_PRINTF(2
LocaleConstant GetSessionDbcLocale() const
std::string GetPlayerInfo() const
void HandleSendMail(WorldPackets::Mail::SendMail &sendMail)
Player * GetPlayer() const
bool CanOpenMailBox(ObjectGuid guid)
void HandleMailDelete(WorldPackets::Mail::MailDelete &mailDelete)
QueryCallbackProcessor & GetQueryProcessor()
void HandleMailTakeItem(WorldPackets::Mail::MailTakeItem &takeItem)
void HandleQueryNextMailTime(WorldPackets::Mail::MailQueryNextMailTime &queryNextMailTime)
void HandleMailMarkAsRead(WorldPackets::Mail::MailMarkAsRead &markAsRead)
bool HasPermission(uint32 permissionId)
void HandleMailReturnToSender(WorldPackets::Mail::MailReturnToSender &returnToSender)
uint32 GetAccountId() const
void HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextItem &createTextItem)
void HandleMailTakeMoney(WorldPackets::Mail::MailTakeMoney &takeMoney)
void HandleGetMailList(WorldPackets::Mail::MailGetList &getList)
std::string const & GetPlayerName() const
@ CONFIG_MAIL_DELIVERY_DELAY
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
@ RBAC_PERM_TWO_SIDE_INTERACTION_MAIL
@ RBAC_PERM_COMMAND_MAILBOX
bool HasFlag(ItemFlags flag) const
ObjectGuid::LowType receiver
ObjectGuid::LowType sender
std::vector< ObjectGuid::LowType > removedItems
std::vector< MailItemInfo > items
bool RemoveItem(ObjectGuid::LowType item_guid)
String< 255, Strings::NoHyperlinks > Subject
String< 7999, Strings::NoHyperlinks > Body
Array< MailAttachment, MAX_MAIL_ITEMS > Attachments