Core/Globals: some changes in quest loading

Port From (https://github.com/TrinityCore/TrinityCore/commit/feb8205d6a78549b60ac8c0c2e394fdcb8e33cc8)
This commit is contained in:
hondacrx
2020-05-06 13:12:56 -04:00
parent c3adef77a9
commit d453b9a8ef
3 changed files with 49 additions and 21 deletions
+4 -4
View File
@@ -1322,8 +1322,8 @@ namespace Game.Entities
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group completed and rewarded
var range = Global.ObjectMgr._exclusiveQuestGroups.LookupByKey(qPrevInfo.ExclusiveGroup);
foreach (var exclude_Id in range)
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)
@@ -1352,7 +1352,7 @@ namespace Game.Entities
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group active
var range = Global.ObjectMgr._exclusiveQuestGroups.LookupByKey(qPrevInfo.ExclusiveGroup);
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
@@ -1528,7 +1528,7 @@ namespace Game.Entities
if (qInfo.ExclusiveGroup <= 0)
return true;
var range = Global.ObjectMgr._exclusiveQuestGroups.LookupByKey(qInfo.ExclusiveGroup);
var range = Global.ObjectMgr.GetExclusiveQuestGroupBounds(qInfo.ExclusiveGroup);
// always must be found if qInfo.ExclusiveGroup != 0
foreach (var exclude_Id in range)
+35 -11
View File
@@ -6354,10 +6354,13 @@ namespace Game
}
while (result.NextRow());
QuestLoaderHelper helper = new QuestLoaderHelper();
helper.LoaderFunction = (quest, fields) => quest.LoadQuestDetails(fields);
// Load `quest_details`
// 0 1 2 3 4 5 6 7 8
result = DB.World.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest details. DB table `quest_details` is empty.");
@@ -6379,7 +6382,6 @@ namespace Game
// Load `quest_request_items`
// 0 1 2 3 4 5
result = DB.World.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, EmoteOnCompleteDelay, EmoteOnIncompleteDelay, CompletionText FROM quest_request_items");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest request items. DB table `quest_request_items` is empty.");
@@ -6401,7 +6403,6 @@ namespace Game
// Load `quest_offer_reward`
// 0 1 2 3 4 5 6 7 8 9
result = DB.World.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
@@ -6423,9 +6424,9 @@ namespace Game
// Load `quest_template_addon`
// 0 1 2 3 4 5 6 7 8
result = DB.World.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, " +
//9 10 11 12 13 14 15 16
"RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, " +
//17 18
//9 10 11 12 13 14 15
"RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, " +
//16 17
"SpecialFlags, ScriptName FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
if (result.IsEmpty())
@@ -6447,9 +6448,29 @@ namespace Game
}
// Load `quest_objectives`
// 0 1 2 3 4 5 6 7 8 9
result = DB.World.Query("SELECT ID, QuestID, Type, StorageIndex, ObjectID, Amount, Flags, Flags2, ProgressBarWeight, Description FROM quest_objectives ORDER BY `Order` ASC, StorageIndex ASC");
// 0 1
result = DB.World.Query("SELECT QuestId, RewardMailSenderEntry FROM quest_mail_sender");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest mail senders. DB table `quest_mail_sender` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadQuestMailSender(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_mail_sender` has data for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_objectives`
// 0 1 2 3 4 5 6 7 8 9
result = DB.World.Query("SELECT QuestID, ID, Type, StorageIndex, ObjectID, Amount, Flags, Flags2, ProgressBarWeight, Description FROM quest_objectives ORDER BY `Order` ASC, StorageIndex ASC");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
@@ -6471,7 +6492,6 @@ namespace Game
// Load `quest_visual_effect` join table with quest_objectives because visual effects are based on objective ID (core stores objectives by their index in quest)
// 0 1 2 3 4
result = DB.World.Query("SELECT v.ID, o.ID, o.QuestID, v.Index, v.VisualEffect FROM quest_visual_effect AS v LEFT JOIN quest_objectives AS o ON v.ID = o.ID ORDER BY v.Index DESC");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest visual effects. DB table `quest_visual_effect` is empty.");
@@ -7515,7 +7535,11 @@ namespace Game
return _questGreetingLocaleStorage[typeIndex].LookupByKey(id);
}
public List<uint> GetExclusiveQuestGroupBounds(int exclusiveGroupId)
{
return _exclusiveQuestGroups.LookupByKey(exclusiveGroupId);
}
//Spells /Skills / Phases
public void LoadPhases()
{
@@ -9754,7 +9778,7 @@ namespace Game
MultiMap<uint, uint> _creatureQuestRelations = new MultiMap<uint, uint>();
MultiMap<uint, uint> _creatureQuestInvolvedRelations = new MultiMap<uint, uint>();
MultiMap<uint, uint> _creatureQuestInvolvedRelationsReverse = new MultiMap<uint, uint>();
public MultiMap<int, uint> _exclusiveQuestGroups = new MultiMap<int, uint>();
MultiMap<int, uint> _exclusiveQuestGroups = new MultiMap<int, uint>();
Dictionary<uint, QuestPOIData> _questPOIStorage = new Dictionary<uint, QuestPOIData>();
MultiMap<uint, uint> _questAreaTriggerStorage = new MultiMap<uint, uint>();
Dictionary<uint, QuestObjective> _questObjectives = new Dictionary<uint, QuestObjective>();
+10 -6
View File
@@ -207,19 +207,23 @@ namespace Game
RequiredMinRepValue = fields.Read<int>(13);
RequiredMaxRepValue = fields.Read<int>(14);
SourceItemIdCount = fields.Read<byte>(15);
RewardMailSenderEntry = fields.Read<uint>(16);
SpecialFlags = (QuestSpecialFlags)fields.Read<byte>(17);
ScriptId = Global.ObjectMgr.GetScriptId(fields.Read<string>(18));
SpecialFlags = (QuestSpecialFlags)fields.Read<byte>(16);
ScriptId = Global.ObjectMgr.GetScriptId(fields.Read<string>(17));
if (SpecialFlags.HasAnyFlag(QuestSpecialFlags.AutoAccept))
Flags |= QuestFlags.AutoAccept;
}
public void LoadQuestMailSender(SQLFields fields)
{
RewardMailSenderEntry = fields.Read<uint>(1);
}
public void LoadQuestObjective(SQLFields fields)
{
QuestObjective obj = new QuestObjective();
obj.Id = fields.Read<uint>(0);
obj.QuestID = fields.Read<uint>(1);
QuestObjective obj = new QuestObjective();
obj.QuestID = fields.Read<uint>(0);
obj.Id = fields.Read<uint>(1);
obj.Type = (QuestObjectiveType)fields.Read<byte>(2);
obj.StorageIndex = fields.Read<sbyte>(3);
obj.ObjectID = fields.Read<int>(4);