[11701] Command .auction item and support auction without owner.

* New command allow place auction from chat/console and create auction without owner.
* Same code can be used in other place when server code want create generated auction
  without need have associated player. Auction code update for support this case.
* MailDraft::SendMailTo now allow "send" mails to non-players. It correcly drop items in like case.
This commit is contained in:
VladimirMangos 2011-06-29 23:24:51 +04:00
parent 78991c1131
commit 67f9c26d51
12 changed files with 210 additions and 86 deletions

View file

@ -194,10 +194,10 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, ObjectGuid sender_guid, Ob
Player *receiver = sObjectMgr.GetPlayer(receiver_guid);
uint32 rc_account = 0;
if(!receiver)
if (!receiver)
rc_account = sObjectMgr.GetPlayerAccountIdByGUID(receiver_guid);
if(!receiver && !rc_account) // sender not exist
if (!receiver && !rc_account) // sender not exist
{
deleteIncludedItems(true);
return;
@ -206,17 +206,17 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, ObjectGuid sender_guid, Ob
// prepare mail and send in other case
bool needItemDelay = false;
if(!m_items.empty())
if (!m_items.empty())
{
// if item send to character at another account, then apply item delivery delay
needItemDelay = sender_acc != rc_account;
// set owner to new receiver (to prevent delete item with sender char deleting)
CharacterDatabase.BeginTransaction();
for(MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
{
Item* item = mailItemIter->second;
item->SaveToDB(); // item not in inventory and can be save standalone
item->SaveToDB(); // item not in inventory and can be save standalone
// owner in data will set at mail receive and item extracting
CharacterDatabase.PExecute("UPDATE item_instance SET owner_guid = '%u' WHERE guid='%u'", receiver_guid.GetCounter(), item->GetGUIDLow());
}
@ -241,6 +241,16 @@ void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sende
{
Player* pReceiver = receiver.GetPlayer(); // can be NULL
uint32 pReceiverAccount = 0;
if (!pReceiver)
pReceiverAccount = sObjectMgr.GetPlayerAccountIdByGUID(receiver.GetPlayerGuid());
if (!pReceiver && !pReceiverAccount) // receiver not exist
{
deleteIncludedItems(true);
return;
}
bool has_items = !m_items.empty();
// generate mail template items for online player, for offline player items will generated at open