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)
Port From (https://github.com/TrinityCore/TrinityCore/commit/4e89a302fcce7644bcd8cf239edad3b409950438)
This commit is contained in:
Hondacrx
2025-02-24 11:21:04 -05:00
parent 0d5c0b572d
commit 0e050f6c54
3 changed files with 795 additions and 779 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -785,7 +785,7 @@ namespace Game.Entities
GetReputationMgr().SetVisible(factionEntry);
break;
case QuestObjectiveType.CriteriaTree:
m_questObjectiveCriteriaMgr.ResetCriteriaTree((uint)obj.ObjectID);
m_questObjectiveCriteriaMgr.ResetCriteriaTree(obj);
break;
default:
break;
@@ -9,6 +9,7 @@ using Game.Networking;
using Game.Networking.Packets;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game
{
@@ -150,9 +151,11 @@ namespace Game
}
}
public void ResetCriteriaTree(uint criteriaTreeId)
public void ResetCriteriaTree(QuestObjective questObjective)
{
CriteriaTree tree = Global.CriteriaMgr.GetCriteriaTree(criteriaTreeId);
_completedObjectives.Remove(questObjective.Id);
CriteriaTree tree = Global.CriteriaMgr.GetCriteriaTree((uint)questObjective.ObjectID);
if (tree == null)
return;
@@ -160,6 +163,12 @@ namespace Game
{
RemoveCriteriaProgress(criteriaTree.Criteria);
});
CriteriaManager.WalkCriteriaTree(tree, criteriaTree =>
{
if (criteriaTree.Criteria != null && CriteriaManager.GetRetroactivelyUpdateableCriteriaTypes().Contains(criteriaTree.Criteria.Entry.Type))
UpdateCriteria(criteriaTree.Criteria, 0, 0, 0, null, _owner);
});
}
public override void SendAllData(Player receiver)
@@ -274,7 +283,9 @@ namespace Game
if (objective == null)
return;
CompletedObjective(objective, referencePlayer);
CriteriaTree entireObjectiveTree = Global.CriteriaMgr.GetCriteriaTree((uint)objective.ObjectID);
if (IsCompletedCriteriaTree(entireObjectiveTree))
CompletedObjective(objective, referencePlayer);
}
public override void SendPacket(ServerPacket data)