Core/Quests: Fixed accessing freed memory after .reload quest_template

Port From (https://github.com/TrinityCore/TrinityCore/commit/308a34ab41241022c7fd2fb42b0c6c9bad94f07e)
This commit is contained in:
hondacrx
2024-02-04 13:44:50 -05:00
parent 44705dcc0d
commit 64d80537ed
3 changed files with 15 additions and 13 deletions
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -673,6 +673,6 @@ namespace Game.Entities
struct QuestObjectiveStatusData
{
public (uint QuestID, QuestStatusData Status) QuestStatusPair;
public QuestObjective Objective;
public uint ObjectiveId;
}
}
+13 -11
View File
@@ -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