From 4e89a302fcce7644bcd8cf239edad3b409950438 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 8 Dec 2024 00:23:38 +0100 Subject: Core/Quests: Improved criteria tree quest objective type * Fixed _completedObjectives not being cleaned when adding quest * Fixed objective credit being granted if just the criteria tree row containing criteria id was completed (instead of the entire tree linked to objective) * Retroactively grant progress on quest accept for criteria types that require action that cannot be repeated (such as learning a spell) --- src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp') diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp index 09c29dbac4d..4fe4e246663 100644 --- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp +++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp @@ -165,9 +165,11 @@ void QuestObjectiveCriteriaMgr::SaveToDB(CharacterDatabaseTransaction trans) } } -void QuestObjectiveCriteriaMgr::ResetCriteriaTree(uint32 criteriaTreeId) +void QuestObjectiveCriteriaMgr::ResetCriteriaTree(QuestObjective const* questObjective) { - CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(criteriaTreeId); + _completedObjectives.erase(questObjective->ID); + + CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(questObjective->ObjectID); if (!tree) return; @@ -175,6 +177,12 @@ void QuestObjectiveCriteriaMgr::ResetCriteriaTree(uint32 criteriaTreeId) { RemoveCriteriaProgress(criteriaTree->Criteria); }); + + CriteriaMgr::WalkCriteriaTree(tree, [this](CriteriaTree const* criteriaTree) + { + if (criteriaTree->Criteria && advstd::ranges::contains(CriteriaMgr::GetRetroactivelyUpdateableCriteriaTypes(), CriteriaType(criteriaTree->Criteria->Entry->Type))) + UpdateCriteria(criteriaTree->Criteria, 0, 0, 0, nullptr, _owner); + }); } void QuestObjectiveCriteriaMgr::SendAllData(Player const* /*receiver*/) const @@ -210,7 +218,7 @@ void QuestObjectiveCriteriaMgr::CompletedObjective(QuestObjective const* questOb bool QuestObjectiveCriteriaMgr::HasCompletedObjective(QuestObjective const* questObjective) const { - return _completedObjectives.find(questObjective->ID) != _completedObjectives.end(); + return _completedObjectives.contains(questObjective->ID); } void QuestObjectiveCriteriaMgr::SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, Seconds timeElapsed, bool timedCompleted) const @@ -293,7 +301,9 @@ void QuestObjectiveCriteriaMgr::CompletedCriteriaTree(CriteriaTree const* tree, if (!objective) return; - CompletedObjective(objective, referencePlayer); + CriteriaTree const* entireObjectiveTree = sCriteriaMgr->GetCriteriaTree(objective->ObjectID); + if (IsCompletedCriteriaTree(entireObjectiveTree)) + CompletedObjective(objective, referencePlayer); } void QuestObjectiveCriteriaMgr::SendPacket(WorldPacket const* data) const -- cgit v1.2.3