diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-08-09 23:44:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-08-09 23:44:07 +0200 |
commit | 6e2ef357180b296369c725c3af113653c988840e (patch) | |
tree | 3cce4a862a50a3b6591c1dfc2c5b83975b086798 /src | |
parent | e5e428351802d9ff804a2c6394cf6cab935d768f (diff) |
Core/Scenarios: Group criteria storage by scenario id
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.h | 7 | ||||
-rw-r--r-- | src/server/game/Scenarios/Scenario.cpp | 2 |
3 files changed, 18 insertions, 7 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 4a81ad485d3..5cbdcefd648 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -4305,6 +4305,14 @@ CriteriaList const& CriteriaMgr::GetPlayerCriteriaByType(CriteriaType type, uint return _criteriasByType[size_t(type)]; } +CriteriaList const& CriteriaMgr::GetScenarioCriteriaByTypeAndScenario(CriteriaType type, uint32 scenarioId) const +{ + if (CriteriaList const* criteriaList = Trinity::Containers::MapGetValuePtr(_scenarioCriteriasByTypeAndScenarioId[size_t(type)], scenarioId)) + return *criteriaList; + + return EmptyCriteriaList; +} + CriteriaMgr::CriteriaMgr() = default; //========================================================== @@ -4455,6 +4463,8 @@ void CriteriaMgr::LoadCriteriaList() _criteria[criteria->ID] = criteria; + std::vector<uint32> scenarioIds; + for (CriteriaTree const* tree : treeItr->second) { const_cast<CriteriaTree*>(tree)->Criteria = criteria; @@ -4469,7 +4479,10 @@ void CriteriaMgr::LoadCriteriaList() criteria->FlagsCu |= CRITERIA_FLAG_CU_PLAYER; } else if (tree->ScenarioStep) + { criteria->FlagsCu |= CRITERIA_FLAG_CU_SCENARIO; + scenarioIds.push_back(tree->ScenarioStep->ScenarioID); + } else if (tree->QuestObjective) criteria->FlagsCu |= CRITERIA_FLAG_CU_QUEST_OBJECTIVE; } @@ -4513,7 +4526,8 @@ void CriteriaMgr::LoadCriteriaList() if (criteria->FlagsCu & CRITERIA_FLAG_CU_SCENARIO) { ++scenarioCriterias; - _scenarioCriteriasByType[criteriaEntry->Type].push_back(criteria); + for (uint32 scenarioId : scenarioIds) + _scenarioCriteriasByTypeAndScenarioId[criteriaEntry->Type][scenarioId].push_back(criteria); } if (criteria->FlagsCu & CRITERIA_FLAG_CU_QUEST_OBJECTIVE) diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h index 2c7d869c769..351f97bdf6f 100644 --- a/src/server/game/Achievements/CriteriaHandler.h +++ b/src/server/game/Achievements/CriteriaHandler.h @@ -338,10 +338,7 @@ public: return _guildCriteriasByType[size_t(type)]; } - CriteriaList const& GetScenarioCriteriaByType(CriteriaType type) const - { - return _scenarioCriteriasByType[size_t(type)]; - } + CriteriaList const& GetScenarioCriteriaByTypeAndScenario(CriteriaType type, uint32 scenarioId) const; CriteriaList const& GetQuestObjectiveCriteriaByType(CriteriaType type) const { @@ -419,7 +416,7 @@ private: CriteriaList _criteriasByType[size_t(CriteriaType::Count)]; CriteriaListByAsset _criteriasByAsset[size_t(CriteriaType::Count)]; CriteriaList _guildCriteriasByType[size_t(CriteriaType::Count)]; - CriteriaList _scenarioCriteriasByType[size_t(CriteriaType::Count)]; + CriteriaListByAsset _scenarioCriteriasByTypeAndScenarioId[size_t(CriteriaType::Count)]; CriteriaList _questObjectiveCriteriasByType[size_t(CriteriaType::Count)]; CriteriaList _criteriasByTimedType[size_t(CriteriaStartEvent::Count)]; diff --git a/src/server/game/Scenarios/Scenario.cpp b/src/server/game/Scenarios/Scenario.cpp index e7debb993b5..868ce78ed4b 100644 --- a/src/server/game/Scenarios/Scenario.cpp +++ b/src/server/game/Scenarios/Scenario.cpp @@ -326,7 +326,7 @@ std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasP CriteriaList const& Scenario::GetCriteriaByType(CriteriaType type, uint32 /*asset*/) const { - return sCriteriaMgr->GetScenarioCriteriaByType(type); + return sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(type, _data->Entry->ID); } void Scenario::SendBootPlayer(Player* player) |