From b472e1b3b060eeb9aecd5d5f1cb6df091ca8b0c0 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 10 Aug 2022 09:33:51 -0400 Subject: [PATCH] Core/Scenarios: Group criteria storage by scenario id Port From (https://github.com/TrinityCore/TrinityCore/commit/6e2ef357180b296369c725c3af113653c988840e) --- Source/Game/Achievements/CriteriaHandler.cs | 22 ++++++++++++++------- Source/Game/Scenarios/Scenario.cs | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 669e940ab..0f2417498 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -3553,7 +3553,7 @@ namespace Game.Achievements MultiMap _criteriasByType = new(); MultiMap[] _criteriasByAsset = new MultiMap[(int)CriteriaType.Count]; MultiMap _guildCriteriasByType = new(); - MultiMap _scenarioCriteriasByType = new(); + MultiMap[] _scenarioCriteriasByTypeAndScenarioId = new MultiMap[(int)CriteriaType.Count]; MultiMap _questObjectiveCriteriasByType = new(); MultiMap _criteriasByTimedType = new(); @@ -3562,7 +3562,10 @@ namespace Game.Achievements CriteriaManager() { for (var i = 0; i < (int)CriteriaType.Count; ++i) + { _criteriasByAsset[i] = new MultiMap(); + _scenarioCriteriasByTypeAndScenarioId[i] = new MultiMap(); + } } public void LoadCriteriaModifiersTree() @@ -3702,6 +3705,7 @@ namespace Game.Achievements _criteria[criteria.Id] = criteria; + List scenarioIds = new(); foreach (CriteriaTree tree in treeList) { tree.Criteria = criteria; @@ -3717,7 +3721,10 @@ namespace Game.Achievements criteria.FlagsCu |= CriteriaFlagsCu.Player; } else if (tree.ScenarioStep != null) + { criteria.FlagsCu |= CriteriaFlagsCu.Scenario; + scenarioIds.Add(tree.ScenarioStep.ScenarioID); + } else if (tree.QuestObjective != null) criteria.FlagsCu |= CriteriaFlagsCu.QuestObjective; } @@ -3761,7 +3768,8 @@ namespace Game.Achievements if (criteria.FlagsCu.HasAnyFlag(CriteriaFlagsCu.Scenario)) { ++scenarioCriterias; - _scenarioCriteriasByType.Add(criteriaEntry.Type, criteria); + foreach (uint scenarioId in scenarioIds) + _scenarioCriteriasByTypeAndScenarioId[(int)criteriaEntry.Type].Add(scenarioId, criteria); } if (criteria.FlagsCu.HasAnyFlag(CriteriaFlagsCu.QuestObjective)) @@ -3907,16 +3915,16 @@ namespace Game.Achievements return _criteriasByType.LookupByKey(type); } + public List GetScenarioCriteriaByTypeAndScenario(CriteriaType type, uint scenarioId) + { + return _scenarioCriteriasByTypeAndScenarioId[(int)type].LookupByKey(scenarioId); + } + public List GetGuildCriteriaByType(CriteriaType type) { return _guildCriteriasByType.LookupByKey(type); } - public List GetScenarioCriteriaByType(CriteriaType type) - { - return _scenarioCriteriasByType.LookupByKey(type); - } - public List GetQuestObjectiveCriteriaByType(CriteriaType type) { return _questObjectiveCriteriasByType[type]; diff --git a/Source/Game/Scenarios/Scenario.cs b/Source/Game/Scenarios/Scenario.cs index 52d704ca9..37b9b840e 100644 --- a/Source/Game/Scenarios/Scenario.cs +++ b/Source/Game/Scenarios/Scenario.cs @@ -346,7 +346,7 @@ namespace Game.Scenarios public override List GetCriteriaByType(CriteriaType type, uint asset) { - return Global.CriteriaMgr.GetScenarioCriteriaByType(type); + return Global.CriteriaMgr.GetScenarioCriteriaByTypeAndScenario(type, _data.Entry.Id); } void SendBootPlayer(Player player)