/*
* 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 "LootPackets.h"
#include "PacketOperators.h"
namespace WorldPackets::Loot
{
static ByteBuffer& operator<<(ByteBuffer& data, LootItemData const& lootItem)
{
data << Bits<2>(lootItem.Type);
data << Bits<3>(lootItem.UIType);
data << Bits<1>(lootItem.CanTradeToTapList);
data.FlushBits();
data << lootItem.Loot; // WorldPackets::Item::ItemInstance
data << uint32(lootItem.Quantity);
data << uint8(lootItem.LootItemType);
data << uint8(lootItem.LootListID);
return data;
}
static ByteBuffer& operator<<(ByteBuffer& data, LootCurrency const& lootCurrency)
{
data << uint32(lootCurrency.CurrencyID);
data << uint32(lootCurrency.Quantity);
data << uint8(lootCurrency.LootListID);
data << Bits<3>(lootCurrency.UIType);
data.FlushBits();
return data;
}
void LootUnit::Read()
{
_worldPacket >> Unit;
}
WorldPacket const* LootResponse::Write()
{
_worldPacket << Owner;
_worldPacket << LootObj;
_worldPacket << uint8(FailureReason);
_worldPacket << uint8(AcquireReason);
_worldPacket << uint8(_LootMethod);
_worldPacket << uint8(Threshold);
_worldPacket << uint32(Coins);
_worldPacket << Size(Items);
_worldPacket << Size(Currencies);
_worldPacket << Bits<1>(Acquired);
_worldPacket << Bits<1>(AELooting);
_worldPacket << Bits<1>(SuppressError);
_worldPacket.FlushBits();
for (LootItemData const& item : Items)
_worldPacket << item;
for (LootCurrency const& currency : Currencies)
_worldPacket << currency;
return &_worldPacket;
}
void LootItem::Read()
{
_worldPacket >> Size(Loot);
for (LootRequest& lootRequest : Loot)
{
_worldPacket >> lootRequest.Object;
_worldPacket >> lootRequest.LootListID;
}
_worldPacket >> Bits<1>(IsSoftInteract);
}
void MasterLootItem::Read()
{
_worldPacket >> Size(Loot);
_worldPacket >> Target;
for (LootRequest& lootRequest : Loot)
{
_worldPacket >> lootRequest.Object;
_worldPacket >> lootRequest.LootListID;
}
}
WorldPacket const* LootRemoved::Write()
{
_worldPacket << Owner;
_worldPacket << LootObj;
_worldPacket << LootListID;
return &_worldPacket;
}
void LootRelease::Read()
{
_worldPacket >> Unit;
}
void LootMoney::Read()
{
_worldPacket >> Bits<1>(IsSoftInteract);
}
WorldPacket const* LootMoneyNotify::Write()
{
_worldPacket << uint64(Money);
_worldPacket << uint64(MoneyMod);
_worldPacket << Bits<1>(SoleLooter);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* CoinRemoved::Write()
{
_worldPacket << LootObj;
return &_worldPacket;
}
void LootRoll::Read()
{
_worldPacket >> LootObj;
_worldPacket >> LootListID;
_worldPacket >> RollType;
}
WorldPacket const* LootReleaseResponse::Write()
{
_worldPacket << LootObj;
_worldPacket << Owner;
return &_worldPacket;
}
WorldPacket const* LootList::Write()
{
_worldPacket << Owner;
_worldPacket << LootObj;
_worldPacket << OptionalInit(Master);
_worldPacket << OptionalInit(RoundRobinWinner);
_worldPacket.FlushBits();
if (Master)
_worldPacket << *Master;
if (RoundRobinWinner)
_worldPacket << *RoundRobinWinner;
return &_worldPacket;
}
void SetLootSpecialization::Read()
{
_worldPacket >> SpecID;
}
WorldPacket const* StartLootRoll::Write()
{
_worldPacket << LootObj;
_worldPacket << int32(MapID);
_worldPacket << RollTime;
_worldPacket << uint8(ValidRolls);
_worldPacket.append(LootRollIneligibleReason.data(), LootRollIneligibleReason.size());
_worldPacket << uint8(Method);
_worldPacket << int32(DungeonEncounterID);
_worldPacket << Item;
return &_worldPacket;
}
WorldPacket const* LootRollBroadcast::Write()
{
_worldPacket << LootObj;
_worldPacket << Player;
_worldPacket << int32(Roll);
_worldPacket << uint8(RollType);
_worldPacket << int32(DungeonEncounterID);
_worldPacket << Item;
_worldPacket << Bits<1>(Autopassed);
_worldPacket << Bits<1>(OffSpec);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* LootRollWon::Write()
{
_worldPacket << LootObj;
_worldPacket << Winner;
_worldPacket << int32(Roll);
_worldPacket << uint8(RollType);
_worldPacket << int32(DungeonEncounterID);
_worldPacket << Item;
_worldPacket << Bits<1>(MainSpec);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* LootAllPassed::Write()
{
_worldPacket << LootObj;
_worldPacket << int32(DungeonEncounterID);
_worldPacket << Item;
return &_worldPacket;
}
WorldPacket const* LootRollsComplete::Write()
{
_worldPacket << LootObj;
_worldPacket << uint8(LootListID);
_worldPacket << int32(DungeonEncounterID);
return &_worldPacket;
}
WorldPacket const* MasterLootCandidateList::Write()
{
_worldPacket << LootObj;
_worldPacket << Size(Players);
for (ObjectGuid const& player : Players)
_worldPacket << player;
return &_worldPacket;
}
WorldPacket const* AELootTargets::Write()
{
_worldPacket << uint32(Count);
return &_worldPacket;
}
}