diff options
author | Xinef <none@empty.com> | 2017-02-05 16:39:56 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-04-26 22:58:51 +0200 |
commit | 6f7ff9a3efd10cd4f776a67540109e7bb774f1c5 (patch) | |
tree | 7a7339a82880134b10f6f4b0856d95cbbc44892b /src/server/game/Achievements/AchievementMgr.cpp | |
parent | 0763844fb604075580e1c84672cb2e4a4fe19cde (diff) |
Core/Achievements: Optimized resetting achievement criteria by condition and changed the functionality to properly reset all possible criteria with given condition
Closes #18905
(cherry picked from commit 7c7b877c3fc0292f33f54f4e8b514be3bf8514a6)
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 12e33cf9ee3..0f33174f40c 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -341,36 +341,35 @@ void PlayerAchievementMgr::SaveToDB(CharacterDatabaseTransaction& trans) } } -void PlayerAchievementMgr::ResetCriteria(CriteriaTypes type, uint64 miscValue1, uint64 miscValue2, bool evenIfCriteriaComplete) +void PlayerAchievementMgr::ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete) { - TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, " UI64FMTD ", " UI64FMTD ")", type, miscValue1, miscValue2); + TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, %d, %s)", condition, failAsset, evenIfCriteriaComplete ? "true" : "false"); // disable for gamemasters with GM-mode enabled if (_owner->IsGameMaster()) return; - CriteriaList const& achievementCriteriaList = GetCriteriaByType(type); - for (Criteria const* achievementCriteria : achievementCriteriaList) + if (CriteriaList const* achievementCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(condition, failAsset)) { - if (achievementCriteria->Entry->FailEvent != miscValue1 || (achievementCriteria->Entry->FailAsset && achievementCriteria->Entry->FailAsset != int64(miscValue2))) - continue; - - std::vector<CriteriaTree const*> const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(achievementCriteria->ID); - bool allComplete = true; - for (CriteriaTree const* tree : *trees) + for (Criteria const* achievementCriteria : *achievementCriteriaList) { - // don't update already completed criteria if not forced or achievement already complete - if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree->Achievement->ID)) + std::vector<CriteriaTree const*> const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(achievementCriteria->ID); + bool allComplete = true; + for (CriteriaTree const* tree : *trees) { - allComplete = false; - break; + // don't update already completed criteria if not forced or achievement already complete + if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree->Achievement->ID)) + { + allComplete = false; + break; + } } - } - if (allComplete) - continue; + if (allComplete) + continue; - RemoveCriteriaProgress(achievementCriteria); + RemoveCriteriaProgress(achievementCriteria); + } } } |