aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKrudor <erikstrandberg93@hotmail.com>2022-03-22 18:55:13 +0100
committerGitHub <noreply@github.com>2022-03-22 18:55:13 +0100
commit6cd44e6ca8c90194ffd679a9ca9e7f07ecfc2c06 (patch)
tree9ff4b60fa03e4e5e5fd5403c0d4f095c7a6bfcc6 /src
parentf465812e21e5eb1f785177e83624f65118be3698 (diff)
Core/Scenarios: Fix bad criteria evaluation in scenarios (#27881)
* Adjust Scenario criteria evaluation process so that entire criteria trees are not completed when a single child tree is completed.
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Scenarios/Scenario.cpp37
-rw-r--r--src/server/game/Scenarios/Scenario.h1
2 files changed, 21 insertions, 17 deletions
diff --git a/src/server/game/Scenarios/Scenario.cpp b/src/server/game/Scenarios/Scenario.cpp
index 37032069e26..e7debb993b5 100644
--- a/src/server/game/Scenarios/Scenario.cpp
+++ b/src/server/game/Scenarios/Scenario.cpp
@@ -175,38 +175,41 @@ bool Scenario::CanUpdateCriteriaTree(Criteria const * /*criteria*/, CriteriaTree
bool Scenario::CanCompleteCriteriaTree(CriteriaTree const* tree)
{
- ScenarioStepEntry const* step = tree->ScenarioStep;
- if (!step)
+ ScenarioStepEntry const* step = ASSERT_NOTNULL(tree->ScenarioStep);
+ ScenarioStepState const state = GetStepState(step);
+ if (state == SCENARIO_STEP_DONE)
return false;
- if (step->ScenarioID != _data->Entry->ID)
+ ScenarioStepEntry const* currentStep = GetStep();
+ if (!currentStep)
return false;
- if (step->IsBonusObjective())
- return !IsComplete();
-
- if (step != GetStep())
- return false;
+ if (!step->IsBonusObjective())
+ if (step != currentStep)
+ return false;
- return true;
+ return CriteriaHandler::CanCompleteCriteriaTree(tree);
}
void Scenario::CompletedCriteriaTree(CriteriaTree const* tree, Player* /*referencePlayer*/)
{
- ScenarioStepEntry const* step = tree->ScenarioStep;
- if (!step)
- return;
-
- if (!step->IsBonusObjective() && step != GetStep())
- return;
-
- if (GetStepState(step) == SCENARIO_STEP_DONE)
+ ScenarioStepEntry const* step = ASSERT_NOTNULL(tree->ScenarioStep);
+ if (!IsCompletedStep(step))
return;
SetStepState(step, SCENARIO_STEP_DONE);
CompleteStep(step);
}
+bool Scenario::IsCompletedStep(ScenarioStepEntry const* step)
+{
+ CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(step->Criteriatreeid);
+ if (!tree)
+ return false;
+
+ return IsCompletedCriteriaTree(tree);
+}
+
void Scenario::SendPacket(WorldPacket const* data) const
{
for (ObjectGuid guid : _players)
diff --git a/src/server/game/Scenarios/Scenario.h b/src/server/game/Scenarios/Scenario.h
index 683c317c8d4..65bd75c8362 100644
--- a/src/server/game/Scenarios/Scenario.h
+++ b/src/server/game/Scenarios/Scenario.h
@@ -64,6 +64,7 @@ class TC_GAME_API Scenario : public CriteriaHandler
virtual void Update(uint32 /*diff*/) { }
bool IsComplete();
+ bool IsCompletedStep(ScenarioStepEntry const* step);
void SetStepState(ScenarioStepEntry const* step, ScenarioStepState state) { _stepStates[step] = state; }
ScenarioEntry const* GetEntry() const;
ScenarioStepState GetStepState(ScenarioStepEntry const* step);