75 TC_LOG_ERROR(
"sql.sql",
"Item set {} for item (id {}) not found, mods not applied.", setid, proto->
GetId());
93 maxLevel = std::min<uint32>(maxLevel, contentTuning->MaxLevel);
102 for (
size_t x = 0; x < player->
ItemSetEff.size(); ++x)
121 if (x < player->ItemSetEff.size())
129 if (std::vector<ItemSetSpellEntry const*>
const* itemSetSpells =
sDB2Manager.GetItemSetSpells(setid))
143 TC_LOG_ERROR(
"entities.player.items",
"WORLD: unknown spell id {} in items set {} effects", itemSetSpell->SpellID, setid);
163 TC_LOG_ERROR(
"sql.sql",
"Item set #{} for item #{} not found, mods not removed.", setid, item->
GetEntry());
169 for (; setindex < player->
ItemSetEff.size(); setindex++)
184 if (std::vector<ItemSetSpellEntry const*>
const* itemSetSpells =
sDB2Manager.GetItemSetSpells(setid))
210 if (!pProto || !pBagProto)
321 Field* fields = artifactResult->Fetch();
333 uint32 maxRank = artifactPower->MaxPurchasableRank;
336 maxRank += info.
Artifact->ArtifactTierId - artifactPower->Tier;
343 info.
Artifact->ArtifactPowers.push_back(artifactPowerData);
346 }
while (artifactResult->NextRow());
360 if (azeriteItemResult)
364 Field* fields = azeriteItemResult->Fetch();
371 for (std::size_t i = 0; i < info.
AzeriteItem->SelectedAzeriteEssences.size(); ++i)
377 info.
AzeriteItem->SelectedAzeriteEssences[i].SpecializationId = specializationId;
381 if (!azeriteEssence || !
sDB2Manager.IsSpecSetMember(azeriteEssence->
SpecSetID, specializationId))
384 info.
AzeriteItem->SelectedAzeriteEssences[i].AzeriteEssenceId[j] = azeriteEssence->
ID;
388 }
while (azeriteItemResult->NextRow());
393 if (azeriteItemMilestonePowersResult)
397 Field* fields = azeriteItemMilestonePowersResult->Fetch();
401 info.
AzeriteItem->AzeriteItemMilestonePowers.push_back(fields[1].GetUInt32());
403 while (azeriteItemMilestonePowersResult->NextRow());
408 if (azeriteItemUnlockedEssencesResult)
412 Field* fields = azeriteItemUnlockedEssencesResult->Fetch();
419 info.
AzeriteItem->UnlockedAzeriteEssences.push_back(azeriteEssencePower);
422 while (azeriteItemUnlockedEssencesResult->NextRow());
427 if (azeriteEmpoweredItemResult)
431 Field* fields = azeriteEmpoweredItemResult->Fetch();
440 }
while (azeriteEmpoweredItemResult->NextRow());
490 for (std::size_t i = 0; i < itemProto->
Effects.size(); ++i)
491 if (itemProto->
Effects[i]->LegacySlotIndex < 5)
505 if (itemProto->
GetArtifactID() != artifactAppearanceSet->ArtifactID)
509 if (!owner || !
sConditionMgr->IsPlayerMeetingCondition(owner, playerCondition))
530 return itemTemplate->
GetName(locale);
538 return !bag->IsEmpty();
548 TC_LOG_DEBUG(
"entities.player.items",
"Item::UpdateDuration Item (Entry: {} Duration {} Diff {})",
GetEntry(), duration, diff);
550 if (duration <= diff)
563 bool isInTransaction = bool(trans);
564 if (!isInTransaction)
581 std::ostringstream ssSpells;
584 stmt->
setString(++index, ssSpells.str());
588 std::ostringstream ssEnchants;
600 ssEnchants <<
"0 0 0 ";
603 stmt->
setString(++index, ssEnchants.str());
615 std::ostringstream bonusListIDs;
617 bonusListIDs << bonusListID <<
' ';
618 stmt->
setString(++index, bonusListIDs.str());
641 uint32 const gemFields = 4;
647 std::ostringstream gemBonusListIDs;
650 gemBonusListIDs << bonusListID <<
' ';
651 stmt->
setString(2 + i * gemFields, gemBonusListIDs.str());
659 stmt->
setUInt8(3 + i * gemFields, 0);
668 stmt->
setUInt8(3 + i * gemFields, 0);
702 if (std::find_if(std::begin(transmogMods), std::end(transmogMods), [
this](
ItemModifier modifier) {
return GetModifier(modifier) != 0; }) != std::end(transmogMods))
764 if (std::find_if(std::begin(modifiersTable), std::end(modifiersTable), [
this](
ItemModifier modifier) {
return GetModifier(modifier) != 0; }) != std::end(modifiersTable))
808 if (!isInTransaction)
824 if (!isInTransaction)
869 bool need_save =
false;
870 if (
uint64 creator = fields[2].GetUInt64())
873 SetCreator(ObjectGuid::Create<HighGuid::Player>(creator));
875 SetCreator(ObjectGuid::Create<HighGuid::Item>(creator));
877 if (
uint64 giftCreator = fields[3].GetUInt64())
878 SetGiftCreator(ObjectGuid::Create<HighGuid::Player>(giftCreator));
884 if ((proto->
GetDuration() == 0) != (duration == 0))
905 SetText(fields[12].GetString());
914 std::vector<std::string_view> bonusListString =
Trinity::Tokenize(fields[18].GetStringView(),
' ',
false);
915 std::vector<int32> bonusListIDs;
916 bonusListIDs.reserve(bonusListString.size());
917 for (std::string_view token : bonusListString)
919 bonusListIDs.push_back(*bonusListID);
923 std::vector<std::string_view> tokens =
Trinity::Tokenize(fields[6].GetStringView(),
' ',
false);
948 uint32 const gemFields = 4;
950 memset(gemData, 0,
sizeof(gemData));
954 std::vector<std::string_view> gemBonusListIDs =
Trinity::Tokenize(fields[38 + i * gemFields].GetStringView(),
' ',
false);
956 for (std::string_view token : gemBonusListIDs)
962 SetGem(i, &gemData[i], fields[40 + i * gemFields].GetUInt32());
969 std::vector<std::string_view> enchantmentTokens =
Trinity::Tokenize(fields[8].GetStringView(),
' ',
false);
1005 for (
uint8 i = 0; i <= artifactTier; ++i)
1015 uint8 totalPurchasedRanks = 0;
1018 power.CurrentRankWithBonus += power.PurchasedRank;
1019 totalPurchasedRanks += power.PurchasedRank;
1028 switch (enchant->Effect[i])
1031 if (
uint32(artifactPower->
Label) == enchant->EffectArg[i])
1032 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1035 if (artifactPower->
ID == enchant->EffectArg[i])
1036 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1044 if (!playerCondition || (owner &&
sConditionMgr->IsPlayerMeetingCondition(owner, playerCondition)))
1046 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1057 SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, power.CurrentRankWithBonus);
1066 SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, totalPurchasedRanks + 1);
1082 if (artifactUnlock->ArtifactID == artifactId)
1133 trans->Append(stmt);
1202 ASSERT(player !=
nullptr);
1206 TC_LOG_DEBUG(
"entities.player.items",
"AddItemToUpdateQueueOf - Owner's guid ({}) and player's guid ({}) don't match!",
1223 ASSERT(player !=
nullptr);
1227 TC_LOG_DEBUG(
"entities.player.items",
"RemoveItemFromUpdateQueueOf - Owner's guid ({}) and player's guid ({}) don't match!",
1265 if (owner->GetLootGUID() ==
GetGUID())
1281 if (
TradeData* tradeData = player->GetTradeData())
1286 tradeData->SetItem(slot,
this,
true);
1298 ASSERT(maxDurability >= curDurability);
1300 uint32 lostDurability = maxDurability - curDurability;
1301 if (!lostDurability)
1307 if (!durabilityCost)
1312 if (!durabilityQualityEntry)
1337 if (enchantEntry->RequiredSkillID && player->
GetSkillValue(enchantEntry->RequiredSkillID) < enchantEntry->RequiredSkillRank)
1352 if (enchantEntry->MinLevel > level)
1353 level = enchantEntry->MinLevel;
1503 uint32 gemBaseItemLevel = gemTemplate->GetBaseItemLevel();
1506 gemBaseItemLevel = scaledIlvl;
1512 switch (gemEnchant->Effect[i])
1540 for (
uint32 i = 0; i < 16; ++i)
1566 GemColor = gemProperty->
Type;
1580 return gemData.ItemID == int32(GemID);
1588 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemID);
1592 return gemProto->GetItemLimitCategory() == limitCategory;
1599 return proto && ((proto->
GetMap() && proto->
GetMap() != cur_mapId) ||
1636 ASSERT_NODEBUGINFO(count != 0,
"proto->Stackable == 0 but checked at loading already");
1642 if (addDefaultBonuses)
1711 std::size_t sizePos = data->
wpos();
1722 std::size_t sizePos = data->
wpos();
1740 std::size_t sizePos = data->
wpos();
1746 m_itemData->WriteUpdate(*data, mask,
true,
this, target);
1756 if (requestedObjectMask.IsAnySet())
1761 if (itemMask.IsAnySet())
1765 std::size_t sizePos = buffer.
wpos();
1770 m_objectData->WriteUpdate(buffer, requestedObjectMask,
true,
this, target);
1773 m_itemData->WriteUpdate(buffer, itemMask,
true,
this, target);
1801 owner->GetMap()->AddUpdateObject(
this);
1811 owner->GetMap()->RemoveUpdateObject(
this);
1820 trans->Append(stmt);
1827 trans->Append(stmt);
1838 (*trans)->Append(stmt);
1863 if (addToCollection)
1878 uint32 new_playtime = current_playtime + elapsed;
1880 if (new_playtime <= 2*
HOUR)
1899 return *
m_itemData->CreatePlayedTime + elapsed;
2072 if (!source || !target)
2122 standardPrice =
false;
2135 float qualityFactor = qualityPrice->
Data;
2136 float baseFactor = 0.0f;
2147 baseFactor = basePrice->
Weapon;
2149 baseFactor = basePrice->
Armor;
2157 baseFactor = basePrice->
Weapon / 3.0f;
2160 float typeFactor = 0.0f;
2163 switch (inventoryType)
2211 typeFactor = shieldPrice->
Data;
2241 typeFactor = weaponPrice->
Data;
2244 standardPrice =
false;
2267 return cost * classEntry->PriceModifier / buyCount;
2288 azeriteLevel = azeriteItem->GetEffectiveLevel();
2290 minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus, azeriteLevel);
2301 itemLevel = azeriteLevelInfo->ItemLevel;
2308 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2318 uint32 itemLevelBeforeUpgrades = itemLevel;
2325 if (minItemLevel && (!minItemLevelCutoff || itemLevelBeforeUpgrades >= minItemLevelCutoff) && itemLevel < minItemLevel)
2326 itemLevel = minItemLevel;
2328 if (maxItemLevel && itemLevel > maxItemLevel)
2329 itemLevel = maxItemLevel;
2384 if (disenchant->Class != itemClass)
2387 if (disenchant->Subclass >= 0 && itemSubClass)
2390 if (disenchant->Quality != quality)
2393 if (disenchant->MinLevel > itemLevel || disenchant->MaxLevel < itemLevel)
2396 if (disenchant->ExpansionID != -2 && disenchant->ExpansionID != expansion)
2408 if (!itemModifiedAppearanceId)
2413 return itemAppearance->ItemDisplayInfoID;
2427 return mod.
Type == modifier;
2430 if (modifierIndex != -1)
2431 return m_itemData->Modifiers->Values[modifierIndex].Value;
2440 return mod.
Type == modifier;
2445 if (modifierIndex == -1)
2451 mod.
Type = modifier;
2461 if (modifierIndex == -1)
2471 if (!itemModifiedAppearanceId)
2475 return transmog->ItemID;
2483 if (!itemModifiedAppearanceId)
2487 return transmog->ItemAppearanceModifierID;
2495 if (!itemModifiedAppearanceId)
2498 if (!itemModifiedAppearanceId)
2500 itemModifiedAppearanceId = itemModifiedAppearance->ID;
2502 return itemModifiedAppearanceId;
2508 if (!itemModifiedAppearanceId)
2511 return itemModifiedAppearanceId;
2523 return enchantmentId;
2529 return enchant->ItemVisual;
2574 return artifact->ArtifactCategoryID != 2;
2583 return &
m_itemData->ArtifactPowers[indexItr->second];
2618 if (artifactPower->Tier != artifactTier)
2637 uint32 extraUnlocked = 0;
2644 if (artifactXp < xpCost)
2647 artifactXp -= xpCost;
2652 return purchased + extraUnlocked;
2657 uint32 purchasedRanks = 0;
2661 return purchasedRanks;
2670 switch (enchant->Effect[i])
2673 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2680 newRank += enchant->EffectPointsMin[i];
2682 newRank -= enchant->EffectPointsMin[i];
2698 uint8 newRank =
m_itemData->ArtifactPowers[*artifactPowerIndex].CurrentRankWithBonus;
2700 newRank += enchant->EffectPointsMin[i];
2702 newRank -= enchant->EffectPointsMin[i];
2720 if (!playerCondition ||
sConditionMgr->IsPlayerMeetingCondition(owner, playerCondition))
2722 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2729 newRank += enchant->EffectPointsMin[i];
2731 newRank -= enchant->EffectPointsMin[i];
2766 if (artifactCategoryId)
2768 uint32 artifactKnowledgeLevel = 1;
2773 amount =
uint64(amount * artifactKnowledge->Multiplier);
2776 amount = 50 * (amount / 50);
2777 else if (amount >= 1000)
2778 amount = 25 * (amount / 25);
2779 else if (amount >= 50)
2780 amount = 5 * (amount / 5);
2787 artifactXpGain.
Amount = amount;
2801 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2821 std::stringstream sstr;
2846 GemItemLevelBonus[i] = 0;
2847 GemRelicType[i] = -1;
2848 GemRelicRankBonus[i] = 0;
2853 AppearanceModID = 0;
2854 RepairCostMultiplier = 1.0f;
2858 HasFixedLevel =
false;
2859 RequiredLevelOverride = 0;
2860 AzeriteTierUnlockSetId = 0;
2862 AzeriteTierUnlockSetId = azeriteEmpoweredItem->AzeriteTierUnlockSetID;
2865 RequiredLevelCurve = 0;
2869 Effects[EffectCount++] = itemEffect;
2871 for (std::size_t i = EffectCount; i < Effects.size(); ++i)
2872 Effects[i] =
nullptr;
2877 _state.SuffixPriority = std::numeric_limits<int32>::max();
2878 _state.AppearanceModPriority = std::numeric_limits<int32>::max();
2879 _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max();
2880 _state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max();
2881 _state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max();
2882 _state.HasQualityBonus =
false;
2895 AddBonusList(bonusListID);
2901 AddBonus(bonus->Type, bonus->Value);
2909 ItemLevelBonus += values[0];
2915 if (ItemStatType[statIndex] == values[0] || ItemStatType[statIndex] == -1)
2920 ItemStatType[statIndex] = values[0];
2921 StatPercentEditor[statIndex] += values[1];
2926 if (!_state.HasQualityBonus)
2928 Quality =
static_cast<uint32>(values[0]);
2929 _state.HasQualityBonus =
true;
2931 else if (Quality <
static_cast<uint32>(values[0]))
2932 Quality =
static_cast<uint32>(values[0]);
2935 if (values[1] < _state.SuffixPriority)
2937 Suffix =
static_cast<uint32>(values[0]);
2938 _state.SuffixPriority = values[1];
2943 uint32 socketCount = values[0];
2955 if (values[1] < _state.AppearanceModPriority)
2957 AppearanceModID =
static_cast<uint32>(values[0]);
2958 _state.AppearanceModPriority = values[1];
2962 RequiredLevel += values[0];
2965 RepairCostMultiplier *=
static_cast<float>(values[0]) * 0.01f;
2969 if (values[1] < _state.ScalingStatDistributionPriority)
2971 ContentTuningId =
static_cast<uint32>(values[2]);
2972 PlayerLevelToItemLevelCurveId =
static_cast<uint32>(values[3]);
2973 _state.ScalingStatDistributionPriority = values[1];
2981 RelicType = values[0];
2984 RequiredLevelOverride = values[0];
2987 if (values[1] < _state.AzeriteTierUnlockSetPriority)
2989 AzeriteTierUnlockSetId = values[0];
2990 _state.AzeriteTierUnlockSetPriority = values[1];
2994 CanDisenchant = values[0] != 0;
2997 CanScrap = values[0] != 0;
3001 Effects[EffectCount++] = itemEffect;
3004 if (values[2] < _state.RequiredLevelCurvePriority)
3006 RequiredLevelCurve = values[0];
3007 _state.RequiredLevelCurvePriority = values[2];
3009 ContentTuningId =
static_cast<uint32>(values[1]);
@ CHAR_UPD_ITEM_INSTANCE_ON_LOAD
@ CHAR_DEL_ITEM_INSTANCE_GEMS
@ CHAR_DEL_ITEM_INSTANCE_ARTIFACT
@ CHAR_DEL_ITEM_INSTANCE_TRANSMOG
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
@ CHAR_DEL_ITEM_INSTANCE_ARTIFACT_POWERS
@ CHAR_INS_ITEM_INSTANCE_ARTIFACT_POWERS
@ CHAR_DEL_ITEM_BOP_TRADE
@ CHAR_DEL_ITEM_INSTANCE_MODIFIERS
@ CHAR_DEL_ITEM_REFUND_INSTANCE
@ CHAR_INS_ITEM_INSTANCE_MODIFIERS
@ CHAR_INS_ITEM_INSTANCE_TRANSMOG
@ CHAR_INS_ITEM_INSTANCE_ARTIFACT
@ CHAR_INS_ITEM_INSTANCE_GEMS
@ CHAR_INS_ITEM_REFUND_INSTANCE
DB2Storage< ArtifactAppearanceEntry > sArtifactAppearanceStore("ArtifactAppearance.db2", &ArtifactAppearanceLoadInfo::Instance)
DB2Storage< ItemNameDescriptionEntry > sItemNameDescriptionStore("ItemNameDescription.db2", &ItemNameDescriptionLoadInfo::Instance)
DB2Storage< ArtifactEntry > sArtifactStore("Artifact.db2", &ArtifactLoadInfo::Instance)
DB2Storage< ArtifactPowerPickerEntry > sArtifactPowerPickerStore("ArtifactPowerPicker.db2", &ArtifactPowerPickerLoadInfo::Instance)
DB2Storage< ImportPriceWeaponEntry > sImportPriceWeaponStore("ImportPriceWeapon.db2", &ImportPriceWeaponLoadInfo::Instance)
DB2Storage< DurabilityQualityEntry > sDurabilityQualityStore("DurabilityQuality.db2", &DurabilityQualityLoadInfo::Instance)
DB2Storage< ArtifactPowerEntry > sArtifactPowerStore("ArtifactPower.db2", &ArtifactPowerLoadInfo::Instance)
DB2Storage< ItemPriceBaseEntry > sItemPriceBaseStore("ItemPriceBase.db2", &ItemPriceBaseLoadInfo::Instance)
DB2Storage< ArtifactUnlockEntry > sArtifactUnlockStore("ArtifactUnlock.db2", &ArtifactUnlockLoadInfo::Instance)
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
DB2Storage< ItemSetEntry > sItemSetStore("ItemSet.db2", &ItemSetLoadInfo::Instance)
DB2Storage< ItemEffectEntry > sItemEffectStore("ItemEffect.db2", &ItemEffectLoadInfo::Instance)
DB2Storage< ImportPriceShieldEntry > sImportPriceShieldStore("ImportPriceShield.db2", &ImportPriceShieldLoadInfo::Instance)
DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance)
DB2Storage< ItemDisenchantLootEntry > sItemDisenchantLootStore("ItemDisenchantLoot.db2", &ItemDisenchantLootLoadInfo::Instance)
DB2Storage< AzeriteLevelInfoEntry > sAzeriteLevelInfoStore("AzeriteLevelInfo.db2", &AzeriteLevelInfoLoadInfo::Instance)
DB2Storage< ImportPriceQualityEntry > sImportPriceQualityStore("ImportPriceQuality.db2", &ImportPriceQualityLoadInfo::Instance)
DB2Storage< GemPropertiesEntry > sGemPropertiesStore("GemProperties.db2", &GemPropertiesLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
DB2Storage< ImportPriceArmorEntry > sImportPriceArmorStore("ImportPriceArmor.db2", &ImportPriceArmorLoadInfo::Instance)
DB2Storage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore("SpellItemEnchantment.db2", &SpellItemEnchantmentLoadInfo::Instance)
DB2Storage< AzeritePowerEntry > sAzeritePowerStore("AzeritePower.db2", &AzeritePowerLoadInfo::Instance)
DB2Storage< ItemAppearanceEntry > sItemAppearanceStore("ItemAppearance.db2", &ItemAppearanceLoadInfo::Instance)
DB2Storage< AzeriteEssenceEntry > sAzeriteEssenceStore("AzeriteEssence.db2", &AzeriteEssenceLoadInfo::Instance)
DB2Storage< ArtifactAppearanceSetEntry > sArtifactAppearanceSetStore("ArtifactAppearanceSet.db2", &ArtifactAppearanceSetLoadInfo::Instance)
DB2Storage< DurabilityCostsEntry > sDurabilityCostsStore("DurabilityCosts.db2", &DurabilityCostsLoadInfo::Instance)
#define MAX_ITEM_ENCHANTMENT_EFFECTS
@ ITEM_BONUS_REQUIRED_LEVEL
@ ITEM_BONUS_AZERITE_TIER_UNLOCK_SET
@ ITEM_BONUS_SCALING_STAT_DISTRIBUTION
@ ITEM_BONUS_SCALING_STAT_DISTRIBUTION_FIXED
@ ITEM_BONUS_OVERRIDE_CAN_DISENCHANT
@ ITEM_BONUS_REQUIRED_LEVEL_CURVE
@ ITEM_BONUS_REPAIR_COST_MULTIPLIER
@ ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL
@ ITEM_BONUS_OVERRIDE_CAN_SCRAP
@ ITEM_BONUS_ITEM_EFFECT_ID
#define MAX_AZERITE_EMPOWERED_TIER
@ ITEM_ENCHANTMENT_TYPE_BONUS_LIST_CURVE
@ ITEM_ENCHANTMENT_TYPE_ARTIFACT_POWER_BONUS_RANK_BY_TYPE
@ ITEM_ENCHANTMENT_TYPE_ARTIFACT_POWER_BONUS_RANK_BY_ID
@ ITEM_ENCHANTMENT_TYPE_BONUS_LIST_ID
@ ITEM_ENCHANTMENT_TYPE_ARTIFACT_POWER_BONUS_RANK_PICKER
#define MAX_ITEM_PROTO_SOCKETS
@ CURVE_ID_ARTIFACT_RELIC_ITEM_LEVEL_BONUS
@ ARTIFACT_POWER_FLAG_SCALES_WITH_NUM_POWERS
@ ARTIFACT_POWER_FLAG_MAX_RANK_WITH_TIER
@ ARTIFACT_POWER_FLAG_FIRST
@ ITEM_SET_FLAG_LEGACY_INACTIVE
#define MAX_AZERITE_ESSENCE_SLOT
#define MAX_ITEM_PROTO_STATS
#define MAX_ARTIFACT_TIER
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
#define ASSERT_NODEBUGINFO
@ SOCK_ENCHANTMENT_SLOT_3
@ MAX_INSPECTED_ENCHANTMENT_SLOT
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3
@ ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_5
@ ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2
@ ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_ALL_SPECS
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4
@ ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1
@ ITEM_MODIFIER_TIMEWALKER_LEVEL
@ ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_5
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_5
@ ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1
@ ITEM_MODIFIER_ARTIFACT_APPEARANCE_ID
@ ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3
@ ITEM_MODIFIER_BATTLE_PET_BREED_DATA
@ ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS
@ ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2
@ ITEM_MODIFIER_ARTIFACT_TIER
@ ITEM_MODIFIER_BATTLE_PET_SPECIES_ID
@ ITEM_MODIFIER_BATTLE_PET_LEVEL
@ ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1
TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass)
uint32 ItemRandomBonusListId
int32 const SocketColorToGemTypeMask[26]
@ ITEM_FLAG2_NO_ALTER_ITEM_VISUAL
@ ITEM_FLAG2_OVERRIDE_GOLD_COST
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
@ ITEM_SUBCLASS_WEAPON_GUN
@ ITEM_SUBCLASS_WEAPON_AXE2
@ ITEM_SUBCLASS_WEAPON_STAFF
@ ITEM_SUBCLASS_WEAPON_MACE
@ ITEM_SUBCLASS_WEAPON_WARGLAIVES
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
@ ITEM_SUBCLASS_WEAPON_MACE2
@ ITEM_SUBCLASS_WEAPON_DAGGER
@ ITEM_SUBCLASS_WEAPON_BOW
@ ITEM_SUBCLASS_WEAPON_SWORD
@ ITEM_SUBCLASS_WEAPON_AXE
@ ITEM_SUBCLASS_WEAPON_FIST_WEAPON
@ ITEM_SUBCLASS_WEAPON_SWORD2
@ ITEM_SUBCLASS_WEAPON_POLEARM
@ ITEM_FIELD_FLAG_REFUNDABLE
@ ITEM_FIELD_FLAG_SOULBOUND
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
@ BAG_FAMILY_MASK_MINING_SUPP
@ BAG_FAMILY_MASK_ENCHANTING_SUPP
@ BAG_FAMILY_MASK_SOUL_SHARDS
@ BAG_FAMILY_MASK_INSCRIPTION_SUPP
@ BAG_FAMILY_MASK_BULLETS
@ BAG_FAMILY_MASK_ENGINEERING_SUPP
@ BAG_FAMILY_MASK_COOKING_SUPP
@ BAG_FAMILY_MASK_FISHING_SUPP
@ BAG_FAMILY_MASK_LEATHERWORKING_SUPP
@ ITEM_SUBCLASS_CONTAINER
@ ITEM_SUBCLASS_REAGENT_CONTAINER
@ ITEM_SUBCLASS_COOKING_CONTAINER
@ ITEM_SUBCLASS_INSCRIPTION_CONTAINER
@ ITEM_SUBCLASS_LEATHERWORKING_CONTAINER
@ ITEM_SUBCLASS_TACKLE_CONTAINER
@ ITEM_SUBCLASS_GEM_CONTAINER
@ ITEM_SUBCLASS_SOUL_CONTAINER
@ ITEM_SUBCLASS_ENCHANTING_CONTAINER
@ ITEM_SUBCLASS_MINING_CONTAINER
@ ITEM_SUBCLASS_HERB_CONTAINER
@ ITEM_SUBCLASS_ENGINEERING_CONTAINER
@ ITEM_SUBCLASS_AMMO_POUCH
@ ITEM_FLAG_NO_DISENCHANT
@ ITEM_FLAG3_CAN_STORE_ENCHANTS
@ ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP
@ ITEM_MOD_CORRUPTION_RESISTANCE
@ ITEM_SUBCLASS_ARMOR_MAIL
@ ITEM_SUBCLASS_ARMOR_CLOTH
@ ITEM_SUBCLASS_ARMOR_LEATHER
@ ITEM_SUBCLASS_ARMOR_PLATE
@ ITEM_SUBCLASS_ARMOR_MISCELLANEOUS
@ ITEM_SUBCLASS_ARMOR_COSMETIC
@ ITEM_SUBCLASS_GEM_ARTIFACT_RELIC
void RemoveItemsSetItem(Player *player, Item const *item)
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
ItemModifier const AppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
ItemTransmogrificationWeaponCategory
static ItemTransmogrificationWeaponCategory GetTransmogrificationWeaponCategory(ItemTemplate const *proto)
ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
Item * NewItemOrBag(ItemTemplate const *proto)
ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS]
int32 const ItemTransmogrificationSlots[MAX_INVTYPE]
void AddItemsSetItem(Player *player, Item const *item)
void AddItemToUpdateQueueOf(Item *item, Player *player)
#define MAX_ENCHANTMENT_OFFSET
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
std::set< ObjectGuid > GuidSet
std::unordered_map< Player *, UpdateData > UpdateDataMapType
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ EQUIPMENT_SLOT_SHOULDERS
@ EQUIPMENT_SLOT_MAINHAND
#define INVENTORY_SLOT_BAG_0
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
#define MAX_SPECIALIZATIONS
@ SPELL_EFFECT_ENCHANT_ITEM
@ SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
@ SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
void put(std::size_t pos, T value)
void AddItemAppearance(Item *item)
Class used to access individual fields of database query result.
std::string GetDebugInfo() const override
uint32 GetEnchantRequiredLevel() const
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
uint32 GetPaidExtendedCost() const
void SetItemFlag(ItemFieldFlags flags)
static bool CanTransmogrifyItemWithItem(Item const *item, ItemModifiedAppearanceEntry const *itemModifiedAppearance)
void SetSpellCharges(uint8 index, int32 value)
bool AddToObjectUpdate() override
void SetText(std::string const &text)
void SetArtifactPower(uint16 artifactPowerId, uint8 purchasedRank, uint8 currentRankWithBonus)
void UpdateDuration(Player *owner, uint32 diff)
virtual void SaveToDB(CharacterDatabaseTransaction trans)
void SetFixedLevel(uint8 level)
uint32 GetBuyPrice(Player const *owner, bool &standardPrice) const
void ReplaceAllItemFlags(ItemFieldFlags flags)
void BuildUpdate(UpdateDataMapType &) override
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
void RemoveItemFlag(ItemFieldFlags flags)
void BuildValuesUpdateWithFlag(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const override
ItemBondingType GetBonding() const
void DeleteRefundDataFromDB(CharacterDatabaseTransaction *trans)
uint32 GetEnchantmentId(EnchantmentSlot slot) const
std::unordered_map< uint32, uint16 > m_artifactPowerIdToIndex
void SetPaidMoney(uint64 money)
int32 GetSpellCharges(uint8 index=0) const
Item * CloneItem(uint32 count, Player const *player=nullptr) const
void AddBonuses(uint32 bonusListID)
uint8 GetGemCountWithID(uint32 GemID) const
bool IsBoundAccountWide() const
void InitArtifactPowers(uint8 artifactId, uint8 artifactTier)
AzeriteItem * ToAzeriteItem()
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, Player const *target) const
int32 GetItemStatType(uint32 index) const
bool CanBeTraded(bool mail=false, bool trade=false) const
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
void SetContext(ItemContext context)
uint32 GetQuality() const
std::array< uint32, MAX_ITEM_PROTO_SOCKETS > m_gemScalingLevels
void GiveArtifactXp(uint64 amount, Item *sourceItem, uint32 artifactCategoryId)
UF::SocketedGem const * GetGem(uint16 slot) const
void SetCount(uint32 value)
void SetModifier(ItemModifier modifier, uint32 value)
void SetDurability(uint32 durability)
ObjectGuid GetCreator() const
ItemTemplate const * GetTemplate() const
void ApplyArtifactPowerEnchantmentBonuses(EnchantmentSlot slot, uint32 enchantId, bool apply, Player *owner)
std::vector< int32 > const & GetBonusListIDs() const
bool IsBOPTradeable() const
void SetGem(uint16 slot, ItemDynamicFieldGems const *gem, uint32 gemScalingLevel)
void SaveRefundDataToDB()
ItemContext GetContext() const
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr, bool addToCollection=true)
ItemRandomBonusListId m_randomBonusListId
uint32 GetVisibleEnchantmentId(Player const *owner) const
void ClearUpdateMask(bool remove) override
friend void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
bool IsBindedNotWith(Player const *player) const
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
void SendTimeUpdate(Player *owner)
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
BonusData const * GetBonus() const
void SetItemRandomBonusList(ItemRandomBonusListId bonusListId)
void UpdatePlayedTime(Player *owner)
Player * GetOwner() const
bool IsValidTransmogrificationTarget() const
ObjectGuid GetOwnerGUID() const
uint32 GetAppearanceModId() const
uint32 GetDisplayId(Player const *owner) const
uint64 GetPaidMoney() const
bool HasEnchantRequiredSkill(Player const *player) const
int32 GetVisibleSecondaryModifiedAppearanceId(Player const *owner) const
time_t m_lastPlayedTimeUpdate
bool IsRefundable() const
ItemModifiedAppearanceEntry const * GetItemModifiedAppearance() const
float GetItemStatValue(uint32 index, Player const *owner) const
bool GemsFitSockets() const
uint64 CalculateDurabilityRepairCost(float discount) const
bool IsBoundByEnchant() const
void SetSoulboundTradeable(GuidSet const &allowedLooters)
void SetContainedIn(ObjectGuid guid)
uint32 GetVisibleEntry(Player const *owner) const
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
ObjectGuid GetGiftCreator() const
void CheckArtifactRelicSlotUnlock(Player const *owner)
UF::ArtifactPower const * GetArtifactPower(uint32 artifactPowerId) const
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
uint32 GetVisibleModifiedAppearanceId(Player const *owner) const
bool IsArtifactDisabled() const
uint32 GetTotalUnlockedArtifactPowers() const
uint32 m_paidExtendedCost
void RemoveFromObjectUpdate() override
void ClearEnchantment(EnchantmentSlot slot)
ItemDisenchantLootEntry const * GetDisenchantLoot(Player const *owner) const
void SetArtifactXP(uint64 xp)
std::unique_ptr< Loot > m_loot
void SetCreator(ObjectGuid guid)
uint32 GetItemLevel(Player const *owner) const
ObjectGuid const & GetRefundRecipient() const
void SetCreatePlayedTime(uint32 createPlayedTime)
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
void SetPaidExtendedCost(uint32 iece)
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
void SetBonuses(std::vector< int32 > bonusListIDs)
void SetAppearanceModId(uint32 appearanceModId)
std::string GetNameForLocaleIdx(LocaleConstant locale) const override
void SetRefundRecipient(ObjectGuid const &guid)
uint32 GetSellPrice(Player const *owner) const
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
void ClearSoulboundTradeable(Player *currentOwner)
bool IsNotEmptyBag() const
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field *fields, uint32 entry)
void SetExpiration(uint32 expiration)
bool CheckSoulboundTradeExpire()
void SetOwnerGUID(ObjectGuid guid)
float GetRepairCostMultiplier() const
uint16 GetVisibleItemVisual(Player const *owner) const
uint16 GetVisibleAppearanceModId(Player const *owner) const
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const override
void SetGiftCreator(ObjectGuid guid)
uint32 GetModifier(ItemModifier modifier) const
void SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges, ObjectGuid caster=ObjectGuid::Empty)
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
void AddArtifactPower(ArtifactPowerData const *artifactPower)
uint32 GetTotalPurchasedArtifactPowers() const
void CopyArtifactDataFromParent(Item *parent)
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
friend void AddItemToUpdateQueueOf(Item *item, Player *player)
bool IsInUpdateQueue() const
int32 GetRequiredLevel() const
static Item * CreateItem(uint32 itemEntry, uint32 count, ItemContext context, Player const *player=nullptr, bool addDefaultBonuses=true)
void LoadArtifactData(Player const *owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector< ArtifactPowerData > &powers)
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
void BuildFieldsUpdate(Player *, UpdateDataMapType &) const
ObjectGuid const & GetGUID() const
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
virtual void ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
UF::UpdateFieldHolder m_values
virtual std::string GetDebugInfo() const
void _Create(ObjectGuid const &guid)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void RemoveDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter, uint32 index)
static ObjectGuid GetGUID(Object const *o)
void SetEntry(uint32 entry)
virtual void SetObjectScale(float scale)
ChrSpecialization GetPrimarySpecialization() const
std::vector< Item * > m_itemUpdateQueue
UF::UpdateField< UF::PlayerData, 0, TYPEID_PLAYER > m_playerData
void SendDirectMessage(WorldPacket const *data) const
uint16 GetSkillValue(uint32 skill) const
bool MeetPlayerCondition(uint32 conditionId) const
WorldSession * GetSession() const
void DestroyItem(uint8 bag, uint8 slot, bool update)
bool IsUsingPvpItemLevels() const
std::vector< ItemSetEffect * > ItemSetEff
static bool IsBagPos(uint16 pos)
uint8 GetActiveTalentGroup() const
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool formChange=false)
void DeleteRefundReference(ObjectGuid it)
void ApplyArtifactPowerRank(Item *artifact, ArtifactPowerRankEntry const *artifactPowerRank, bool apply)
bool m_itemUpdateQueueBlocked
void setUInt8(const uint8 index, const uint8 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const uint64 value)
bool HasEffect(SpellEffectName effect) const
int32 EquippedItemSubClassMask
int32 EquippedItemInventoryTypeMask
Mask const & GetChangesMask() const
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
uint32 GetChangedObjectTypeMask() const
UF::UpdateField< UF::UnitData, 0, TYPEID_UNIT > m_unitData
bool BuildPacket(WorldPacket *packet)
uint32 GetBlock(uint32 index) const
constexpr uint32 GetMapId() const
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
CollectionMgr * GetCollectionMgr() const
void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint32 itemId, uint32 enchantId, uint32 enchantSlot)
std::vector< int32 > GetBonusListsForItem(uint32 itemId, ItemBonusGenerationParams const ¶ms)
std::span< ItemBonusEntry const * > GetItemBonuses(uint32 bonusListId)
uint32 GetItemBonusListForItemLevelDelta(int16 delta)
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
std::string ToString(Type &&val, Params &&... params)
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
uint8 CurrentRankWithBonus
int32 RequiredLevelOverride
void AddBonus(uint32 type, std::array< int32, 4 > const &values)
uint32 PlayerLevelToItemLevelCurveId
int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]
int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]
void AddBonusList(uint32 bonusListId)
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]
void Initialize(ItemTemplate const *proto)
std::array< uint16, 8 > ArmorSubClassCost
std::array< uint16, 21 > WeaponSubClassCost
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
uint32 GetBaseItemLevel() const
uint32 GetArea(uint32 index) const
uint32 GetQuality() const
int32 GetStatModifierBonusStat(uint32 index) const
uint32 GetDuration() const
uint32 GetBuyCount() const
float GetPriceRandomValue() const
uint32 GetGemProperties() const
uint32 GetMaxStackSize() const
InventoryType GetInventoryType() const
SocketColor GetSocketColor(uint32 index) const
uint32 GetBuyPrice() const
ItemBondingType GetBonding() const
uint32 GetItemSet() const
float GetStatPercentageOfSocket(uint32 index) const
uint32 GetScalingStatContentTuning() const
uint8 GetArtifactID() const
std::vector< ItemEffectEntry const * > Effects
bool IsCraftingReagent() const
int32 GetBaseRequiredLevel() const
bool HasFlag(ItemFlags flag) const
uint32 GetSubClass() const
uint32 GetSellPrice() const
char const * GetName(LocaleConstant locale) const
uint8 GetRequiredExpansion() const
int32 GetStatPercentEditor(uint32 index) const
float GetPriceVariance() const
uint32 GetPlayerLevelToItemLevelCurveId() const
uint32 GetBagFamily() const
void operator()(Player const *player) const
UF::ObjectData::Base ObjectMask
UF::ItemData::Base ItemMask
uint8 CurrentRankWithBonus
UpdateFieldArray< UF::ItemEnchantment, 13, 27, 28 > Enchantment
UpdateField< UF::ItemModList, 0, 17 > Modifiers
DynamicUpdateField< UF::SocketedGem, 0, 2 > Gems
UpdateField< WorldPackets::Item::ItemBonusKey, 0, 19 > ItemBonusKey
UpdateField< uint32, 0, 11 > MaxDurability
UpdateField< uint8, 0, 16 > ItemAppearanceModID
UpdateField< uint64, 0, 15 > ArtifactXP
UpdateField< uint32, 0, 7 > StackCount
DynamicUpdateField< UF::ArtifactPower, 0, 1 > ArtifactPowers
UpdateField< int16, 0, 3 > Charges
UpdateField< int32, 0, 1 > ID
UpdateField< uint16, 0, 4 > Inactive
UpdateField< uint32, 0, 2 > Duration
DynamicUpdateField< UF::ItemMod, -1, 0 > Values
UpdateFieldArray< uint16, 16, 3, 4 > BonusListIDs
UpdateField< uint8, 0, 2 > Context
UpdateField< int32, 0, 1 > ItemID
std::vector< int32 > BonusListIDs
Optional< ItemBonuses > ItemBonus