diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-27 22:17:25 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-27 22:17:25 +0100 |
commit | 39263027d45f9e394a7f5121b71845fdf67d9ae6 (patch) | |
tree | d887d4e1e63406e9f632f0017eed0c91c69e959a /src | |
parent | 4913d027bf3b8231b925be3f203feac590bb3607 (diff) |
Core/Conditions: Extend circular references check for player condition conditions to also handle two different conditions referencing each other
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index b8fccb7ecdb..5bad31bbc0f 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<Condition> const& conditions, ConditionsByEntryMap const& referenceConditions) const + bool operator()(uint32 playerConditionId, std::vector<Condition> 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!", |