aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorCarbenium <keresztesschmidt@gmail.com>2015-02-03 23:11:07 +0100
committerCarbenium <keresztesschmidt@gmail.com>2015-02-07 12:43:25 +0100
commit829e11b6623f967672143d79cd8d31772f54866d (patch)
treee2fcced6ddde99843b23abda068f8c2d2aeade70 /src/server/game/Server
parent919ab9157e7458257e300546e05312049b0872cd (diff)
Core/Packets: Implement all mail system relevant packets
Thanks @joschiwald, @DDuarte and @Warpten
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/MailPackets.cpp272
-rw-r--r--src/server/game/Server/Packets/MailPackets.h257
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp15
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp27
-rw-r--r--src/server/game/Server/WorldSession.h31
6 files changed, 581 insertions, 22 deletions
diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp
new file mode 100644
index 00000000000..c712fe0d5b0
--- /dev/null
+++ b/src/server/game/Server/Packets/MailPackets.cpp
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Mail.h"
+#include "MailPackets.h"
+#include "Player.h"
+#include "World.h"
+
+WorldPackets::Mail::MailAttachedItem::MailAttachedItem(::Item const* item, uint8 pos)
+{
+ Position = pos;
+ AttachID = item->GetGUID().GetCounter();
+ Count = item->GetCount();
+ Charges = item->GetSpellCharges();
+ MaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
+ Durability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
+ Unlocked = !item->IsLocked(); //TODO: Check
+
+ for (uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; j++)
+ {
+ Enchants[j].Enchant = item->GetEnchantmentId((EnchantmentSlot)j);
+ Enchants[j].Duration = item->GetEnchantmentDuration((EnchantmentSlot)j);
+ Enchants[j].Charges = item->GetEnchantmentCharges((EnchantmentSlot)j);
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailAttachedItem const& att)
+{
+ data << uint8(att.Position);
+ data << uint32(att.AttachID);
+ data << WorldPackets::Item::ItemInstance(att.Item);
+
+ for (auto const& en : att.Enchants)
+ {
+ data << int32(en.Enchant);
+ data << int32(en.Duration);
+ data << int32(en.Charges);
+ }
+
+ data << int32(att.Count);
+ data << int32(att.Charges);
+ data << int32(att.MaxDurability);
+ data << int32(att.Durability);
+ data.WriteBit(att.Unlocked);
+ data.FlushBits();
+
+ return data;
+}
+
+WorldPackets::Mail::MailListEntry::MailListEntry(::Mail const* mail, ::Player* player)
+{
+ MailID = mail->messageID;
+ SenderType = mail->messageType;
+
+ switch (mail->messageType)
+ {
+ case MAIL_NORMAL:
+ SenderCharacter.Set(ObjectGuid::Create<HighGuid::Player>(mail->sender));
+ SenderHint.NativeRealmAddress.Set(GetVirtualRealmAddress());
+ SenderHint.VirtualRealmAddress.Set(GetVirtualRealmAddress());
+ break;
+ case MAIL_CREATURE:
+ case MAIL_GAMEOBJECT:
+ case MAIL_AUCTION:
+ case MAIL_CALENDAR:
+ AltSenderID.Set(mail->sender);
+ break;
+ }
+
+ Cod = mail->COD;
+ PackageID = 0;
+ StationeryID = mail->stationery;
+ SentMoney = mail->money;
+ Flags = mail->checked;
+ DaysLeft = float(mail->expire_time - time(nullptr)) / DAY;
+ MailTemplateID = mail->mailTemplateId;
+ Subject = mail->subject;
+ Body = mail->body;
+
+ for (uint8 i = 0; i < mail->items.size(); i++)
+ {
+ if (::Item* item = player->GetMItem(mail->items[i].item_guid))
+ Attachments.emplace_back(item, i);
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailListEntry const& entry)
+{
+ data << int32(entry.MailID);
+ data << int8(entry.SenderType);
+
+ data << entry.SenderHint;
+
+ data << int64(entry.Cod);
+ data << int32(entry.PackageID);
+ data << int32(entry.StationeryID);
+ data << int64(entry.SentMoney);
+ data << int32(entry.Flags);
+ data << float(entry.DaysLeft);
+ data << int32(entry.MailTemplateID);
+
+ data << int32(entry.Attachments.size());
+
+ for (auto const& att : entry.Attachments)
+ data << att;
+
+ data.WriteBit(entry.SenderCharacter.HasValue);
+ data.WriteBit(entry.AltSenderID.HasValue);
+ data.WriteBits(entry.Subject.size(), 8);
+ data.WriteBits(entry.Body.size(), 13);
+ data.FlushBits();
+
+ return data;
+}
+
+void WorldPackets::Mail::MailGetList::Read()
+{
+ _worldPacket >> Mailbox;
+ LowGuids.resize(_worldPacket.read<int32>());
+
+ for (auto& l : LowGuids)
+ _worldPacket >> l;
+}
+
+WorldPacket const* WorldPackets::Mail::MailListResult::Write()
+{
+ _worldPacket << int32(Mails.size());
+ _worldPacket << int32(TotalNumRecords);
+
+ for (auto const& mail : Mails)
+ _worldPacket << mail;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Mail::MailCreateTextItem::Read()
+{
+ _worldPacket >> Mailbox;
+ _worldPacket >> MailID;
+}
+
+void WorldPackets::Mail::SendMail::Read()
+{
+ _worldPacket >> Info.Mailbox;
+ _worldPacket >> Info.StationeryID;
+ _worldPacket >> Info.PackageID;
+ _worldPacket >> Info.SendMoney;
+ _worldPacket >> Info.Cod;
+
+ uint32 targetLength = _worldPacket.ReadBits(9);
+ uint32 subjectLength = _worldPacket.ReadBits(9);
+ uint32 bodyLength = _worldPacket.ReadBits(11);
+
+ Info.Attachments.resize(_worldPacket.ReadBits(5));
+
+ Info.Target = _worldPacket.ReadString(targetLength);
+ Info.Subject = _worldPacket.ReadString(subjectLength);
+ Info.Body = _worldPacket.ReadString(bodyLength);
+
+ for (auto& att : Info.Attachments)
+ {
+ _worldPacket >> att.AttachPosition;
+ _worldPacket >> att.ItemGUID;
+ }
+}
+
+void WorldPackets::Mail::MailReturnToSender::Read()
+{
+ _worldPacket >> MailID;
+ _worldPacket >> SenderGUID;
+}
+
+WorldPacket const* WorldPackets::Mail::MailCommandResult::Write()
+{
+ _worldPacket << uint32(MailID);
+ _worldPacket << uint32(Command);
+ _worldPacket << uint32(ErrorCode);
+ _worldPacket << uint32(BagResult);
+ _worldPacket << uint32(AttachID);
+ _worldPacket << uint32(QtyInInventory);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Mail::MailMarkAsRead::Read()
+{
+ _worldPacket >> Mailbox;
+ _worldPacket >> MailID;
+ BiReceipt = _worldPacket.ReadBit();
+}
+
+void WorldPackets::Mail::MailDelete::Read()
+{
+ _worldPacket >> MailID;
+ _worldPacket >> DeleteReason;
+}
+
+void WorldPackets::Mail::MailTakeItem::Read()
+{
+ _worldPacket >> Mailbox;
+ _worldPacket >> MailID;
+ _worldPacket >> AttachID;
+}
+
+void WorldPackets::Mail::MailTakeMoney::Read()
+{
+ _worldPacket >> Mailbox;
+ _worldPacket >> MailID;
+ _worldPacket >> Money;
+}
+
+WorldPackets::Mail::MailQueryNextTimeResult::MailNextTimeEntry::MailNextTimeEntry(::Mail const* mail)
+{
+ switch (mail->messageType)
+ {
+ case MAIL_NORMAL:
+ SenderGuid = ObjectGuid::Create<HighGuid::Player>(mail->sender);
+ SenderHint.NativeRealmAddress.Set(GetVirtualRealmAddress());
+ SenderHint.VirtualRealmAddress.Set(GetVirtualRealmAddress());
+ break;
+ case MAIL_AUCTION:
+ case MAIL_CREATURE:
+ case MAIL_GAMEOBJECT:
+ case MAIL_CALENDAR:
+ AltSenderID = mail->sender;
+ break;
+ }
+
+ TimeLeft = mail->deliver_time - time(nullptr);
+ AltSenderType = mail->messageType;
+ StationeryID = mail->stationery;
+}
+
+WorldPacket const* WorldPackets::Mail::MailQueryNextTimeResult::Write()
+{
+ _worldPacket << float(NextMailTime);
+ _worldPacket << int32(Next.size());
+
+ for (auto const& entry : Next)
+ {
+ _worldPacket << entry.SenderGuid;
+ _worldPacket << entry.SenderHint;
+
+ _worldPacket << float(entry.TimeLeft);
+ _worldPacket << int32(entry.AltSenderID);
+ _worldPacket << int8(entry.AltSenderType);
+ _worldPacket << int32(entry.StationeryID);
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Mail::NotifyRecievedMail::Write()
+{
+ _worldPacket << float(Delay);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h
new file mode 100644
index 00000000000..8019c274191
--- /dev/null
+++ b/src/server/game/Server/Packets/MailPackets.h
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MailPackets_h__
+#define MailPackets_h__
+
+#include "ItemPackets.h"
+#include "Packet.h"
+#include "QueryPackets.h"
+#include "ObjectGuid.h"
+
+struct Mail;
+
+namespace WorldPackets
+{
+ namespace Mail
+ {
+ struct MailAttachedItemEnchant
+ {
+ int32 Enchant = 0;
+ int32 Duration = 0;
+ int32 Charges = 0;
+ };
+
+ struct MailAttachedItem
+ {
+ MailAttachedItem(::Item const* item, uint8 pos);
+
+ uint8 Position = 0;
+ int32 AttachID = 0;
+ Item::ItemInstance Item;
+ int32 Count = 0;
+ int32 Charges = 0;
+ int32 MaxDurability = 0;
+ int32 Durability = 0;
+ bool Unlocked = false;
+ MailAttachedItemEnchant Enchants[8];
+ };
+
+ struct MailListEntry
+ {
+ MailListEntry(::Mail const* mail, ::Player* player);
+
+ int32 MailID = 0;
+ uint8 SenderType = 0;
+ Optional<ObjectGuid> SenderCharacter;
+ Query::PlayerGuidLookupHint SenderHint;
+ Optional<uint32> AltSenderID;
+ int64 Cod = 0;
+ int32 PackageID = 0;
+ int32 StationeryID = 0;
+ int64 SentMoney = 0;
+ int32 Flags = 0;
+ float DaysLeft = 0.0f;
+ int32 MailTemplateID = 0;
+ std::string Subject;
+ std::string Body;
+ std::vector<MailAttachedItem> Attachments;
+ };
+
+ class MailGetList final : public ClientPacket
+ {
+ public:
+ MailGetList(WorldPacket&& packet) : ClientPacket(CMSG_GET_MAIL_LIST, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Mailbox;
+ std::vector<ObjectGuid::LowType> LowGuids;
+ };
+
+ class MailListResult final : public ServerPacket
+ {
+ public:
+ MailListResult() : ServerPacket(SMSG_MAIL_LIST_RESULT, 8) { }
+
+ WorldPacket const* Write() override;
+
+ int32 TotalNumRecords = 0;
+ std::vector<MailListEntry> Mails;
+ };
+
+ class MailCreateTextItem final : public ClientPacket
+ {
+ public:
+ MailCreateTextItem(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_CREATE_TEXT_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Mailbox;
+ uint32 MailID = 0;
+ };
+
+ class SendMail final : public ClientPacket
+ {
+ public:
+ struct StructSendMail
+ {
+ struct MailAttachment
+ {
+ uint8 AttachPosition = 0;
+ ObjectGuid ItemGUID;
+ };
+
+ ObjectGuid Mailbox;
+ int32 StationeryID = 0;
+ int32 PackageID = 0;
+ int64 SendMoney = 0;
+ int64 Cod = 0;
+ std::string Target;
+ std::string Subject;
+ std::string Body;
+ std::vector<MailAttachment> Attachments;
+ };
+
+ SendMail(WorldPacket&& packet) : ClientPacket(CMSG_SEND_MAIL, std::move(packet)) { }
+
+ void Read() override;
+
+ StructSendMail Info;
+ };
+
+ class MailCommandResult final : public ServerPacket
+ {
+ public:
+ MailCommandResult() : ServerPacket(SMSG_SEND_MAIL_RESULT) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 MailID = 0;
+ uint32 Command = 0;
+ uint32 ErrorCode = 0;
+ uint32 BagResult = 0;
+ uint32 AttachID = 0;
+ uint32 QtyInInventory = 0;
+ };
+
+ class MailReturnToSender final : public ClientPacket
+ {
+ public:
+ MailReturnToSender(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_RETURN_TO_SENDER, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 MailID = 0;
+ ObjectGuid SenderGUID;
+ };
+
+ class MailMarkAsRead final : public ClientPacket
+ {
+ public:
+ MailMarkAsRead(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_MARK_AS_READ, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Mailbox;
+ int32 MailID = 0;
+ bool BiReceipt = false;
+ };
+
+ class MailDelete final : public ClientPacket
+ {
+ public:
+ MailDelete(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_DELETE, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 MailID = 0;
+ int32 DeleteReason = 0;
+ };
+
+ class MailTakeItem final : public ClientPacket
+ {
+ public:
+ MailTakeItem(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_TAKE_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Mailbox;
+ int32 MailID = 0;
+ int32 AttachID = 0;
+ };
+
+ class MailTakeMoney final : public ClientPacket
+ {
+ public:
+ MailTakeMoney(WorldPacket&& packet) : ClientPacket(CMSG_MAIL_TAKE_MONEY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Mailbox;
+ int32 MailID = 0;
+ int64 Money = 0;
+ };
+
+ class MailQueryNextMailTime final : public ClientPacket
+ {
+ public:
+ MailQueryNextMailTime(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_NEXT_MAIL_TIME, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class MailQueryNextTimeResult final : public ServerPacket
+ {
+ public:
+ struct MailNextTimeEntry
+ {
+ MailNextTimeEntry(::Mail const* mail);
+
+ ObjectGuid SenderGuid;
+ Query::PlayerGuidLookupHint SenderHint;
+ float TimeLeft = 0.0f;
+ int32 AltSenderID = 0;
+ int8 AltSenderType = 0;
+ int32 StationeryID = 0;
+ };
+
+ MailQueryNextTimeResult() : ServerPacket(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, 8) { }
+
+ WorldPacket const* Write() override;
+
+ float NextMailTime = 0.0f;
+ std::vector<MailNextTimeEntry> Next;
+ };
+
+ class NotifyRecievedMail : ServerPacket
+ {
+ public:
+ NotifyRecievedMail() : ServerPacket(SMSG_NOTIFY_RECEIVED_MAIL, 4) { }
+
+ WorldPacket const* Write() override;
+
+ float Delay = 0.0f;
+ };
+
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailAttachedItem const& att);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailListEntry const& entry);
+
+#endif // MailPackets_h__
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index 4dfd01dfcaa..d9e48ca1205 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -106,6 +106,21 @@ void WorldPackets::Query::QueryPlayerName::Read()
_worldPacket >> Hint.NativeRealmAddress.Value;
}
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupHint const& lookupHint)
+{
+ data.WriteBit(lookupHint.VirtualRealmAddress.HasValue);
+ data.WriteBit(lookupHint.NativeRealmAddress.HasValue);
+ data.FlushBits();
+
+ if (lookupHint.VirtualRealmAddress.HasValue)
+ data << uint32(lookupHint.VirtualRealmAddress.Value);
+
+ if (lookupHint.NativeRealmAddress.HasValue)
+ data << uint32(lookupHint.NativeRealmAddress.Value);
+
+ return data;
+}
+
bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& guid, Player const* player /*= nullptr*/)
{
CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid);
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index 3907476129c..97648385a50 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -323,6 +323,7 @@ namespace WorldPackets
}
}
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupHint const& lookupHint);
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupData const& lookupData);
#endif // QueryPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 9b9bb079729..e2c097c8fc4 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -33,6 +33,7 @@
#include "Packets/InspectPackets.h"
#include "Packets/ItemPackets.h"
#include "Packets/LootPackets.h"
+#include "Packets/MailPackets.h"
#include "Packets/MiscPackets.h"
#include "Packets/MovementPackets.h"
#include "Packets/NPCPackets.h"
@@ -377,7 +378,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_GARRISON_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MAIL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList );
+ DEFINE_HANDLER(CMSG_GET_MAIL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailGetList, &WorldSession::HandleGetMailList);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -529,12 +530,12 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootRoll );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailCreateTextItem );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailDelete );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_MARK_AS_READ, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailMarkAsRead );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney );
+ DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem);
+ DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete);
+ DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead);
+ DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender);
+ DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem);
+ DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MEETINGSTONE_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_CHANNEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -690,7 +691,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_COUNTDOWN_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_XP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryXPOpcode );
DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::QueryInspectAchievements, &WorldSession::HandleQueryInspectAchievements);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryNextMailTime );
+ DEFINE_HANDLER(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailQueryNextMailTime, &WorldSession::HandleQueryNextMailTime);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_PETITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryTime, &WorldSession::HandleQueryTimeOpcode);
@@ -768,7 +769,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SELF_RES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSelfResOpcode );
DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SellItem, &WorldSession::HandleSellItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleContactListOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_MAIL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSendMail );
+ DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SERVERTIME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1477,8 +1478,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOSS_OF_CONTROL_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVES_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MASTER_LOOT_CANDIDATE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1594,7 +1595,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_WONT_TALK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1782,7 +1783,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_ITEM_PASSIVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 029d97ce9bd..d90cb1f1770 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -198,6 +198,19 @@ namespace WorldPackets
class LootMoney;
}
+ namespace Mail
+ {
+ class MailCreateTextItem;
+ class MailDelete;
+ class MailGetList;
+ class MailMarkAsRead;
+ class MailQueryNextMailTime;
+ class MailReturnToSender;
+ class MailTakeItem;
+ class MailTakeMoney;
+ class SendMail;
+ }
+
namespace Misc
{
class AreaTrigger;
@@ -937,16 +950,16 @@ class WorldSession
// Black Market
void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& packet);
- void HandleGetMailList(WorldPacket& recvData);
- void HandleSendMail(WorldPacket& recvData);
- void HandleMailTakeMoney(WorldPacket& recvData);
- void HandleMailTakeItem(WorldPacket& recvData);
- void HandleMailMarkAsRead(WorldPacket& recvData);
- void HandleMailReturnToSender(WorldPacket& recvData);
- void HandleMailDelete(WorldPacket& recvData);
+ void HandleGetMailList(WorldPackets::Mail::MailGetList& packet);
+ void HandleSendMail(WorldPackets::Mail::SendMail& packet);
+ void HandleMailTakeMoney(WorldPackets::Mail::MailTakeMoney& packet);
+ void HandleMailTakeItem(WorldPackets::Mail::MailTakeItem& packet);
+ void HandleMailMarkAsRead(WorldPackets::Mail::MailMarkAsRead& packet);
+ void HandleMailReturnToSender(WorldPackets::Mail::MailReturnToSender& packet);
+ void HandleMailDelete(WorldPackets::Mail::MailDelete& packet);
void HandleItemTextQuery(WorldPacket& recvData);
- void HandleMailCreateTextItem(WorldPacket& recvData);
- void HandleQueryNextMailTime(WorldPacket& recvData);
+ void HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextItem& packet);
+ void HandleQueryNextMailTime(WorldPackets::Mail::MailQueryNextMailTime& packet);
void HandleCancelChanneling(WorldPacket& recvData);
void SendItemPageInfo(ItemTemplate* itemProto);