56 std::string receiver, subject, body;
57 uint32 unk1, unk2, money, COD;
60 recv_data >> receiver;
70 recv_data >> items_count;
81 for (
uint8 i = 0; i < items_count; ++i)
84 recv_data >> itemGUIDs[i];
87 recv_data >> money >> COD;
103 rc =
sObjectMgr.GetPlayerGUIDByName(receiver);
107 sLog.outDetail(
"Player %u is sending mail to invalid player %s (no GUID) with subject %s and body %s includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u",
108 pl->
GetGUIDLow(), receiver.c_str(), subject.c_str(), body.c_str(), items_count, money, COD, unk1, unk2);
113 sLog.outDetail(
"Player %u is sending mail to %s (GUID: %u) with subject %s and body %s includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", pl->
GetGUIDLow(), receiver.c_str(),
GUID_LOPART(rc), subject.c_str(), body.c_str(), items_count, money, COD, unk1, unk2);
121 uint32 cost = items_count ? 30 * items_count : 30;
123 uint32 reqmoney = cost + money;
134 uint8 mails_count = 0;
146 Field* fields = result->Fetch();
147 mails_count = fields[0].GetUInt32();
152 if (mails_count > 100)
167 for (
uint8 i = 0; i < items_count; ++i)
202 if (item->
IsBag() && !((
Bag*)item)->IsEmpty())
217 bool needItemDelay =
false;
221 if (items_count > 0 || money > 0)
227 rc_account =
sObjectMgr.GetPlayerAccountIdByGUID(rc);
231 for (
uint8 i = 0; i < items_count; ++i)
233 Item* item = items[i];
236 sLog.outCommand(
GetAccountId(),
"GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) to player: %s (Account: %u)",
257 sLog.outCommand(
GetAccountId(),
"GM %s (Account: %u) mail money: %u to player: %s (Account: %u)",
291 recv_data >> mailbox;
321 recv_data >> mailbox;
358 recv_data >> mailbox;
391 for (std::vector<MailItemInfo>::iterator itr2 = m->
items.begin(); itr2 != m->
items.end(); ++itr2)
418 recv_data >> mailbox;
459 std::string sender_name;
463 sender_name = receive->
GetName();
468 sender_accId =
sObjectMgr.GetPlayerAccountIdByGUID(sender_guid);
470 if (!
sObjectMgr.GetPlayerNameByGUID(sender_guid, sender_name))
473 sLog.outCommand(
GetAccountId(),
"GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: %u to player: %s (Account: %u)",
477 sender_accId =
sObjectMgr.GetPlayerAccountIdByGUID(sender_guid);
480 if (receive || sender_accId)
515 recv_data >> mailbox;
551 recv_data >> mailbox;
563 const uint32 maxPacketSize = 32767;
569 time_t cur_time = time(NULL);
574 if (mailsCount >= 254)
581 uint8 item_count = (*itr)->items.size();
583 size_t next_mail_size = 2 + 4 + 1 + 8 + 4 * 8 + ((*itr)->subject.size() + 1) + 1 + item_count * (1 + 4 + 4 + 6 * 3 * 4 + 4 + 4 + 1 + 4 + 4 + 4);
585 if (data.
wpos() + next_mail_size > maxPacketSize)
588 data <<
uint16(next_mail_size);
589 data <<
uint32((*itr)->messageID);
590 data <<
uint8((*itr)->messageType);
592 switch ((*itr)->messageType)
600 data << (
uint32) (*itr)->sender;
606 data <<
uint32((*itr)->COD);
607 data <<
uint32((*itr)->itemTextId);
609 data <<
uint32((*itr)->stationery);
610 data <<
uint32((*itr)->money);
611 data <<
uint32((*itr)->checked);
612 data << float(((*itr)->expire_time - time(NULL)) /
DAY);
613 data <<
uint32((*itr)->mailTemplateId);
614 data << (*itr)->subject;
616 data << (
uint8) item_count;
618 for (uint8 i = 0; i < item_count; ++i)
627 for (uint8 j = 0; j < 6; ++j)
650 data.
put<uint8>(0, mailsCount);
669 recv_data >> itemTextId >> mailId >> unk;
673 sLog.outDebug(
"CMSG_ITEM_TEXT_QUERY itemguid: %u, mailId: %u, unk: %u", itemTextId, mailId, unk);
693 recv_data >> mailbox;
719 sLog.outDetail(
"HandleMailCreateTextItem mailid=%u", mailId);
783 data << (
uint32) 0xC6000000;
790 data << (
uint32) 0xC7A8C000;
791 data << (
uint32) 0x00000000;
822 if (static_cast<Player*>(sender)->IsGameMaster())
828 sLog.outError(
"MailSender::MailSender - Mail has unexpected sender typeid (%u)", sender->
GetTypeId());
880 if (!m_mailTemplateId || !m_mailTemplateItemsNeed)
883 m_mailTemplateItemsNeed =
false;
910 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
912 Item* item = mailItemIter->second;
937 if (!receiver && !rc_account)
939 deleteIncludedItems(
true);
944 bool needItemDelay =
false;
946 if (!m_items.empty())
949 needItemDelay = sender_acc != rc_account;
953 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
955 Item* item = mailItemIter->second;
983 prepareItems(pReceiver);
988 deleteIncludedItems(
true);
993 time_t deliver_time = time(NULL) + deliver_delay;
1000 expire_delay = (m_COD > 0) ? 3 *
DAY : 30 *
DAY;
1002 time_t expire_time = deliver_time + expire_delay;
1005 std::string safe_subject = GetSubject();
1009 CharacterDatabase.
PExecute(
"INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked) " 1010 "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%u', '" UI64FMTD "','" UI64FMTD "', '%u', '%u', '%d')",
1011 mailId, sender.
GetMailMessageType(), sender.
GetStationery(), GetMailTemplateId(), sender.
GetSenderId(), receiver.
GetPlayerGUIDLow(), safe_subject.c_str(), GetBodyId(), (m_items.empty() ? 0 : 1), (
uint64)expire_time, (
uint64)deliver_time, m_money, m_COD, checked);
1013 for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
1015 Item* item = mailItemIter->second;
1016 CharacterDatabase.
PExecute(
"INSERT INTO mail_items (mail_id,item_guid,item_template,receiver) VALUES ('%u', '%u', '%u','%u')", mailId, item->
GetGUIDLow(), item->
GetEntry(), receiver.
GetPlayerGUIDLow());
1032 m->
money = GetMoney();
1035 for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
1037 Item* item = mailItemIter->second;
1052 if (!m_items.empty())
1054 for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
1055 pReceiver->
AddMItem(mailItemIter->second);
1058 else if (!m_items.empty())
1059 deleteIncludedItems();
1061 else if (!m_items.empty())
1062 deleteIncludedItems();
1067 sLog.outDebug(
"External Mail - Send Mails from Queue...");
1071 sLog.outDebug(
"External Mail - No Mails in Queue...");
1078 Field* fields = result->Fetch();
1079 uint32 id = fields[0].GetUInt32();
1080 uint64 receiver_guid = fields[1].GetUInt64();
1081 std::string subject = fields[2].
GetString();
1082 std::string message = fields[3].
GetString();
1083 uint32 money = fields[4].GetUInt32();
1084 uint32 ItemID = fields[5].GetUInt32();
1085 uint32 ItemCount = fields[6].GetUInt32();
1091 sLog.outDebug(
"External Mail - Sending mail to " UI64FMTD ", Item:%u", receiver_guid, ItemID);
1092 uint32 itemTextId = !message.empty() ?
sObjectMgr.CreateItemText(message) : 0;
1096 ToMailItem -> SaveToDB();
1112 while (result -> NextRow());
1114 sLog.outDebug(
"External Mail - All Mails Sent...");
void HandleSendMail(WorldPacket &recv_data)
std::vector< MailItemInfo > items
ItemTemplate const * GetProto() const
uint32 GetSenderId() const
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
const uint32 & GetUInt32Value(uint16 index) const
int32 GetSpellCharges(uint8 index=0) const
PlayerMails::iterator GetmailBegin()
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=NULL, QuestItem **ffaitem=NULL, QuestItem **conditem=NULL)
void HandleMailDelete(WorldPacket &recv_data)
uint32 GetMaxSlotInLootFor(Player *player) const
uint32 m_receiver_lowguid
uint32 GetItemSuffixFactor() const
void HandleMarkAsRead(WorldPacket &recv_data)
void AddItem(uint32 itemGuidLow, uint32 item_template)
uint32 GetPlayerGUIDLow() const
QueryResult_AutoPtr PQuery(const char *format,...) ATTR_PRINTF(2
void RemoveMail(uint32 id)
MailSender(MailMessageType messageType, uint32 sender_guidlow_or_entry, MailStationery stationery=MAIL_STATIONERY_NORMAL)
void prepareItems(Player *receiver)
MailMessageType GetMailMessageType() const
void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, uint32 item_guid=0, uint32 item_count=0)
#define sLog
Log class singleton.
void UpdateNextMailTimeAndUnreads()
void deleteIncludedItems(bool inDB=false)
void SetUInt32Value(uint16 index, uint32 value)
unsigned long escape_string(char *to, const char *from, unsigned long length)
QueryResult_AutoPtr Query(const char *sql)
void HandleMsgQueryNextMailtime(WorldPacket &recv_data)
uint32 GetAccountId() const
Player * GetPlayer() const
uint32 GetGUIDLow() const
static void SendExternalMails()
void HandleItemTextQuery(WorldPacket &recv_data)
void AddNewMailDeliverTime(time_t deliver_time)
MailDraft & AddMoney(uint32 money)
int32 GetItemRandomPropertyId() const
void SendPacket(WorldPacket const *packet)
const char * GetString() const
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
void FillLoot(uint32 loot_id, LootStore const &store, Player *loot_owner, bool personal)
void HandleTakeItem(WorldPacket &recv_data)
bool normalizePlayerName(std::string &name)
uint8 CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
std::vector< uint32 > removedItems
virtual bool Create(uint32 guidlow, uint32 itemid, Player const *owner)
void put(size_t pos, T value)
#define MAKE_NEW_GUID(l, e, h)
static Item * CreateItem(uint32 item, uint32 count, Player const *player=NULL)
bool IsMailsLoaded() const
LootStore LootTemplates_Mail("mail_loot_template","mail template id")
#define MAIL_BODY_ITEM_TEMPLATE
Mail * GetMail(uint32 id)
void SendMailTo(MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0)
bool PExecute(const char *format,...) ATTR_PRINTF(2
char const * GetPlayerName() const
const char * GetName() const
std::vector< ItemPosCount > ItemPosCountVec
MailStationery GetStationery() const
void HandleReturnToSender(WorldPacket &recv_data)
MailDraft & AddItem(Item *item)
GameObject * GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const
PlayerMails::iterator GetmailEnd()
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Player * GetPlayer() const
ACE_Refcounted_Auto_Ptr< QueryResult, ACE_Null_Mutex > QueryResult_AutoPtr
bool RemoveItem(uint32 item_guid)
void HandleMailCreateTextItem(WorldPacket &recv_data)
Item * GetMItem(uint32 id)
void SaveInventoryAndGoldToDB()
void MoveItemToInventory(ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
WorldSession * GetSession() const
MailMessageType m_messageType
DatabaseType CharacterDatabase
Accessor to the character database.
void uint32 GetSecurity() const
MailReceiver(uint32 receiver_lowguid)
void SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid)
bool HasFlag(uint16 index, uint32 flag) const
void ModifyMoney(int32 d)
void HandleTakeMoney(WorldPacket &recv_data)
bool RemoveMItem(uint32 id)
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
void HandleGetMail(WorldPacket &recv_data)
MailDraft & AddCOD(uint32 COD)
void DeleteFromInventoryDB()
MailStationery m_stationery
Item * GetItemByGuid(uint64 guid) const
const uint64 & GetGUID() const
uint32 GetEnchantmentId(EnchantmentSlot slot) const