From b8b2714c25e6bee1617fdb04b6633b51a7f69e95 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 27 Mar 2024 22:17:25 +0100 Subject: Core/Conditions: Extend circular references check for player condition conditions to also handle two different conditions referencing each other (cherry picked from commit 39263027d45f9e394a7f5121b71845fdf67d9ae6) --- src/server/game/Conditions/ConditionMgr.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (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 0f0180a7301..3e016ae273b 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1446,7 +1446,7 @@ void ConditionMgr::LoadConditions(bool isReload) struct { - bool operator()(uint32 playerConditionId, std::vector const& conditions, ConditionsByEntryMap const& referenceConditions) const + bool operator()(uint32 playerConditionId, std::vector const& conditions, ConditionEntriesByTypeArray const& store) const { return std::any_of(conditions.begin(), conditions.end(), [&](Condition const& condition) { @@ -1454,12 +1454,16 @@ void ConditionMgr::LoadConditions(bool isReload) { if (condition.ConditionValue1 == playerConditionId) return true; + auto playerCondItr = store[CONDITION_SOURCE_TYPE_PLAYER_CONDITION].find({ 0, int32(condition.ConditionValue1), 0 }); + if (playerCondItr != store[CONDITION_SOURCE_TYPE_PLAYER_CONDITION].end()) + if (operator()(playerConditionId, *playerCondItr->second, store)) + return true; } else if (condition.ReferenceId) { - auto refItr = referenceConditions.find({ condition.ReferenceId, 0, 0 }); - if (refItr != referenceConditions.end()) - if (operator()(playerConditionId, *refItr->second, referenceConditions)) + auto refItr = store[CONDITION_SOURCE_TYPE_REFERENCE_CONDITION].find({ condition.ReferenceId, 0, 0 }); + if (refItr != store[CONDITION_SOURCE_TYPE_REFERENCE_CONDITION].end()) + if (operator()(playerConditionId, *refItr->second, store)) return true; } return false; @@ -1469,7 +1473,7 @@ void ConditionMgr::LoadConditions(bool isReload) for (auto&& [id, conditions] : ConditionStore[CONDITION_SOURCE_TYPE_PLAYER_CONDITION]) { - if (isPlayerConditionIdUsedByCondition(id.SourceEntry, *conditions, ConditionStore[CONDITION_SOURCE_TYPE_REFERENCE_CONDITION])) + if (isPlayerConditionIdUsedByCondition(id.SourceEntry, *conditions, ConditionStore)) { TC_LOG_ERROR("sql.sql", "[Condition SourceType: CONDITION_SOURCE_TYPE_PLAYER_CONDITION, SourceGroup: {}, SourceEntry: {}, SourceId: {}] " "has a circular reference to player condition id {}, removed all conditions for this SourceEntry!", -- cgit v1.2.3