aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-08 00:23:38 +0100
committerShauren <shauren.trinity@gmail.com>2024-12-08 00:23:38 +0100
commit4e89a302fcce7644bcd8cf239edad3b409950438 (patch)
tree3bffaa439377f092840d757d74f09c40004f4411 /src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
parent6da1679cbfdc56cd5f1cab7148f645916bccecc1 (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.cpp18
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