27struct ItemLevelSelectorQualityEntryComparator
33using ItemLevelSelectorQualities = std::set<ItemLevelSelectorQualityEntry const*, ItemLevelSelectorQualityEntryComparator>;
37std::unordered_map<
uint32 , std::vector<ItemBonusEntry const*>> _itemBonusLists;
38std::unordered_multimap<int32, 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 });
79 newContext = currentContext;
87 context = evalContext(context,
ItemContext(difficulty->ItemContext));
101 if (itemContextPickerEntry->PVal <= 0)
104 bool meetsPlayerCondition =
false;
109 if (itemContextPickerEntry->Flags & 0x1)
110 meetsPlayerCondition = !meetsPlayerCondition;
112 if (!meetsPlayerCondition)
115 if (itemContextPickerEntry->LabelID && !
sDB2Manager.HasContentTuningLabel(contentTuningId, itemContextPickerEntry->LabelID))
118 if (!selectedPickerEntry || selectedPickerEntry->
OrderIndex < itemContextPickerEntry->OrderIndex)
119 selectedPickerEntry = itemContextPickerEntry;
122 if (selectedPickerEntry)
132 return std::span(*itemBonusEntries);
140 return *itemBonusListId;
149 if (bonusTree->InventoryTypeSlotMask)
150 if (!(1 << itemTemplate->
GetInventoryType() & bonusTree->InventoryTypeSlotMask))
162 if (bonusTree->Flags & 0x4)
168 bool anyNodeMatched =
false;
171 if (bonusTreeNode->MinMythicPlusLevel > 0)
180 anyNodeMatched =
true;
193 int32 selectedLevel = -1;
194 int32 selectedMilestoneSeason = -1;
198 if (itemBonusOverride->Type != 0)
201 if (itemBonusOverride->Value >
params.MythicPlusKeystoneLevel.value_or(-1))
204 if (itemBonusOverride->MythicPlusSeasonID)
210 if (mythicPlusSeason->MilestoneSeason < overrideSeason->
MilestoneSeason)
217 if (selectedLevel > itemBonusOverride->Value)
222 else if (selectedLevel > itemBonusOverride->Value)
225 selectedLevel = itemBonusOverride->Value;
226 selectedItemBonusOverride = itemBonusOverride;
236 int32 selectedLevel = -1;
237 int32 selectedMilestoneSeason = -1;
241 if (itemBonusOverride->Type != 1)
244 if (itemBonusOverride->Value >
params.PvpTier.value_or(-1))
247 if (itemBonusOverride->PvPSeasonID)
260 if (selectedLevel > itemBonusOverride->Value)
265 else if (selectedLevel > itemBonusOverride->Value)
268 selectedLevel = itemBonusOverride->Value;
269 selectedItemBonusOverride = itemBonusOverride;
276 return itemBonusTreeId;
281 uint32 originalItemBonusTreeId = itemBonusTreeId;
289 auto treeItr = _itemBonusTrees.find(itemBonusTreeId);
290 if (treeItr == _itemBonusTrees.end())
300 if (
params.MythicPlusKeystoneLevel)
317 int32 resolvedSequenceLevel = sequenceLevel;
318 switch (originalItemBonusTreeId)
321 resolvedSequenceLevel = 1;
324 if (
params.MythicPlusKeystoneLevel)
329 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62951, *
params.MythicPlusKeystoneLevel);
332 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62952, *
params.MythicPlusKeystoneLevel);
335 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(62954, *
params.MythicPlusKeystoneLevel);
338 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64388, *
params.MythicPlusKeystoneLevel);
341 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64389, *
params.MythicPlusKeystoneLevel);
344 resolvedSequenceLevel =
sDB2Manager.GetCurveValueAt(64395, *
params.MythicPlusKeystoneLevel);
352 resolvedSequenceLevel = 2;
355 resolvedSequenceLevel = 3;
358 resolvedSequenceLevel = 4;
366 resolvedSequenceLevel = 2;
369 resolvedSequenceLevel = 6;
379 resolvedSequenceLevel = 2;
382 resolvedSequenceLevel = 4;
394 if ((resolvedSequenceLevel > 0 || bonusListGroupEntry->SequenceValue <= 0) && resolvedSequenceLevel != bonusListGroupEntry->SequenceValue)
397 *itemLevelSelectorId = bonusListGroupEntry->ItemLevelSelectorID;
398 bonusListIDs->push_back(bonusListGroupEntry->ItemBonusListID);
410 if (minItemLevel < azeriteUnlockMapping->ItemLevel)
413 if (selectedAzeriteUnlockMapping && selectedAzeriteUnlockMapping->
ItemLevel > azeriteUnlockMapping->ItemLevel)
416 selectedAzeriteUnlockMapping = azeriteUnlockMapping;
419 if (selectedAzeriteUnlockMapping)
421 switch (inventoryType)
440 std::vector<int32> bonusListIDs;
446 uint32 itemLevelSelectorId = 0;
456 bonusListIDs.push_back(bonus);
460 auto itemSelectorQualities = _itemLevelQualitySelectorQualities.find(selector->ItemLevelSelectorQualitySetID);
461 if (itemSelectorQualities != _itemLevelQualitySelectorQualities.end())
464 if (selector->MinItemLevel >= selectorQualitySet->IlvlEpic)
466 else if (selector->MinItemLevel >= selectorQualitySet->IlvlRare)
469 auto itemSelectorQuality = std::lower_bound(itemSelectorQualities->second.begin(), itemSelectorQualities->second.end(),
470 quality, ItemLevelSelectorQualityEntryComparator{});
472 if (itemSelectorQuality != itemSelectorQualities->second.end())
473 bonusListIDs.push_back((*itemSelectorQuality)->QualityItemBonusListID);
478 bonusListIDs.push_back(azeriteUnlockBonusListId);
484template<
typename Visitor>
487 auto treeItr = _itemBonusTrees.find(itemBonusTreeId);
488 if (treeItr == _itemBonusTrees.end())
493 visitor(bonusTreeNode);
501 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< PvpSeasonEntry > sPvpSeasonStore("PvpSeason.db2", &PvpSeasonLoadInfo::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< MythicPlusSeasonEntry > sMythicPlusSeasonStore("MythicPlusSeason.db2", &MythicPlusSeasonLoadInfo::Instance)
DB2Storage< ItemBonusListLevelDeltaEntry > sItemBonusListLevelDeltaStore("ItemBonusListLevelDelta.db2", &ItemBonusListLevelDeltaLoadInfo::Instance)
DB2Storage< ItemBonusListGroupEntryEntry > sItemBonusListGroupEntryStore("ItemBonusListGroupEntry.db2", &ItemBonusListGroupEntryLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
DB2Storage< ItemLevelSelectorQualitySetEntry > sItemLevelSelectorQualitySetStore("ItemLevelSelectorQualitySet.db2", &ItemLevelSelectorQualitySetLoadInfo::Instance)
std::unordered_set< uint32 > params[2]
@ ITEM_FLAG2_CASTER_WEAPON
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
UF::UpdateField< UF::PlayerData, 0, 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