85 TC_LOG_ERROR(
"sql.sql",
"Item set {} for item (id {}) not found, mods not applied.", setid, proto->
GetId());
103 maxLevel = std::min<uint32>(maxLevel, contentTuning->MaxLevel);
112 for (
size_t x = 0; x < player->
ItemSetEff.size(); ++x)
131 if (x < player->ItemSetEff.size())
139 if (std::vector<ItemSetSpellEntry const*>
const* itemSetSpells =
sDB2Manager.GetItemSetSpells(setid))
150 TC_LOG_ERROR(
"entities.player.items",
"WORLD: unknown spell id {} in items set {} effects", itemSetSpell->SpellID, setid);
154 if (!eff->
SetBonuses.insert(itemSetSpell).second)
161 if (itemSetSpell->TraitSubTreeID &&
int32(itemSetSpell->TraitSubTreeID) != player->
m_playerData->CurrentCombatTraitConfigSubTreeID)
177 TC_LOG_ERROR(
"sql.sql",
"Item set #{} for item #{} not found, mods not removed.", setid, item->
GetEntry());
183 for (; setindex < player->
ItemSetEff.size(); setindex++)
198 if (std::vector<ItemSetSpellEntry const*>
const* itemSetSpells =
sDB2Manager.GetItemSetSpells(setid))
234 || (itemSetSpell->TraitSubTreeID &&
int32(itemSetSpell->TraitSubTreeID) != player->
m_playerData->CurrentCombatTraitConfigSubTreeID))
247 delete itemSetEffect;
252 if (!pProto || !pBagProto)
363 Field* fields = artifactResult->Fetch();
375 uint32 maxRank = artifactPower->MaxPurchasableRank;
378 maxRank += info.
Artifact->ArtifactTierId - artifactPower->Tier;
385 info.
Artifact->ArtifactPowers.push_back(artifactPowerData);
388 }
while (artifactResult->NextRow());
402 if (azeriteItemResult)
406 Field* fields = azeriteItemResult->Fetch();
413 for (std::size_t i = 0; i < info.
AzeriteItem->SelectedAzeriteEssences.size(); ++i)
419 info.
AzeriteItem->SelectedAzeriteEssences[i].SpecializationId = specializationId;
423 if (!azeriteEssence || !
sDB2Manager.IsSpecSetMember(azeriteEssence->
SpecSetID, specializationId))
426 info.
AzeriteItem->SelectedAzeriteEssences[i].AzeriteEssenceId[j] = azeriteEssence->
ID;
430 }
while (azeriteItemResult->NextRow());
435 if (azeriteItemMilestonePowersResult)
439 Field* fields = azeriteItemMilestonePowersResult->Fetch();
443 info.
AzeriteItem->AzeriteItemMilestonePowers.push_back(fields[1].GetUInt32());
445 while (azeriteItemMilestonePowersResult->NextRow());
450 if (azeriteItemUnlockedEssencesResult)
454 Field* fields = azeriteItemUnlockedEssencesResult->Fetch();
461 info.
AzeriteItem->UnlockedAzeriteEssences.push_back(azeriteEssencePower);
464 while (azeriteItemUnlockedEssencesResult->NextRow());
469 if (azeriteEmpoweredItemResult)
473 Field* fields = azeriteEmpoweredItemResult->Fetch();
482 }
while (azeriteEmpoweredItemResult->NextRow());
512 _Create(ObjectGuid::Create<HighGuid::Item>(guidlow));
547 if (itemProto->
GetArtifactID() != artifactAppearanceSet->ArtifactID)
571 return itemTemplate->
GetName(locale);
579 return !bag->IsEmpty();
589 TC_LOG_DEBUG(
"entities.player.items",
"Item::UpdateDuration Item (Entry: {} Duration {} Diff {})",
GetEntry(), duration, diff);
591 if (duration <= diff)
604 static constexpr uint32 MaxSpellChargesSlot = UF::size<decltype(UF::ItemData::SpellCharges)>();
613 return MaxSpellChargesSlot;
617 if (bonusData.
Effects[i] == effect)
620 return MaxSpellChargesSlot;
626 if (slot < m_itemData->SpellCharges.size())
635 if (slot < m_itemData->SpellCharges.size())
641 bool isInTransaction = bool(trans);
642 if (!isInTransaction)
659 std::ostringstream ssSpells;
661 ssSpells <<
m_itemData->SpellCharges[i] <<
' ';
662 stmt->
setString(++index, ssSpells.str());
666 std::ostringstream ssEnchants;
678 ssEnchants <<
"0 0 0 ";
681 stmt->
setString(++index, ssEnchants.str());
694 std::ostringstream bonusListIDs;
696 bonusListIDs << bonusListID <<
' ';
697 stmt->
setString(++index, bonusListIDs.str());
720 uint32 const gemFields = 4;
725 stmt->
setUInt32(1 + i * gemFields, gemData.ItemID);
726 std::ostringstream gemBonusListIDs;
727 for (
uint16 bonusListID : gemData.BonusListIDs)
729 gemBonusListIDs << bonusListID <<
' ';
730 stmt->
setString(2 + i * gemFields, gemBonusListIDs.str());
731 stmt->
setUInt8(3 + i * gemFields, gemData.Context);
737 stmt->
setString(2 + i * gemFields,
""sv);
738 stmt->
setUInt8(3 + i * gemFields, 0);
746 stmt->
setString(2 + i * gemFields,
""sv);
747 stmt->
setUInt8(3 + i * gemFields, 0);
781 if (std::find_if(std::begin(transmogMods), std::end(transmogMods), [
this](
ItemModifier modifier) {
return GetModifier(modifier) != 0; }) != std::end(transmogMods))
827 stmt->
setUInt32(1, artifactPower.ArtifactPowerID);
828 stmt->
setUInt8(2, artifactPower.PurchasedRank);
843 if (std::find_if(std::begin(modifiersTable), std::end(modifiersTable), [
this](
ItemModifier modifier) {
return GetModifier(modifier) != 0; }) != std::end(modifiersTable))
887 if (!isInTransaction)
903 if (!isInTransaction)
928 _Create(ObjectGuid::Create<HighGuid::Item>(guid));
948 bool need_save =
false;
949 if (
uint64 creator = fields[2].GetUInt64())
952 SetCreator(ObjectGuid::Create<HighGuid::Player>(creator));
954 SetCreator(ObjectGuid::Create<HighGuid::Item>(creator));
956 if (
uint64 giftCreator = fields[3].GetUInt64())
957 SetGiftCreator(ObjectGuid::Create<HighGuid::Player>(giftCreator));
963 if ((proto->
GetDuration() == 0) != (duration == 0))
985 SetText(fields[13].GetString());
994 std::vector<std::string_view> bonusListString =
Trinity::Tokenize(fields[19].GetStringView(),
' ',
false);
995 std::vector<int32> bonusListIDs;
996 bonusListIDs.reserve(bonusListString.size());
997 for (std::string_view token : bonusListString)
999 bonusListIDs.push_back(*bonusListID);
1003 std::vector<std::string_view> tokens =
Trinity::Tokenize(fields[6].GetStringView(),
' ',
false);
1028 uint32 const gemFields = 4;
1030 memset(gemData, 0,
sizeof(gemData));
1034 std::vector<std::string_view> gemBonusListIDs =
Trinity::Tokenize(fields[39 + i * gemFields].GetStringView(),
' ',
false);
1036 for (std::string_view token : gemBonusListIDs)
1038 gemData[i].BonusListIDs[b++] = *bonusListID;
1042 SetGem(i, &gemData[i], fields[41 + i * gemFields].GetUInt32());
1049 std::vector<std::string_view> enchantmentTokens =
Trinity::Tokenize(fields[8].GetStringView(),
' ',
false);
1087 addionalData->
Artifact->ArtifactTierId, addionalData->
Artifact->ArtifactPowers);
1091 azeriteItem->LoadAzeriteItemData(owner, *addionalData->
AzeriteItem);
1095 azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(owner, *addionalData->
AzeriteEmpoweredItem);
1100 for (
uint8 i = 0; i <= artifactTier; ++i)
1110 uint8 totalPurchasedRanks = 0;
1113 power.CurrentRankWithBonus += power.PurchasedRank;
1114 totalPurchasedRanks += power.PurchasedRank;
1123 switch (enchant->Effect[i])
1126 if (
uint32(artifactPower->
Label) == enchant->EffectArg[i])
1127 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1130 if (artifactPower->
ID == enchant->EffectArg[i])
1131 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1139 power.CurrentRankWithBonus += enchant->EffectPointsMin[i];
1149 SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, power.CurrentRankWithBonus);
1158 SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, totalPurchasedRanks + 1);
1174 if (artifactUnlock->ArtifactID == artifactId)
1225 trans->Append(stmt);
1294 ASSERT(player !=
nullptr);
1298 TC_LOG_DEBUG(
"entities.player.items",
"AddItemToUpdateQueueOf - Owner's guid ({}) and player's guid ({}) don't match!",
1315 ASSERT(player !=
nullptr);
1319 TC_LOG_DEBUG(
"entities.player.items",
"RemoveItemFromUpdateQueueOf - Owner's guid ({}) and player's guid ({}) don't match!",
1357 if (owner->GetLootGUID() ==
GetGUID())
1373 if (
TradeData* tradeData = player->GetTradeData())
1378 tradeData->SetItem(slot,
this,
true);
1390 ASSERT(maxDurability >= curDurability);
1392 uint32 lostDurability = maxDurability - curDurability;
1393 if (!lostDurability)
1399 if (!durabilityCost)
1404 if (!durabilityQualityEntry)
1428 if (enchantEntry->RequiredSkillID && player->
GetSkillValue(enchantEntry->RequiredSkillID) < enchantEntry->RequiredSkillRank)
1442 if (enchantEntry->MinLevel > level)
1443 level = enchantEntry->MinLevel;
1596 gemBaseItemLevel = scaledIlvl;
1602 switch (gemEnchant->Effect[i])
1630 for (
uint32 i = 0; i < 16; ++i)
1656 GemColor = gemProperty->
Type;
1670 return gemData.ItemID == int32(GemID);
1678 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemID);
1683 gemBonus.Initialize(gemProto);
1685 for (uint16 bonusListID : gemData.BonusListIDs)
1686 gemBonus.AddBonusList(bonusListID);
1688 return gemBonus.LimitCategory == limitCategory;
1695 return proto && ((proto->
GetMap() && proto->
GetMap() != cur_mapId) ||
1732 ASSERT_NODEBUGINFO(count != 0,
"proto->Stackable == 0 but checked at loading already");
1738 if (addDefaultBonuses)
1833 m_itemData->WriteUpdate(mask, data, target,
this,
true);
1841 if (requestedObjectMask.IsAnySet())
1846 if (itemMask.IsAnySet())
1850 std::size_t sizePos = buffer.
wpos();
1856 m_objectData->WriteUpdate(requestedObjectMask, buffer, target,
this, ignoreNestedChangesMask);
1859 m_itemData->WriteUpdate(itemMask, buffer, target,
this, ignoreNestedChangesMask);
1887 owner->GetMap()->AddUpdateObject(
this);
1897 owner->GetMap()->RemoveUpdateObject(
this);
1906 trans->Append(stmt);
1913 trans->Append(stmt);
1924 (*trans)->Append(stmt);
1949 if (addToCollection)
2058 if (!source || !target)
2108 standardPrice =
false;
2121 float qualityFactor = qualityPrice->
Data;
2122 float baseFactor = 0.0f;
2133 baseFactor = basePrice->
Weapon;
2135 baseFactor = basePrice->
Armor;
2143 baseFactor = basePrice->
Weapon / 3.0f;
2146 float typeFactor = 0.0f;
2149 switch (inventoryType)
2197 typeFactor = shieldPrice->
Data;
2227 typeFactor = weaponPrice->
Data;
2230 standardPrice =
true;
2238 if (price && forVendor)
2240 std::span<ItemEffectEntry const* const> effects =
GetEffects();
2241 auto effectWithCharges = std::ranges::find_if(effects,
2244 if (effectWithCharges != effects.end())
2245 price = price *
GetSpellCharges(*effectWithCharges) / (*effectWithCharges)->Charges;
2248 if (repairCost < price)
2249 price -= repairCost;
2271 return cost * classEntry->PriceModifier / buyCount;
2292 azeriteLevel = azeriteItem->GetEffectiveLevel();
2298 int32 minItemLevel,
int32 minItemLevelCutoff,
int32 maxItemLevel,
bool pvpBonus,
uint32 azeriteLevel,
uint32 overrideContentTuningId)
2305 itemLevel = azeriteLevelInfo->ItemLevel;
2314 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2325 scalingLevel = fixedLevel ? fixedLevel : level;
2329 scalingLevel = std::min(std::max(
int16(scalingLevel), levels->MinLevel), levels->MaxLevel);
2338 int32 itemLevelBeforeUpgrades = itemLevel;
2350 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
2358 if (!squish || squish->
Flags & 0x1)
2361 if (squish->
Patch > currentBuild)
2375 if (minItemLevel && (!minItemLevelCutoff || itemLevelBeforeUpgrades >= minItemLevelCutoff) && itemLevel < minItemLevel)
2376 itemLevel = minItemLevel;
2378 if (maxItemLevel && itemLevel > maxItemLevel)
2379 itemLevel = maxItemLevel;
2422 if (!disenchantLoot)
2425 return disenchantLoot->
ID;
2437 if (!disenchantLoot)
2459 if (disenchant->Class != itemClass)
2462 if (disenchant->Subclass >= 0 && itemSubClass)
2465 if (disenchant->Quality != quality)
2468 if (disenchant->MinLevel > itemLevel || disenchant->MaxLevel < itemLevel)
2471 if (disenchant->ExpansionID != -2 && disenchant->ExpansionID != expansion)
2483 if (!itemModifiedAppearanceId)
2487 if (!itemModifiedAppearance)
2490 if (itemModifiedAppearance)
2492 return itemAppearance->ItemDisplayInfoID;
2506 return mod.
Type == modifier;
2509 if (modifierIndex != -1)
2510 return m_itemData->Modifiers->Values[modifierIndex].Value;
2519 return mod.
Type == modifier;
2524 if (modifierIndex == -1)
2530 mod.
Type = modifier;
2540 if (modifierIndex == -1)
2550 if (!itemModifiedAppearanceId)
2554 return transmog->ItemID;
2562 if (!itemModifiedAppearanceId)
2566 return transmog->ItemAppearanceModifierID;
2574 if (!itemModifiedAppearanceId)
2577 if (!itemModifiedAppearanceId)
2579 itemModifiedAppearanceId = itemModifiedAppearance->ID;
2581 return itemModifiedAppearanceId;
2587 if (!itemModifiedAppearanceId)
2590 return itemModifiedAppearanceId;
2602 return enchantmentId;
2608 return enchant->ItemVisual;
2653 return artifact->ArtifactCategoryID != 2;
2700 std::unordered_set<uint32> knownPowers;
2702 knownPowers.insert(power.ArtifactPowerID);
2706 if (artifactPower->Tier != artifactTier)
2709 if (knownPowers.contains(artifactPower->ID))
2725 uint32 extraUnlocked = 0;
2732 if (artifactXp < xpCost)
2735 artifactXp -= xpCost;
2740 return purchased + extraUnlocked;
2745 uint32 purchasedRanks = 0;
2747 purchasedRanks += power.PurchasedRank;
2749 return purchasedRanks;
2758 switch (enchant->Effect[i])
2761 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2768 newRank += enchant->EffectPointsMin[i];
2770 newRank -= enchant->EffectPointsMin[i];
2786 uint8 newRank =
m_itemData->ArtifactPowers[artifactPowerIndex].CurrentRankWithBonus;
2788 newRank += enchant->EffectPointsMin[i];
2790 newRank -= enchant->EffectPointsMin[i];
2809 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2816 newRank += enchant->EffectPointsMin[i];
2818 newRank -= enchant->EffectPointsMin[i];
2853 if (artifactCategoryId)
2855 uint32 artifactKnowledgeLevel = 1;
2860 amount =
uint64(amount * artifactKnowledge->Multiplier);
2863 amount = 50 * (amount / 50);
2864 else if (amount >= 1000)
2865 amount = 25 * (amount / 25);
2866 else if (amount >= 50)
2867 amount = 5 * (amount / 5);
2874 artifactXpGain.
Amount = amount;
2890 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2910 std::stringstream sstr;
2934 GemItemLevelBonus[i] = 0;
2935 GemRelicType[i] = -1;
2936 GemRelicRankBonus[i] = 0;
2941 AppearanceModID = 0;
2942 RepairCostMultiplier = 1.0f;
2945 DisenchantLootId = 0;
2947 HasFixedLevel =
false;
2948 RequiredLevelOverride = 0;
2949 AzeriteTierUnlockSetId = 0;
2951 AzeriteTierUnlockSetId = azeriteEmpoweredItem->AzeriteTierUnlockSetID;
2954 RequiredLevelCurve = 0;
2957 PvpItemLevelBonus = 0;
2961 ItemLevelOffset = 0;
2963 ScalingConfigItemLevelBonus = 0;
2964 ScalingConfigCraftingQualityItemLevelBonus = 0;
2968 Effects[EffectCount++] = itemEffect;
2970 for (std::size_t i = EffectCount; i < Effects.size(); ++i)
2971 Effects[i] =
nullptr;
2980 IgnoreSquish =
false;
2981 RestrictScalingToContentTuning =
false;
2982 ScalingConfigUsesPlayerLevel =
false;
2984 _state.SuffixPriority = std::numeric_limits<int32>::max();
2985 _state.AppearanceModPriority = std::numeric_limits<int32>::max();
2986 _state.DisenchantLootPriority = std::numeric_limits<int32>::max();
2987 _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max();
2988 _state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max();
2989 _state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max();
2990 _state.ItemLevelPriority = std::numeric_limits<int32>::max();
2991 _state.PvpItemLevelPriority = std::numeric_limits<int32>::max();
2992 _state.BondingPriority = std::numeric_limits<int32>::max();
2993 _state.ScalingConfigItemLevelBonusPriority = std::numeric_limits<int32>::max();
2994 _state.ScalingConfigCraftingQualityItemLevelBonusPriority = std::numeric_limits<int32>::max();
2995 _state.HasQualityBonus =
false;
2996 _state.HasItemLimitCategory =
false;
3009 AddBonusList(bonusListID);
3015 AddBonus(bonus->Type, bonus->Value);
3023 ItemLevelBonus += values[0];
3029 if (ItemStatType[statIndex] == values[0] || ItemStatType[statIndex] == -1)
3034 ItemStatType[statIndex] = values[0];
3035 StatPercentEditor[statIndex] += values[1];
3040 if (!_state.HasQualityBonus)
3042 Quality =
static_cast<uint32>(values[0]);
3043 _state.HasQualityBonus =
true;
3045 else if (Quality <
static_cast<uint32>(values[0]))
3046 Quality =
static_cast<uint32>(values[0]);
3049 if (values[1] < _state.SuffixPriority)
3051 Suffix =
static_cast<uint32>(values[0]);
3052 _state.SuffixPriority = values[1];
3057 uint32 socketCount = values[0];
3069 if (values[1] < _state.AppearanceModPriority)
3071 AppearanceModID =
static_cast<uint32>(values[0]);
3072 _state.AppearanceModPriority = values[1];
3076 RequiredLevel += values[0];
3079 RepairCostMultiplier *=
static_cast<float>(values[0]) * 0.01f;
3083 if (values[1] < _state.ScalingStatDistributionPriority)
3085 ContentTuningId =
static_cast<uint32>(values[2]);
3086 PlayerLevelToItemLevelCurveId =
static_cast<uint32>(values[3]);
3087 _state.ScalingStatDistributionPriority = values[1];
3092 if (values[1] < _state.DisenchantLootPriority)
3094 DisenchantLootId = values[0];
3095 _state.DisenchantLootPriority = values[1];
3102 RelicType = values[0];
3105 RequiredLevelOverride = values[0];
3108 if (values[1] < _state.AzeriteTierUnlockSetPriority)
3110 AzeriteTierUnlockSetId = values[0];
3111 _state.AzeriteTierUnlockSetPriority = values[1];
3115 CanDisenchant = values[0] != 0;
3118 CanScrap = values[0] != 0;
3122 Effects[EffectCount++] = itemEffect;
3125 if (values[2] < _state.RequiredLevelCurvePriority)
3127 RequiredLevelCurve = values[0];
3128 _state.RequiredLevelCurvePriority = values[2];
3130 ContentTuningId =
static_cast<uint32>(values[1]);
3134 if (!_state.HasItemLimitCategory)
3136 LimitCategory = values[0];
3137 _state.HasItemLimitCategory =
true;
3141 PvpItemLevelBonus += values[0];
3144 CanSalvage = values[0] != 0;
3147 CanRecraft = values[0] != 0;
3150 if (values[1] < _state.ItemLevelPriority)
3152 ItemLevel = values[0];
3153 _state.ItemLevelPriority = values[1];
3157 if (values[1] < _state.PvpItemLevelPriority)
3159 PvpItemLevel = values[0];
3160 _state.PvpItemLevelPriority = values[1];
3164 CannotTradeBindOnPickup = values[0] != 0;
3167 if (values[1] < _state.BondingPriority)
3170 _state.BondingPriority = values[1];
3174 if (values[3] < _state.ScalingStatDistributionPriority)
3176 ItemLevelOffsetCurveId = values[0];
3177 ItemLevelOffsetItemLevel = values[1];
3178 _state.ScalingStatDistributionPriority = values[3];
3182 if (values[1] < _state.ScalingStatDistributionPriority)
3184 _state.ScalingStatDistributionPriority = values[1];
3189 ItemLevelOffsetCurveId = itemOffsetCurve->CurveID;
3190 ItemLevelOffset = itemOffsetCurve->Offset;
3193 ScalingConfigUsesPlayerLevel =
false;
3194 ItemSquishEraID = scalingConfig->ItemSquishEraID;
3195 if (scalingConfig->Flags & 0x1)
3196 IgnoreSquish =
true;
3197 if (scalingConfig->Flags & 0x2)
3198 RestrictScalingToContentTuning =
true;
3200 if (values[1] < _state.RequiredLevelCurvePriority)
3202 ItemLevelOffsetItemLevel = scalingConfig->ItemLevel;
3203 RequiredLevelOverride = scalingConfig->RequiredLevel;
3204 RequiredLevelCurve = 0;
3210 AddBonusList(values[0]);
3213 if (values[1] < _state.ScalingStatDistributionPriority)
3215 _state.ScalingStatDistributionPriority = values[1];
3220 ItemLevelOffsetCurveId = itemOffsetCurve->CurveID;
3221 ItemLevelOffset = itemOffsetCurve->Offset;
3224 ScalingConfigUsesPlayerLevel =
true;
3225 ItemLevelOffsetItemLevel = 0;
3226 ItemSquishEraID = scalingConfig->ItemSquishEraID;
3227 if (scalingConfig->Flags & 0x1)
3228 IgnoreSquish =
true;
3229 if (scalingConfig->Flags & 0x2)
3230 RestrictScalingToContentTuning =
true;
3235 if (values[3] < _state.ScalingConfigCraftingQualityItemLevelBonusPriority)
3237 bool isSquished =
false;
3238 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
3246 if (!squish || squish->
Flags & 0x1)
3249 isSquished = squish->
Patch <= currentBuild;
3254 ScalingConfigCraftingQualityItemLevelBonus = values[isSquished ? 2 : 0];
3255 _state.ScalingConfigCraftingQualityItemLevelBonusPriority = values[3];
3259 if (values[1] < _state.ScalingConfigItemLevelBonusPriority)
3261 ScalingConfigItemLevelBonus = values[0];
3262 _state.ScalingConfigItemLevelBonusPriority = values[1];
std::unordered_map< Player *, UpdateData > UpdateDataMapType
@ 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< ItemScalingConfigEntry > sItemScalingConfigStore("ItemScalingConfig.db2", &ItemScalingConfigLoadInfo::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< ItemSquishEraEntry > sItemSquishEraStore("ItemSquishEra.db2", &ItemSquishEraLoadInfo::Instance)
DB2Storage< ImportPriceShieldEntry > sImportPriceShieldStore("ImportPriceShield.db2", &ImportPriceShieldLoadInfo::Instance)
DB2Storage< ItemOffsetCurveEntry > sItemOffsetCurveStore("ItemOffsetCurve.db2", &ItemOffsetCurveLoadInfo::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< 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_SCALING_CONFIG
@ ITEM_BONUS_ITEM_OFFSET_CURVE
@ ITEM_BONUS_OVERRIDE_CAN_RECRAFT
@ ITEM_BONUS_SCALING_ITEM_LEVEL_BONUS
@ ITEM_BONUS_REQUIRED_LEVEL
@ ITEM_BONUS_AZERITE_TIER_UNLOCK_SET
@ ITEM_BONUS_SCALING_STAT_DISTRIBUTION
@ ITEM_BONUS_BONDING_WITH_PRIORITY
@ ITEM_BONUS_SCALING_STAT_DISTRIBUTION_FIXED
@ ITEM_BONUS_CRAFTED_ITEM_LEVEL
@ ITEM_BONUS_OVERRIDE_CAN_DISENCHANT
@ ITEM_BONUS_PVP_ITEM_LEVEL_BASE
@ ITEM_BONUS_REQUIRED_LEVEL_CURVE
@ ITEM_BONUS_OVERRIDE_CAN_SALVAGE
@ ITEM_BONUS_ITEM_LEVEL_BASE
@ ITEM_BONUS_REPAIR_COST_MULTIPLIER
@ ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL
@ ITEM_BONUS_PVP_ITEM_LEVEL_INCREMENT
@ ITEM_BONUS_SCALING_CONFIG_AND_REQ_LEVEL
@ ITEM_BONUS_ITEM_LIMIT_CATEGORY
@ ITEM_BONUS_OVERRIDE_CANNOT_TRADE_BOP
@ ITEM_BONUS_OVERRIDE_CAN_SCRAP
@ ITEM_BONUS_ITEM_EFFECT_ID
@ ITEM_BONUS_ITEM_BONUS_LIST
@ ITEM_BONUS_DISENCHANT_LOOT_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_CONTENT_TUNING_ID
@ 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
float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass)
uint32 ItemRandomBonusListId
int32 const SocketColorToGemTypeMask[31]
@ ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE
@ ITEM_FLAG2_NO_ALTER_ITEM_VISUAL
@ ITEM_FLAG2_OVERRIDE_GOLD_COST
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
@ ITEM_FIELD_FLAG_REFUNDABLE
@ ITEM_FIELD_FLAG_SOULBOUND
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
@ ITEM_SPELLTRIGGER_ON_USE
@ 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]
void UpdateItemSetAuras(Player *player, bool formChange)
ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
Item * NewItemOrBag(ItemTemplate const *proto)
ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS]
static uint32 FindSpellChargesSlot(BonusData const &bonusData, ItemEffectEntry const *effect)
void AddItemsSetItem(Player *player, Item const *item)
void DeleteItemSetEffects(ItemSetEffect *itemSetEffect)
void AddItemToUpdateQueueOf(Item *item, Player *player)
ItemModifier const AppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS]
#define MAX_ENCHANTMENT_OFFSET
Item * NewItemOrBag(ItemTemplate const *proto)
ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS]
int32 const ItemTransmogrificationSlots[MAX_INVTYPE]
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
std::set< ObjectGuid > GuidSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ EQUIPMENT_SLOT_SHOULDERS
@ EQUIPMENT_SLOT_MAINHAND
constexpr uint8 INVENTORY_SLOT_BAG_0
@ SPELL_EFFECT_ENCHANT_ITEM
@ SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
@ SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
#define MAX_SPECIALIZATIONS
ObjectGuid const & GetGUID() const
void BuildUpdateChangesMask()
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
WowCS::EntityFragmentsHolder m_entityFragments
void RemoveDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter, uint32 index)
UF::UpdateFieldHolder m_values
void _Create(ObjectGuid const &guid)
void ClearUpdateMask(bool remove)
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void BuildFieldsUpdate(Player *player, UpdateDataMapType &data_map) const
void put(std::size_t pos, T value)
void AddItemAppearance(Item *item)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
Class used to access individual fields of database query result.
uint64 GetUInt64() const noexcept
uint32 GetUInt32() const noexcept
uint16 GetUInt16() const noexcept
uint8 GetUInt8() const noexcept
int32 GetInt32() const noexcept
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)
std::span< ItemEffectEntry const *const > GetEffects() const
static bool CanTransmogrifyItemWithItem(Item const *item, ItemModifiedAppearanceEntry const *itemModifiedAppearance)
void LoadAdditionalDataFromDB(Player const *owner, ItemAdditionalLoadInfo *addionalData)
bool AddToObjectUpdate() override
void SetText(std::string const &text)
void SetArtifactPower(uint16 artifactPowerId, uint8 purchasedRank, uint8 currentRankWithBonus)
void UpdateDuration(Player *owner, uint32 diff)
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, Player const *target, bool ignoreNestedChangesMask) const
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)
ItemBondingType GetBonding() const
int32 GetArtifactPowerIndex(uint32 artifactPowerId) const
void DeleteRefundDataFromDB(CharacterDatabaseTransaction *trans)
static ItemDisenchantLootEntry const * GetBaseDisenchantLoot(ItemTemplate const *itemTemplate, uint32 quality, uint32 itemLevel)
uint32 GetEnchantmentId(EnchantmentSlot slot) const
void SetPaidMoney(uint64 money)
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()
int32 GetItemStatType(uint32 index) const
bool CanBeTraded(bool mail=false, bool trade=false) const
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
void ClearValuesChangesMask() override
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)
void SetCreateTime(int64 createTime)
ObjectGuid GetCreator() const
ItemTemplate const * GetTemplate() const
void ApplyArtifactPowerEnchantmentBonuses(EnchantmentSlot slot, uint32 enchantId, bool apply, Player *owner)
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
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
friend void RemoveItemFromUpdateQueueOf(Item *item, Player *player)
bool IsBindedNotWith(Player const *player) const
uint32 GetSellPrice(Player const *owner, bool forVendor=false) const
void SendTimeUpdate(Player *owner)
Optional< uint16 > GetDisenchantSkillRequired() const
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
void SetSpellCharges(ItemEffectEntry const *effect, int32 value)
BonusData const * GetBonus() const
void SetItemRandomBonusList(ItemRandomBonusListId bonusListId)
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
bool IsRefundable() const
Optional< uint32 > GetDisenchantLootId() const
ItemModifiedAppearanceEntry const * GetItemModifiedAppearance() const
float GetItemStatValue(uint32 index, Player const *owner) const
bool GemsFitSockets() const
bool IsBoundByEnchant() const
void SetSoulboundTradeable(GuidSet const &allowedLooters)
void SetContainedIn(ObjectGuid guid)
uint32 GetVisibleEntry(Player const *owner) const
ObjectGuid GetGiftCreator() const
void CheckArtifactRelicSlotUnlock(Player const *owner)
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
UF::ArtifactPower const * GetArtifactPower(uint32 artifactPowerId) const
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
void SetMaxDurability(uint32 maxDurability)
uint32 GetVisibleModifiedAppearanceId(Player const *owner) const
bool IsArtifactDisabled() const
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const final
uint32 GetTotalUnlockedArtifactPowers() const
uint32 m_paidExtendedCost
void RemoveFromObjectUpdate() override
void ClearEnchantment(EnchantmentSlot slot)
uint32 GetPlayedTime() const
bool IsRefundExpired() 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)
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
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)
AzeriteEmpoweredItem * ToAzeriteEmpoweredItem()
float GetRepairCostMultiplier() const
uint16 GetVisibleItemVisual(Player const *owner) const
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
uint16 GetVisibleAppearanceModId(Player const *owner) const
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
uint64 CalculateDurabilityRepairCost(float discount, bool useRateConfig=true) const
void CopyArtifactDataFromParent(Item *parent)
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
int32 GetSpellCharges(ItemEffectEntry const *effect=nullptr) const
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
std::string GetDebugInfo() const override
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
void SetEntry(uint32 entry)
virtual void ClearValuesChangesMask()
virtual void SetObjectScale(float scale)
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
ChrSpecialization GetPrimarySpecialization() const
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
std::vector< Item * > m_itemUpdateQueue
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)
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
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 setUInt16(uint8 index, uint16 value)
void setString(uint8 index, std::string &&value)
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
int32 EquippedItemSubClassMask
int32 EquippedItemInventoryTypeMask
bool HasEffect(SpellEffects effect) const
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, int32(WowCS::EntityFragment::CGObject), TYPEID_UNIT > m_unitData
bool BuildPacket(WorldPacket *packet)
constexpr uint32 GetBlock(uint32 index) const
constexpr void Set(uint32 index)
constexpr uint32 GetMapId() const
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
CollectionMgr * GetCollectionMgr() const
void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint32 itemId, uint32 enchantId, uint32 enchantSlot)
uint32 GetMinorMajorBugfixVersionForBuild(uint32 build)
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 &)
ItemModifiedAppearanceEntry const * GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId)
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) noexcept
Default TC string format function.
struct advstd::ranges::Contains contains
uint8 CurrentRankWithBonus
int32 RequiredLevelOverride
std::array< ItemEffectEntry const *, 13 > Effects
void AddBonus(uint32 type, std::array< int32, 4 > const &values)
uint32 PlayerLevelToItemLevelCurveId
int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]
bool RestrictScalingToContentTuning
uint32 ItemLevelOffsetCurveId
int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]
bool ScalingConfigUsesPlayerLevel
void AddBonusList(uint32 bonusListId)
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
int32 ScalingConfigItemLevelBonus
uint32 ItemLevelOffsetItemLevel
float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]
int32 ScalingConfigCraftingQualityItemLevelBonus
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
TransmogOutfitSlotOption GetWeaponTransmogOutfitSlotOption() 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
uint32 GetItemLevelOffsetItemLevel() const
uint8 GetArtifactID() const
std::vector< ItemEffectEntry const * > Effects
bool IsCraftingReagent() const
uint32 GetItemSquishEraId() const
uint32 GetItemLimitCategory() const
int32 GetBaseRequiredLevel() const
uint32 GetItemLevelOffsetCurveId() 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
bool IgnoreNestedChangesMask
EnumFlag< SpellItemEnchantmentFlags > GetFlags() const
uint8 CurrentRankWithBonus
static void AppendAllowedFieldsMaskForFlag(Mask &allowedMaskForTarget, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
UpdateFieldArray< UF::ItemEnchantment, 13, 27, 28 > Enchantment
static void FilterDisallowedFieldsMaskForFlag(Mask &changesMask, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
UpdateField< UF::ItemModList, 0, 17 > Modifiers
DynamicUpdateField< UF::SocketedGem, 0, 2 > Gems
UpdateField< WorldPackets::Item::ItemBonusKey, 0, 19 > ItemBonusKey
UpdateField< uint32, 0, 11 > MaxDurability
UpdateFieldArray< int32, 5, 21, 22 > SpellCharges
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
void Add(EntityFragment fragment, bool update, void const *data=nullptr)