aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Conditions/ConditionMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-12-04 15:13:20 +0100
committerShauren <shauren.trinity@gmail.com>2022-12-04 15:13:20 +0100
commite98e1283ea0034baf6be9aa2ffb386eb5582801b (patch)
treeb1dd854d88e6e049d26b208bb259cdc7d31f29f8 /src/server/game/Conditions/ConditionMgr.cpp
parentde7c03c8385780f05530c2b3cf952a712d5f8f00 (diff)
Core: Updated to 10.0.2
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp42
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;
}