/*
* 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 "ItemPackets.h"
#include "PacketOperators.h"
namespace WorldPackets::Item
{
void BuyBackItem::Read()
{
_worldPacket >> VendorGUID;
_worldPacket >> Slot;
}
void BuyItem::Read()
{
_worldPacket >> VendorGUID;
_worldPacket >> ContainerGUID;
_worldPacket >> Quantity;
_worldPacket >> Muid;
_worldPacket >> Slot;
_worldPacket >> As(ItemType);
_worldPacket >> Item;
}
WorldPacket const* BuySucceeded::Write()
{
_worldPacket << VendorGUID;
_worldPacket << uint32(Muid);
_worldPacket << int32(NewQuantity);
_worldPacket << uint32(QuantityBought);
return &_worldPacket;
}
WorldPacket const* BuyFailed::Write()
{
_worldPacket << VendorGUID;
_worldPacket << uint32(Muid);
_worldPacket << int32(Reason);
return &_worldPacket;
}
void GetItemPurchaseData::Read()
{
_worldPacket >> ItemGUID;
}
ByteBuffer& operator<<(ByteBuffer& data, ItemPurchaseRefundItem& refundItem)
{
data << int32(refundItem.ItemID);
data << int32(refundItem.ItemCount);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ItemPurchaseRefundCurrency& refundCurrency)
{
data << int32(refundCurrency.CurrencyID);
data << int32(refundCurrency.CurrencyCount);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ItemPurchaseContents& purchaseContents)
{
data << uint64(purchaseContents.Money);
for (uint32 i = 0; i < 5; ++i)
data << purchaseContents.Items[i];
for (uint32 i = 0; i < 5; ++i)
data << purchaseContents.Currencies[i];
return data;
}
WorldPacket const* SetItemPurchaseData::Write()
{
_worldPacket << ItemGUID;
_worldPacket << Contents;
_worldPacket << uint32(Flags);
_worldPacket << uint32(PurchaseTime);
return &_worldPacket;
}
void ItemPurchaseRefund::Read()
{
_worldPacket >> ItemGUID;
}
WorldPacket const* ItemPurchaseRefundResult::Write()
{
_worldPacket << ItemGUID;
_worldPacket << uint32(Result);
_worldPacket << OptionalInit(Contents);
_worldPacket.FlushBits();
if (Contents)
_worldPacket << *Contents;
return &_worldPacket;
}
WorldPacket const* ItemExpirePurchaseRefund::Write()
{
_worldPacket << ItemGUID;
return &_worldPacket;
}
void RepairItem::Read()
{
_worldPacket >> NpcGUID;
_worldPacket >> ItemGUID;
_worldPacket >> Bits<1>(UseGuildBank);
}
void SellItem::Read()
{
_worldPacket >> VendorGUID;
_worldPacket >> ItemGUID;
_worldPacket >> Amount;
}
WorldPacket const* ItemTimeUpdate::Write()
{
_worldPacket << ItemGuid;
_worldPacket << uint32(DurationLeft);
return &_worldPacket;
}
WorldPacket const* SetProficiency::Write()
{
_worldPacket << uint32(ProficiencyMask);
_worldPacket << uint8(ProficiencyClass);
return &_worldPacket;
}
WorldPacket const* InventoryChangeFailure::Write()
{
_worldPacket << int32(BagResult);
_worldPacket << Item[0];
_worldPacket << Item[1];
_worldPacket << uint8(ContainerBSlot); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_WRONG_BAG_TYPE_2
switch (BagResult)
{
case EQUIP_ERR_CANT_EQUIP_LEVEL_I:
case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW:
_worldPacket << int32(Level);
break;
case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM:
_worldPacket << SrcContainer;
_worldPacket << int32(SrcSlot);
_worldPacket << DstContainer;
break;
case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS:
case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS:
case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS:
_worldPacket << int32(LimitCategory);
break;
default:
break;
}
return &_worldPacket;
}
void SplitItem::Read()
{
_worldPacket >> Inv;
_worldPacket >> FromPackSlot;
_worldPacket >> FromSlot;
_worldPacket >> ToPackSlot;
_worldPacket >> ToSlot;
_worldPacket >> Quantity;
}
void SwapInvItem::Read()
{
_worldPacket >> Inv;
_worldPacket >> Slot2;
_worldPacket >> Slot1;
}
void SwapItem::Read()
{
_worldPacket >> Inv;
_worldPacket >> ContainerSlotB;
_worldPacket >> ContainerSlotA;
_worldPacket >> SlotB;
_worldPacket >> SlotA;
}
void AutoEquipItem::Read()
{
_worldPacket >> Inv;
_worldPacket >> PackSlot;
_worldPacket >> Slot;
}
void AutoEquipItemSlot::Read()
{
_worldPacket >> Inv;
_worldPacket >> Item;
_worldPacket >> ItemDstSlot;
}
void AutoStoreBagItem::Read()
{
_worldPacket >> Inv;
_worldPacket >> ContainerSlotB;
_worldPacket >> ContainerSlotA;
_worldPacket >> SlotA;
}
void DestroyItem::Read()
{
_worldPacket >> Count;
_worldPacket >> ContainerId;
_worldPacket >> SlotNum;
}
WorldPacket const* SellResponse::Write()
{
_worldPacket << VendorGUID;
_worldPacket << Size(ItemGUIDs);
_worldPacket << int32(Reason);
for (ObjectGuid const& itemGuid : ItemGUIDs)
_worldPacket << itemGuid;
return &_worldPacket;
}
WorldPacket const* ItemPushResult::Write()
{
_worldPacket << PlayerGUID;
_worldPacket << uint8(Slot);
_worldPacket << int32(SlotInBag);
_worldPacket << int32(ProxyItemID);
_worldPacket << int32(Quantity);
_worldPacket << int32(QuantityInInventory);
_worldPacket << int32(QuantityInQuestLog);
_worldPacket << int32(EncounterID);
_worldPacket << int32(BattlePetSpeciesID);
_worldPacket << int32(BattlePetBreedID);
_worldPacket << uint8(BattlePetBreedQuality);
_worldPacket << int32(BattlePetLevel);
_worldPacket << ItemGUID;
_worldPacket << Size(Toasts);
for (UiEventToast const& uiEventToast : Toasts)
_worldPacket << uiEventToast;
_worldPacket << Bits<1>(Pushed);
_worldPacket << Bits<1>(Created);
_worldPacket << Bits<1>(FakeQuestItem);
_worldPacket << Bits<3>(ChatNotifyType);
_worldPacket << Bits<1>(IsBonusRoll);
_worldPacket << Bits<1>(IsPersonalLoot);
_worldPacket << OptionalInit(CraftingData);
_worldPacket << OptionalInit(FirstCraftOperationID);
_worldPacket.FlushBits();
_worldPacket << Item;
if (FirstCraftOperationID)
_worldPacket << uint32(*FirstCraftOperationID);
if (CraftingData)
_worldPacket << *CraftingData;
return &_worldPacket;
}
void ReadItem::Read()
{
_worldPacket >> PackSlot;
_worldPacket >> Slot;
}
WorldPacket const* ReadItemResultFailed::Write()
{
_worldPacket << Item;
_worldPacket << uint32(Delay);
_worldPacket << Bits<2>(Subcode);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* ReadItemResultOK::Write()
{
_worldPacket << Item;
return &_worldPacket;
}
void WrapItem::Read()
{
_worldPacket >> Inv;
}
void CancelTempEnchantment::Read()
{
_worldPacket >> Slot;
}
WorldPacket const* ItemCooldown::Write()
{
_worldPacket << ItemGuid;
_worldPacket << uint32(SpellID);
_worldPacket << uint32(Cooldown);
return &_worldPacket;
}
WorldPacket const* EnchantmentLog::Write()
{
_worldPacket << Owner;
_worldPacket << Caster;
_worldPacket << ItemGUID;
_worldPacket << int32(ItemID);
_worldPacket << int32(Enchantment);
_worldPacket << int32(EnchantSlot);
return &_worldPacket;
}
WorldPacket const* ItemEnchantTimeUpdate::Write()
{
_worldPacket << ItemGuid;
_worldPacket << uint32(DurationLeft);
_worldPacket << uint32(Slot);
_worldPacket << OwnerGuid;
return &_worldPacket;
}
void UseCritterItem::Read()
{
_worldPacket >> ItemGuid;
}
void SocketGems::Read()
{
_worldPacket >> ItemGuid;
for (ObjectGuid& gemGuid : GemItem)
_worldPacket >> gemGuid;
}
WorldPacket const* SocketGemsSuccess::Write()
{
_worldPacket << Item;
return &_worldPacket;
}
void RemoveNewItem::Read()
{
_worldPacket >> ItemGuid;
}
void ChangeBagSlotFlag::Read()
{
_worldPacket >> BagIndex;
_worldPacket >> As(FlagToChange);
_worldPacket >> Bits<1>(On);
}
void SetBackpackAutosortDisabled::Read()
{
_worldPacket >> Bits<1>(Disable);
}
void SetBackpackSellJunkDisabled::Read()
{
_worldPacket >> Bits<1>(Disable);
}
void SetBankAutosortDisabled::Read()
{
_worldPacket >> Bits<1>(Disable);
}
WorldPacket const* AddItemPassive::Write()
{
_worldPacket << int32(SpellID);
return &_worldPacket;
}
WorldPacket const* RemoveItemPassive::Write()
{
_worldPacket << int32(SpellID);
return &_worldPacket;
}
WorldPacket const* SendItemPassives::Write()
{
_worldPacket << Size(SpellID);
if (!SpellID.empty())
_worldPacket.append(SpellID.data(), SpellID.size());
return &_worldPacket;
}
}