18#ifndef TRINITYCORE_ITEM_H
19#define TRINITYCORE_ITEM_H
48#define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS
50#define MAX_ENCHANTMENT_OFFSET 3
60#define MAX_ITEM_SPELLS 5
91 std::array<ItemEffectEntry const*, 13>
Effects;
221 bool IsBindedNotWith(
Player const* player)
const;
222 bool IsBoundByEnchant()
const;
225 void LoadArtifactData(
Player const* owner,
uint64 xp,
uint32 artifactAppearanceId,
uint32 artifactTier, std::vector<ArtifactPowerData>& powers);
226 void CheckArtifactRelicSlotUnlock(
Player const* owner);
228 void AddBonuses(
uint32 bonusListID);
229 std::vector<int32>
const&
GetBonusListIDs()
const {
return m_itemData->ItemBonusKey->BonusListIDs; }
230 void SetBonuses(std::vector<int32> bonusListIDs);
238 void SaveRefundDataToDB();
241 Bag*
ToBag() {
if (IsBag())
return reinterpret_cast<Bag*
>(
this);
else return nullptr; }
242 Bag const*
ToBag()
const {
if (IsBag())
return reinterpret_cast<Bag const*
>(
this);
else return nullptr; }
256 bool IsNotEmptyBag()
const;
257 bool IsBroken()
const {
return *m_itemData->MaxDurability > 0 && *m_itemData->Durability == 0; }
260 bool CanBeTraded(
bool mail =
false,
bool trade =
false)
const;
264 uint64 CalculateDurabilityRepairCost(
float discount)
const;
266 bool HasEnchantRequiredSkill(
Player const* player)
const;
267 uint32 GetEnchantRequiredLevel()
const;
269 bool IsFitToSpellRequirements(
SpellInfo const* spellInfo)
const;
270 bool IsLimitedToAnotherMapOrZone(
uint32 cur_mapId,
uint32 cur_zoneId)
const;
271 bool GemsFitSockets()
const;
274 void SetCount(
uint32 value);
277 uint8 GetGemCountWithLimitCategory(
uint32 limitCategory)
const;
282 uint8 GetBagSlot()
const;
287 bool IsInBag()
const {
return m_container !=
nullptr; }
288 bool IsEquipped()
const;
304 std::string
const&
GetText()
const {
return m_text; }
305 void SetText(std::string
const& text) { m_text = text; }
307 void SendUpdateSockets();
309 void SendTimeUpdate(
Player* owner);
331 bool hasQuest(
uint32 quest_id)
const override {
return GetTemplate()->GetStartQuest() == quest_id; }
333 bool IsPotion()
const {
return GetTemplate()->IsPotion(); }
334 bool IsVellum()
const {
return GetTemplate()->IsVellum(); }
341 int32 GetRequiredLevel()
const;
343 float GetItemStatValue(
uint32 index,
Player const* owner)
const;
353 void SetFixedLevel(
uint8 level);
366 void UpdatePlayedTime(
Player* owner);
368 bool IsRefundExpired();
371 void SetSoulboundTradeable(
GuidSet const& allowedLooters);
372 void ClearSoulboundTradeable(
Player* currentOwner);
373 bool CheckSoulboundTradeExpire();
396 void operator()(
Player const* player)
const;
404 bool IsValidTransmogrificationTarget()
const;
405 bool HasStats()
const;
408 uint32 GetBuyPrice(
Player const* owner,
bool& standardPrice)
const;
414 uint16 GetVisibleAppearanceModId(
Player const* owner)
const;
415 uint32 GetVisibleModifiedAppearanceId(
Player const* owner)
const;
416 int32 GetVisibleSecondaryModifiedAppearanceId(
Player const* owner)
const;
417 uint32 GetVisibleEnchantmentId(
Player const* owner)
const;
426 bool IsArtifactDisabled()
const;
430 void SetArtifactPower(
uint16 artifactPowerId,
uint8 purchasedRank,
uint8 currentRankWithBonus);
432 void InitArtifactPowers(
uint8 artifactId,
uint8 artifactTier);
433 uint32 GetTotalUnlockedArtifactPowers()
const;
434 uint32 GetTotalPurchasedArtifactPowers()
const;
436 void CopyArtifactDataFromParent(
Item* parent);
439 void GiveArtifactXp(
uint64 amount,
Item* sourceItem,
uint32 artifactCategoryId);
#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::unordered_map< Player *, UpdateData > UpdateDataMapType
std::optional< T > Optional
Optional helper class to wrap optional values within.
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
#define MAX_SPECIALIZATIONS
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)
bool IsCurrencyToken() const
uint32 GetScriptId() const
bool HasItemFlag2(ItemFieldFlags2 flag) const
void SetSpellCharges(uint8 index, int32 value)
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
Trinity::IteratorPair< ItemEffectEntry const *const * > GetEffects() const
uint32 GetEnchantmentId(EnchantmentSlot slot) const
void SetChildItem(ObjectGuid childItem)
std::unordered_map< uint32, uint16 > m_artifactPowerIdToIndex
void SetPaidMoney(uint64 money)
int32 GetSpellCharges(uint8 index=0) const
bool IsAzeriteEmpoweredItem() const
bool IsBoundAccountWide() const
AzeriteItem * ToAzeriteItem()
int32 GetItemStatType(uint32 index) const
void ReplaceAllItemFlags2(ItemFieldFlags2 flags)
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
void SetContext(ItemContext context)
uint32 GetQuality() const
std::array< uint32, MAX_ITEM_PROTO_SOCKETS > m_gemScalingLevels
void SetDurability(uint32 durability)
ObjectGuid GetCreator() const
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
void ApplyBonusList(uint32 itemBonusListId)
BonusData const * GetBonus() const
SocketColor GetSocketColor(uint32 index) const
AzeriteEmpoweredItem const * ToAzeriteEmpoweredItem() const
ObjectGuid GetOwnerGUID() const
Bag const * ToBag() const
uint32 GetAppearanceModId() const
uint64 GetPaidMoney() const
time_t m_lastPlayedTimeUpdate
bool IsAzeriteItem() const
bool IsRefundable() const
void SetItemFlag2(ItemFieldFlags2 flags)
ObjectGuid m_refundRecipient
bool IsRangedWeapon() const
void SetContainedIn(ObjectGuid guid)
ObjectGuid GetGiftCreator() const
void RemoveItemFlag2(ItemFieldFlags2 flags)
void SetPetitionNumSignatures(uint32 signatures)
void FSetState(ItemUpdateState state)
void SetMaxDurability(uint32 maxDurability)
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
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
bool IsInUpdateQueue() const
uint32 GetScalingContentTuningId() const
void SetInTrade(bool b=true)
static ObjectGuid const Empty
virtual void BuildValuesUpdateWithFlag(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const
virtual std::string GetNameForLocaleIdx(LocaleConstant locale) const =0
void RemoveUpdateFieldFlagValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type flag)
virtual bool AddToObjectUpdate()=0
void SetUpdateFieldFlagValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type flag)
virtual void BuildValuesCreate(ByteBuffer *data, Player const *target) const =0
virtual void ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
virtual std::string GetDebugInfo() const
virtual void BuildValuesUpdate(ByteBuffer *data, Player const *target) const =0
virtual void BuildUpdate(UpdateDataMapType &)
virtual void RemoveFromObjectUpdate()=0
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
Utility class to enable range for loop syntax for multimap.equal_range uses.
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
int32 RequiredLevelOverride
int32 ScalingStatDistributionPriority
std::array< ItemEffectEntry const *, 13 > Effects
void AddBonus(uint32 type, std::array< int32, 4 > const &values)
int32 AppearanceModPriority
int32 ItemStatType[MAX_ITEM_PROTO_STATS]
uint16 GemRelicRankBonus[MAX_ITEM_PROTO_SOCKETS]
uint32 PlayerLevelToItemLevelCurveId
float RepairCostMultiplier
int32 RequiredLevelCurvePriority
int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]
int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]
struct BonusData::@276 _state
void AddBonusList(uint32 bonusListId)
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
int32 AzeriteTierUnlockSetId
float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]
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
std::unordered_set< ItemSetSpellEntry const * > SetBonuses
std::unordered_set< Item const * > EquippedItems
UF::ObjectData::Base ObjectMask
UF::ItemData::Base ItemMask
ValuesUpdateForPlayerWithMaskSender(Item const *owner)
UpdateField< ObjectGuid, 0, 6 > GiftCreator
UpdateFieldArray< UF::ItemEnchantment, 13, 27, 28 > Enchantment
UpdateField< uint32, 0, 18 > DynamicFlags2
UpdateField< ObjectGuid, 0, 5 > Creator
UpdateField< uint32, 0, 10 > Durability
UpdateField< uint32, 0, 11 > MaxDurability
UpdateField< uint32, 0, 9 > DynamicFlags
UpdateFieldArray< int32, 5, 21, 22 > SpellCharges
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< uint32, 0, 12 > CreatePlayedTime
UpdateField< int32, 0, 13 > Context
UpdateField< int32, 0, 1 > ID
UpdateField< uint32, 0, 2 > Duration