From e98e1283ea0034baf6be9aa2ffb386eb5582801b Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 4 Dec 2022 15:13:20 +0100 Subject: Core: Updated to 10.0.2 --- src/server/game/Conditions/ConditionMgr.cpp | 42 ++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/server/game/Conditions/ConditionMgr.cpp') diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 63476dc1b8d..e1c385dc881 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1547,7 +1547,7 @@ bool ConditionMgr::addToGossipMenuItems(Condition* cond) const Trinity::IteratorPair pMenuItemBounds = sObjectMgr->GetGossipMenuItemsMapBoundsNonConst(cond->SourceGroup); for (auto& [_, gossipMenuItem] : pMenuItemBounds) { - if (gossipMenuItem.MenuID == cond->SourceGroup && gossipMenuItem.OptionID == uint32(cond->SourceEntry)) + if (gossipMenuItem.MenuID == cond->SourceGroup && gossipMenuItem.OrderIndex == uint32(cond->SourceEntry)) { gossipMenuItem.Conditions.push_back(cond); return true; @@ -3350,6 +3350,46 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio if (condition->CovenantID && player->m_playerData->CovenantID != condition->CovenantID) return false; + if (std::any_of(condition->TraitNodeEntryID.begin(), condition->TraitNodeEntryID.end(), [](int32 traitNodeEntryId) { return traitNodeEntryId != 0; })) + { + auto getTraitNodeEntryRank = [player](int32 traitNodeEntryId) -> Optional + { + for (UF::TraitConfig const& traitConfig : player->m_activePlayerData->TraitConfigs) + { + if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat) + { + if (int32(*player->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID + || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) + continue; + } + + for (UF::TraitEntry const& traitEntry : traitConfig.Entries) + if (traitEntry.TraitNodeEntryID == traitNodeEntryId) + return traitEntry.Rank; + } + return {}; + }; + + std::arrayTraitNodeEntryID)>> results; + results.fill(true); + for (std::size_t i = 0; i < condition->TraitNodeEntryID.size(); ++i) + { + if (!condition->TraitNodeEntryID[i]) + continue; + + Optional rank = getTraitNodeEntryRank(condition->TraitNodeEntryID[i]); + if (!rank) + results[i] = false; + else if (condition->TraitNodeEntryMinRank[i] && rank < condition->TraitNodeEntryMinRank[i]) + results[i] = false; + else if (condition->TraitNodeEntryMaxRank[i] && rank > condition->TraitNodeEntryMaxRank[i]) + results[i] = false; + } + + if (!PlayerConditionLogic(condition->TraitNodeEntryLogic, results)) + return false; + } + return true; } -- cgit v1.2.3