27struct ItemLevelSelectorQualityEntryComparator
33using ItemLevelSelectorQualities = std::set<ItemLevelSelectorQualityEntry const*, ItemLevelSelectorQualityEntryComparator>;
37std::unordered_map<
uint32 , std::vector<ItemBonusEntry const*>> _itemBonusLists;
38std::unordered_multimap<uint32, ItemBonusListGroupEntryEntry const*> _itemBonusListGroupEntries;
39std::unordered_map<
int16 ,
uint32 > _itemLevelDeltaToBonusListContainer;
40std::unordered_map<
uint32 , ItemLevelSelectorQualities> _itemLevelQualitySelectorQualities;
41std::unordered_map<
uint32 , std::set<ItemBonusTreeNodeEntry const*>> _itemBonusTrees;
42std::unordered_multimap<
uint32 ,
uint32 > _itemToBonusTree;
50 _azeriteUnlockMappings.emplace(azeriteUnlockMapping->AzeriteUnlockMappingSetID, azeriteUnlockMapping);
53 _challengeModeItemBonusOverrides.emplace(challengeModeItemBonusOverride->SrcItemBonusTreeID, challengeModeItemBonusOverride);
56 _itemBonusLists[bonus->ParentItemBonusListID].push_back(bonus);
59 _itemBonusListGroupEntries.emplace(bonusListGroupEntry->ItemBonusListGroupID, bonusListGroupEntry);
62 _itemLevelDeltaToBonusListContainer[itemBonusListLevelDelta->ItemLevelDelta] = itemBonusListLevelDelta->ID;
65 _itemLevelQualitySelectorQualities[itemLevelSelectorQuality->ParentILSQualitySetID].insert(itemLevelSelectorQuality);
68 _itemBonusTrees[bonusTreeNode->ParentItemBonusTreeID].insert(bonusTreeNode);
71 _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->ItemBonusTreeID });
82 newContext = currentContext;
90 context = evalContext(context,
ItemContext(difficulty->ItemContext));
104 if (itemContextPickerEntry->PVal <= 0)
107 bool meetsPlayerCondition =
false;
111 if (itemContextPickerEntry->Flags & 0x1)
112 meetsPlayerCondition = !meetsPlayerCondition;
114 if (!meetsPlayerCondition)
117 if (itemContextPickerEntry->LabelID && !
sDB2Manager.HasContentTuningLabel(contentTuningId, itemContextPickerEntry->LabelID))
120 if (!selectedPickerEntry || selectedPickerEntry->
OrderIndex < itemContextPickerEntry->OrderIndex)
121 selectedPickerEntry = itemContextPickerEntry;
124 if (selectedPickerEntry)
134 return std::span(*itemBonusEntries);
142 return *itemBonusListId;
151 if (bonusTree->InventoryTypeSlotMask)
152 if (!(1 << itemTemplate->
GetInventoryType() & bonusTree->InventoryTypeSlotMask))
164 if (bonusTree->Flags & 0x4)
170 bool anyNodeMatched =
false;
173 if (bonusTreeNode->MinMythicPlusLevel > 0)
182 anyNodeMatched =
true;
192 std::vector<int32> passedTimeEvents;
194 if (!passedTimeEvents.empty())
196 int32 selectedLevel = -1;
197 std::ptrdiff_t selectedMilestoneSeason = -1;
201 if (
params.MythicPlusKeystoneLevel && itemBonusOverride->Value > *
params.MythicPlusKeystoneLevel)
204 if (
params.PvpTier && itemBonusOverride->Value > *
params.PvpTier)
207 if (itemBonusOverride->RequiredTimeEventPassed)
209 auto itr = std::ranges::find(passedTimeEvents, itemBonusOverride->RequiredTimeEventPassed);
210 if (itr == passedTimeEvents.end())
213 std::ptrdiff_t overrideMilestoneSeason = std::ranges::distance(passedTimeEvents.begin(), itr);
214 if (selectedMilestoneSeason > overrideMilestoneSeason)
217 if (selectedMilestoneSeason == overrideMilestoneSeason)
218 if (selectedLevel > itemBonusOverride->Value)
221 selectedMilestoneSeason = overrideMilestoneSeason;
223 else if (selectedLevel > itemBonusOverride->Value)
226 selectedLevel = itemBonusOverride->Value;
227 selectedItemBonusOverride = itemBonusOverride;
234 return itemBonusTreeId;
239 uint32 originalItemBonusTreeId = itemBonusTreeId;
247 auto treeItr = _itemBonusTrees.find(itemBonusTreeId);
248 if (treeItr == _itemBonusTrees.end())
258 if (
params.MythicPlusKeystoneLevel)
275 int32 resolvedSequenceLevel = sequenceLevel;
276 switch (originalItemBonusTreeId)
279 resolvedSequenceLevel = 1;
282 if (
params.MythicPlusKeystoneLevel)
287 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62951, *
params.MythicPlusKeystoneLevel);
290 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62952, *
params.MythicPlusKeystoneLevel);
293 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62954, *
params.MythicPlusKeystoneLevel);
296 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64388, *
params.MythicPlusKeystoneLevel);
299 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64389, *
params.MythicPlusKeystoneLevel);
302 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64395, *
params.MythicPlusKeystoneLevel);
310 resolvedSequenceLevel = 2;
313 resolvedSequenceLevel = 3;
316 resolvedSequenceLevel = 4;
324 resolvedSequenceLevel = 2;
327 resolvedSequenceLevel = 6;
337 resolvedSequenceLevel = 2;
340 resolvedSequenceLevel = 4;
352 if ((resolvedSequenceLevel > 0 || bonusListGroupEntry->SequenceValue <= 0) && resolvedSequenceLevel != bonusListGroupEntry->SequenceValue)
355 *itemLevelSelectorId = bonusListGroupEntry->ItemLevelSelectorID;
356 bonusListIDs->push_back(bonusListGroupEntry->ItemBonusListID);
368 if (minItemLevel < azeriteUnlockMapping->ItemLevel)
371 if (selectedAzeriteUnlockMapping && selectedAzeriteUnlockMapping->
ItemLevel > azeriteUnlockMapping->ItemLevel)
374 selectedAzeriteUnlockMapping = azeriteUnlockMapping;
377 if (selectedAzeriteUnlockMapping)
379 switch (inventoryType)
398 std::vector<int32> bonusListIDs;
404 uint32 itemLevelSelectorId = 0;
414 bonusListIDs.push_back(bonus);
418 auto itemSelectorQualities = _itemLevelQualitySelectorQualities.find(selector->ItemLevelSelectorQualitySetID);
419 if (itemSelectorQualities != _itemLevelQualitySelectorQualities.end())
422 if (selector->MinItemLevel >= selectorQualitySet->IlvlEpic)
424 else if (selector->MinItemLevel >= selectorQualitySet->IlvlRare)
427 auto itemSelectorQuality = std::lower_bound(itemSelectorQualities->second.begin(), itemSelectorQualities->second.end(),
428 quality, ItemLevelSelectorQualityEntryComparator{});
430 if (itemSelectorQuality != itemSelectorQualities->second.end())
431 bonusListIDs.push_back((*itemSelectorQuality)->QualityItemBonusListID);
436 bonusListIDs.push_back(azeriteUnlockBonusListId);
442template<
typename Visitor>
445 auto treeItr = _itemBonusTrees.find(itemBonusTreeId);
446 if (treeItr == _itemBonusTrees.end())
451 visitor(bonusTreeNode);
459 std::vector<int32> bonusListIDs;
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< ItemLevelSelectorEntry > sItemLevelSelectorStore("ItemLevelSelector.db2", &ItemLevelSelectorLoadInfo::Instance)
DB2Storage< ItemBonusTreeEntry > sItemBonusTreeStore("ItemBonusTree.db2", &ItemBonusTreeLoadInfo::Instance)
DB2Storage< ItemBonusEntry > sItemBonusStore("ItemBonus.db2", &ItemBonusLoadInfo::Instance)
DB2Storage< ItemBonusTreeNodeEntry > sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", &ItemBonusTreeNodeLoadInfo::Instance)
DB2Storage< ChallengeModeItemBonusOverrideEntry > sChallengeModeItemBonusOverrideStore("ChallengeModeItemBonusOverride.db2", &ChallengeModeItemBonusOverrideLoadInfo::Instance)
DB2Storage< ItemLevelSelectorQualityEntry > sItemLevelSelectorQualityStore("ItemLevelSelectorQuality.db2", &ItemLevelSelectorQualityLoadInfo::Instance)
DB2Storage< ItemXBonusTreeEntry > sItemXBonusTreeStore("ItemXBonusTree.db2", &ItemXBonusTreeLoadInfo::Instance)
DB2Storage< AzeriteUnlockMappingEntry > sAzeriteUnlockMappingStore("AzeriteUnlockMapping.db2", &AzeriteUnlockMappingLoadInfo::Instance)
DB2Storage< ItemContextPickerEntryEntry > sItemContextPickerEntryStore("ItemContextPickerEntry.db2", &ItemContextPickerEntryLoadInfo::Instance)
DB2Storage< ItemBonusListLevelDeltaEntry > sItemBonusListLevelDeltaStore("ItemBonusListLevelDelta.db2", &ItemBonusListLevelDeltaLoadInfo::Instance)
DB2Storage< ItemBonusListGroupEntryEntry > sItemBonusListGroupEntryStore("ItemBonusListGroupEntry.db2", &ItemBonusListGroupEntryLoadInfo::Instance)
DB2Storage< ItemLevelSelectorQualitySetEntry > sItemLevelSelectorQualitySetStore("ItemLevelSelectorQualitySet.db2", &ItemLevelSelectorQualitySetLoadInfo::Instance)
std::unordered_set< uint32 > params[2]
@ ITEM_FLAG2_CASTER_WEAPON
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
std::vector< int32 > GetBonusListsForItem(uint32 itemId, ItemBonusGenerationParams const ¶ms)
void VisitItemBonusTree(uint32 itemBonusTreeId, Visitor visitor)
ItemContext GetContextForPlayer(MapDifficultyEntry const *mapDifficulty, Player const *player)
int32 GetAzeriteUnlockBonusList(uint16 azeriteUnlockMappingSetId, uint16 minItemLevel, InventoryType inventoryType)
uint32 GetBonusTreeIdOverride(uint32 itemBonusTreeId, ItemBonusGenerationParams const ¶ms)
void ApplyBonusTreeHelper(ItemTemplate const *itemTemplate, uint32 itemBonusTreeId, ItemBonusGenerationParams const ¶ms, int32 sequenceLevel, uint32 *itemLevelSelectorId, std::vector< int32 > *bonusListIDs)
std::span< ItemBonusEntry const * > GetItemBonuses(uint32 bonusListId)
bool CanApplyBonusTreeToItem(ItemTemplate const *itemTemplate, uint32 itemBonusTreeId, ItemBonusGenerationParams const ¶ms)
std::vector< int32 > GetAllBonusListsForTree(uint32 itemBonusTreeId)
uint32 GetItemBonusListForItemLevelDelta(int16 delta)
auto MapEqualRange(M &map, typename M::key_type const &key)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
int32 ItemBonusListShoulders
uint16 ChildItemBonusTreeID
uint16 ChildItemLevelSelectorID
int32 IblGroupPointsModSetID
uint16 ChildItemBonusListID
int32 ChildItemBonusListGroupID
uint8 ItemCreationContext
uint32 GetBaseItemLevel() const
InventoryType GetInventoryType() const
bool HasFlag(ItemFlags flag) const
int32 ItemContextPickerID