aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-08-09 23:44:07 +0200
committerShauren <shauren.trinity@gmail.com>2022-08-09 23:44:07 +0200
commit6e2ef357180b296369c725c3af113653c988840e (patch)
tree3cce4a862a50a3b6591c1dfc2c5b83975b086798
parente5e428351802d9ff804a2c6394cf6cab935d768f (diff)
Core/Scenarios: Group criteria storage by scenario id
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp16
-rw-r--r--src/server/game/Achievements/CriteriaHandler.h7
-rw-r--r--src/server/game/Scenarios/Scenario.cpp2
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)