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;
222 bool IsBindedNotWith(
Player const* player)
const;
223 bool IsBoundByEnchant()
const;
226 void LoadArtifactData(
Player const* owner,
uint64 xp,
uint32 artifactAppearanceId,
uint32 artifactTier, std::vector<ArtifactPowerData>& powers);
227 void CheckArtifactRelicSlotUnlock(
Player const* owner);
229 void AddBonuses(
uint32 bonusListID);
230 std::vector<int32>
const&
GetBonusListIDs()
const {
return m_itemData->ItemBonusKey->BonusListIDs; }
231 void SetBonuses(std::vector<int32> bonusListIDs);
239 void SaveRefundDataToDB();
242 Bag*
ToBag() {
if (IsBag())
return reinterpret_cast<Bag*
>(
this);
else return nullptr; }
243 Bag const*
ToBag()
const {
if (IsBag())
return reinterpret_cast<Bag const*
>(
this);
else return nullptr; }
257 bool IsNotEmptyBag()
const;
258 bool IsBroken()
const {
return *m_itemData->MaxDurability > 0 && *m_itemData->Durability == 0; }
261 bool CanBeTraded(
bool mail =
false,
bool trade =
false)
const;
265 uint64 CalculateDurabilityRepairCost(
float discount)
const;
267 bool HasEnchantRequiredSkill(
Player const* player)
const;
268 uint32 GetEnchantRequiredLevel()
const;
270 bool IsFitToSpellRequirements(
SpellInfo const* spellInfo)
const;
271 bool IsLimitedToAnotherMapOrZone(
uint32 cur_mapId,
uint32 cur_zoneId)
const;
272 bool GemsFitSockets()
const;
275 void SetCount(
uint32 value);
278 uint8 GetGemCountWithLimitCategory(
uint32 limitCategory)
const;
283 uint8 GetBagSlot()
const;
288 bool IsInBag()
const {
return m_container !=
nullptr; }
289 bool IsEquipped()
const;
305 std::string
const&
GetText()
const {
return m_text; }
306 void SetText(std::string
const& text) { m_text = text; }
308 void SendUpdateSockets();
310 void SendTimeUpdate(
Player* owner);
333 bool hasQuest(
uint32 quest_id)
const override {
return GetTemplate()->GetStartQuest() == quest_id; }
335 bool IsPotion()
const {
return GetTemplate()->IsPotion(); }
336 bool IsVellum()
const {
return GetTemplate()->IsVellum(); }
343 int32 GetRequiredLevel()
const;
345 float GetItemStatValue(
uint32 index,
Player const* owner)
const;
356 void SetFixedLevel(
uint8 level);
369 uint32 GetPlayedTime()
const;
370 bool IsRefundExpired()
const;
373 void SetSoulboundTradeable(
GuidSet const& allowedLooters);
374 void ClearSoulboundTradeable(
Player* currentOwner);
375 bool CheckSoulboundTradeExpire();
398 void operator()(
Player const* player)
const;
406 bool IsValidTransmogrificationTarget()
const;
407 bool HasStats()
const;
410 uint32 GetBuyPrice(
Player const* owner,
bool& standardPrice)
const;
416 uint16 GetVisibleAppearanceModId(
Player const* owner)
const;
417 uint32 GetVisibleModifiedAppearanceId(
Player const* owner)
const;
418 int32 GetVisibleSecondaryModifiedAppearanceId(
Player const* owner)
const;
419 uint32 GetVisibleEnchantmentId(
Player const* owner)
const;
428 bool IsArtifactDisabled()
const;
432 void SetArtifactPower(
uint16 artifactPowerId,
uint8 purchasedRank,
uint8 currentRankWithBonus);
434 void InitArtifactPowers(
uint8 artifactId,
uint8 artifactTier);
435 uint32 GetTotalUnlockedArtifactPowers()
const;
436 uint32 GetTotalPurchasedArtifactPowers()
const;
438 void CopyArtifactDataFromParent(
Item* parent);
441 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 HasItemZoneFlag(ItemZoneFlags flag) const
bool IsCurrencyToken() const
uint32 GetScriptId() 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
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
SocketColor GetSocketColor(uint32 index) const
AzeriteEmpoweredItem const * ToAzeriteEmpoweredItem() 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
bool IsRangedWeapon() const
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 BuildValuesCreate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
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 ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
virtual void BuildValuesUpdate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
virtual std::string GetDebugInfo() const
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::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
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
int32 DisenchantLootPriority
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]
void AddBonusList(uint32 bonusListId)
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
struct BonusData::@269 _state
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< 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< 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