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;
2253 return cost * classEntry->PriceModifier / buyCount;
2274 azeriteLevel = azeriteItem->GetEffectiveLevel();
2276 minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus, azeriteLevel);
2287 itemLevel = azeriteLevelInfo->ItemLevel;
2296 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2309 uint32 itemLevelBeforeUpgrades = itemLevel;
2321 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
2332 if (squish->
Patch > currentBuild)
2343 if (minItemLevel && (!minItemLevelCutoff || itemLevelBeforeUpgrades >= minItemLevelCutoff) && itemLevel < minItemLevel)
2344 itemLevel = minItemLevel;
2346 if (maxItemLevel && itemLevel > maxItemLevel)
2347 itemLevel = maxItemLevel;
2390 if (!disenchantLoot)
2393 return disenchantLoot->
ID;
2405 if (!disenchantLoot)
2427 if (disenchant->Class != itemClass)
2430 if (disenchant->Subclass >= 0 && itemSubClass)
2433 if (disenchant->Quality != quality)
2436 if (disenchant->MinLevel > itemLevel || disenchant->MaxLevel < itemLevel)
2439 if (disenchant->ExpansionID != -2 && disenchant->ExpansionID != expansion)
2451 if (!itemModifiedAppearanceId)
2455 if (!itemModifiedAppearance)
2458 if (itemModifiedAppearance)
2460 return itemAppearance->ItemDisplayInfoID;
2474 return mod.
Type == modifier;
2477 if (modifierIndex != -1)
2478 return m_itemData->Modifiers->Values[modifierIndex].Value;
2487 return mod.
Type == modifier;
2492 if (modifierIndex == -1)
2498 mod.
Type = modifier;
2508 if (modifierIndex == -1)
2518 if (!itemModifiedAppearanceId)
2522 return transmog->ItemID;
2530 if (!itemModifiedAppearanceId)
2534 return transmog->ItemAppearanceModifierID;
2542 if (!itemModifiedAppearanceId)
2545 if (!itemModifiedAppearanceId)
2547 itemModifiedAppearanceId = itemModifiedAppearance->ID;
2549 return itemModifiedAppearanceId;
2555 if (!itemModifiedAppearanceId)
2558 return itemModifiedAppearanceId;
2570 return enchantmentId;
2576 return enchant->ItemVisual;
2621 return artifact->ArtifactCategoryID != 2;
2668 std::unordered_set<uint32> knownPowers;
2670 knownPowers.insert(power.ArtifactPowerID);
2674 if (artifactPower->Tier != artifactTier)
2677 if (knownPowers.contains(artifactPower->ID))
2693 uint32 extraUnlocked = 0;
2700 if (artifactXp < xpCost)
2703 artifactXp -= xpCost;
2708 return purchased + extraUnlocked;
2713 uint32 purchasedRanks = 0;
2715 purchasedRanks += power.PurchasedRank;
2717 return purchasedRanks;
2726 switch (enchant->Effect[i])
2729 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2736 newRank += enchant->EffectPointsMin[i];
2738 newRank -= enchant->EffectPointsMin[i];
2754 uint8 newRank =
m_itemData->ArtifactPowers[artifactPowerIndex].CurrentRankWithBonus;
2756 newRank += enchant->EffectPointsMin[i];
2758 newRank -= enchant->EffectPointsMin[i];
2777 for (
uint32 artifactPowerIndex = 0; artifactPowerIndex <
m_itemData->ArtifactPowers.size(); ++artifactPowerIndex)
2784 newRank += enchant->EffectPointsMin[i];
2786 newRank -= enchant->EffectPointsMin[i];
2821 if (artifactCategoryId)
2823 uint32 artifactKnowledgeLevel = 1;
2828 amount =
uint64(amount * artifactKnowledge->Multiplier);
2831 amount = 50 * (amount / 50);
2832 else if (amount >= 1000)
2833 amount = 25 * (amount / 25);
2834 else if (amount >= 50)
2835 amount = 5 * (amount / 5);
2842 artifactXpGain.
Amount = amount;
2858 level = std::min(std::max(
int16(level), levels->MinLevel), levels->MaxLevel);
2878 std::stringstream sstr;
2902 GemItemLevelBonus[i] = 0;
2903 GemRelicType[i] = -1;
2904 GemRelicRankBonus[i] = 0;
2909 AppearanceModID = 0;
2910 RepairCostMultiplier = 1.0f;
2913 DisenchantLootId = 0;
2915 HasFixedLevel =
false;
2916 RequiredLevelOverride = 0;
2917 AzeriteTierUnlockSetId = 0;
2919 AzeriteTierUnlockSetId = azeriteEmpoweredItem->AzeriteTierUnlockSetID;
2922 RequiredLevelCurve = 0;
2925 PvpItemLevelBonus = 0;
2929 ItemLevelOffset = 0;
2934 Effects[EffectCount++] = itemEffect;
2936 for (std::size_t i = EffectCount; i < Effects.size(); ++i)
2937 Effects[i] =
nullptr;
2946 IgnoreSquish =
false;
2948 _state.SuffixPriority = std::numeric_limits<int32>::max();
2949 _state.AppearanceModPriority = std::numeric_limits<int32>::max();
2950 _state.DisenchantLootPriority = std::numeric_limits<int32>::max();
2951 _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max();
2952 _state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max();
2953 _state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max();
2954 _state.ItemLevelPriority = std::numeric_limits<int32>::max();
2955 _state.PvpItemLevelPriority = std::numeric_limits<int32>::max();
2956 _state.BondingPriority = std::numeric_limits<int32>::max();
2957 _state.HasQualityBonus =
false;
2958 _state.HasItemLimitCategory =
false;
2971 AddBonusList(bonusListID);
2977 AddBonus(bonus->Type, bonus->Value);
2985 ItemLevelBonus += values[0];
2991 if (ItemStatType[statIndex] == values[0] || ItemStatType[statIndex] == -1)
2996 ItemStatType[statIndex] = values[0];
2997 StatPercentEditor[statIndex] += values[1];
3002 if (!_state.HasQualityBonus)
3004 Quality =
static_cast<uint32>(values[0]);
3005 _state.HasQualityBonus =
true;
3007 else if (Quality <
static_cast<uint32>(values[0]))
3008 Quality =
static_cast<uint32>(values[0]);
3011 if (values[1] < _state.SuffixPriority)
3013 Suffix =
static_cast<uint32>(values[0]);
3014 _state.SuffixPriority = values[1];
3019 uint32 socketCount = values[0];
3031 if (values[1] < _state.AppearanceModPriority)
3033 AppearanceModID =
static_cast<uint32>(values[0]);
3034 _state.AppearanceModPriority = values[1];
3038 RequiredLevel += values[0];
3041 RepairCostMultiplier *=
static_cast<float>(values[0]) * 0.01f;
3045 if (values[1] < _state.ScalingStatDistributionPriority)
3047 ContentTuningId =
static_cast<uint32>(values[2]);
3048 PlayerLevelToItemLevelCurveId =
static_cast<uint32>(values[3]);
3049 _state.ScalingStatDistributionPriority = values[1];
3054 if (values[1] < _state.DisenchantLootPriority)
3056 DisenchantLootId = values[0];
3057 _state.DisenchantLootPriority = values[1];
3064 RelicType = values[0];
3067 RequiredLevelOverride = values[0];
3070 if (values[1] < _state.AzeriteTierUnlockSetPriority)
3072 AzeriteTierUnlockSetId = values[0];
3073 _state.AzeriteTierUnlockSetPriority = values[1];
3077 CanDisenchant = values[0] != 0;
3080 CanScrap = values[0] != 0;
3084 Effects[EffectCount++] = itemEffect;
3087 if (values[2] < _state.RequiredLevelCurvePriority)
3089 RequiredLevelCurve = values[0];
3090 _state.RequiredLevelCurvePriority = values[2];
3092 ContentTuningId =
static_cast<uint32>(values[1]);
3096 if (!_state.HasItemLimitCategory)
3098 LimitCategory = values[0];
3099 _state.HasItemLimitCategory =
true;
3103 PvpItemLevelBonus += values[0];
3106 CanSalvage = values[0] != 0;
3109 CanRecraft = values[0] != 0;
3112 if (values[1] < _state.ItemLevelPriority)
3114 ItemLevel = values[0];
3115 _state.ItemLevelPriority = values[1];
3119 if (values[1] < _state.PvpItemLevelPriority)
3121 PvpItemLevel = values[0];
3122 _state.PvpItemLevelPriority = values[1];
3126 CannotTradeBindOnPickup = values[0] != 0;
3129 if (values[1] < _state.BondingPriority)
3132 _state.BondingPriority = values[1];
3136 if (values[3] < _state.ScalingStatDistributionPriority)
3138 ItemLevelOffsetCurveId = values[0];
3139 ItemLevelOffsetItemLevel = values[1];
3140 _state.ScalingStatDistributionPriority = values[3];
3144 if (values[1] < _state.ScalingStatDistributionPriority)
3150 ItemLevelOffsetCurveId = itemOffsetCurve->CurveID;
3151 ItemLevelOffset = itemOffsetCurve->Offset;
3154 ItemLevelOffsetItemLevel = scalingConfig->ItemLevel;
3155 ItemSquishEraID = scalingConfig->ItemSquishEraID;
3156 if (scalingConfig->Flags & 0x1)
3157 IgnoreSquish =
true;
3159 if (values[1] < _state.RequiredLevelCurvePriority)
3161 RequiredLevelOverride = scalingConfig->RequiredLevel;
3162 RequiredLevelCurve = 0;
3168 AddBonusList(values[0]);
3171 if (values[1] < _state.ScalingStatDistributionPriority)
3177 ItemLevelOffsetCurveId = itemOffsetCurve->CurveID;
3178 ItemLevelOffset = itemOffsetCurve->Offset;
3181 ItemLevelOffsetItemLevel = 0;
3182 ItemSquishEraID = scalingConfig->ItemSquishEraID;
3183 if (scalingConfig->Flags & 0x1)
3184 IgnoreSquish =
true;
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_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_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_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[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
@ 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
#define INVENTORY_SLOT_BAG_0
#define MAX_SPECIALIZATIONS
@ SPELL_EFFECT_ENCHANT_ITEM
@ SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
@ SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
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
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
uint64 CalculateDurabilityRepairCost(float discount) 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)
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
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)
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
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)
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, 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
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)
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]
uint32 ItemLevelOffsetCurveId
int32 StatPercentEditor[MAX_ITEM_PROTO_STATS]
void AddBonusList(uint32 bonusListId)
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]
uint32 ItemLevelOffsetItemLevel
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
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)