36 uint8 srcbag, srcslot, dstbag, dstslot;
39 recvData >> srcbag >> srcslot >> dstbag >> dstslot >> count;
42 uint16 src = ((srcbag << 8) | srcslot);
43 uint16 dst = ((dstbag << 8) | dstslot);
69 uint8 srcslot, dstslot;
71 recvData >> dstslot >> srcslot;
75 if (srcslot == dstslot)
112 recvData >> itemguid >> dstslot;
121 if (!item || item->
GetPos() == dstpos)
130 uint8 dstbag, dstslot, srcbag, srcslot;
132 recvData >> dstbag >> dstslot >> srcbag >> srcslot;
135 uint16 src = ((srcbag << 8) | srcslot);
136 uint16 dst = ((dstbag << 8) | dstslot);
172 uint8 srcbag, srcslot;
174 recvData >> srcbag >> srcslot;
271 uint8 bag, slot, count, data1, data2, data3;
273 recvData >> bag >> slot >> count >> data1 >> data2 >> data3;
276 uint16 pos = (bag << 8) | slot;
328 TC_LOG_DEBUG(
"network",
"WORLD: CMSG_ITEM_QUERY_SINGLE - NO item INFO! (ENTRY: {})", query.
ItemID);
338 recvData >> bag >> slot;
355 TC_LOG_INFO(
"network",
"STORAGE: Unable to read item");
367 TC_LOG_DEBUG(
"network",
"WORLD: Received CMSG_SELL_ITEM");
371 recvData >> vendorguid >> itemguid >> count;
379 TC_LOG_DEBUG(
"network",
"WORLD: HandleSellItemOpcode - {} not found or you can not interact with him.", vendorguid.
ToString());
450 if (count < pItem->GetCount())
455 TC_LOG_ERROR(
"network",
"WORLD: HandleSellItemOpcode - could not create clone of item {}; count = {}", pItem->
GetEntry(), count);
492 TC_LOG_DEBUG(
"network",
"WORLD: Received CMSG_BUYBACK_ITEM");
496 recvData >> vendorguid >> slot;
501 TC_LOG_DEBUG(
"network",
"WORLD: HandleBuybackItem - Unit ({}) not found or you can not interact with him.", vendorguid.
ToString());
539 TC_LOG_DEBUG(
"network",
"WORLD: Received CMSG_BUY_ITEM_IN_SLOT");
544 recvData >> vendorguid >> item >> slot >> bagguid >> bagslot >> count;
556 bag = bagItem->GetSlot();
565 TC_LOG_DEBUG(
"network",
"WORLD: Received CMSG_BUY_ITEM");
570 recvData >> vendorguid >> item >> slot >> count >> unk1;
590 TC_LOG_DEBUG(
"network",
"WORLD: Recvd CMSG_LIST_INVENTORY");
600 TC_LOG_DEBUG(
"network",
"WORLD: SendListInventory - {} not found or you can not interact with him.", vendorGuid.
ToString());
631 size_t countPos = data.
wpos();
632 data <<
uint8(count);
636 for (
uint8 slot = 0; slot < itemCount; ++slot)
658 if (leftInStock == 0)
664 TC_LOG_DEBUG(
"condition",
"SendListInventory: conditions not met for creature entry {} item {}", vendor->
GetEntry(), item->item);
669 int32 price = item->IsGoldRequired(itemTemplate) ?
uint32(floor(itemTemplate->
BuyPrice * discountMod)) : 0;
672 data <<
uint32(item->item);
674 data <<
int32(leftInStock);
678 data <<
uint32(item->ExtendedCost);
699 uint8 srcbag, srcslot, dstbag;
701 recvData >> srcbag >> srcslot >> dstbag;
736 if (dest.size() == 1 && dest[0].pos == src)
780 data <<
uint32(enchantId);
801 TC_LOG_DEBUG(
"network",
"WORLD: CMSG_ITEM_NAME_QUERY {}", itemid);
805 std::string Name = pName->
name;
821 TC_LOG_DEBUG(
"network",
"Received opcode CMSG_WRAP_ITEM");
823 uint8 gift_bag, gift_slot, item_bag, item_slot;
825 recvData >> gift_bag >> gift_slot;
826 recvData >> item_bag >> item_slot;
828 TC_LOG_DEBUG(
"network",
"WRAP: receive gift_bag = {}, gift_slot = {}, item_bag = {}, item_slot = {}", gift_bag, gift_slot, item_bag, item_slot);
907 case 5042: item->
SetEntry(5043);
break;
908 case 5048: item->
SetEntry(5044);
break;
909 case 17303: item->
SetEntry(17302);
break;
910 case 17304: item->
SetEntry(17305);
break;
911 case 17307: item->
SetEntry(17308);
break;
912 case 21830: item->
SetEntry(21831);
break;
937 recvData >> item_guid;
942 recvData >> gem_guids[i];
945 if ((!gem_guids[0].IsEmpty() && (gem_guids[0] == gem_guids[1] || gem_guids[0] == gem_guids[2])) ||
946 (!gem_guids[1].IsEmpty() && (gem_guids[1] == gem_guids[2])))
966 GemProps[i] = (Gems[i]) ?
sGemPropertiesStore.LookupEntry(Gems[i]->GetTemplate()->GemProperties) :
nullptr;
969 int32 firstPrismatic = 0;
970 while (firstPrismatic < MAX_GEM_SOCKETS && itemProto->Socket[firstPrismatic].Color)
979 if (!itemProto->
Socket[i].Color)
985 if (i != firstPrismatic)
1002 GemEnchants[i] = (GemProps[i]) ? GemProps[i]->EnchantID : 0;
1031 else if (OldEnchants[j])
1035 if (iGemProto->
ItemId == enchantEntry->SrcItemID)
1046 int32 limit_newcount = 0;
1060 else if (OldEnchants[j])
1070 if (limit_newcount > 0 &&
uint32(limit_newcount) > limitEntry->Quantity)
1113 if (SocketBonusActivated ^ SocketBonusToBeActivated)
1131 TC_LOG_DEBUG(
"network",
"WORLD: CMSG_CANCEL_TEMP_ENCHANTMENT");
1155 TC_LOG_DEBUG(
"network",
"WORLD: CMSG_ITEM_REFUND_INFO");
1163 TC_LOG_DEBUG(
"network",
"Item refund: item not found!");
1179 TC_LOG_DEBUG(
"network",
"Item refund: item not found!");
1198 recvData >> itemGuid;
1208 data << item->GetText();
@ CREATURE_FLAG_EXTRA_NO_SELL_VENDOR
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
@ PRISMATIC_ENCHANTMENT_SLOT
@ EQUIP_ERR_TOO_MUCH_GOLD
@ 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
@ SELL_ERR_CANT_FIND_VENDOR
@ SELL_ERR_CANT_SELL_TO_THIS_MERCHANT
@ SELL_ERR_CANT_FIND_ITEM
@ SELL_ERR_CANT_SELL_ITEM
@ ITEM_FLAG2_FACTION_HORDE
@ ITEM_FLAG2_FACTION_ALLIANCE
@ ITEM_FIELD_FLAG_WRAPPED
@ ITEM_FLAG_NO_USER_DESTROY
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
uint32 const MAX_MONEY_AMOUNT
std::vector< ItemPosCount > ItemPosCountVec
#define INVENTORY_SLOT_BAG_0
@ PLAYER_FIELD_BUYBACK_PRICE_1
void put(std::size_t pos, T value)
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)
virtual void SaveToDB(CharacterDatabaseTransaction trans)
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Item * CloneItem(uint32 count, Player const *player=nullptr) const
void SetCount(uint32 value)
ItemTemplate const * GetTemplate() const
ItemUpdateState GetState() const
ObjectGuid GetOwnerGUID() const
bool IsRefundable() const
bool GemsFitSockets() const
void ClearEnchantment(EnchantmentSlot slot)
void ClearSoulboundTradeable(Player *currentOwner)
bool IsNotEmptyBag() const
uint32 GetMaxStackCount() const
void SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges, ObjectGuid caster=ObjectGuid::Empty)
LowType GetCounter() const
static ObjectGuid const Empty
PackedGuidWriter WriteAsPacked() const
std::string ToString() const
static std::string_view GetLocaleString(std::vector< std::string > const &data, size_t locale)
uint32 GetUInt32Value(uint16 index) const
void SetGuidValue(uint16 index, ObjectGuid value)
static ObjectGuid GetGUID(Object const *o)
void SetEntry(uint32 entry)
void SendUpdateToPlayer(Player *player)
void SetUInt32Value(uint16 index, uint32 value)
ObjectGuid GetGuidValue(uint16 index) const
bool IsValidPos(uint16 pos, bool explicit_pos) const
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
static bool IsEquipmentPos(uint16 pos)
InventoryResult CanUnequipItem(uint16 src, bool swap) const
void ToggleMetaGemsActive(uint8 exceptslot, bool apply)
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
void SplitItem(uint16 src, uint16 dst, uint32 count)
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
bool ModifyMoney(int32 amount, bool sendError=true)
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
float GetReputationPriceDiscount(Creature const *creature) const
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
void AddItemToBuyBackSlot(Item *pItem)
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
void SwapItem(uint16 src, uint16 dst)
void ApplyItemDependentAuras(Item *item, bool apply)
void SendSellError(SellResult msg, Creature *creature, ObjectGuid guid, uint32 param) const
void RemoveTradeableItem(Item *item)
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Item * GetItemByPos(uint16 pos) const
ObjectGuid GetLootGUID() const
void SetAmmo(uint32 item)
bool HasEnoughMoney(uint32 amount) const
void DestroyItem(uint8 bag, uint8 slot, bool update)
static bool IsInventoryPos(uint16 pos)
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, NPCFlags npcFlags) const
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param) const
void SendRefundInfo(Item *item)
void AutoUnequipOffhandIfNeed(bool force=false)
bool IsGameMaster() const
Item * EquipItem(uint16 pos, Item *pItem, bool update)
static bool IsBagPos(uint16 pos)
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0) const
Item * GetItemFromBuyBackSlot(uint32 slot)
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
void ItemAddedQuestCheck(uint32 entry, 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)
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
void setUInt32(uint8 index, uint32 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)
void Initialize(uint16 opcode, size_t newres=200)
WorldPacket const * Write() override
void HandleDestroyItemOpcode(WorldPacket &recvPacket)
void HandleSocketOpcode(WorldPacket &recvData)
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
void HandleSellItemOpcode(WorldPacket &recvPacket)
void HandleItemNameQueryOpcode(WorldPacket &recvPacket)
void HandleItemQuerySingleOpcode(WorldPackets::Query::QueryItemSingle &query)
LocaleConstant GetSessionDbLocaleIndex() const
void HandleSwapItem(WorldPacket &recvPacket)
void HandleAutoStoreBagItemOpcode(WorldPacket &recvPacket)
void HandleWrapItemOpcode(WorldPacket &recvPacket)
void HandleItemRefund(WorldPacket &recvData)
Player * GetPlayer() const
void HandleAutoEquipItemSlotOpcode(WorldPacket &recvPacket)
void HandleItemRefundInfoRequest(WorldPacket &recvData)
void HandleSwapInvItemOpcode(WorldPacket &recvPacket)
ObjectGuid m_currentBankerGUID
void HandleAutoEquipItemOpcode(WorldPacket &recvPacket)
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
void HandleSetAmmoOpcode(WorldPacket &recvPacket)
void HandleReadItem(WorldPacket &recvPacket)
void HandleBuyItemOpcode(WorldPacket &recvPacket)
void SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId)
void HandleSplitItemOpcode(WorldPacket &recvPacket)
void SendListInventory(ObjectGuid guid)
bool CanUseBank(ObjectGuid bankerGUID=ObjectGuid::Empty) const
void HandleBuyItemInSlotOpcode(WorldPacket &recvPacket)
void HandleCancelTempEnchantmentOpcode(WorldPacket &recvData)
void HandleItemTextQuery(WorldPacket &recvData)
void HandleBuybackItem(WorldPacket &recvPacket)
void HandleListInventoryOpcode(WorldPacket &recvPacket)
@ SMSG_ITEM_NAME_QUERY_RESPONSE
@ SMSG_ITEM_TEXT_QUERY_RESPONSE
@ SMSG_ITEM_ENCHANT_TIME_UPDATE
@ CONFIG_CACHE_DATA_QUERIES
uint32 GetInteractionPauseTimer() const
std::array< _Socket, MAX_ITEM_PROTO_SOCKETS > Socket
bool HasFlag(ItemFlags flag) const
void GetPosition(float &x, float &y) const
uint32 GetItemCount() const
VendorItem const * GetItem(uint32 slot) const