18#ifndef TRINITYCORE_ITEM_H
19#define TRINITYCORE_ITEM_H
40#define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS
42#define MAX_ENCHANTMENT_OFFSET 3
52#define MAX_ITEM_SPELLS 5
90 std::array<ItemEffectEntry const*, 13>
Effects;
230 bool IsBindedNotWith(
Player const* player)
const;
231 bool IsBoundByEnchant()
const;
235 void LoadArtifactData(
Player const* owner,
uint64 xp,
uint32 artifactAppearanceId,
uint32 artifactTier, std::vector<ArtifactPowerData>& powers);
236 void CheckArtifactRelicSlotUnlock(
Player const* owner);
238 void AddBonuses(
uint32 bonusListID);
239 std::vector<int32>
const&
GetBonusListIDs()
const {
return m_itemData->ItemBonusKey->BonusListIDs; }
240 void SetBonuses(std::vector<int32> bonusListIDs);
248 void SaveRefundDataToDB();
251 Bag*
ToBag() {
return IsBag() ?
reinterpret_cast<Bag*
>(
this) :
nullptr; }
252 Bag const*
ToBag()
const {
return IsBag() ?
reinterpret_cast<Bag const*
>(
this) :
nullptr; }
266 bool IsNotEmptyBag()
const;
267 bool IsBroken()
const {
return *m_itemData->MaxDurability > 0 && *m_itemData->Durability == 0; }
270 bool CanBeTraded(
bool mail =
false,
bool trade =
false)
const;
274 uint64 CalculateDurabilityRepairCost(
float discount)
const;
276 bool HasEnchantRequiredSkill(
Player const* player)
const;
277 uint32 GetEnchantRequiredLevel()
const;
279 bool IsFitToSpellRequirements(
SpellInfo const* spellInfo)
const;
280 bool IsLimitedToAnotherMapOrZone(
uint32 cur_mapId,
uint32 cur_zoneId)
const;
281 bool GemsFitSockets()
const;
284 void SetCount(
uint32 value);
287 uint8 GetGemCountWithLimitCategory(
uint32 limitCategory)
const;
292 uint8 GetBagSlot()
const;
297 bool IsInBag()
const {
return m_container !=
nullptr; }
298 bool IsEquipped()
const;
314 std::string
const&
GetText()
const {
return m_text; }
315 void SetText(std::string
const& text) { m_text = text; }
317 void SendUpdateSockets();
319 void SendTimeUpdate(
Player* owner);
342 bool hasQuest(
uint32 quest_id)
const override {
return GetTemplate()->GetStartQuest() == quest_id; }
344 bool IsPotion()
const {
return GetTemplate()->IsPotion(); }
345 bool IsVellum()
const {
return GetTemplate()->IsVellum(); }
351 int32 GetRequiredLevel()
const;
353 float GetItemStatValue(
uint32 index,
Player const* owner)
const;
364 void SetFixedLevel(
uint8 level);
365 std::span<ItemEffectEntry const* const>
GetEffects()
const {
return { _bonusData.Effects.data(), _bonusData.EffectCount }; }
378 uint32 GetPlayedTime()
const;
379 bool IsRefundExpired()
const;
382 void SetSoulboundTradeable(
GuidSet const& allowedLooters);
383 void ClearSoulboundTradeable(
Player* currentOwner);
384 bool CheckSoulboundTradeExpire();
408 void operator()(
Player const* player)
const;
416 bool IsValidTransmogrificationTarget()
const;
418 uint32 GetBuyPrice(
Player const* owner,
bool& standardPrice)
const;
424 uint16 GetVisibleAppearanceModId(
Player const* owner)
const;
425 uint32 GetVisibleModifiedAppearanceId(
Player const* owner)
const;
426 int32 GetVisibleSecondaryModifiedAppearanceId(
Player const* owner)
const;
427 uint32 GetVisibleEnchantmentId(
Player const* owner)
const;
436 bool IsArtifactDisabled()
const;
440 void SetArtifactPower(
uint16 artifactPowerId,
uint8 purchasedRank,
uint8 currentRankWithBonus);
442 void InitArtifactPowers(
uint8 artifactId,
uint8 artifactTier);
443 uint32 GetTotalUnlockedArtifactPowers()
const;
444 uint32 GetTotalPurchasedArtifactPowers()
const;
446 void CopyArtifactDataFromParent(
Item* parent);
449 void GiveArtifactXp(
uint64 amount,
Item* sourceItem,
uint32 artifactCategoryId);
479 int32 GetArtifactPowerIndex(
uint32 artifactPowerId)
const;
std::unordered_map< Player *, UpdateData > UpdateDataMapType
#define MAX_ITEM_PROTO_SOCKETS
#define MAX_ITEM_PROTO_STATS
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
uint32 ItemRandomBonusListId
@ ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK
@ ITEM_FIELD_FLAG_REFUNDABLE
@ ITEM_FIELD_FLAG_UNLOCKED
@ ITEM_FIELD_FLAG_SOULBOUND
@ ITEM_FIELD_FLAG_WRAPPED
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
@ ITEM_FLAG_IS_BOUND_TO_ACCOUNT
void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
void AddItemToUpdateQueueOf(Item *item, Player *player)
ItemModifier const AppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
Item * NewItemOrBag(ItemTemplate const *proto)
ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS]
int32 const ItemTransmogrificationSlots[MAX_INVTYPE]
bool ItemCanGoIntoBag(ItemTemplate const *proto, ItemTemplate const *pBagProto)
@ TYPEID_AZERITE_EMPOWERED_ITEM
std::set< ObjectGuid > GuidSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
#define MAX_SPECIALIZATIONS
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
virtual bool AddToObjectUpdate()=0
void SetUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
virtual std::string GetNameForLocaleIdx(LocaleConstant locale) const =0
virtual void RemoveFromObjectUpdate()=0
void RemoveUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
virtual void BuildUpdate(UpdateDataMapType &data_map)
Class used to access individual fields of database query result.
uint32 GetPaidExtendedCost() const
bool hasInvolvedQuest(uint32) const override
std::string const & GetText() const
void SetItemFlag(ItemFieldFlags flags)
std::span< ItemEffectEntry const *const > GetEffects() const
bool HasItemZoneFlag(ItemZoneFlags flag) const
bool IsCurrencyToken() const
uint32 GetScriptId() const
uint32 GetSocketColor(uint32 index) const
void SetText(std::string const &text)
void SetPetitionId(uint32 petitionId)
Loot * GetLootForPlayer(Player const *) const override
AzeriteItem const * ToAzeriteItem() const
void ReplaceAllItemFlags(ItemFieldFlags flags)
void RemoveItemFlag(ItemFieldFlags flags)
ObjectGuid GetContainedIn() const
void SetBinding(bool val)
ItemBondingType GetBonding() const
uint32 GetEnchantmentId(EnchantmentSlot slot) const
void SetChildItem(ObjectGuid childItem)
void SetPaidMoney(uint64 money)
bool IsAzeriteEmpoweredItem() const
bool IsBoundAccountWide() const
AzeriteItem * ToAzeriteItem()
int32 GetItemStatType(uint32 index) const
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
void SetItemZoneFlag(ItemZoneFlags flags)
void SetContext(ItemContext context)
uint32 GetQuality() const
std::array< uint32, MAX_ITEM_PROTO_SOCKETS > m_gemScalingLevels
void SetDurability(uint32 durability)
void SetCreateTime(int64 createTime)
ObjectGuid GetCreator() const
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
std::vector< int32 > const & GetBonusListIDs() const
bool IsBOPTradeable() const
ItemRandomBonusListId GetItemRandomBonusListId() const
ItemContext GetContext() const
ItemRandomBonusListId m_randomBonusListId
ItemUpdateState GetState() const
bool IsBattlenetAccountBound() const
bool HasItemFlag(ItemFieldFlags flag) const
uint16 GetQueuePos() const
BonusData const * GetBonus() const
AzeriteEmpoweredItem const * ToAzeriteEmpoweredItem() const
uint32 GetItemLimitCategory() const
ObjectGuid GetOwnerGUID() const
Bag const * ToBag() const
uint32 GetAppearanceModId() const
uint64 GetPaidMoney() const
void RemoveItemZoneFlag(ItemZoneFlags flags)
bool IsAzeriteItem() const
bool IsRefundable() const
ObjectGuid m_refundRecipient
void SetContainedIn(ObjectGuid guid)
ObjectGuid GetGiftCreator() const
void SetPetitionNumSignatures(uint32 signatures)
void FSetState(ItemUpdateState state)
void SetMaxDurability(uint32 maxDurability)
void ReplaceAllItemZoneFlags(ItemZoneFlags flags)
uint32 m_paidExtendedCost
void SetArtifactXP(uint64 xp)
std::unique_ptr< Loot > m_loot
void SetCreator(ObjectGuid guid)
ObjectGuid const & GetRefundRecipient() const
void SetCreatePlayedTime(uint32 createPlayedTime)
void SetPaidExtendedCost(uint32 iece)
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
void SetAppearanceModId(uint32 appearanceModId)
void SetRefundRecipient(ObjectGuid const &guid)
void SetExpiration(uint32 expiration)
void SetOwnerGUID(ObjectGuid guid)
void SetContainer(Bag *container)
AzeriteEmpoweredItem * ToAzeriteEmpoweredItem()
float GetRepairCostMultiplier() const
ObjectGuid GetChildItem() const
bool hasQuest(uint32 quest_id) const override
uint32 GetMaxStackCount() const
void SetGiftCreator(ObjectGuid guid)
bool IsConjuredConsumable() const
bool IsInUpdateQueue() const
uint32 GetScalingContentTuningId() const
void SetInTrade(bool b=true)
static ObjectGuid const Empty
virtual void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const
std::string GetDebugInfo() const override
virtual void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void ClearValuesChangesMask()
std::vector< ArtifactPowerData > ArtifactPowers
uint32 ArtifactAppearanceId
uint8 CurrentRankWithBonus
std::array< int32, MAX_AZERITE_EMPOWERED_TIER > SelectedAzeritePowers
std::vector< uint32 > AzeriteItemMilestonePowers
std::array< AzeriteItemSelectedEssencesData, 4 > SelectedAzeriteEssences
std::vector< AzeriteEssencePowerEntry const * > UnlockedAzeriteEssences
std::array< uint32, MAX_AZERITE_ESSENCE_SLOT > AzeriteEssenceId
bool HasItemLimitCategory
int32 RequiredLevelOverride
int32 ScalingStatDistributionPriority
std::array< ItemEffectEntry const *, 13 > Effects
int32 DisenchantLootPriority
void AddBonus(uint32 type, std::array< int32, 4 > const &values)
int32 AppearanceModPriority
int32 PvpItemLevelPriority
int32 ItemStatType[MAX_ITEM_PROTO_STATS]
uint16 GemRelicRankBonus[MAX_ITEM_PROTO_SOCKETS]
uint32 PlayerLevelToItemLevelCurveId
float RepairCostMultiplier
int32 RequiredLevelCurvePriority
int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]
uint32 ItemLevelOffsetCurveId
int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]
void AddBonusList(uint32 bonusListId)
struct BonusData::@265 _state
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
uint32 ItemLevelOffsetItemLevel
int32 AzeriteTierUnlockSetId
float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]
bool CannotTradeBindOnPickup
void Initialize(ItemTemplate const *proto)
int32 AzeriteTierUnlockSetPriority
Optional< ArtifactData > Artifact
Optional< AzeriteEmpoweredItemData > AzeriteEmpoweredItem
static void Init(std::unordered_map< ObjectGuid::LowType, ItemAdditionalLoadInfo > *loadInfo, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult)
Optional< AzeriteItemData > AzeriteItem
UF::ObjectData::Base ObjectMask
UF::ItemData::Base ItemMask
ValuesUpdateForPlayerWithMaskSender(Item const *owner)
bool IgnoreNestedChangesMask
UpdateField< ObjectGuid, 0, 6 > GiftCreator
UpdateFieldArray< UF::ItemEnchantment, 13, 27, 28 > Enchantment
UpdateField< ObjectGuid, 0, 5 > Creator
UpdateField< uint32, 0, 10 > Durability
UpdateField< uint32, 0, 11 > MaxDurability
UpdateField< uint32, 0, 9 > DynamicFlags
UpdateField< int64, 0, 14 > CreateTime
UpdateField< uint8, 0, 16 > ItemAppearanceModID
UpdateField< uint64, 0, 15 > ArtifactXP
UpdateField< ObjectGuid, 0, 3 > Owner
UpdateField< uint32, 0, 8 > Expiration
UpdateField< ObjectGuid, 0, 4 > ContainedIn
UpdateField< uint8, 0, 13 > Context
UpdateField< uint32, 0, 12 > CreatePlayedTime
UpdateField< uint32, 0, 18 > ZoneFlags
UpdateField< int32, 0, 1 > ID
UpdateField< uint32, 0, 2 > Duration