diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-12-04 15:13:20 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-12-04 15:13:20 +0100 |
commit | e98e1283ea0034baf6be9aa2ffb386eb5582801b (patch) | |
tree | b1dd854d88e6e049d26b208bb259cdc7d31f29f8 /src/server/game/Conditions/ConditionMgr.cpp | |
parent | de7c03c8385780f05530c2b3cf952a712d5f8f00 (diff) |
Core: Updated to 10.0.2
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
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<uint16> + { + 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::array<bool, std::tuple_size_v<decltype(condition->TraitNodeEntryID)>> results; + results.fill(true); + for (std::size_t i = 0; i < condition->TraitNodeEntryID.size(); ++i) + { + if (!condition->TraitNodeEntryID[i]) + continue; + + Optional<int32> 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; } |