void WorldSession::SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 receiver_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay, uint16 mailTemplateId) { uint32 mailId = objmgr.GenerateMailID(); time_t deliver_time = time(NULL) + deliver_delay; //expire time if COD 3 days, if no COD 30 days, if auction sale pending 1 hour uint32 expire_delay; if(messageType == MAIL_AUCTION && !mi && !money) // auction mail without any items and money expire_delay = HOUR; else expire_delay = (COD > 0) ? 3*DAY : 30*DAY; time_t expire_time = deliver_time + expire_delay; if(mailTemplateId && !sMailTemplateStore.LookupEntry(mailTemplateId)) { sLog.outError( "WorldSession::SendMailTo - Mail have not existed MailTemplateId (%u), remove at send", mailTemplateId); mailTemplateId = 0; } if(receiver) { receiver->AddNewMailDeliverTime(deliver_time); if ( receiver->IsMailsLoaded() ) { Mail * m = new Mail; m->messageID = mailId; m->messageType = messageType; m->stationery = stationery; m->mailTemplateId = mailTemplateId; m->sender = sender_guidlow_or_entry; m->receiver = receiver->GetGUIDLow(); m->subject = subject; m->itemTextId = itemTextId; if(mi) m->AddAllItems(*mi); m->expire_time = expire_time; m->deliver_time = deliver_time; m->money = money; m->COD = COD; m->checked = checked; m->state = MAIL_STATE_UNCHANGED; receiver->AddMail(m); //to insert new mail to beginning of maillist if(mi) { for(MailItemMap::iterator mailItemIter = mi->begin(); mailItemIter != mi->end(); ++mailItemIter) { MailItem& mailItem = mailItemIter->second; if(mailItem.item) receiver->AddMItem(mailItem.item); } } } else if(mi) mi->deleteIncludedItems(); } else if(mi) mi->deleteIncludedItems(); CharacterDatabase.BeginTransaction(); CharacterDatabase.escape_string(subject); CharacterDatabase.PExecute("INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked) " "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%u', '" I64FMTD "','" I64FMTD "', '%u', '%u', '%d')", mailId, messageType, stationery, mailTemplateId, sender_guidlow_or_entry, receiver_guidlow, subject.c_str(), itemTextId, (mi && !mi->empty() ? 1 : 0), (uint64)expire_time, (uint64)deliver_time, money, COD, checked); if(mi) { for(MailItemMap::const_iterator mailItemIter = mi->begin(); mailItemIter != mi->end(); ++mailItemIter) { MailItem const& mailItem = mailItemIter->second; CharacterDatabase.PExecute("INSERT INTO mail_items (mail_id,item_guid,item_template,receiver) VALUES ('%u', '%u', '%u','%u')", mailId, mailItem.item_guidlow, mailItem.item_template,receiver_guidlow); } } CharacterDatabase.CommitTransaction(); }
void WorldSession::SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 receiver_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay, uint16 mailTemplateId) { if (receiver_guidlow == AHBplayerGUID) { if(messageType == MAIL_AUCTION && mi) // auction mail with items { mi->deleteIncludedItems(true); } return; } uint32 mailId = objmgr.GenerateMailID(); time_t deliver_time = time(NULL) + deliver_delay; uint32 expire_delay; // auction mail without any items and money (auction sale note) pending 1 hour if (messageType == MAIL_AUCTION && !mi && !money) expire_delay = HOUR; // mail from battlemaster (rewardmarks) should last only one day else if (messageType == MAIL_CREATURE && sBattleGroundMgr.GetBattleMasterBG(sender_guidlow_or_entry) != BATTLEGROUND_TYPE_NONE) expire_delay = DAY; // default case: expire time if COD 3 days, if no COD 30 days else expire_delay = (COD > 0) ? 3 * DAY : 30 * DAY; time_t expire_time = deliver_time + expire_delay; if (mailTemplateId && !sMailTemplateStore.LookupEntry(mailTemplateId)) { sLog.outError( "WorldSession::SendMailTo - Mail have not existed MailTemplateId (%u), remove at send", mailTemplateId); mailTemplateId = 0; } // Add to DB CharacterDatabase.BeginTransaction(); CharacterDatabase.escape_string(subject); CharacterDatabase.PExecute("INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked) " "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%u', '" UI64FMTD "','" UI64FMTD "', '%u', '%u', '%d')", mailId, messageType, stationery, mailTemplateId, sender_guidlow_or_entry, receiver_guidlow, subject.c_str(), itemTextId, (mi && !mi->empty() ? 1 : 0), (uint64)expire_time, (uint64)deliver_time, money, COD, checked); if (mi) { for(MailItemMap::const_iterator mailItemIter = mi->begin(); mailItemIter != mi->end(); ++mailItemIter) { Item* item = mailItemIter->second; CharacterDatabase.PExecute("INSERT INTO mail_items (mail_id,item_guid,item_template,receiver) VALUES ('%u', '%u', '%u','%u')", mailId, item->GetGUIDLow(), item->GetEntry(), receiver_guidlow); } } CharacterDatabase.CommitTransaction(); // For online receiver update in game mail status and data if (receiver) { receiver->AddNewMailDeliverTime(deliver_time); if (receiver->IsMailsLoaded()) { Mail *m = new Mail; m->messageID = mailId; m->messageType = messageType; m->stationery = stationery; m->mailTemplateId = mailTemplateId; m->sender = sender_guidlow_or_entry; m->receiver = receiver->GetGUIDLow(); m->subject = subject; m->itemTextId = itemTextId; if (mi) m->AddAllItems(*mi); m->expire_time = expire_time; m->deliver_time = deliver_time; m->money = money; m->COD = COD; m->checked = checked; m->state = MAIL_STATE_UNCHANGED; receiver->AddMail(m); // to insert new mail to beginning of maillist if (mi) { for(MailItemMap::iterator mailItemIter = mi->begin(); mailItemIter != mi->end(); ++mailItemIter) receiver->AddMItem(mailItemIter->second); } } else if (mi) mi->deleteIncludedItems(); } else if (mi) mi->deleteIncludedItems(); }