diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 945e1d22d..52d8c7f55 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -766,7 +766,7 @@ namespace Game.Entities questStatusData.Slot = slot; foreach (QuestObjective obj in quest.Objectives) - m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), Objective = obj }); + m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), ObjectiveId = obj.Id }); SetQuestSlot(slot, questId); SetQuestSlotEndTime(slot, endTime); diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 15ca13b60..754ea5c66 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -673,6 +673,6 @@ namespace Game.Entities struct QuestObjectiveStatusData { public (uint QuestID, QuestStatusData Status) QuestStatusPair; - public QuestObjective Objective; + public uint ObjectiveId; } } diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index fb5aab7e0..db3e88702 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -779,7 +779,7 @@ namespace Game.Entities foreach (QuestObjective obj in quest.Objectives) { - m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), Objective = obj }); + m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), ObjectiveId = obj.Id }); switch (obj.Type) { case QuestObjectiveType.MinReputation: @@ -2366,12 +2366,12 @@ namespace Game.Entities { foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)entry))) { - uint questId = objectiveStatusData.QuestStatusPair.QuestID; - Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); + uint questId = objectiveStatusData.QuestStatusPair.QuestID; ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot; - QuestObjective objective = objectiveStatusData.Objective; + Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); + QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveStatusData.ObjectiveId); - if (!IsQuestObjectiveCompletable(logSlot, quest, objective)) + if (quest == null || objective == null || !IsQuestObjectiveCompletable(logSlot, quest, objective)) continue; int newItemCount = (int)GetItemCount(entry, false); // we may have more than what the status shows, so we have to iterate inventory @@ -2465,14 +2465,16 @@ namespace Game.Entities { uint questId = objectiveStatusData.QuestStatusPair.QuestID; Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); + if (quest == null) + continue; if (!QuestObjective.CanAlwaysBeProgressedInRaid(objectiveType)) if (GetGroup() != null && GetGroup().IsRaidGroup() && !quest.IsAllowedInRaid(GetMap().GetDifficultyID())) continue; ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot; - QuestObjective objective = objectiveStatusData.Objective; - if (!IsQuestObjectiveCompletable(logSlot, quest, objective)) + QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveStatusData.ObjectiveId); + if (objective == null || !IsQuestObjectiveCompletable(logSlot, quest, objective)) continue; if (quest.HasFlagEx(QuestFlagsEx.NoCreditForProxy)) @@ -2610,8 +2612,8 @@ namespace Game.Entities foreach (var objectiveItr in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)itemid))) { Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveItr.QuestStatusPair.QuestID); - QuestObjective objective = objectiveItr.Objective; - if (!IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective)) + QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveItr.ObjectiveId); + if (qInfo == null || objective == null || !IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective)) continue; // hide quest if player is in raid-group and quest is no raid quest @@ -3080,8 +3082,8 @@ namespace Game.Entities foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.GameObject, GOId))) { Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveStatusData.QuestStatusPair.QuestID); - QuestObjective objective = objectiveStatusData.Objective; - if (!IsQuestObjectiveCompletable(objectiveStatusData.QuestStatusPair.Status.Slot, qInfo, objective)) + QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveStatusData.ObjectiveId); + if (qInfo == null || objective == null || !IsQuestObjectiveCompletable(objectiveStatusData.QuestStatusPair.Status.Slot, qInfo, objective)) continue; // hide quest if player is in raid-group and quest is no raid quest