Core/Quests: Unify quest objective updating into one function and replace iterating entire quest log to find objective with direct {type, id} lookup

Port From (https://github.com/TrinityCore/TrinityCore/commit/6352a84bf78a7afe0ea8d8caccee33dd09e09694)
This commit is contained in:
hondacrx
2021-05-11 12:22:07 -04:00
parent 5cbd815f53
commit 5915e1a9a0
4 changed files with 251 additions and 515 deletions
+19 -10
View File
@@ -201,10 +201,11 @@ namespace Game
if (player.IsAlive())
{
// not using Player.UpdateQuestObjectiveProgress, ObjectID in quest_objectives can be set to -1, areatrigger_involvedrelation then holds correct id
List<uint> quests = Global.ObjectMgr.GetQuestsForAreaTrigger(packet.AreaTriggerID);
if (quests != null)
{
bool completedObjectiveInSequencedQuest = false;
bool anyObjectiveChangedCompletionState = false;
foreach (uint questId in quests)
{
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(questId);
@@ -213,14 +214,22 @@ namespace Game
{
foreach (QuestObjective obj in qInfo.Objectives)
{
if (obj.Type == QuestObjectiveType.AreaTrigger && !player.IsQuestObjectiveComplete(slot, qInfo, obj))
{
player.SetQuestObjectiveData(obj, 1);
player.SendQuestUpdateAddCreditSimple(obj);
if (qInfo.HasSpecialFlag(QuestSpecialFlags.SequencedObjectives))
completedObjectiveInSequencedQuest = true;
break;
}
if (obj.Type != QuestObjectiveType.AreaTrigger)
continue;
if (!player.IsQuestObjectiveCompletable(slot, qInfo, obj))
continue;
if (player.IsQuestObjectiveComplete(slot, qInfo, obj))
continue;
if (obj.ObjectID != -1 && obj.ObjectID != packet.AreaTriggerID)
continue;
player.SetQuestObjectiveData(obj, 1);
player.SendQuestUpdateAddCreditSimple(obj);
anyObjectiveChangedCompletionState = true;
break;
}
if (player.CanCompleteQuest(questId))
@@ -228,7 +237,7 @@ namespace Game
}
}
if (completedObjectiveInSequencedQuest)
if (anyObjectiveChangedCompletionState)
player.UpdateForQuestWorldObjects();
}
}