diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-08 00:23:38 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-12-08 00:23:38 +0100 |
commit | 4e89a302fcce7644bcd8cf239edad3b409950438 (patch) | |
tree | 3bffaa439377f092840d757d74f09c40004f4411 /src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp | |
parent | 6da1679cbfdc56cd5f1cab7148f645916bccecc1 (diff) |
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)
Diffstat (limited to 'src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp')
-rw-r--r-- | src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
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 |