diff options
| author | n0n4m3 <none@none> | 2010-04-11 11:16:42 +0400 | 
|---|---|---|
| committer | n0n4m3 <none@none> | 2010-04-11 11:16:42 +0400 | 
| commit | be95faff2370db63eedd812ab4e70bb87e34b570 (patch) | |
| tree | d2db46e9e6161abe0dd8740461979b8309ef79c7 /src/game/Mail.cpp | |
| parent | 457df07bd4fd1b394cfcdbb63d5ff76e87fe8c89 (diff) | |
Fix mail, professions, group loot, console spam, and some fixes. Big thx to TOM_RUS.
--HG--
branch : trunk
Diffstat (limited to 'src/game/Mail.cpp')
| -rw-r--r-- | src/game/Mail.cpp | 103 | 
1 files changed, 49 insertions, 54 deletions
diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 448a90cd582..a552664d162 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -225,14 +225,12 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data)      pl->SendMailResult(0, MAIL_SEND, MAIL_OK); -    uint32 itemTextId = !body.empty() ? objmgr.CreateItemText(body) : 0; -      pl->ModifyMoney(-int32(reqmoney));      pl->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, cost);      bool needItemDelay = false; -    MailDraft draft(subject, itemTextId); +    MailDraft draft(subject, body);      if (items_count > 0 || money > 0)      { @@ -276,7 +274,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data)      draft          .AddMoney(money)          .AddCOD(COD) -        .SendMailTo(MailReceiver(receive, GUID_LOPART(rc)), pl, MAIL_CHECK_MASK_NONE, deliver_delay); +        .SendMailTo(MailReceiver(receive, GUID_LOPART(rc)), MailSender(pl), body.empty() ? MailCheckMask(MAIL_CHECK_MASK_NONE | MAIL_CHECK_MASK_COPIED) : MAIL_CHECK_MASK_HAS_BODY, deliver_delay);      CharacterDatabase.BeginTransaction();      pl->SaveInventoryAndGoldToDB(); @@ -301,7 +299,6 @@ void WorldSession::HandleMailMarkAsRead(WorldPacket & recv_data)          if (pl->unReadMails)              --pl->unReadMails;          m->checked = m->checked | MAIL_CHECK_MASK_READ; -        // m->expire_time = time(NULL) + (30 * DAY);  // Expire time do not change at reading mail          pl->m_mailsUpdated = true;          m->state = MAIL_STATE_CHANGED;      } @@ -366,7 +363,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recv_data)      // send back only to players and simple drop for other cases      if (m->messageType == MAIL_NORMAL)      { -        MailDraft draft(m->subject, m->itemTextId); +        MailDraft draft(m->subject, m->body);          if (m->mailTemplateId)              draft = MailDraft(m->mailTemplateId, false);     // items already included @@ -465,9 +462,9 @@ void WorldSession::HandleMailTakeItem(WorldPacket & recv_data)              // check player existence              if (receive || sender_accId)              { -                MailDraft(m->subject) +                MailDraft(m->subject, "")                      .AddMoney(m->COD) -                    .SendMailTo(MailReceiver(receive,m->sender),MailSender(MAIL_NORMAL,m->receiver), MAIL_CHECK_MASK_COD_PAYMENT); +                    .SendMailTo(MailReceiver(receive, m->sender), MailSender(MAIL_NORMAL, m->receiver), MAIL_CHECK_MASK_COD_PAYMENT);              }              pl->ModifyMoney(-int32(m->COD)); @@ -565,7 +562,7 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data)          uint8 item_count = (*itr)->items.size();            // max count is MAX_MAIL_ITEMS (12) -        size_t next_mail_size = 2+4+1+((*itr)->messageType == MAIL_NORMAL ? 8 : 4)+4*8+((*itr)->subject.size()+1)+1+item_count*(1+4+4+7*3*4+4+4+4+4+4+4+1); +        size_t next_mail_size = 2+4+1+((*itr)->messageType == MAIL_NORMAL ? 8 : 4)+4*8+((*itr)->subject.size()+1)+((*itr)->body.size()+1)+1+item_count*(1+4+4+7*3*4+4+4+4+4+4+4+1);          if (data.wpos()+next_mail_size > maxPacketSize)          { @@ -573,14 +570,6 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data)              continue;          } -        uint32 show_flags = 0; -        if ((*itr)->messageType != MAIL_NORMAL) -            show_flags |= MAIL_SHOW_DELETE; -        if ((*itr)->messageType == MAIL_AUCTION) -            show_flags |= MAIL_SHOW_AUCTION; -        if ((*itr)->HasItems() && (*itr)->messageType == MAIL_NORMAL) -            show_flags |= MAIL_SHOW_RETURN; -          data << uint16(next_mail_size);                    // Message size          data << uint32((*itr)->messageID);                 // Message ID          data << uint8((*itr)->messageType);                // Message Type @@ -601,14 +590,14 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data)          }          data << uint32((*itr)->COD);                         // COD -        data << uint32((*itr)->itemTextId);                  // sure about this -        data << uint32(0);                                   // unknown +        data << uint32(0);                                   // probably changed in 3.3.3          data << uint32((*itr)->stationery);                  // stationery (Stationery.dbc)          data << uint32((*itr)->money);                       // Gold -        data << uint32(show_flags);                          // unknown, 0x4 - auction, 0x10 - normal +        data << uint32((*itr)->checked);                    // flags          data << float(((*itr)->expire_time-time(NULL))/DAY); // Time          data << uint32((*itr)->mailTemplateId);              // mail template (MailTemplate.dbc) -        data << (*itr)->subject;                             // Subject string - once 00, when mail type = 3 +        data << (*itr)->subject;                            // Subject string - once 00, when mail type = 3, max 256	 +        data << (*itr)->body;                               // message? max 8000          data << uint8(item_count);                           // client limit is 0x10          for (uint8 i = 0; i < item_count; ++i) @@ -657,19 +646,23 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data)  ///this function is called when client needs mail message body, or when player clicks on item which has ITEM_FIELD_ITEM_TEXT_ID > 0  void WorldSession::HandleItemTextQuery(WorldPacket & recv_data)  { -    uint32 itemTextId; -    uint32 mailId;                                          //this value can be item id in bag, but it is also mail id -    uint32 unk;                                             //maybe something like state - 0x70000000 - -    recv_data >> itemTextId >> mailId >> unk; +    uint64 itemGuid;	 +    recv_data >> itemGuid; -    //some check needed, if player has item with guid mailId, or has mail with id mailId +    sLog.outDebug("CMSG_ITEM_TEXT_QUERY item guid: %u", GUID_LOPART(itemGuid)); -    sLog.outDebug("CMSG_ITEM_TEXT_QUERY itemguid: %u, mailId: %u, unk: %u", itemTextId, mailId, unk); - -    WorldPacket data(SMSG_ITEM_TEXT_QUERY_RESPONSE, (4+10));// guess size -    data << itemTextId; -    data << objmgr.GetItemText(itemTextId); +    WorldPacket data(SMSG_ITEM_TEXT_QUERY_RESPONSE, (4+10));    // guess size	 +	 +    if (Item *item = _player->GetItemByGuid(itemGuid))	 +    {	 +        data << uint8(0);                                       // has text	 +        data << uint64(itemGuid);                               // item guid	 +        data << objmgr.GetItemText(item->GetGUIDLow());     // max 8000	 +    } +    else	 +    { +        data << uint8(1);                                       // no text	 +    }      SendPacket(&data);  } @@ -681,7 +674,6 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data)      recv_data >> mailbox;      recv_data >> mailId; -    recv_data.read_skip<uint32>();                          // mailTemplateId, non need, Mail store own 100% correct value anyway      if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))          return; @@ -689,16 +681,21 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data)      Player *pl = _player;      Mail* m = pl->GetMail(mailId); -    if (!m || !m->itemTextId && !m->mailTemplateId || m->state == MAIL_STATE_DELETED || m->deliver_time > time(NULL)) +    if (!m || (m->body.empty() && !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; +    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)) +    {	 +        delete bodyItem; +        return;	 +    } -    // in mail template case we need create new text id -    if (!itemTextId) +    // in mail template case we need create new item text +    if(m->mailTemplateId)      {          MailTemplateEntry const* mailTemplateEntry = sMailTemplateStore.LookupEntry(m->mailTemplateId);          if (!mailTemplateEntry) @@ -707,18 +704,13 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data)              return;          } -        itemTextId = objmgr.CreateItemText(mailTemplateEntry->content[GetSessionDbcLocale()]); +        objmgr.CreateItemText(bodyItem->GetGUIDLow(), mailTemplateEntry->content[GetSessionDbcLocale()]);      } +    else	 +        objmgr.CreateItemText(bodyItem->GetGUIDLow(), m->body); -    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)) -    { -        delete bodyItem; -        return; -    } - -    //bodyItem->SetUInt32Value(ITEM_FIELD_ITEM_TEXT_ID , itemTextId); -    bodyItem->SetUInt32Value(ITEM_FIELD_CREATOR, m->sender); +    bodyItem->SetUInt32Value(ITEM_FIELD_CREATOR, m->sender);	 +    bodyItem->SetFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPER | ITEM_FLAGS_REFUNDABLE_2 | ITEM_FLAGS_UNK1);      sLog.outDetail("HandleMailCreateTextItem mailid=%u",mailId); @@ -726,12 +718,11 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data)      uint8 msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, bodyItem, false);      if (msg == EQUIP_ERR_OK)      { -        m->itemTextId = 0; +        m->checked = m->checked | MAIL_CHECK_MASK_COPIED;          m->state = MAIL_STATE_CHANGED;          pl->m_mailsUpdated = true;          pl->StoreItem(dest, bodyItem, true); -        //bodyItem->SetState(ITEM_NEW, pl); is set automatically          pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_OK);      }      else @@ -966,12 +957,16 @@ void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sende      // Add to DB      std::string safe_subject = GetSubject(); -      CharacterDatabase.BeginTransaction();      CharacterDatabase.escape_string(safe_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, 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); + +    std::string safe_body = GetBody();	 +    CharacterDatabase.BeginTransaction();	 +    CharacterDatabase.escape_string(safe_body);	 + +    CharacterDatabase.PExecute("INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,body,has_items,expire_time,deliver_time,money,cod,checked) "	 +        "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%s', '%u', '" UI64FMTD "','" UI64FMTD "', '%u', '%u', '%d')", +        mailId, sender.GetMailMessageType(), sender.GetStationery(), GetMailTemplateId(), sender.GetSenderId(), receiver.GetPlayerGUIDLow(), safe_subject.c_str(), safe_body.c_str(),(m_items.empty() ? 0 : 1), (uint64)expire_time, (uint64)deliver_time, m_money, m_COD, checked);      for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)      { @@ -991,7 +986,7 @@ void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sende              m->messageID = mailId;              m->mailTemplateId = GetMailTemplateId();              m->subject = GetSubject(); -            m->itemTextId = GetBodyId(); +            m->body = GetBody();              m->money = GetMoney();              m->COD = GetCOD();  | 
