TrinityCore
MailPackets.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "MailPackets.h"
19#include "GameTime.h"
20#include "Item.h"
21#include "Mail.h"
22#include "Player.h"
23
25{
26 Position = pos;
27 AttachID = item->GetGUID().GetCounter();
28 Item.Initialize(item);
29 Count = item->GetCount();
30 Charges = item->GetSpellCharges();
31 MaxDurability = item->m_itemData->MaxDurability;
32 Durability = item->m_itemData->Durability;
33 Unlocked = !item->IsLocked();
34
35 for (uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; j++)
36 {
38 if (!item->GetEnchantmentId(slot))
39 continue;
40
41 Enchants.emplace_back(item->GetEnchantmentId(slot), item->GetEnchantmentDuration(slot), item->GetEnchantmentCharges(slot), j);
42 }
43
44 uint8 i = 0;
45 for (UF::SocketedGem const& gemData : item->m_itemData->Gems)
46 {
47 if (gemData.ItemID)
48 {
50 gem.Slot = i;
51 gem.Item.Initialize(&gemData);
52 Gems.push_back(gem);
53 }
54 ++i;
55 }
56}
57
59{
60 data << uint8(att.Position);
61 data << uint64(att.AttachID);
62 data << int32(att.Count);
63 data << int32(att.Charges);
64 data << uint32(att.MaxDurability);
65 data << int32(att.Durability);
66 data << att.Item;
67 data.WriteBits(att.Enchants.size(), 4);
68 data.WriteBits(att.Gems.size(), 2);
69 data.WriteBit(att.Unlocked);
70 data.FlushBits();
71
72 for (WorldPackets::Item::ItemGemData const& gem : att.Gems)
73 data << gem;
74
76 data << en;
77
78 return data;
79}
80
82{
83 MailID = mail->messageID;
84 SenderType = mail->messageType;
85
86 switch (mail->messageType)
87 {
88 case MAIL_NORMAL:
89 SenderCharacter = ObjectGuid::Create<HighGuid::Player>(mail->sender);
90 break;
91 case MAIL_CREATURE:
92 case MAIL_GAMEOBJECT:
93 case MAIL_AUCTION:
94 case MAIL_CALENDAR:
97 case MAIL_AUCTION_2:
99 AltSenderID = mail->sender;
100 break;
101 }
102
103 Cod = mail->COD;
104 StationeryID = mail->stationery;
105 SentMoney = mail->money;
106 Flags = mail->checked;
107 DaysLeft = float(mail->expire_time - GameTime::GetGameTime()) / float(DAY);
108 MailTemplateID = mail->mailTemplateId;
109 Subject = mail->subject;
110 Body = mail->body;
111
112 for (uint8 i = 0; i < mail->items.size(); i++)
113 {
114 if (::Item* item = player->GetMItem(mail->items[i].item_guid))
115 Attachments.emplace_back(item, i);
116 }
117}
118
120{
121 data << uint64(entry.MailID);
122 data << uint32(entry.SenderType);
123 data << uint64(entry.Cod);
124 data << int32(entry.StationeryID);
125 data << uint64(entry.SentMoney);
126 data << int32(entry.Flags);
127 data << float(entry.DaysLeft);
128 data << int32(entry.MailTemplateID);
129 data << uint32(entry.Attachments.size());
130
131 switch (entry.SenderType)
132 {
133 case MAIL_NORMAL:
134 data << entry.SenderCharacter;
135 break;
136 case MAIL_AUCTION:
137 case MAIL_CREATURE:
138 case MAIL_GAMEOBJECT:
139 case MAIL_CALENDAR:
140 case MAIL_BLACKMARKET:
142 case MAIL_AUCTION_2:
144 data << int32(entry.AltSenderID);
145 break;
146 default:
147 break;
148 }
149
150 data.WriteBits(entry.Subject.size(), 8);
151 data.WriteBits(entry.Body.size(), 13);
152 data.FlushBits();
153
155 data << att;
156
157 data.WriteString(entry.Subject);
158 data.WriteString(entry.Body);
159
160 return data;
161}
162
164{
165 _worldPacket >> Mailbox;
166}
167
169{
170 _worldPacket << uint32(Mails.size());
171 _worldPacket << int32(TotalNumRecords);
172
173 for (MailListEntry const& mail : Mails)
174 _worldPacket << mail;
175
176 return &_worldPacket;
177}
178
180{
181 _worldPacket >> Mailbox;
182 _worldPacket >> MailID;
183}
184
186{
187 data >> attachment.AttachPosition;
188 data >> attachment.ItemGUID;
189 return data;
190}
191
193{
194 _worldPacket >> Info.Mailbox;
195 _worldPacket >> Info.StationeryID;
196 _worldPacket >> Info.SendMoney;
197 _worldPacket >> Info.Cod;
198
199 uint32 targetLength = _worldPacket.ReadBits(9);
200 uint32 subjectLength = _worldPacket.ReadBits(9);
201 uint32 bodyLength = _worldPacket.ReadBits(11);
202
203 Info.Attachments.resize(_worldPacket.ReadBits(5));
204
205 Info.Target = _worldPacket.ReadString(targetLength);
206 Info.Subject = _worldPacket.ReadString(subjectLength);
207 Info.Body = _worldPacket.ReadString(bodyLength);
208
209 for (StructSendMail::MailAttachment& att : Info.Attachments)
210 _worldPacket >> att;
211}
212
214{
215 _worldPacket >> MailID;
216 _worldPacket >> SenderGUID;
217}
218
220{
221 _worldPacket << uint64(MailID);
222 _worldPacket << int32(Command);
223 _worldPacket << int32(ErrorCode);
224 _worldPacket << int32(BagResult);
225 _worldPacket << uint64(AttachID);
226 _worldPacket << int32(QtyInInventory);
227
228 return &_worldPacket;
229}
230
232{
233 _worldPacket >> Mailbox;
234 _worldPacket >> MailID;
235}
236
238{
239 _worldPacket >> MailID;
240 _worldPacket >> DeleteReason;
241}
242
244{
245 _worldPacket >> Mailbox;
246 _worldPacket >> MailID;
247 _worldPacket >> AttachID;
248}
249
251{
252 _worldPacket >> Mailbox;
253 _worldPacket >> MailID;
254 _worldPacket >> Money;
255}
256
258{
259 switch (mail->messageType)
260 {
261 case MAIL_NORMAL:
262 SenderGuid = ObjectGuid::Create<HighGuid::Player>(mail->sender);
263 break;
264 case MAIL_AUCTION:
265 case MAIL_CREATURE:
266 case MAIL_GAMEOBJECT:
267 case MAIL_CALENDAR:
268 case MAIL_BLACKMARKET:
270 case MAIL_AUCTION_2:
272 AltSenderID = mail->sender;
273 break;
274 default:
275 break;
276 }
277
278 TimeLeft = mail->deliver_time - GameTime::GetGameTime();
279 AltSenderType = mail->messageType;
280 StationeryID = mail->stationery;
281}
282
284{
285 _worldPacket << float(NextMailTime);
286 _worldPacket << int32(Next.size());
287
288 for (auto const& entry : Next)
289 {
290 _worldPacket << entry.SenderGuid;
291 _worldPacket << float(entry.TimeLeft);
292 _worldPacket << int32(entry.AltSenderID);
293 _worldPacket << int8(entry.AltSenderType);
294 _worldPacket << int32(entry.StationeryID);
295 }
296
297 return &_worldPacket;
298}
299
301{
302 _worldPacket << float(Delay);
303
304 return &_worldPacket;
305}
@ DAY
Definition: Common.h:31
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
EnchantmentSlot
Definition: ItemDefines.h:178
@ MAX_INSPECTED_ENCHANTMENT_SLOT
Definition: ItemDefines.h:188
ByteBuffer & operator>>(ByteBuffer &data, WorldPackets::Mail::SendMail::StructSendMail::MailAttachment &attachment)
@ MAIL_AUCTION
Definition: Mail.h:40
@ MAIL_BLACKMARKET
Definition: Mail.h:44
@ MAIL_GAMEOBJECT
Definition: Mail.h:42
@ MAIL_CREATURE
Definition: Mail.h:41
@ MAIL_COMMERCE_AUCTION
Definition: Mail.h:45
@ MAIL_AUCTION_2
Definition: Mail.h:46
@ MAIL_CALENDAR
Definition: Mail.h:43
@ MAIL_NORMAL
Definition: Mail.h:39
@ MAIL_ARTISANS_CONSORTIUM
Definition: Mail.h:47
void WriteString(std::string const &str)
Definition: ByteBuffer.h:500
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
void FlushBits()
Definition: ByteBuffer.h:155
Definition: Item.h:170
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:298
int32 GetSpellCharges(uint8 index=0) const
Definition: Item.h:314
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition: Item.h:299
bool IsLocked() const
Definition: Item.h:251
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition: Item.h:300
uint32 GetCount() const
Definition: Item.h:273
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
Definition: Item.h:449
LowType GetCounter() const
Definition: ObjectGuid.h:293
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Item * GetMItem(ObjectGuid::LowType id)
Definition: Player.cpp:21856
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
time_t GetGameTime()
Definition: GameTime.cpp:44
ByteBuffer & operator<<(ByteBuffer &data, Movement::MonsterSplineFilterKey const &monsterSplineFilterKey)
Definition: Mail.h:175
uint64 messageID
Definition: Mail.h:176
uint8 messageType
Definition: Mail.h:177
uint64 money
Definition: Mail.h:188
uint64 COD
Definition: Mail.h:189
time_t expire_time
Definition: Mail.h:186
uint8 stationery
Definition: Mail.h:178
ObjectGuid::LowType sender
Definition: Mail.h:180
std::string subject
Definition: Mail.h:182
std::string body
Definition: Mail.h:183
std::vector< MailItemInfo > items
Definition: Mail.h:184
time_t deliver_time
Definition: Mail.h:187
uint32 checked
Definition: Mail.h:190
uint16 mailTemplateId
Definition: Mail.h:179
UpdateField< int32, 0, 1 > ItemID
Definition: UpdateFields.h:109
void Initialize(::Item const *item)
std::vector< Item::ItemEnchantData > Enchants
Definition: MailPackets.h:44
std::vector< Item::ItemGemData > Gems
Definition: MailPackets.h:45
MailAttachedItem(::Item const *item, uint8 pos)
Definition: MailPackets.cpp:24
MailListEntry(::Mail const *mail, ::Player *player)
Definition: MailPackets.cpp:81
std::vector< MailAttachedItem > Attachments
Definition: MailPackets.h:64