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>2020-04-26 22:58:51 +0200
commit6f7ff9a3efd10cd4f776a67540109e7bb774f1c5 (patch)
tree7a7339a82880134b10f6f4b0856d95cbbc44892b /src/server/game/Achievements/AchievementMgr.cpp
parent0763844fb604075580e1c84672cb2e4a4fe19cde (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.cpp35
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);
+ }
}
}