void PlayerAchievementMgr::ResetCriteria(CriteriaTypes type, uint64 miscValue1, uint64 miscValue2, bool evenIfCriteriaComplete) { TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, " UI64FMTD ", " UI64FMTD ")", type, miscValue1, miscValue2); // disable for gamemasters with GM-mode enabled if (_owner->IsGameMaster()) return; CriteriaList const& achievementCriteriaList = GetCriteriaByType(type); for (Criteria const* achievementCriteria : achievementCriteriaList) { if (achievementCriteria->Entry->FailEvent != miscValue1 || (achievementCriteria->Entry->FailAsset && achievementCriteria->Entry->FailAsset != miscValue2)) continue; std::vector<CriteriaTree const*> const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(achievementCriteria->ID); bool allComplete = true; for (CriteriaTree const* tree : *trees) { // 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; RemoveCriteriaProgress(achievementCriteria); } }
void QuestObjectiveCriteriaMgr::ResetCriteriaTree(uint32 criteriaTreeId) { CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(criteriaTreeId); if (!tree) return; CriteriaMgr::WalkCriteriaTree(tree, [this](CriteriaTree const* criteriaTree) { RemoveCriteriaProgress(criteriaTree->Criteria); }); }
void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) { AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type); for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i!=achievementCriteriaList.end(); ++i) { if ((*i)->timedCriteriaMiscId != entry) continue; TimedAchievementMap::iterator timedIter = m_timedAchievements.find((*i)->ID); // We don't have timer for this achievement if (timedIter == m_timedAchievements.end()) continue; // remove progress RemoveCriteriaProgress(*i, _player); // Remove the timer m_timedAchievements.erase(timedIter); } }
void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) { if (!m_timedAchievements.empty()) { for (TimedAchievementMap::iterator itr = m_timedAchievements.begin(); itr != m_timedAchievements.end();) { // Time is up, remove timer and reset progress if (itr->second <= timeDiff) { AchievementCriteriaEntry const *entry = sAchievementCriteriaStore.LookupEntry(itr->first); RemoveCriteriaProgress(entry, _player); m_timedAchievements.erase(itr++); } else { itr->second -= timeDiff; ++itr; } } } }