51 _azeriteUnlockMappings.emplace(azeriteUnlockMapping->AzeriteUnlockMappingSetID, azeriteUnlockMapping);
54 _challengeModeItemBonusOverrides.emplace(challengeModeItemBonusOverride->SrcItemBonusTreeID, challengeModeItemBonusOverride);
57 _itemBonusLists[bonus->ParentItemBonusListID].push_back(bonus);
60 _itemBonusListGroupEntries.emplace(bonusListGroupEntry->ItemBonusListGroupID, bonusListGroupEntry);
63 _itemLevelDeltaToBonusListContainer[itemBonusListLevelDelta->ItemLevelDelta] = itemBonusListLevelDelta->ID;
66 _itemContextByGroup[itemCreationContext->ItemCreationContextGroupID].push_back(
ItemContext(itemCreationContext->ItemContext));
69 _itemLevelQualitySelectorQualities[itemLevelSelectorQuality->ParentILSQualitySetID].insert(itemLevelSelectorQuality);
72 _itemBonusTrees[bonusTreeNode->ParentItemBonusTreeID].insert(bonusTreeNode);
75 _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->ItemBonusTreeID });
86 newContext = currentContext;
94 context = evalContext(context,
ItemContext(difficulty->ItemContext));
108 if (itemContextPickerEntry->PVal <= 0)
111 bool meetsPlayerCondition =
false;
115 if (itemContextPickerEntry->Flags & 0x1)
116 meetsPlayerCondition = !meetsPlayerCondition;
118 if (!meetsPlayerCondition)
121 if (itemContextPickerEntry->LabelID && !
sDB2Manager.HasContentTuningLabel(contentTuningId, itemContextPickerEntry->LabelID))
124 if (!selectedPickerEntry || selectedPickerEntry->
OrderIndex < itemContextPickerEntry->OrderIndex)
125 selectedPickerEntry = itemContextPickerEntry;
128 if (selectedPickerEntry)
155 if (bonusTree->InventoryTypeSlotMask)
156 if (!(1 << itemTemplate->
GetInventoryType() & bonusTree->InventoryTypeSlotMask))
168 if (bonusTree->Flags & 0x4)
174 bool anyNodeMatched =
false;
177 if (bonusTreeNode->MinMythicPlusLevel > 0)
186 anyNodeMatched =
true;
196 std::vector<int32> passedTimeEvents;
198 if (!passedTimeEvents.empty())
200 int32 selectedLevel = -1;
201 std::ptrdiff_t selectedMilestoneSeason = -1;
205 if (
params.MythicPlusKeystoneLevel && itemBonusOverride->Value > *
params.MythicPlusKeystoneLevel)
208 if (
params.PvpTier && itemBonusOverride->Value > *
params.PvpTier)
211 if (itemBonusOverride->RequiredTimeEventPassed)
213 auto itr = std::ranges::find(passedTimeEvents, itemBonusOverride->RequiredTimeEventPassed);
214 if (itr == passedTimeEvents.end())
217 std::ptrdiff_t overrideMilestoneSeason = std::ranges::distance(passedTimeEvents.begin(), itr);
218 if (selectedMilestoneSeason > overrideMilestoneSeason)
221 if (selectedMilestoneSeason == overrideMilestoneSeason)
222 if (selectedLevel > itemBonusOverride->Value)
225 selectedMilestoneSeason = overrideMilestoneSeason;
227 else if (selectedLevel > itemBonusOverride->Value)
230 selectedLevel = itemBonusOverride->Value;
231 selectedItemBonusOverride = itemBonusOverride;
238 return itemBonusTreeId;
243 uint32 originalItemBonusTreeId = itemBonusTreeId;
251 auto treeItr = _itemBonusTrees.find(itemBonusTreeId);
252 if (treeItr == _itemBonusTrees.end())
261 if (!(bonusTreeNode->Flags & 0x1))
267 if (bonusTreeNode->ItemCreationContextGroupID)
269 bool hasContextFromGroup =
false;
273 if (!!(bonusTreeNode->Flags & 0x1) == hasContextFromGroup)
277 if (
params.MythicPlusKeystoneLevel)
279 if (bonusTreeNode->MinMythicPlusLevel &&
params.MythicPlusKeystoneLevel < bonusTreeNode->MinMythicPlusLevel)
282 if (bonusTreeNode->MaxMythicPlusLevel &&
params.MythicPlusKeystoneLevel > bonusTreeNode->MaxMythicPlusLevel)
286 if (bonusTreeNode->ChildItemBonusTreeID)
287 ApplyBonusTreeHelper(itemTemplate, bonusTreeNode->ChildItemBonusTreeID,
params, sequenceLevel, itemLevelSelectorId, bonusListIDs);
288 else if (bonusTreeNode->ChildItemBonusListID)
289 bonusListIDs->push_back(bonusTreeNode->ChildItemBonusListID);
290 else if (bonusTreeNode->ChildItemLevelSelectorID)
291 *itemLevelSelectorId = bonusTreeNode->ChildItemLevelSelectorID;
292 else if (bonusTreeNode->ChildItemBonusListGroupID)
294 int32 resolvedSequenceLevel = sequenceLevel;
295 switch (originalItemBonusTreeId)
298 resolvedSequenceLevel = 1;
301 if (
params.MythicPlusKeystoneLevel)
303 switch (bonusTreeNode->IblGroupPointsModSetID)
306 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62951, *
params.MythicPlusKeystoneLevel);
309 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62952, *
params.MythicPlusKeystoneLevel);
312 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62954, *
params.MythicPlusKeystoneLevel);
315 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64388, *
params.MythicPlusKeystoneLevel);
318 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64389, *
params.MythicPlusKeystoneLevel);
321 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64395, *
params.MythicPlusKeystoneLevel);
329 resolvedSequenceLevel = 2;
332 resolvedSequenceLevel = 3;
335 resolvedSequenceLevel = 4;
343 resolvedSequenceLevel = 2;
346 resolvedSequenceLevel = 6;
356 resolvedSequenceLevel = 2;
359 resolvedSequenceLevel = 4;
371 if ((resolvedSequenceLevel > 0 || bonusListGroupEntry->SequenceValue <= 0) && resolvedSequenceLevel != bonusListGroupEntry->SequenceValue)
374 *itemLevelSelectorId = bonusListGroupEntry->ItemLevelSelectorID;
375 bonusListIDs->push_back(bonusListGroupEntry->ItemBonusListID);
387 if (minItemLevel < azeriteUnlockMapping->ItemLevel)
390 if (selectedAzeriteUnlockMapping && selectedAzeriteUnlockMapping->
ItemLevel > azeriteUnlockMapping->ItemLevel)
393 selectedAzeriteUnlockMapping = azeriteUnlockMapping;
396 if (selectedAzeriteUnlockMapping)
398 switch (inventoryType)
417 std::vector<int32> bonusListIDs;
423 uint32 itemLevelSelectorId = 0;
433 bonusListIDs.push_back(bonus);
437 auto itemSelectorQualities = _itemLevelQualitySelectorQualities.find(selector->ItemLevelSelectorQualitySetID);
438 if (itemSelectorQualities != _itemLevelQualitySelectorQualities.end())
441 if (selector->MinItemLevel >= selectorQualitySet->IlvlEpic)
443 else if (selector->MinItemLevel >= selectorQualitySet->IlvlRare)
446 auto itemSelectorQuality = std::lower_bound(itemSelectorQualities->second.begin(), itemSelectorQualities->second.end(),
447 quality, ItemLevelSelectorQualityEntryComparator{});
449 if (itemSelectorQuality != itemSelectorQualities->second.end())
450 bonusListIDs.push_back((*itemSelectorQuality)->QualityItemBonusListID);
455 bonusListIDs.push_back(azeriteUnlockBonusListId);