/*
* 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 .
*/
#ifndef TRINITYCORE_ITEM_PACKETS_H
#define TRINITYCORE_ITEM_PACKETS_H
#include "Packet.h"
#include "CraftingPacketsCommon.h"
#include "DBCEnums.h"
#include "ItemDefines.h"
#include "ItemPacketsCommon.h"
#include "ObjectGuid.h"
#include "Optional.h"
#include
struct VoidStorageItem;
enum class BagSlotFlags : uint32;
namespace WorldPackets
{
namespace Item
{
class BuyBackItem final : public ClientPacket
{
public:
explicit BuyBackItem(WorldPacket&& packet) : ClientPacket(CMSG_BUY_BACK_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid VendorGUID;
uint32 Slot = 0;
};
class BuyItem final : public ClientPacket
{
public:
explicit BuyItem(WorldPacket&& packet) : ClientPacket(CMSG_BUY_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid VendorGUID;
ItemInstance Item;
uint32 Muid = 0u;
uint32 Slot = 0u;
ItemVendorType ItemType = ITEM_VENDOR_TYPE_NONE;
int32 Quantity = 0;
ObjectGuid ContainerGUID;
};
class BuySucceeded final : ServerPacket
{
public:
explicit BuySucceeded() : ServerPacket(SMSG_BUY_SUCCEEDED, 16 + 4 + 4 + 4 + 4) { }
WorldPacket const* Write() override;
ObjectGuid VendorGUID;
uint32 Muid = 0u;
uint32 QuantityBought = 0u;
int32 NewQuantity = 0;
};
class BuyFailed final : ServerPacket
{
public:
explicit BuyFailed() : ServerPacket(SMSG_BUY_FAILED, 16 + 4 + 1) { }
WorldPacket const* Write() override;
ObjectGuid VendorGUID;
uint32 Muid = 0u;
BuyResult Reason = BUY_ERR_CANT_FIND_ITEM;
};
class GetItemPurchaseData final : public ClientPacket
{
public:
explicit GetItemPurchaseData(WorldPacket&& packet) : ClientPacket(CMSG_GET_ITEM_PURCHASE_DATA, std::move(packet)) { }
void Read() override;
ObjectGuid ItemGUID;
};
struct ItemPurchaseRefundItem
{
int32 ItemID = 0;
int32 ItemCount = 0;
};
struct ItemPurchaseRefundCurrency
{
int32 CurrencyID = 0;
int32 CurrencyCount = 0;
};
struct ItemPurchaseContents
{
uint64 Money = 0;
ItemPurchaseRefundItem Items[5] = { };
ItemPurchaseRefundCurrency Currencies[5] = { };
};
class SetItemPurchaseData final : public ServerPacket
{
public:
explicit SetItemPurchaseData() : ServerPacket(SMSG_SET_ITEM_PURCHASE_DATA, 4 + 4 + 4 + 5 * (4 + 4) + 5 * (4 + 4) + 16) { }
WorldPacket const* Write() override;
uint32 PurchaseTime = 0;
uint32 Flags = 0;
ItemPurchaseContents Contents;
ObjectGuid ItemGUID;
};
class ItemPurchaseRefund final : public ClientPacket
{
public:
explicit ItemPurchaseRefund(WorldPacket&& packet) : ClientPacket(CMSG_ITEM_PURCHASE_REFUND, std::move(packet)) { }
void Read() override;
ObjectGuid ItemGUID;
};
class ItemPurchaseRefundResult final : public ServerPacket
{
public:
explicit ItemPurchaseRefundResult() : ServerPacket(SMSG_ITEM_PURCHASE_REFUND_RESULT, 1 + 4 + 5 * (4 + 4) + 5 * (4 + 4) + 16) { }
WorldPacket const* Write() override;
uint32 Result = 0;
ObjectGuid ItemGUID;
Optional Contents;
};
class ItemExpirePurchaseRefund final : public ServerPacket
{
public:
explicit ItemExpirePurchaseRefund() : ServerPacket(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, 16) { }
WorldPacket const* Write() override;
ObjectGuid ItemGUID;
};
class RepairItem final : public ClientPacket
{
public:
explicit RepairItem(WorldPacket&& packet) : ClientPacket(CMSG_REPAIR_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid NpcGUID;
ObjectGuid ItemGUID;
bool UseGuildBank = false;
};
class SellItem final : public ClientPacket
{
public:
explicit SellItem(WorldPacket&& packet) : ClientPacket(CMSG_SELL_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid VendorGUID;
ObjectGuid ItemGUID;
uint32 Amount = 0;
};
class ItemTimeUpdate final : public ServerPacket
{
public:
explicit ItemTimeUpdate() : ServerPacket(SMSG_ITEM_TIME_UPDATE, 8 + 4) { }
WorldPacket const* Write() override;
ObjectGuid ItemGuid;
uint32 DurationLeft = 0;
};
class SetProficiency final : public ServerPacket
{
public:
explicit SetProficiency() : ServerPacket(SMSG_SET_PROFICIENCY, 5) { }
WorldPacket const* Write() override;
uint32 ProficiencyMask = 0;
uint8 ProficiencyClass = 0;
};
class InventoryChangeFailure final : public ServerPacket
{
public:
explicit InventoryChangeFailure() : ServerPacket(SMSG_INVENTORY_CHANGE_FAILURE, 22) { }
WorldPacket const* Write() override;
int32 BagResult = EQUIP_ERR_OK; /// @see enum InventoryResult
uint8 ContainerBSlot = 0;
ObjectGuid SrcContainer;
ObjectGuid DstContainer;
int32 SrcSlot = 0;
int32 LimitCategory = 0;
int32 Level = 0;
ObjectGuid Item[2];
};
class SplitItem final : public ClientPacket
{
public:
explicit SplitItem(WorldPacket&& packet) : ClientPacket(CMSG_SPLIT_ITEM, std::move(packet)) { }
void Read() override;
uint8 ToSlot = 0;
uint8 ToPackSlot = 0;
uint8 FromPackSlot = 0;
int32 Quantity = 0;
InvUpdate Inv;
uint8 FromSlot = 0;
};
class SwapInvItem final : public ClientPacket
{
public:
explicit SwapInvItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_INV_ITEM, std::move(packet)) { }
void Read() override;
InvUpdate Inv;
uint8 Slot1 = 0; /// Source Slot
uint8 Slot2 = 0; /// Destination Slot
};
class SwapItem final : public ClientPacket
{
public:
explicit SwapItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_ITEM, std::move(packet)) { }
void Read() override;
InvUpdate Inv;
uint8 SlotA = 0;
uint8 ContainerSlotB = 0;
uint8 SlotB = 0;
uint8 ContainerSlotA = 0;
};
class AutoEquipItem final : public ClientPacket
{
public:
explicit AutoEquipItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTO_EQUIP_ITEM, std::move(packet)) { }
void Read() override;
uint8 Slot = 0;
InvUpdate Inv;
uint8 PackSlot = 0;
};
class AutoEquipItemSlot final : public ClientPacket
{
public:
explicit AutoEquipItemSlot(WorldPacket&& packet) : ClientPacket(CMSG_AUTO_EQUIP_ITEM_SLOT, std::move(packet)) { }
void Read() override;
ObjectGuid Item;
uint8 ItemDstSlot = 0;
InvUpdate Inv;
};
class AutoStoreBagItem final : public ClientPacket
{
public:
explicit AutoStoreBagItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTO_STORE_BAG_ITEM, std::move(packet)) { }
void Read() override;
uint8 ContainerSlotB = 0;
InvUpdate Inv;
uint8 ContainerSlotA = 0;
uint8 SlotA = 0;
};
class DestroyItem final : public ClientPacket
{
public:
explicit DestroyItem(WorldPacket&& packet) : ClientPacket(CMSG_DESTROY_ITEM, std::move(packet)) { }
void Read() override;
uint32 Count = 0;
uint8 SlotNum = 0;
uint8 ContainerId = 0;
};
class SellResponse final : public ServerPacket
{
public:
explicit SellResponse() : ServerPacket(SMSG_SELL_RESPONSE, 16 + 16 + 1) { }
WorldPacket const* Write() override;
ObjectGuid VendorGUID;
std::vector ItemGUIDs;
SellResult Reason = SELL_ERR_UNK;
};
class ItemPushResult final : public ServerPacket
{
public:
enum DisplayType
{
DISPLAY_TYPE_HIDDEN = 0,
DISPLAY_TYPE_NORMAL = 1,
DISPLAY_TYPE_ENCOUNTER_LOOT = 2
};
explicit ItemPushResult() : ServerPacket(SMSG_ITEM_PUSH_RESULT, 16 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 16 + 1 + 1 + 1 + 1) { }
WorldPacket const* Write() override;
ObjectGuid PlayerGUID;
uint8 Slot = 0;
int32 SlotInBag = 0;
ItemInstance Item;
int32 ProxyItemID = 0; // Item ID used for updating quest progress
// only set if different than real ID (similar to CreatureTemplate.KillCredit)
int32 Quantity = 0;
int32 QuantityInInventory = 0;
int32 QuantityInQuestLog = 0;
int32 EncounterID = 0;
int32 BattlePetSpeciesID = 0;
int32 BattlePetBreedID = 0;
uint8 BattlePetBreedQuality = 0;
int32 BattlePetLevel = 0;
ObjectGuid ItemGUID;
std::vector Toasts;
Optional CraftingData;
Optional FirstCraftOperationID;
bool Pushed = false;
DisplayType ChatNotifyType = DISPLAY_TYPE_HIDDEN;
bool Created = false;
bool FakeQuestItem = false;
bool IsBonusRoll = false;
bool IsPersonalLoot = false;
};
class ReadItem final : public ClientPacket
{
public:
explicit ReadItem(WorldPacket&& packet) : ClientPacket(CMSG_READ_ITEM, std::move(packet)) { }
void Read() override;
uint8 PackSlot = 0;
uint8 Slot = 0;
};
class ReadItemResultFailed final : public ServerPacket
{
public:
explicit ReadItemResultFailed() : ServerPacket(SMSG_READ_ITEM_RESULT_FAILED, 16 + 1 + 4) { }
WorldPacket const* Write() override;
ObjectGuid Item;
uint8 Subcode = 0;
uint32 Delay = 0;
};
class ReadItemResultOK final : public ServerPacket
{
public:
explicit ReadItemResultOK() : ServerPacket(SMSG_READ_ITEM_RESULT_OK, 16) { }
WorldPacket const* Write() override;
ObjectGuid Item;
};
class WrapItem final : public ClientPacket
{
public:
explicit WrapItem(WorldPacket&& packet) : ClientPacket(CMSG_WRAP_ITEM, std::move(packet)) { }
void Read() override;
InvUpdate Inv;
};
class CancelTempEnchantment final : public ClientPacket
{
public:
explicit CancelTempEnchantment(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_TEMP_ENCHANTMENT, std::move(packet)) { }
void Read() override;
int32 Slot = 0;
};
class ItemCooldown final : public ServerPacket
{
public:
explicit ItemCooldown() : ServerPacket(SMSG_ITEM_COOLDOWN, 24) { }
WorldPacket const* Write() override;
ObjectGuid ItemGuid;
uint32 SpellID = 0;
uint32 Cooldown = 0;
};
class EnchantmentLog final : public ServerPacket
{
public:
explicit EnchantmentLog() : ServerPacket(SMSG_ENCHANTMENT_LOG, 0) { }
WorldPacket const* Write() override;
ObjectGuid Owner;
ObjectGuid Caster;
ObjectGuid ItemGUID;
int32 ItemID = 0;
int32 Enchantment = 0;
int32 EnchantSlot = 0;
};
class ItemEnchantTimeUpdate final : public ServerPacket
{
public:
explicit ItemEnchantTimeUpdate() : ServerPacket(SMSG_ITEM_ENCHANT_TIME_UPDATE, 40) { }
WorldPacket const* Write() override;
ObjectGuid OwnerGuid;
ObjectGuid ItemGuid;
uint32 DurationLeft = 0;
uint32 Slot = 0;
};
class UseCritterItem final : public ClientPacket
{
public:
explicit UseCritterItem(WorldPacket&& packet) : ClientPacket(CMSG_USE_CRITTER_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid ItemGuid;
};
class SocketGems final : public ClientPacket
{
public:
explicit SocketGems(WorldPacket&& packet) : ClientPacket(CMSG_SOCKET_GEMS, std::move(packet)) { }
void Read() override;
ObjectGuid ItemGuid;
std::array GemItem = { };
};
class SocketGemsSuccess final : public ServerPacket
{
public:
explicit SocketGemsSuccess() : ServerPacket(SMSG_SOCKET_GEMS_SUCCESS, 16 + 4 * 3 + 4) { }
WorldPacket const* Write() override;
ObjectGuid Item;
};
class SortAccountBankBags final : public ClientPacket
{
public:
explicit SortAccountBankBags(WorldPacket&& packet) : ClientPacket(CMSG_SORT_ACCOUNT_BANK_BAGS, std::move(packet)) { }
void Read() override { }
};
class SortBags final : public ClientPacket
{
public:
SortBags(WorldPacket&& packet) : ClientPacket(CMSG_SORT_BAGS, std::move(packet)) { }
void Read() override { }
};
class SortBankBags final : public ClientPacket
{
public:
explicit SortBankBags(WorldPacket&& packet) : ClientPacket(CMSG_SORT_BANK_BAGS, std::move(packet)) { }
void Read() override { }
};
class BagCleanupFinished final : public ServerPacket
{
public:
explicit BagCleanupFinished() : ServerPacket(SMSG_BAG_CLEANUP_FINISHED, 0) { }
WorldPacket const* Write() override { return &_worldPacket; }
};
class RemoveNewItem final : public ClientPacket
{
public:
explicit RemoveNewItem(WorldPacket&& packet) : ClientPacket(CMSG_REMOVE_NEW_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid ItemGuid;
};
class InventoryFullOverflow final : public ServerPacket
{
public:
explicit InventoryFullOverflow() : ServerPacket(SMSG_INVENTORY_FULL_OVERFLOW, 0) { }
WorldPacket const* Write() override { return &_worldPacket; }
};
class ChangeBagSlotFlag final : public ClientPacket
{
public:
explicit ChangeBagSlotFlag(WorldPacket&& packet) : ClientPacket(CMSG_CHANGE_BAG_SLOT_FLAG, std::move(packet)) { }
void Read() override;
uint8 BagIndex = 0;
BagSlotFlags FlagToChange = { };
bool On = false;
};
class ChangeBankBagSlotFlag final : public ClientPacket
{
public:
explicit ChangeBankBagSlotFlag(WorldPacket&& packet) : ClientPacket(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, std::move(packet)) { }
void Read() override;
uint8 BagIndex = 0;
BagSlotFlags FlagToChange = { };
bool On = false;
};
class SetBackpackAutosortDisabled final : public ClientPacket
{
public:
explicit SetBackpackAutosortDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, std::move(packet)) { }
void Read() override;
bool Disable = false;
};
class SetBackpackSellJunkDisabled final : public ClientPacket
{
public:
explicit SetBackpackSellJunkDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BACKPACK_SELL_JUNK_DISABLED, std::move(packet)) { }
void Read() override;
bool Disable = false;
};
class SetBankAutosortDisabled final : public ClientPacket
{
public:
explicit SetBankAutosortDisabled(WorldPacket&& packet) : ClientPacket(CMSG_SET_BANK_AUTOSORT_DISABLED, std::move(packet)) { }
void Read() override;
bool Disable = false;
};
class AddItemPassive final : public ServerPacket
{
public:
explicit AddItemPassive() : ServerPacket(SMSG_ADD_ITEM_PASSIVE, 4) { }
WorldPacket const* Write() override;
int32 SpellID = 0;
};
class RemoveItemPassive final : public ServerPacket
{
public:
explicit RemoveItemPassive() : ServerPacket(SMSG_REMOVE_ITEM_PASSIVE, 4) { }
WorldPacket const* Write() override;
int32 SpellID = 0;
};
class SendItemPassives final : public ServerPacket
{
public:
explicit SendItemPassives() : ServerPacket(SMSG_SEND_ITEM_PASSIVES, 4) { }
WorldPacket const* Write() override;
std::vector SpellID;
};
}
}
#endif // TRINITYCORE_ITEM_PACKETS_H