Core/Scenarios: Fix bad criteria evaluation in scenarios

Port From (https://github.com/TrinityCore/TrinityCore/commit/6cd44e6ca8c90194ffd679a9ca9e7f07ecfc2c06)
This commit is contained in:
hondacrx
2022-05-30 14:04:40 -04:00
parent 702e8c0feb
commit c804b0fd17
+16 -13
View File
@@ -192,37 +192,40 @@ namespace Game.Scenarios
public override bool CanCompleteCriteriaTree(CriteriaTree tree) public override bool CanCompleteCriteriaTree(CriteriaTree tree)
{ {
ScenarioStepRecord step = tree.ScenarioStep; ScenarioStepRecord step = tree.ScenarioStep;
if (step == null) ScenarioStepState state = GetStepState(step);
if (state == ScenarioStepState.Done)
return false; return false;
if (step.ScenarioID != _data.Entry.Id) ScenarioStepRecord currentStep = GetStep();
if (currentStep == null)
return false; return false;
if (step.IsBonusObjective()) if (step.IsBonusObjective())
return !IsComplete(); if (step != currentStep)
if (step != GetStep())
return false; return false;
return true; return base.CanCompleteCriteriaTree(tree);
} }
public override void CompletedCriteriaTree(CriteriaTree tree, Player referencePlayer) public override void CompletedCriteriaTree(CriteriaTree tree, Player referencePlayer)
{ {
ScenarioStepRecord step = tree.ScenarioStep; ScenarioStepRecord step = tree.ScenarioStep;
if (step == null) if (!IsCompletedStep(step))
return;
if (!step.IsBonusObjective() && step != GetStep())
return;
if (GetStepState(step) == ScenarioStepState.Done)
return; return;
SetStepState(step, ScenarioStepState.Done); SetStepState(step, ScenarioStepState.Done);
CompleteStep(step); CompleteStep(step);
} }
bool IsCompletedStep(ScenarioStepRecord step)
{
CriteriaTree tree = Global.CriteriaMgr.GetCriteriaTree(step.CriteriaTreeId);
if (tree == null)
return false;
return IsCompletedCriteriaTree(tree);
}
public override void SendPacket(ServerPacket data) public override void SendPacket(ServerPacket data)
{ {
foreach (ObjectGuid guid in _players) foreach (ObjectGuid guid in _players)