my suggested modifications:
DROP TABLE IF EXISTS `mail_external`;
CREATE TABLE `mail_external` (
`id` int(20) unsigned NOT NULL auto_increment,
`receiver` bigint(20) unsigned NOT NULL,
`subject` varchar(200) default 'Support Message',
`message` varchar(500) default 'Support Message',
`money` int(20) unsigned NOT NULL default '0',
`item` int(20) unsigned NOT NULL default '0',
`item_count` int(20) unsigned NOT NULL default '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
void WorldSession::SendExternalMails()
{
sLog.outString("EXTERNAL MAIL> Send Mails from Queue...");
QueryResult *result = CharacterDatabase.Query("SELECT id,receiver,subject,message,money,item,item_count FROM mail_external");
if(!result)
{
sLog.outString("EXTERNAL MAIL> No Mails in Queue.");
delete result;
return;
}
do
{
Field *fields = result->Fetch();
uint32 id = fields[0].GetUInt32();
uint64 receiver_guid = fields[1].GetUInt64();
std::string subject = fields[2].GetString();
std::string message = fields[3].GetString();
uint32 money = fields[4].GetUInt32();
uint32 ItemID = fields[5].GetUInt32();
uint32 ItemCount = fields[6].GetUInt32();
if (Player *receiver = sObjectMgr.GetPlayer(receiver_guid))
{
sLog.outString("EXTERNAL MAIL> Sending mail to %u, Item: %u", receiver_guid, ItemID);
uint32 itemTextId = !message.empty() ? sObjectMgr.CreateItemText(message) : 0;
if (ItemID && ItemCount < 1)
{
sLog.outString("EXTERNAL MAIL> Warning: invalid ItemCount of %u, setting to 1", ItemCount);
ItemCount = 1;
}
Item* ToMailItem = ItemID ? Item::CreateItem(ItemID, ItemCount, receiver) : NULL;
if (ToMailItem)
{
ToMailItem->SaveToDB();
MailDraft(subject, itemTextId)
.AddItem(ToMailItem)
.AddMoney(money)
.SendMailTo(MailReceiver(receiver), MailSender(MAIL_NORMAL, 0, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_RETURNED);
}
else
{
MailDraft(subject, itemTextId)
.AddMoney(money)
.SendMailTo(MailReceiver(receiver), MailSender(MAIL_NORMAL, 0, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_RETURNED);
}
CharacterDatabase.PExecute("DELETE FROM mail_external WHERE id=%u", id);
}
else
sLog.outString("EXTERNAL MAIL> Player %u not in game, skip mail!", receiver_guid);
} while(result->NextRow());
delete result;
sLog.outString("EXTERNAL MAIL> All Mails Sent.");
}