aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
diff options
context:
space:
mode:
authorXinef <none@empty.com>2017-02-05 16:39:56 +0100
committerShauren <shauren.trinity@gmail.com>2017-02-05 16:41:45 +0100
commit7c7b877c3fc0292f33f54f4e8b514be3bf8514a6 (patch)
tree0d6ec7ba893653dc90a7d15eac1dbb3cb7bea992 /src/server/game/Achievements/AchievementMgr.cpp
parent78a729b6a4f1643eea7120da87a5a10f268dd3c3 (diff)
Core/Achievements: Optimized resetting achievement criteria by condition and changed the functionality to properly reset all possible criteria with given condition
Closes #18905
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 34955846886..6fd2037cf51 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -474,19 +474,21 @@ void AchievementMgr::Reset()
CheckAllAchievementCriteria();
}
-void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, bool evenIfCriteriaComplete)
+void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete)
{
- TC_LOG_DEBUG("achievement", "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscvalue1, miscvalue2);
+ TC_LOG_DEBUG("achievement", "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", condition, value, evenIfCriteriaComplete);
// disable for gamemasters with GM-mode enabled
if (m_player->IsGameMaster())
return;
- AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type, 0/*get all*/);
- for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
- {
- AchievementCriteriaEntry const* achievementCriteria = (*i);
+ AchievementCriteriaEntryList const* achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByCondition(condition, value);
+ if (!achievementCriteriaList)
+ return;
+ for (auto itr = achievementCriteriaList->begin(); itr != achievementCriteriaList->end(); ++itr)
+ {
+ AchievementCriteriaEntry const* achievementCriteria = *itr;
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->ReferredAchievement);
if (!achievement)
continue;
@@ -495,14 +497,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID))
continue;
- for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j)
- if (achievementCriteria->AdditionalRequirements[j].Type == miscvalue1 &&
- (!achievementCriteria->AdditionalRequirements[j].Asset ||
- achievementCriteria->AdditionalRequirements[j].Asset == miscvalue2))
- {
- RemoveCriteriaProgress(achievementCriteria);
- break;
- }
+ RemoveCriteriaProgress(achievementCriteria);
}
}
@@ -2297,6 +2292,21 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList()
}
}
+ for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i)
+ {
+ if (criteria->AdditionalRequirements[i].Type != ACHIEVEMENT_CRITERIA_CONDITION_NONE)
+ {
+ ASSERT(criteria->AdditionalRequirements[i].Type < ACHIEVEMENT_CRITERIA_CONDITION_MAX,
+ "ACHIEVEMENT_CRITERIA_CONDITION_MAX must be greater than or equal to %u but is currently equal to %u",
+ criteria->AdditionalRequirements[i].Type + 1, ACHIEVEMENT_CRITERIA_CONDITION_MAX);
+
+ if (i == 0
+ || criteria->AdditionalRequirements[i].Type != criteria->AdditionalRequirements[i - 1].Type
+ || criteria->AdditionalRequirements[i].Asset != criteria->AdditionalRequirements[i - 1].Asset)
+ m_AchievementCriteriasByCondition[criteria->AdditionalRequirements[i].Type][criteria->AdditionalRequirements[i].Asset].push_back(criteria);
+ }
+ }
+
if (criteria->StartTimer)
{
ASSERT(criteria->StartEvent < ACHIEVEMENT_TIMED_TYPE_MAX, "ACHIEVEMENT_TIMED_TYPE_MAX must be greater than or equal to %u but is currently equal to %u",