fix(mail): use attachment item guid for WotLK take item

This commit is contained in:
Kelsi 2026-03-14 07:11:18 -07:00
parent 5a10ae9df0
commit 5fa5020af5
6 changed files with 12 additions and 11 deletions

View file

@ -1978,7 +1978,7 @@ public:
const std::array<MailAttachSlot, 12>& getMailAttachments() const { return mailAttachments_; } const std::array<MailAttachSlot, 12>& getMailAttachments() const { return mailAttachments_; }
int getMailAttachmentCount() const; int getMailAttachmentCount() const;
void mailTakeMoney(uint32_t mailId); void mailTakeMoney(uint32_t mailId);
void mailTakeItem(uint32_t mailId, uint32_t itemIndex); void mailTakeItem(uint32_t mailId, uint32_t itemGuidLow);
void mailDelete(uint32_t mailId); void mailDelete(uint32_t mailId);
void mailMarkAsRead(uint32_t mailId); void mailMarkAsRead(uint32_t mailId);
void refreshMailList(); void refreshMailList();

View file

@ -266,8 +266,8 @@ public:
virtual bool parseMailList(network::Packet& packet, std::vector<MailMessage>& inbox); virtual bool parseMailList(network::Packet& packet, std::vector<MailMessage>& inbox);
/** Build CMSG_MAIL_TAKE_ITEM */ /** Build CMSG_MAIL_TAKE_ITEM */
virtual network::Packet buildMailTakeItem(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemSlot) { virtual network::Packet buildMailTakeItem(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemGuidLow) {
return MailTakeItemPacket::build(mailboxGuid, mailId, itemSlot); return MailTakeItemPacket::build(mailboxGuid, mailId, itemGuidLow);
} }
/** Build CMSG_MAIL_DELETE */ /** Build CMSG_MAIL_DELETE */
@ -404,7 +404,7 @@ public:
uint32_t money, uint32_t cod, uint32_t money, uint32_t cod,
const std::vector<uint64_t>& itemGuids = {}) override; const std::vector<uint64_t>& itemGuids = {}) override;
bool parseMailList(network::Packet& packet, std::vector<MailMessage>& inbox) override; bool parseMailList(network::Packet& packet, std::vector<MailMessage>& inbox) override;
network::Packet buildMailTakeItem(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemSlot) override; network::Packet buildMailTakeItem(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemGuidLow) override;
network::Packet buildMailDelete(uint64_t mailboxGuid, uint32_t mailId, uint32_t mailTemplateId) override; network::Packet buildMailDelete(uint64_t mailboxGuid, uint32_t mailId, uint32_t mailTemplateId) override;
network::Packet buildItemQuery(uint32_t entry, uint64_t guid) override; network::Packet buildItemQuery(uint32_t entry, uint64_t guid) override;
bool parseItemQueryResponse(network::Packet& packet, ItemQueryResponseData& data) override; bool parseItemQueryResponse(network::Packet& packet, ItemQueryResponseData& data) override;

View file

@ -2517,7 +2517,7 @@ public:
/** CMSG_MAIL_TAKE_ITEM packet builder */ /** CMSG_MAIL_TAKE_ITEM packet builder */
class MailTakeItemPacket { class MailTakeItemPacket {
public: public:
static network::Packet build(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemIndex); static network::Packet build(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemGuidLow);
}; };
/** CMSG_MAIL_DELETE packet builder */ /** CMSG_MAIL_DELETE packet builder */

View file

@ -22136,9 +22136,9 @@ void GameHandler::mailTakeMoney(uint32_t mailId) {
socket->send(packet); socket->send(packet);
} }
void GameHandler::mailTakeItem(uint32_t mailId, uint32_t itemIndex) { void GameHandler::mailTakeItem(uint32_t mailId, uint32_t itemGuidLow) {
if (state != WorldState::IN_WORLD || !socket || mailboxGuid_ == 0) return; if (state != WorldState::IN_WORLD || !socket || mailboxGuid_ == 0) return;
auto packet = packetParsers_->buildMailTakeItem(mailboxGuid_, mailId, itemIndex); auto packet = packetParsers_->buildMailTakeItem(mailboxGuid_, mailId, itemGuidLow);
socket->send(packet); socket->send(packet);
} }

View file

@ -5069,11 +5069,12 @@ network::Packet MailTakeMoneyPacket::build(uint64_t mailboxGuid, uint32_t mailId
return packet; return packet;
} }
network::Packet MailTakeItemPacket::build(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemIndex) { network::Packet MailTakeItemPacket::build(uint64_t mailboxGuid, uint32_t mailId, uint32_t itemGuidLow) {
network::Packet packet(wireOpcode(Opcode::CMSG_MAIL_TAKE_ITEM)); network::Packet packet(wireOpcode(Opcode::CMSG_MAIL_TAKE_ITEM));
packet.writeUInt64(mailboxGuid); packet.writeUInt64(mailboxGuid);
packet.writeUInt32(mailId); packet.writeUInt32(mailId);
packet.writeUInt32(itemIndex); // WotLK expects attachment item GUID low, not attachment slot index.
packet.writeUInt32(itemGuidLow);
return packet; return packet;
} }

View file

@ -17716,7 +17716,7 @@ void GameScreen::renderMailWindow(game::GameHandler& gameHandler) {
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::SmallButton("Take")) { if (ImGui::SmallButton("Take")) {
gameHandler.mailTakeItem(mail.messageId, att.slot); gameHandler.mailTakeItem(mail.messageId, att.itemGuidLow);
} }
ImGui::PopID(); ImGui::PopID();
@ -17725,7 +17725,7 @@ void GameScreen::renderMailWindow(game::GameHandler& gameHandler) {
if (mail.attachments.size() > 1) { if (mail.attachments.size() > 1) {
if (ImGui::SmallButton("Take All")) { if (ImGui::SmallButton("Take All")) {
for (const auto& att2 : mail.attachments) { for (const auto& att2 : mail.attachments) {
gameHandler.mailTakeItem(mail.messageId, att2.slot); gameHandler.mailTakeItem(mail.messageId, att2.itemGuidLow);
} }
} }
} }