Core/Quests: fixed exclusivegroup interaction with prevquestId and nextQuestId.

Port From (https://github.com/TrinityCore/TrinityCore/commit/1536f01a7448bc3401686e55894a943835060fcd)
This commit is contained in:
hondacrx
2020-05-06 13:36:38 -04:00
parent d0cc070edf
commit 52ed9a2ebb
3 changed files with 80 additions and 84 deletions
+76 -78
View File
@@ -27,6 +27,7 @@ using Game.Network.Packets;
using Game.Spells;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game.Entities
{
@@ -406,7 +407,7 @@ namespace Game.Entities
{
if (!Global.DisableMgr.IsDisabledFor(DisableType.Quest, quest.Id, this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
SatisfyQuestDependentQuests(quest, false) && SatisfyQuestNextChain(quest, false) &&
SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
{
@@ -422,7 +423,7 @@ namespace Game.Entities
&& SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
&& SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
&& SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
&& SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
&& SatisfyQuestDependentQuests(quest, msg) && SatisfyQuestTimed(quest, msg)
&& SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
&& SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
&& SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
@@ -1299,89 +1300,86 @@ namespace Game.Entities
return false;
}
bool SatisfyQuestDependentQuests(Quest qInfo, bool msg)
{
return SatisfyQuestPreviousQuest(qInfo, msg) && SatisfyQuestDependentPreviousQuests(qInfo, msg);
}
public bool SatisfyQuestPreviousQuest(Quest qInfo, bool msg)
{
// No previous quest (might be first quest in a series)
if (qInfo.prevQuests.Empty())
if (qInfo.PrevQuestId == 0)
return true;
foreach (var prev in qInfo.prevQuests)
{
uint prevId = (uint)Math.Abs(prev);
uint prevId = (uint)Math.Abs(qInfo.PrevQuestId);
// If positive previous quest rewarded, return true
if (qInfo.PrevQuestId > 0 && m_RewardedQuests.Contains(prevId))
return true;
Quest qPrevInfo = Global.ObjectMgr.GetQuestTemplate(prevId);
// If negative previous quest active, return true
if (qInfo.PrevQuestId < 0 && GetQuestStatus(prevId) == QuestStatus.Incomplete)
return true;
if (qPrevInfo != null)
{
// If any of the positive previous quests completed, return true
if (prev > 0 && m_RewardedQuests.Contains(prevId))
{
// skip one-from-all exclusive group
if (qPrevInfo.ExclusiveGroup >= 0)
return true;
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group completed and rewarded
var bounds = Global.ObjectMgr.GetExclusiveQuestGroupBounds(qPrevInfo.ExclusiveGroup);
foreach (var exclude_Id in bounds)
{
// skip checked quest id, only state of other quests in group is interesting
if (exclude_Id == prevId)
continue;
// alternative quest from group also must be completed and rewarded (reported)
if (!m_RewardedQuests.Contains(exclude_Id))
{
if (msg)
{
SendCanTakeQuestResponse(QuestFailedReasons.None);
Log.outDebug(LogFilter.Server, "SatisfyQuestPreviousQuest: Sent QuestFailedReason.None (questId: {0}) because player does not have required quest (1).", qInfo.Id);
}
return false;
}
}
return true;
}
// If any of the negative previous quests active, return true
if (prev < 0 && GetQuestStatus(prevId) != QuestStatus.None)
{
// skip one-from-all exclusive group
if (qPrevInfo.ExclusiveGroup >= 0)
return true;
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group active
var range = Global.ObjectMgr.GetExclusiveQuestGroupBounds(qPrevInfo.ExclusiveGroup);
foreach (var exclude_Id in range)
{
// skip checked quest id, only state of other quests in group is interesting
if (exclude_Id == prevId)
continue;
// alternative quest from group also must be active
if (GetQuestStatus(exclude_Id) != QuestStatus.None)
{
if (msg)
{
SendCanTakeQuestResponse(QuestFailedReasons.None);
Log.outDebug(LogFilter.Server, "SatisfyQuestPreviousQuest: Sent QuestFailedReason.None (questId: {0}) because player does not have required quest (2).", qInfo.Id);
}
return false;
}
}
return true;
}
}
}
// Has only positive prev. quests in non-rewarded state
// and negative prev. quests in non-active state
// Has positive prev. quest in non-rewarded state
// and negative prev. quest in non-active state
if (msg)
{
SendCanTakeQuestResponse(QuestFailedReasons.None);
Log.outDebug(LogFilter.Server, "SatisfyQuestPreviousQuest: Sent QuestFailedReason.None (questId: {0}) because player does not have required quest (3).", qInfo.Id);
Log.outDebug(LogFilter.Misc, $"Player.SatisfyQuestPreviousQuest: Sent QUEST_ERR_NONE (QuestID: {qInfo.Id}) because player '{GetName()}' ({GetGUID()}) doesn't have required quest {prevId}.");
}
return false;
}
bool SatisfyQuestDependentPreviousQuests(Quest qInfo, bool msg)
{
// No previous quest (might be first quest in a series)
if (qInfo.DependentPreviousQuests.Empty())
return true;
foreach (uint prevId in qInfo.DependentPreviousQuests)
{
// checked in startup
Quest questInfo = Global.ObjectMgr.GetQuestTemplate(prevId);
// If any of the previous quests completed, return true
if (IsQuestRewarded(prevId))
{
// skip one-from-all exclusive group
if (questInfo.ExclusiveGroup >= 0)
return true;
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group completed and rewarded
var bounds = Global.ObjectMgr.GetExclusiveQuestGroupBounds(questInfo.ExclusiveGroup);
foreach (var exclusiveQuestId in bounds)
{
// skip checked quest id, only state of other quests in group is interesting
if (exclusiveQuestId == prevId)
continue;
// alternative quest from group also must be completed and rewarded (reported)
if (!IsQuestRewarded(exclusiveQuestId))
{
if (msg)
{
SendCanTakeQuestResponse(QuestFailedReasons.None);
Log.outDebug(LogFilter.Misc, $"Player.SatisfyQuestDependentPreviousQuests: Sent QUEST_ERR_NONE (QuestID: {qInfo.Id}) because player '{GetName()}' ({GetGUID()}) doesn't have the required quest (1).");
}
return false;
}
}
return true;
}
}
// Has only prev. quests in non-rewarded state
if (msg)
{
SendCanTakeQuestResponse(QuestFailedReasons.None);
Log.outDebug(LogFilter.Misc, $"Player.SatisfyQuestDependentPreviousQuests: Sent QUEST_ERR_NONE (QuestID: {qInfo.Id}) because player '{GetName()}' ({GetGUID()}) doesn't have required quest (2).");
}
return false;
@@ -1586,12 +1584,12 @@ namespace Game.Entities
public bool SatisfyQuestPrevChain(Quest qInfo, bool msg)
{
// No previous quest in chain
if (qInfo.prevChainQuests.Empty())
if (qInfo.PrevChainQuests.Empty())
return true;
foreach (var questId in qInfo.prevChainQuests)
foreach (var prevQuestId in qInfo.PrevChainQuests)
{
var questStatusData = m_QuestStatus.LookupByKey(questId);
var questStatusData = m_QuestStatus.LookupByKey(prevQuestId);
// If any of the previous quests in chain active, return false
if (questStatusData != null && questStatusData.Status != QuestStatus.None)
+2 -4
View File
@@ -7022,7 +7022,7 @@ namespace Game
qinfo.NextQuestInChain = 0;
}
else
qNext.prevChainQuests.Add(qinfo.Id);
qNext.PrevChainQuests.Add(qinfo.Id);
}
for (var j = 0; j < SharedConst.QuestRewardCurrencyCount; ++j)
@@ -7105,8 +7105,6 @@ namespace Game
{
if (!_questTemplates.ContainsKey((uint)Math.Abs(qinfo.PrevQuestId)))
Log.outError(LogFilter.Sql, "Quest {0} has PrevQuestId {1}, but no such quest", qinfo.Id, qinfo.PrevQuestId);
else
qinfo.prevQuests.Add(qinfo.PrevQuestId);
}
if (qinfo.NextQuestId != 0)
@@ -7115,7 +7113,7 @@ namespace Game
if (nextquest == null)
Log.outError(LogFilter.Sql, "Quest {0} has NextQuestId {1}, but no such quest", qinfo.Id, qinfo.NextQuestId);
else
nextquest.prevQuests.Add((int)qinfo.Id);
nextquest.DependentPreviousQuests.Add(qinfo.Id);
}
if (qinfo.ExclusiveGroup != 0)
+2 -2
View File
@@ -661,8 +661,8 @@ namespace Game
public QuestSpecialFlags SpecialFlags; // custom flags, not sniffed/WDB
public uint ScriptId;
public List<int> prevQuests = new List<int>();
public List<uint> prevChainQuests = new List<uint>();
public List<uint> DependentPreviousQuests = new List<uint>();
public List<uint> PrevChainQuests = new List<uint>();
public QueryQuestInfoResponse QueryData;
uint _rewChoiceItemsCount;