aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-27 22:17:25 +0100
committerfunjoker <funjoker109@gmail.com>2024-03-28 20:36:54 +0100
commitb8b2714c25e6bee1617fdb04b6633b51a7f69e95 (patch)
tree5086c903e321e3e66318520cbde4c166a0955238 /src/server/game
parent46b35d308213586c75653be2b9d92d0f0029c738 (diff)
Core/Conditions: Extend circular references check for player condition conditions to also handle two different conditions referencing each other
(cherry picked from commit 39263027d45f9e394a7f5121b71845fdf67d9ae6)
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp14
1 files changed, 9 insertions, 5 deletions
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<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!",