From c96fc90f5b3259030d4cc72f4550707c10c1c65e Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 2 Feb 2021 10:14:16 -0500 Subject: [PATCH] Core/Quests: Automatically add quests with AUTO_PUSH flag to player Port From (https://github.com/TrinityCore/TrinityCore/commit/db6eb694656c58a817a965e2f5c85874e9c92d12) --- Source/Game/Chat/Commands/LookupCommands.cs | 2 +- Source/Game/Entities/Player/Player.DB.cs | 2 ++ Source/Game/Entities/Player/Player.Map.cs | 2 ++ Source/Game/Entities/Player/Player.Quest.cs | 17 ++++++++++++++--- Source/Game/Entities/Player/Player.cs | 2 ++ Source/Game/Globals/ObjectManager.cs | 8 ++++++-- Source/Game/Quest/Quest.cs | 6 ++++++ 7 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Source/Game/Chat/Commands/LookupCommands.cs b/Source/Game/Chat/Commands/LookupCommands.cs index 9005d674f..a2dbe7a5d 100644 --- a/Source/Game/Chat/Commands/LookupCommands.cs +++ b/Source/Game/Chat/Commands/LookupCommands.cs @@ -498,7 +498,7 @@ namespace Game.Chat bool found = false; uint count = 0; - var qTemplates = Global.ObjectMgr.GetQuestStorage(); + var qTemplates = Global.ObjectMgr.GetQuestTemplates(); foreach (var qInfo in qTemplates.Values) { int localeIndex = handler.GetSessionDbLocaleIndex(); diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 44dcad55c..e6d9858f9 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3222,6 +3222,8 @@ namespace Game.Entities m_achievementSys.CheckAllAchievementCriteria(this); m_questObjectiveCriteriaMgr.CheckAllQuestObjectiveCriteria(this); + + PushQuests(); return true; } diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index b426ca64d..beedf7cb1 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -145,6 +145,8 @@ namespace Game.Entities else _restMgr.RemoveRestFlag(RestFlag.FactionArea); + PushQuests(); + UpdateCriteria(CriteriaTypes.TravelledToArea, newArea); } diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index dd06e2036..613e0e0e7 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -37,7 +37,7 @@ namespace Game.Entities public ObjectGuid GetPlayerSharingQuest() { return m_playerSharingQuest; } public void SetQuestSharingInfo(ObjectGuid guid, uint id) { m_playerSharingQuest = guid; m_sharedQuestId = id; } public void ClearQuestSharingInfo() { m_playerSharingQuest = ObjectGuid.Empty; m_sharedQuestId = 0; } - + uint GetInGameTime() { return m_ingametime; } public void SetInGameTime(uint time) { m_ingametime = time; } @@ -768,8 +768,7 @@ namespace Game.Entities GetReputationMgr().SetVisible(factionEntry); break; case QuestObjectiveType.CriteriaTree: - if (quest.HasFlagEx(QuestFlagsEx.IsWorldQuest)) - m_questObjectiveCriteriaMgr.ResetCriteriaTree((uint)obj.ObjectID); + m_questObjectiveCriteriaMgr.ResetCriteriaTree((uint)obj.ObjectID); break; default: break; @@ -3122,5 +3121,17 @@ namespace Game.Entities m_monthlyquests.Add(quest_id); m_MonthlyQuestChanged = true; } + + void PushQuests() + { + foreach (Quest quest in Global.ObjectMgr.GetQuestTemplatesAutoPush()) + { + if (quest.GetQuestTag() != 0 && quest.GetQuestTag() != QuestTagType.Tag) + continue; + + if (!quest.IsUnavailable() && CanTakeQuest(quest, false)) + AddQuestAndCheckCompletion(quest, null); + } + } } } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 4483cc161..3d9d7b665 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5236,6 +5236,8 @@ namespace Game.Entities UpdateCriteria(CriteriaTypes.ReachLevel); + PushQuests(); + Global.ScriptMgr.OnPlayerLevelChanged(this, (byte)oldLevel); } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 71a9f2ad5..308943aad 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -6592,6 +6592,7 @@ namespace Game // For reload case _questTemplates.Clear(); + _questTemplatesAutoPush.Clear(); _questObjectives.Clear(); _exclusiveQuestGroups.Clear(); @@ -6641,6 +6642,8 @@ namespace Game { Quest newQuest = new Quest(result.GetFields()); _questTemplates[newQuest.Id] = newQuest; + if (newQuest.IsAutoPush()) + _questTemplatesAutoPush.Add(newQuest); } while (result.NextRow()); @@ -7805,9 +7808,9 @@ namespace Game { return _questTemplates; } - public Dictionary GetQuestStorage() + public List GetQuestTemplatesAutoPush() { - return _questTemplates; + return _questTemplatesAutoPush; } public MultiMap GetGOQuestRelationMap() { @@ -10246,6 +10249,7 @@ namespace Game //Quest Dictionary _questTemplates = new Dictionary(); + List _questTemplatesAutoPush = new List(); MultiMap _goQuestRelations = new MultiMap(); MultiMap _goQuestInvolvedRelations = new MultiMap(); MultiMap _goQuestInvolvedRelationsReverse = new MultiMap(); diff --git a/Source/Game/Quest/Quest.cs b/Source/Game/Quest/Quest.cs index 63392ce87..c80aae0e5 100644 --- a/Source/Game/Quest/Quest.cs +++ b/Source/Game/Quest/Quest.cs @@ -564,6 +564,12 @@ namespace Game public bool HasSpecialFlag(QuestSpecialFlags flag) { return (SpecialFlags & flag) != 0; } public void SetSpecialFlag(QuestSpecialFlags flag) { SpecialFlags |= flag; } + + public bool IsAutoPush() { return HasFlagEx(QuestFlagsEx.AutoPush); } + public bool IsWorldQuest() { return HasFlagEx(QuestFlagsEx.IsWorldQuest);} + + // Possibly deprecated flag + public bool IsUnavailable() { return HasFlag(QuestFlags.Unavailable); } // table data accessors: public bool IsRepeatable() { return SpecialFlags.HasAnyFlag(QuestSpecialFlags.Repeatable); }