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); GetReputationMgr().SetVisible(factionEntry);
break; break;
case QuestObjectiveType.CriteriaTree: case QuestObjectiveType.CriteriaTree:
m_questObjectiveCriteriaMgr.ResetCriteriaTree((uint)obj.ObjectID); m_questObjectiveCriteriaMgr.ResetCriteriaTree(obj);
break; break;
default: default:
break; break;
@@ -9,6 +9,7 @@ using Game.Networking;
using Game.Networking.Packets; using Game.Networking.Packets;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace Game 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) if (tree == null)
return; return;
@@ -160,6 +163,12 @@ namespace Game
{ {
RemoveCriteriaProgress(criteriaTree.Criteria); 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) public override void SendAllData(Player receiver)
@@ -274,7 +283,9 @@ namespace Game
if (objective == null) if (objective == null)
return; return;
CompletedObjective(objective, referencePlayer); CriteriaTree entireObjectiveTree = Global.CriteriaMgr.GetCriteriaTree((uint)objective.ObjectID);
if (IsCompletedCriteriaTree(entireObjectiveTree))
CompletedObjective(objective, referencePlayer);
} }
public override void SendPacket(ServerPacket data) public override void SendPacket(ServerPacket data)