diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index d017c6b78..d26ba051a 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1069,7 +1069,7 @@ struct MailTemplateEntry uint32 ID; // 0 //char* subject[16]; // 1-16 // 17 name flags, unused - //char* content[16]; // 18-33 + char* content[16]; // 18-33 }; struct MapEntry diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h index 6073fb663..e1f8f1a21 100644 --- a/src/game/DBCfmt.h +++ b/src/game/DBCfmt.h @@ -71,7 +71,7 @@ const char ItemRandomPropertiesfmt[]="nxiiiiissssssssssssssssx"; const char ItemRandomSuffixfmt[]="nssssssssssssssssxxiiiiiiiiii"; const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; -const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxssssssssssssssssx"; const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixiffxixx"; const char MapDifficultyEntryfmt[]="diixxxxxxxxxxxxxxxxxiix"; const char MovieEntryfmt[]="nxx"; diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index fd94d86e9..ec31265f5 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -314,6 +314,7 @@ void WorldSession::HandleMailDelete(WorldPacket & recv_data ) uint32 mailId; recv_data >> mailbox; recv_data >> mailId; + recv_data.read_skip(); // mailTemplateId if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX)) return; @@ -709,7 +710,9 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data ) uint64 mailbox; uint32 mailId; - recv_data >> mailbox >> mailId; + recv_data >> mailbox; + recv_data >> mailId; + recv_data.read_skip(); // mailTemplateId, non need, Mail store own 100% correct value anyway if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX)) return; @@ -717,12 +720,27 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data ) Player *pl = _player; Mail* m = pl->GetMail(mailId); - if(!m || !m->itemTextId || m->state == MAIL_STATE_DELETED || m->deliver_time > time(NULL)) + if(!m || !m->itemTextId && !m->mailTemplateId || m->state == MAIL_STATE_DELETED || m->deliver_time > time(NULL)) { pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_ERR_INTERNAL_ERROR); return; } + uint32 itemTextId = m->itemTextId; + + // in mail template case we need create new text id + if(!itemTextId) + { + MailTemplateEntry const* mailTemplateEntry = sMailTemplateStore.LookupEntry(m->mailTemplateId); + if(!mailTemplateEntry) + { + pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_ERR_INTERNAL_ERROR); + return; + } + + itemTextId = objmgr.CreateItemText(mailTemplateEntry->content[GetSessionDbcLocale()]); + } + Item *bodyItem = new Item; // This is not bag and then can be used new Item. if(!bodyItem->Create(objmgr.GenerateLowGuid(HIGHGUID_ITEM), MAIL_BODY_ITEM_TEMPLATE, pl)) { @@ -730,7 +748,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data ) return; } - bodyItem->SetUInt32Value( ITEM_FIELD_ITEM_TEXT_ID, m->itemTextId ); + bodyItem->SetUInt32Value( ITEM_FIELD_ITEM_TEXT_ID, itemTextId ); bodyItem->SetUInt32Value( ITEM_FIELD_CREATOR, m->sender); sLog.outDetail("HandleMailCreateTextItem mailid=%u",mailId); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3e3f2c07f..be9c44e86 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8750" + #define REVISION_NR "8751" #endif // __REVISION_NR_H__