/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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 .
*/
#include "MailPackets.h"
#include "GameTime.h"
#include "Item.h"
#include "Mail.h"
#include "PacketOperators.h"
#include "Player.h"
namespace WorldPackets::Mail
{
MailAttachedItem::MailAttachedItem(::Item const* item, uint8 pos)
{
Position = pos;
AttachID = item->GetGUID().GetCounter();
Item.Initialize(item);
Count = item->GetCount();
Charges = item->GetSpellCharges();
MaxDurability = item->m_itemData->MaxDurability;
Durability = item->m_itemData->Durability;
Unlocked = !item->IsLocked();
for (uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; j++)
{
EnchantmentSlot slot = EnchantmentSlot(j);
if (!item->GetEnchantmentId(slot))
continue;
Enchants.emplace_back(item->GetEnchantmentId(slot), item->GetEnchantmentDuration(slot), item->GetEnchantmentCharges(slot), j);
}
uint8 i = 0;
for (UF::SocketedGem const& gemData : item->m_itemData->Gems)
{
if (gemData.ItemID)
{
Item::ItemGemData gem;
gem.Slot = i;
gem.Item.Initialize(&gemData);
Gems.push_back(gem);
}
++i;
}
}
ByteBuffer& operator<<(ByteBuffer& data, MailAttachedItem const& att)
{
data << uint8(att.Position);
data << uint64(att.AttachID);
data << int32(att.Count);
data << int32(att.Charges);
data << uint32(att.MaxDurability);
data << int32(att.Durability);
data << att.Item;
data << BitsSize<4>(att.Enchants);
data << BitsSize<2>(att.Gems);
data << Bits<1>(att.Unlocked);
data.FlushBits();
for (Item::ItemGemData const& gem : att.Gems)
data << gem;
for (Item::ItemEnchantData const& en : att.Enchants)
data << en;
return data;
}
MailListEntry::MailListEntry(::Mail const* mail, Player* player)
{
MailID = mail->messageID;
SenderType = mail->messageType;
switch (mail->messageType)
{
case MAIL_NORMAL:
SenderCharacter = ObjectGuid::Create(mail->sender);
break;
case MAIL_CREATURE:
case MAIL_GAMEOBJECT:
case MAIL_AUCTION:
case MAIL_CALENDAR:
case MAIL_BLACKMARKET:
case MAIL_COMMERCE_AUCTION:
case MAIL_AUCTION_2:
case MAIL_ARTISANS_CONSORTIUM:
AltSenderID = mail->sender;
break;
}
Cod = mail->COD;
StationeryID = mail->stationery;
SentMoney = mail->money;
Flags = mail->checked;
DaysLeft = float(mail->expire_time - GameTime::GetGameTime()) / float(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, MailListEntry const& entry)
{
data << uint64(entry.MailID);
data << uint32(entry.SenderType);
data << uint64(entry.Cod);
data << int32(entry.StationeryID);
data << uint64(entry.SentMoney);
data << int32(entry.Flags);
data << float(entry.DaysLeft);
data << int32(entry.MailTemplateID);
data << WorldPackets::Size(entry.Attachments);
switch (entry.SenderType)
{
case MAIL_NORMAL:
data << entry.SenderCharacter;
break;
case MAIL_AUCTION:
case MAIL_CREATURE:
case MAIL_GAMEOBJECT:
case MAIL_CALENDAR:
case MAIL_BLACKMARKET:
case MAIL_COMMERCE_AUCTION:
case MAIL_AUCTION_2:
case MAIL_ARTISANS_CONSORTIUM:
data << int32(entry.AltSenderID);
break;
default:
break;
}
data << SizedString::BitsSize<8>(entry.Subject);
data << SizedString::BitsSize<13>(entry.Body);
data.FlushBits();
for (MailAttachedItem const& att : entry.Attachments)
data << att;
data << SizedString::Data(entry.Subject);
data << SizedString::Data(entry.Body);
return data;
}
void MailGetList::Read()
{
_worldPacket >> Mailbox;
}
WorldPacket const* MailListResult::Write()
{
_worldPacket << Size(Mails);
_worldPacket << int32(TotalNumRecords);
for (MailListEntry const& mail : Mails)
_worldPacket << mail;
return &_worldPacket;
}
void MailCreateTextItem::Read()
{
_worldPacket >> Mailbox;
_worldPacket >> MailID;
}
ByteBuffer& operator>>(ByteBuffer& data, SendMail::StructSendMail::MailAttachment& attachment)
{
data >> attachment.AttachPosition;
data >> attachment.ItemGUID;
return data;
}
void SendMail::Read()
{
_worldPacket >> Info.Mailbox;
_worldPacket >> Info.StationeryID;
_worldPacket >> Info.SendMoney;
_worldPacket >> Info.Cod;
_worldPacket >> SizedString::BitsSize<9>(Info.Target);
_worldPacket >> SizedString::BitsSize<9>(Info.Subject);
_worldPacket >> SizedString::BitsSize<11>(Info.Body);
_worldPacket >> BitsSize<5>(Info.Attachments);
_worldPacket >> SizedString::Data(Info.Target);
_worldPacket >> SizedString::Data(Info.Subject);
_worldPacket >> SizedString::Data(Info.Body);
for (StructSendMail::MailAttachment& att : Info.Attachments)
_worldPacket >> att;
}
void MailReturnToSender::Read()
{
_worldPacket >> MailID;
_worldPacket >> SenderGUID;
}
WorldPacket const* MailCommandResult::Write()
{
_worldPacket << uint64(MailID);
_worldPacket << int32(Command);
_worldPacket << int32(ErrorCode);
_worldPacket << int32(BagResult);
_worldPacket << uint64(AttachID);
_worldPacket << int32(QtyInInventory);
return &_worldPacket;
}
void MailMarkAsRead::Read()
{
_worldPacket >> Mailbox;
_worldPacket >> MailID;
}
void MailDelete::Read()
{
_worldPacket >> MailID;
_worldPacket >> DeleteReason;
}
void MailTakeItem::Read()
{
_worldPacket >> Mailbox;
_worldPacket >> MailID;
_worldPacket >> AttachID;
}
void MailTakeMoney::Read()
{
_worldPacket >> Mailbox;
_worldPacket >> MailID;
_worldPacket >> Money;
}
MailQueryNextTimeResult::MailNextTimeEntry::MailNextTimeEntry(::Mail const* mail)
{
switch (mail->messageType)
{
case MAIL_NORMAL:
SenderGuid = ObjectGuid::Create(mail->sender);
break;
case MAIL_AUCTION:
case MAIL_CREATURE:
case MAIL_GAMEOBJECT:
case MAIL_CALENDAR:
case MAIL_BLACKMARKET:
case MAIL_COMMERCE_AUCTION:
case MAIL_AUCTION_2:
case MAIL_ARTISANS_CONSORTIUM:
AltSenderID = mail->sender;
break;
default:
break;
}
TimeLeft = mail->deliver_time - GameTime::GetGameTime();
AltSenderType = mail->messageType;
StationeryID = mail->stationery;
}
WorldPacket const* MailQueryNextTimeResult::Write()
{
_worldPacket << float(NextMailTime);
_worldPacket << Size(Next);
for (MailNextTimeEntry const& entry : Next)
{
_worldPacket << entry.SenderGuid;
_worldPacket << float(entry.TimeLeft);
_worldPacket << int32(entry.AltSenderID);
_worldPacket << int32(entry.AltSenderType);
_worldPacket << int32(entry.StationeryID);
}
return &_worldPacket;
}
WorldPacket const* NotifyReceivedMail::Write()
{
_worldPacket << float(Delay);
return &_worldPacket;
}
}