diff options
author | Krudor <erikstrandberg93@hotmail.com> | 2022-03-22 18:55:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-22 18:55:13 +0100 |
commit | 6cd44e6ca8c90194ffd679a9ca9e7f07ecfc2c06 (patch) | |
tree | 9ff4b60fa03e4e5e5fd5403c0d4f095c7a6bfcc6 /src | |
parent | f465812e21e5eb1f785177e83624f65118be3698 (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.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Scenarios/Scenario.h | 1 |
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); |