37 TC_LOG_ERROR(
"network",
"HandleSplitItemOpcode - Invalid ItemCount ({})", splitItem.
Inv.
Items.size());
41 TC_LOG_DEBUG(
"network",
"HandleSplitItemOpcode: receive FromPackSlot: {}, FromSlot: {}, ToPackSlot: {}, ToSlot: {}, Quantity: {}",
71 if (swapInvItem.
Inv.
Items.size() != 2)
73 TC_LOG_ERROR(
"network",
"HandleSwapInvItemOpcode - Invalid itemCount ({})", swapInvItem.
Inv.
Items.size());
77 TC_LOG_DEBUG(
"network",
"HandleSwapInvItemOpcode: receive Slot1: {}, Slot2: {}",
98 TC_LOG_DEBUG(
"network",
"HandleSwapInvItemOpcode - Unit ({}) not found or you can't interact with him.",
_player->
PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
104 TC_LOG_DEBUG(
"network",
"HandleSwapInvItemOpcode - Unit ({}) not found or you can't interact with him.",
_player->
PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
124 if (!item || item->
GetPos() != srcPos || srcPos == dstPos)
138 TC_LOG_DEBUG(
"network",
"HandleSwapItem: receive ContainerSlotA: {}, SlotA: {}, ContainerSlotB: {}, SlotB: {}",
162 TC_LOG_DEBUG(
"network",
"HandleSwapItem - Unit ({}) not found or you can't interact with him.",
_player->
PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
168 TC_LOG_DEBUG(
"network",
"HandleSwapItem - Unit ({}) not found or you can't interact with him.",
_player->
PlayerTalkClass->GetInteractionData().SourceGuid.ToString());
177 if (autoEquipItem.
Inv.
Items.size() != 1)
179 TC_LOG_ERROR(
"network",
"HandleAutoEquipItemOpcode - Invalid itemCount ({})", autoEquipItem.
Inv.
Items.size());
183 TC_LOG_DEBUG(
"network",
"HandleAutoEquipItemOpcode: receive PackSlot: {}, Slot: {}",
315 TC_LOG_DEBUG(
"network",
"HandleDestroyItemOpcode: receive ContainerId: {}, SlotNum: {}, Count: {}",
344 if (destroyItem.
Count)
376 TC_LOG_INFO(
"network",
"STORAGE: Unable to read item");
386 TC_LOG_DEBUG(
"network",
"WORLD: Received CMSG_SELL_ITEM: Vendor {}, Item {}, Amount: {}",
392 TC_LOG_DEBUG(
"network",
"WORLD: HandleSellItemOpcode - {} not found or you can not interact with him.", sellItem.
VendorGUID);
450 std::vector<Item*> junkItems;
468 if (bagIndex < _player->m_activePlayerData->BagSlotFlags.size()
475 junkItems.push_back(item);
480 auto itr = junkItems.begin();
481 auto end = junkItems.end();
485 for (; itr != end && !sellError; ++itr)
548 bag = bagItem->GetSlot();
561 TC_LOG_DEBUG(
"network",
"WORLD: received wrong itemType ({}) in HandleBuyItemOpcode", packet.
ItemType);
580 TC_LOG_DEBUG(
"network",
"WORLD: SendListInventory - {} not found or you can not interact with him.", vendorGuid.
ToString());
602 packet.
Items.resize(rawItemCount);
606 for (
uint32 slot = 0; slot < rawItemCount; ++slot)
636 if (leftInStock == 0)
642 TC_LOG_DEBUG(
"condition",
"SendListInventory: conditions not met for creature entry {} item {}", vendor->
GetEntry(), vendorItem->
item);
648 basePrice = iece->Money;
656 price = std::max(
uint64(1), price);
658 item.
MuID = slot + 1;
677 if (!currencyTemplate)
683 item.
MuID = slot + 1;
698 packet.
Items.resize(count);
709 TC_LOG_ERROR(
"network",
"HandleAutoStoreBagItemOpcode - Invalid itemCount ({})", packet.
Inv.
Items.size());
713 TC_LOG_DEBUG(
"network",
"HandleAutoStoreBagItemOpcode: receive ContainerSlotA: {}, SlotA: {}, ContainerSlotB: {}",
748 if (dest.size() == 1 && dest[0].pos == src)
762 enchantmentLog.
Owner = owner;
763 enchantmentLog.
Caster = caster;
765 enchantmentLog.
ItemID = itemId;
797 TC_LOG_DEBUG(
"network",
"HandleWrapItem - Receive giftContainerSlot = {}, giftSlot = {}, itemContainerSlot = {}, itemSlot = {}", giftContainerSlot, giftSlot, itemContainerSlot, itemSlot);
935 memset(gems, 0,
sizeof(gems));
937 memset(gemData, 0,
sizeof(gemData));
939 memset(gemProperties, 0,
sizeof(gemProperties));
941 memset(oldGemData, 0,
sizeof(oldGemData));
947 gemData[i].
ItemId = gem->GetEntry();
948 gemData[i].
Context = gem->m_itemData->Context;
949 for (std::size_t b = 0; b < gem->GetBonusListIDs().size() && b < 16; ++b)
950 gemData[i].BonusListIDs[b] = gem->GetBonusListIDs()[b];
952 gemProperties[i] =
sGemPropertiesStore.LookupEntry(gem->GetTemplate()->GetGemProperties());
955 oldGemData[i] = itemTarget->
GetGem(i);
959 uint32 firstPrismatic = 0;
960 while (firstPrismatic < MAX_GEM_SOCKETS && itemTarget->GetSocketColor(firstPrismatic))
965 if (!gemProperties[i])
978 if (i != firstPrismatic)
995 if (!(acceptableGemTypeMask & gemProperties[i]->Type))
1024 else if (oldGemData[j])
1036 int32 limit_newcount = 0;
1037 if (gems[i]->GetItemLimitCategory())
1047 if (gems[i]->GetItemLimitCategory() == gems[j]->GetItemLimitCategory())
1050 else if (oldGemData[j])
1061 if (gems[i]->GetItemLimitCategory() == oldGemBonus.
LimitCategory)
1101 gemScalingLevel = fixedLevel;
1103 itemTarget->
SetGem(i, &gemData[i], gemScalingLevel);
1105 if (gemProperties[i] && gemProperties[i]->EnchantId)
1118 if (childItem->IsEquipped())
1120 childItem->CopyArtifactDataFromParent(itemTarget);
1121 if (childItem->IsEquipped())
1126 if (SocketBonusActivated ^ SocketBonusToBeActivated)
1198 if (!isUsingBankCommand)
1269 if (changeBagSlotFlag.
On)
@ CREATURE_FLAG_EXTRA_NO_SELL_VENDOR
DB2Storage< ItemLimitCategoryEntry > sItemLimitCategoryStore("ItemLimitCategory.db2", &ItemLimitCategoryLoadInfo::Instance)
DB2Storage< ItemExtendedCostEntry > sItemExtendedCostStore("ItemExtendedCost.db2", &ItemExtendedCostLoadInfo::Instance)
DB2Storage< CurrencyTypesEntry > sCurrencyTypesStore("CurrencyTypes.db2", &CurrencyTypesLoadInfo::Instance)
DB2Storage< GemPropertiesEntry > sGemPropertiesStore("GemProperties.db2", &GemPropertiesLoadInfo::Instance)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
@ PRISMATIC_ENCHANTMENT_SLOT
@ EQUIP_ERR_CANT_WRAP_BAGS
@ EQUIP_ERR_DROP_BOUND_ITEM
@ EQUIP_ERR_ITEM_NOT_FOUND
@ EQUIP_ERR_CANT_WRAP_BOUND
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED
@ EQUIP_ERR_INTERNAL_BAG_ERROR
@ EQUIP_ERR_CANT_WRAP_EQUIPPED
@ EQUIP_ERR_CANT_WRAP_STACKABLE
@ EQUIP_ERR_CANT_WRAP_WRAPPED
@ EQUIP_ERR_CANT_WRAP_UNIQUE
@ BUY_ERR_NOT_ENOUGHT_MONEY
@ ITEM_MODIFIER_TIMEWALKER_LEVEL
@ SELL_ERR_CANT_FIND_VENDOR
@ SELL_ERR_CANT_SELL_TO_THIS_MERCHANT
@ SELL_ERR_CANT_FIND_ITEM
@ ITEM_VENDOR_TYPE_CURRENCY
int32 const SocketColorToGemTypeMask[31]
@ ITEM_FLAG2_FACTION_HORDE
@ ITEM_FLAG2_FACTION_ALLIANCE
@ ITEM_FIELD_FLAG_NEW_ITEM
@ ITEM_FIELD_FLAG_WRAPPED
@ ITEM_SPELLTRIGGER_ON_LEARN
@ ITEM_FLAG_NO_USER_DESTROY
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
@ ITEM_PURPLE_RIBBONED_WRAPPING_PAPER
@ ITEM_BLUE_RIBBONED_WRAPPING_PAPER
@ ITEM_PURPLE_RIBBONED_HOLIDAY_GIFT
@ ITEM_BLUE_RIBBONED_GIFT
@ ITEM_GREEN_RIBBONED_HOLIDAY_GIFT
@ ITEM_GREEN_RIBBONED_WRAPPING_PAPER
@ ITEM_BLUE_RIBBONED_HOLIDAY_GIFT
@ ITEM_RED_RIBBONED_WRAPPING_PAPER
@ ITEM_BLUE_RIBBONED_HOLIDAY_WRAPPING_PAPER
void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
std::vector< ItemPosCount > ItemPosCountVec
@ INVENTORY_SLOT_BAG_START
#define INVENTORY_SLOT_BAG_0
@ SPELL_AURA_MOD_VENDOR_ITEMS_PRICES
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
T CalculatePct(T base, U pct)
ObjectGuid const & GetGUID() const
static uint16 RollPetBreed(uint32 species)
static uint32 SelectPetDisplay(BattlePetSpeciesEntry const *speciesEntry)
static BattlePetSpeciesEntry const * GetBattlePetSpeciesBySpell(uint32 spellId)
void AddPet(uint32 species, uint32 display, uint16 breed, BattlePetBreedQuality quality, uint16 level=1)
static BattlePetBreedQuality GetDefaultPetQuality(uint32 species)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
void SetHomePosition(float x, float y, float z, float o)
VendorItemData const * GetVendorItems() const
CreatureTemplate const * GetCreatureTemplate() const
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
CreatureMovementData const & GetMovementTemplate() const
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
std::span< ItemEffectEntry const *const > GetEffects() const
uint32 GetSocketColor(uint32 index) const
virtual void SaveToDB(CharacterDatabaseTransaction trans)
void ReplaceAllItemFlags(ItemFieldFlags flags)
void RemoveItemFlag(ItemFieldFlags flags)
uint32 GetEnchantmentId(EnchantmentSlot slot) const
uint32 GetQuality() const
UF::SocketedGem const * GetGem(uint16 slot) const
ObjectGuid GetCreator() const
ItemTemplate const * GetTemplate() const
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
void SetGem(uint16 slot, ItemDynamicFieldGems const *gem, uint32 gemScalingLevel)
ItemUpdateState GetState() const
bool HasItemFlag(ItemFieldFlags flag) const
uint32 GetItemLimitCategory() const
ObjectGuid GetOwnerGUID() const
bool IsRefundable() const
bool GemsFitSockets() const
ObjectGuid GetGiftCreator() const
void ClearEnchantment(EnchantmentSlot slot)
void ClearSoulboundTradeable(Player *currentOwner)
ObjectGuid GetChildItem() const
uint32 GetMaxStackCount() const
void SetGiftCreator(ObjectGuid guid)
void SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges, ObjectGuid caster=ObjectGuid::Empty)
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
void SetEntry(uint32 entry)
bool IsValidPos(uint16 pos, bool explicit_pos) const
void SendEquipError(InventoryResult msg, Item const *item1=nullptr, Item const *item2=nullptr, uint32 itemId=0) const
static bool IsEquipmentPos(uint16 pos)
InventoryResult CanUnequipItem(uint16 src, bool swap) const
void ToggleMetaGemsActive(uint8 exceptslot, bool apply)
bool ModifyMoney(int64 amount, bool sendError=true)
void AutoUnequipChildItem(Item *parentItem)
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, NPCFlags npcFlags, NPCFlags2 npcFlags2) const
bool ForEachItem(ItemSearchLocation location, T callback) const
Iterate over each item in the player storage.
void RemoveBagSlotFlag(uint32 bagIndex, EnumFlag< BagSlotFlags > flags)
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
void SplitItem(uint16 src, uint16 dst, uint32 count)
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
InventoryResult CanEquipChildItem(Item *parentItem) const
Item * GetChildItemByGuid(ObjectGuid guid) const
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
bool IsBackpackSellJunkDisabled() const
void SetBackpackSellJunkDisabled(bool disabled)
void _ApplyItemMods(Item *item, uint8 slot, bool apply, bool updateItemAuras=true)
uint8 GetItemLimitCategoryQuantity(ItemLimitCategoryEntry const *limitEntry) const
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
float GetReputationPriceDiscount(Creature const *creature) const
ObjectGuid const & GetLootGUID() const
void SetBackpackAutoSortDisabled(bool disabled)
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true, bool reagentBankOnly=false) const
void SendSellError(SellResult msg, Creature *creature, ObjectGuid guid) const
EnumFlag< BagSlotFlags > GetBagSlotFlags(uint32 bagIndex) const
void SwapItem(uint16 src, uint16 dst)
void ApplyItemDependentAuras(Item *item, bool apply)
void RemoveTradeableItem(Item *item)
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
void EquipChildItem(uint8 parentBag, uint8 parentSlot, Item *parentItem)
Item * GetItemByPos(uint16 pos) const
void DestroyItem(uint8 bag, uint8 slot, bool update)
static bool IsInventoryPos(uint16 pos)
Optional< SellResult > SellItemToVendor(Item *item, uint32 amount)
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param) const
void SetBankAutoSortDisabled(bool disabled)
void SendRefundInfo(Item *item)
void AutoUnequipOffhandIfNeed(bool force=false)
Optional< SellResult > CanSellItemToVendor(Item const *item, uint32 amount) const
void ItemAddedQuestCheck(uint32 entry, uint32 count, Optional< bool > boundItemFlagRequirement={}, bool *hadBoundItemObjective=nullptr)
bool IsGameMaster() const
Item * EquipItem(uint16 pos, Item *pItem, bool update)
static bool IsBagPos(uint16 pos)
Item * GetItemFromBuyBackSlot(uint32 slot)
bool BuyCurrencyFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorSlot, uint32 currency, uint32 count)
static bool IsBankPos(uint16 pos)
void RemoveItem(uint8 bag, uint8 slot, bool update)
void RefundItem(Item *item)
void SendMessageToSet(WorldPacket const *data, bool self) const override
Item * GetItemByGuid(ObjectGuid guid) const
bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint32 count, uint8 bag, uint8 slot)
std::unique_ptr< PlayerMenu > PlayerTalkClass
void SetBagSlotFlag(uint32 bagIndex, EnumFlag< BagSlotFlags > flags)
bool HasEnoughMoney(uint64 amount) const
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
uint32 GetClassMask() const
void PauseMovement(uint32 timer=0, uint8 slot=0, bool forced=true)
float GetTotalAuraModifier(AuraType auraType) const
BagSlotFlags FlagToChange
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::array< ObjectGuid, MAX_ITEM_PROTO_SOCKETS > GemItem
WorldPacket const * Write() override
std::vector< VendorItem > Items
void HandleReadItem(WorldPackets::Item::ReadItem &readItem)
void HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem &autoEquipItem)
void HandleSellItemOpcode(WorldPackets::Item::SellItem const &sellItem)
void HandleSplitItemOpcode(WorldPackets::Item::SplitItem &splitItem)
void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment &cancelTempEnchantment)
void HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const &setBackpackAutosortDisabled)
void HandleBuybackItem(WorldPackets::Item::BuyBackItem &packet)
void HandleGetItemPurchaseData(WorldPackets::Item::GetItemPurchaseData &packet)
void HandleSellAllJunkItems(WorldPackets::Item::SellAllJunkItems const &sellAllJunkItems)
void HandleSortBags(WorldPackets::Item::SortBags &sortBags)
std::string GetPlayerInfo() const
void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem &packet)
Player * GetPlayer() const
void HandleSortBankBags(WorldPackets::Item::SortBankBags &sortBankBags)
void HandleUseCritterItem(WorldPackets::Item::UseCritterItem &packet)
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
void HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem &swapInvItem)
void HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem &removeNewItem)
void HandleSocketGems(WorldPackets::Item::SocketGems &socketGems)
void HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag const &changeBagSlotFlag)
void HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem &destroyItem)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleSortAccountBankBags(WorldPackets::Item::SortAccountBankBags &sortBankBags)
void SendListInventory(ObjectGuid guid)
void HandleSwapItem(WorldPackets::Item::SwapItem &swapItem)
void HandleWrapItem(WorldPackets::Item::WrapItem &packet)
void HandleSetBackpackSellJunkDisabled(WorldPackets::Item::SetBackpackSellJunkDisabled const &setBackpackSellJunkDisabled)
bool CanUseBank(ObjectGuid bankerGUID=ObjectGuid::Empty) const
void HandleSetBankAutosortDisabled(WorldPackets::Item::SetBankAutosortDisabled const &setBankAutosortDisabled)
void HandleAutoEquipItemSlotOpcode(WorldPackets::Item::AutoEquipItemSlot &autoEquipItemSlot)
void HandleListInventoryOpcode(WorldPackets::NPC::Hello &packet)
void HandleBuyItemOpcode(WorldPackets::Item::BuyItem &packet)
void HandleItemRefund(WorldPackets::Item::ItemPurchaseRefund &packet)
BattlePets::BattlePetMgr * GetBattlePetMgr() const
void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint32 itemId, uint32 enchantId, uint32 enchantSlot)
void AddBonusList(uint32 bonusListId)
void Initialize(ItemTemplate const *proto)
uint32 GetInteractionPauseTimer() const
uint32 GetBuyCount() const
int32 GetAllowableClass() const
uint32 GetPageText() const
uint32 GetMaxStackSize() const
uint32 GetBuyPrice() const
ItemBondingType GetBonding() const
bool HasFlag(ItemFlags flag) const
uint32 GetSocketBonus() const
uint32 GetMaxCount() const
constexpr void GetPosition(float &x, float &y) const
UpdateFieldArray< uint16, 16, 3, 4 > BonusListIDs
UpdateField< int32, 0, 1 > ItemID
uint32 GetItemCount() const
VendorItem const * GetItem(uint32 slot) const
std::vector< int32 > BonusListIDs
std::vector< InvItem > Items
Optional< ItemBonuses > ItemBonus
WorldPackets::Item::ItemInstance Item
int32 PlayerConditionFailed