Core/Quests: Fixed accessing freed memory after .reload quest_template
Port From (https://github.com/TrinityCore/TrinityCore/commit/308a34ab41241022c7fd2fb42b0c6c9bad94f07e)
This commit is contained in:
@@ -766,7 +766,7 @@ namespace Game.Entities
|
|||||||
questStatusData.Slot = slot;
|
questStatusData.Slot = slot;
|
||||||
|
|
||||||
foreach (QuestObjective obj in quest.Objectives)
|
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);
|
SetQuestSlot(slot, questId);
|
||||||
SetQuestSlotEndTime(slot, endTime);
|
SetQuestSlotEndTime(slot, endTime);
|
||||||
|
|||||||
@@ -673,6 +673,6 @@ namespace Game.Entities
|
|||||||
struct QuestObjectiveStatusData
|
struct QuestObjectiveStatusData
|
||||||
{
|
{
|
||||||
public (uint QuestID, QuestStatusData Status) QuestStatusPair;
|
public (uint QuestID, QuestStatusData Status) QuestStatusPair;
|
||||||
public QuestObjective Objective;
|
public uint ObjectiveId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -779,7 +779,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
foreach (QuestObjective obj in quest.Objectives)
|
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)
|
switch (obj.Type)
|
||||||
{
|
{
|
||||||
case QuestObjectiveType.MinReputation:
|
case QuestObjectiveType.MinReputation:
|
||||||
@@ -2366,12 +2366,12 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)entry)))
|
foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)entry)))
|
||||||
{
|
{
|
||||||
uint questId = objectiveStatusData.QuestStatusPair.QuestID;
|
uint questId = objectiveStatusData.QuestStatusPair.QuestID;
|
||||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
|
||||||
ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot;
|
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;
|
continue;
|
||||||
|
|
||||||
int newItemCount = (int)GetItemCount(entry, false); // we may have more than what the status shows, so we have to iterate inventory
|
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;
|
uint questId = objectiveStatusData.QuestStatusPair.QuestID;
|
||||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
||||||
|
if (quest == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!QuestObjective.CanAlwaysBeProgressedInRaid(objectiveType))
|
if (!QuestObjective.CanAlwaysBeProgressedInRaid(objectiveType))
|
||||||
if (GetGroup() != null && GetGroup().IsRaidGroup() && !quest.IsAllowedInRaid(GetMap().GetDifficultyID()))
|
if (GetGroup() != null && GetGroup().IsRaidGroup() && !quest.IsAllowedInRaid(GetMap().GetDifficultyID()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot;
|
ushort logSlot = objectiveStatusData.QuestStatusPair.Status.Slot;
|
||||||
QuestObjective objective = objectiveStatusData.Objective;
|
QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveStatusData.ObjectiveId);
|
||||||
if (!IsQuestObjectiveCompletable(logSlot, quest, objective))
|
if (objective == null || !IsQuestObjectiveCompletable(logSlot, quest, objective))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (quest.HasFlagEx(QuestFlagsEx.NoCreditForProxy))
|
if (quest.HasFlagEx(QuestFlagsEx.NoCreditForProxy))
|
||||||
@@ -2610,8 +2612,8 @@ namespace Game.Entities
|
|||||||
foreach (var objectiveItr in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)itemid)))
|
foreach (var objectiveItr in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.Item, (int)itemid)))
|
||||||
{
|
{
|
||||||
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveItr.QuestStatusPair.QuestID);
|
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveItr.QuestStatusPair.QuestID);
|
||||||
QuestObjective objective = objectiveItr.Objective;
|
QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveItr.ObjectiveId);
|
||||||
if (!IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective))
|
if (qInfo == null || objective == null || !IsQuestObjectiveCompletable(objectiveItr.QuestStatusPair.Status.Slot, qInfo, objective))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// hide quest if player is in raid-group and quest is no raid quest
|
// 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)))
|
foreach (var objectiveStatusData in m_questObjectiveStatus.LookupByKey((QuestObjectiveType.GameObject, GOId)))
|
||||||
{
|
{
|
||||||
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveStatusData.QuestStatusPair.QuestID);
|
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(objectiveStatusData.QuestStatusPair.QuestID);
|
||||||
QuestObjective objective = objectiveStatusData.Objective;
|
QuestObjective objective = Global.ObjectMgr.GetQuestObjective(objectiveStatusData.ObjectiveId);
|
||||||
if (!IsQuestObjectiveCompletable(objectiveStatusData.QuestStatusPair.Status.Slot, qInfo, objective))
|
if (qInfo == null || objective == null || !IsQuestObjectiveCompletable(objectiveStatusData.QuestStatusPair.Status.Slot, qInfo, objective))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// hide quest if player is in raid-group and quest is no raid quest
|
// hide quest if player is in raid-group and quest is no raid quest
|
||||||
|
|||||||
Reference in New Issue
Block a user