/*
* 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 "NPCPackets.h"
#include "PacketOperators.h"
namespace WorldPackets::NPC
{
ByteBuffer& operator<<(ByteBuffer& data, TreasureItem const& treasureItem)
{
data << Bits<1>(treasureItem.Type);
data << int32(treasureItem.ID);
data << int32(treasureItem.Quantity);
data << int8(treasureItem.ItemContext);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, TreasureLootList const& treasureLootList)
{
data << Size(treasureLootList.Items);
for (TreasureItem const& treasureItem : treasureLootList.Items)
data << treasureItem;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ClientGossipOptions const& gossipOption)
{
data << int32(gossipOption.GossipOptionID);
data << uint32(gossipOption.OptionNPC);
data << int8(gossipOption.OptionFlags);
data << uint64(gossipOption.OptionCost);
data << uint32(gossipOption.OptionLanguage);
data << int32(gossipOption.Flags);
data << int32(gossipOption.OrderIndex);
data << SizedString::BitsSize<12>(gossipOption.Text);
data << SizedString::BitsSize<12>(gossipOption.Confirm);
data << Bits<2>(gossipOption.Status);
data << OptionalInit(gossipOption.SpellID);
data << OptionalInit(gossipOption.OverrideIconID);
data << SizedCString::BitsSize<8>(gossipOption.FailureDescription);
data.FlushBits();
data << gossipOption.Treasure;
data << SizedString::Data(gossipOption.Text);
data << SizedString::Data(gossipOption.Confirm);
if (gossipOption.SpellID)
data << int32(*gossipOption.SpellID);
if (gossipOption.OverrideIconID)
data << int32(*gossipOption.OverrideIconID);
data << SizedCString::Data(gossipOption.FailureDescription);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ClientGossipText const& gossipText)
{
data << int32(gossipText.QuestID);
data << int32(gossipText.ContentTuningID);
data << int32(gossipText.QuestType);
data << int32(gossipText.Unused1102);
data.append(gossipText.QuestFlags);
data << Bits<1>(gossipText.Repeatable);
data << Bits<1>(gossipText.ResetByScheduler);
data << Bits<1>(gossipText.Important);
data << Bits<1>(gossipText.Meta);
data << SizedString::BitsSize<9>(gossipText.QuestTitle);
data.FlushBits();
data << SizedString::Data(gossipText.QuestTitle);
return data;
}
void Hello::Read()
{
_worldPacket >> Unit;
}
WorldPacket const* NPCInteractionOpenResult::Write()
{
_worldPacket << Npc;
_worldPacket << int32(InteractionType);
_worldPacket << Bits<1>(Success);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* GossipMessage::Write()
{
_worldPacket << GossipGUID;
_worldPacket << int32(GossipID);
_worldPacket << int32(LfgDungeonsID);
_worldPacket << int32(FriendshipFactionID);
_worldPacket << Size(GossipOptions);
_worldPacket << Size(GossipText);
_worldPacket << OptionalInit(RandomTextID);
_worldPacket << OptionalInit(BroadcastTextID);
_worldPacket.FlushBits();
for (ClientGossipOptions const& options : GossipOptions)
_worldPacket << options;
if (RandomTextID)
_worldPacket << int32(*RandomTextID);
if (BroadcastTextID)
_worldPacket << int32(*BroadcastTextID);
for (ClientGossipText const& text : GossipText)
_worldPacket << text;
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, VendorItem const& item)
{
data << uint64(item.Price);
data << uint32(item.MuID);
data << int32(item.Type);
data << int32(item.StackCount);
data << int32(item.Quantity);
data << int32(item.ExtendedCostID);
data << int32(item.PlayerConditionFailed);
data << Bits<1>(item.Locked);
data << Bits<1>(item.DoNotFilterOnVendor);
data << Bits<1>(item.Refundable);
data.FlushBits();
data << item.Item;
return data;
}
WorldPacket const* VendorInventory::Write()
{
_worldPacket << Vendor;
_worldPacket << int32(Reason);
_worldPacket << Size(Items);
for (VendorItem const& item : Items)
_worldPacket << item;
return &_worldPacket;
}
WorldPacket const* TrainerList::Write()
{
_worldPacket << TrainerGUID;
_worldPacket << int8(TrainerType);
_worldPacket << uint32(TrainerID);
_worldPacket << Size(Spells);
for (TrainerListSpell const& spell : Spells)
{
_worldPacket << int32(spell.SpellID);
_worldPacket << uint32(spell.MoneyCost);
_worldPacket << uint32(spell.ReqSkillLine);
_worldPacket << uint32(spell.ReqSkillRank);
_worldPacket.append(spell.ReqAbility.data(), spell.ReqAbility.size());
_worldPacket << uint8(spell.Usable);
_worldPacket << uint8(spell.ReqLevel);
}
_worldPacket << SizedString::BitsSize<11>(Greeting);
_worldPacket.FlushBits();
_worldPacket << SizedString::Data(Greeting);
return &_worldPacket;
}
void GossipSelectOption::Read()
{
_worldPacket >> GossipUnit;
_worldPacket >> GossipID;
_worldPacket >> GossipOptionID;
_worldPacket >> SizedString::BitsSize<8>(PromotionCode);
_worldPacket >> SizedString::Data(PromotionCode);
}
WorldPacket const* GossipOptionNPCInteraction::Write()
{
_worldPacket << GossipGUID;
_worldPacket << int32(GossipNpcOptionID);
_worldPacket << OptionalInit(FriendshipFactionID);
_worldPacket.FlushBits();
if (FriendshipFactionID)
_worldPacket << int32(*FriendshipFactionID);
return &_worldPacket;
}
WorldPacket const* GossipComplete::Write()
{
_worldPacket << Bits<1>(SuppressSound);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* GossipPOI::Write()
{
_worldPacket << int32(ID);
_worldPacket << int32(Flags);
_worldPacket << Pos;
_worldPacket << int32(Icon);
_worldPacket << int32(Importance);
_worldPacket << int32(WMOGroupID);
_worldPacket << SizedString::BitsSize<6>(Name);
_worldPacket.FlushBits();
_worldPacket << SizedString::Data(Name);
return &_worldPacket;
}
void SpiritHealerActivate::Read()
{
_worldPacket >> Healer;
}
void TabardVendorActivate::Read()
{
_worldPacket >> Vendor;
_worldPacket >> Type;
}
void TrainerBuySpell::Read()
{
_worldPacket >> TrainerGUID;
_worldPacket >> TrainerID;
_worldPacket >> SpellID;
}
WorldPacket const* TrainerBuyFailed::Write()
{
_worldPacket << TrainerGUID;
_worldPacket << SpellID;
_worldPacket << TrainerFailedReason;
return &_worldPacket;
}
void RequestStabledPets::Read()
{
_worldPacket >> StableMaster;
}
void SetPetSlot::Read()
{
_worldPacket >> PetNumber;
_worldPacket >> DestSlot;
_worldPacket >> StableMaster;
}
}