[11945] Fix a bunch of counter achievements. Some still require more work

Signed-off-by: Schmoozerd <schmoozerd@scriptdev2.com>
This commit is contained in:
Schmoozerd 2012-04-10 19:54:28 +02:00
parent f09fa8d245
commit 43dd16ff60
4 changed files with 136 additions and 94 deletions

View file

@ -577,11 +577,11 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
progress.changed = false; progress.changed = false;
progress.timedCriteriaFailed = false; progress.timedCriteriaFailed = false;
AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
// A failed achievement will be removed on next tick - TODO: Possible that timer 2 is reseted // A failed achievement will be removed on next tick - TODO: Possible that timer 2 is reseted
if (criteria->timeLimit) if (criteria->timeLimit)
{ {
AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
// Add not-completed achievements to time map // Add not-completed achievements to time map
if (!IsCompletedCriteria(criteria, achievement)) if (!IsCompletedCriteria(criteria, achievement))
{ {
@ -594,7 +594,7 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
} }
// check intergiry with max allowed counter value // check intergiry with max allowed counter value
if (uint32 maxcounter = GetCriteriaProgressMaxCounter(criteria)) if (uint32 maxcounter = GetCriteriaProgressMaxCounter(criteria, achievement))
{ {
if (progress.counter > maxcounter) if (progress.counter > maxcounter)
{ {
@ -1699,98 +1699,141 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
} }
} }
uint32 AchievementMgr::GetCriteriaProgressMaxCounter(AchievementCriteriaEntry const* achievementCriteria) uint32 AchievementMgr::GetCriteriaProgressMaxCounter(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement)
{ {
uint32 resultValue = 0;
switch (achievementCriteria->requiredType) switch (achievementCriteria->requiredType)
{ {
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
return achievementCriteria->win_bg.winCount; resultValue = achievementCriteria->win_bg.winCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
return achievementCriteria->kill_creature.creatureCount; resultValue = achievementCriteria->kill_creature.creatureCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
return achievementCriteria->reach_level.level; resultValue = achievementCriteria->reach_level.level;
break;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
return achievementCriteria->reach_skill_level.skillLevel; resultValue = achievementCriteria->reach_skill_level.skillLevel;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
return 1; resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
return achievementCriteria->complete_quest_count.totalQuestCount; resultValue = achievementCriteria->complete_quest_count.totalQuestCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
return achievementCriteria->complete_quests_in_zone.questCount; resultValue = achievementCriteria->complete_quests_in_zone.questCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
return achievementCriteria->healing_done.count; resultValue = achievementCriteria->healing_done.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
return achievementCriteria->complete_daily_quest.questCount; resultValue = achievementCriteria->complete_daily_quest.questCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
return achievementCriteria->fall_without_dying.fallHeight; resultValue = achievementCriteria->fall_without_dying.fallHeight;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
return 1; resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
return achievementCriteria->be_spell_target.spellCount; resultValue = achievementCriteria->be_spell_target.spellCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
return achievementCriteria->cast_spell.castCount; resultValue = achievementCriteria->cast_spell.castCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
return 1; resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
return achievementCriteria->own_item.itemCount; resultValue = achievementCriteria->own_item.itemCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
return achievementCriteria->win_rated_arena.count; resultValue = achievementCriteria->win_rated_arena.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
return achievementCriteria->learn_skill_level.skillLevel * 75; resultValue = achievementCriteria->learn_skill_level.skillLevel * 75;
break;
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
return achievementCriteria->use_item.itemCount; resultValue = achievementCriteria->use_item.itemCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
return achievementCriteria->loot_item.itemCount; resultValue = achievementCriteria->loot_item.itemCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
return 1; resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
return achievementCriteria->buy_bank_slot.numberOfSlots; resultValue = achievementCriteria->buy_bank_slot.numberOfSlots;
break;
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
return achievementCriteria->gain_reputation.reputationAmount; resultValue = achievementCriteria->gain_reputation.reputationAmount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
return achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions; resultValue = achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
break;
case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
return achievementCriteria->visit_barber.numberOfVisits; resultValue = achievementCriteria->visit_barber.numberOfVisits;
break;
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
return achievementCriteria->equip_epic_item.count; resultValue = achievementCriteria->equip_epic_item.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
return achievementCriteria->roll_greed_on_loot.count; resultValue = achievementCriteria->roll_greed_on_loot.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
return achievementCriteria->hk_class.count; resultValue = achievementCriteria->hk_class.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
return achievementCriteria->hk_race.count; resultValue = achievementCriteria->hk_race.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
return achievementCriteria->do_emote.count; resultValue = achievementCriteria->do_emote.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
return achievementCriteria->equip_item.count; resultValue = achievementCriteria->equip_item.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
return achievementCriteria->quest_reward_money.goldInCopper; resultValue = achievementCriteria->quest_reward_money.goldInCopper;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
return achievementCriteria->loot_money.goldInCopper; resultValue = achievementCriteria->loot_money.goldInCopper;
break;
case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
return achievementCriteria->use_gameobject.useCount; resultValue = achievementCriteria->use_gameobject.useCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
return achievementCriteria->special_pvp_kill.killCount; resultValue = achievementCriteria->special_pvp_kill.killCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
return achievementCriteria->fish_in_gameobject.lootCount; resultValue = achievementCriteria->fish_in_gameobject.lootCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
return 1; resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
return achievementCriteria->learn_skillline_spell.spellCount; resultValue = achievementCriteria->learn_skillline_spell.spellCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
return achievementCriteria->win_duel.duelCount; resultValue = achievementCriteria->win_duel.duelCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
return achievementCriteria->loot_type.lootTypeCount; resultValue = achievementCriteria->loot_type.lootTypeCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
return achievementCriteria->learn_skill_line.spellCount; resultValue = achievementCriteria->learn_skill_line.spellCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
return achievementCriteria->honorable_kill.killCount; resultValue = achievementCriteria->honorable_kill.killCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
return achievementCriteria->highest_personal_rating.teamrating; resultValue = achievementCriteria->highest_personal_rating.teamrating;
break;
// handle all statistic-only criteria here // handle all statistic-only criteria here
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
@ -1825,10 +1868,14 @@ uint32 AchievementMgr::GetCriteriaProgressMaxCounter(AchievementCriteriaEntry co
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN: case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
return 0; resultValue = 0;
break;
} }
return 0; if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
resultValue = std::numeric_limits<uint32>::max();
return resultValue;
} }
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) const bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) const
@ -1850,13 +1897,9 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
CriteriaProgress const* progress = &itr->second; CriteriaProgress const* progress = &itr->second;
uint32 maxcounter = GetCriteriaProgressMaxCounter(achievementCriteria); uint32 maxcounter = GetCriteriaProgressMaxCounter(achievementCriteria, achievement);
// different counters or non-completable criteria return progress->counter >= maxcounter || (achievement->flags & ACHIEVEMENT_FLAG_REQ_COUNT && progress->counter);
if (!maxcounter)
return false;
return progress->counter >= maxcounter;
} }
void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement) void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement)
@ -1940,10 +1983,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* criteri
{ {
DETAIL_FILTER_LOG(LOG_FILTER_ACHIEVEMENT_UPDATES, "AchievementMgr::SetCriteriaProgress(%u, %u) for (GUID:%u)", criteria->ID, changeValue, m_player->GetGUIDLow()); DETAIL_FILTER_LOG(LOG_FILTER_ACHIEVEMENT_UPDATES, "AchievementMgr::SetCriteriaProgress(%u, %u) for (GUID:%u)", criteria->ID, changeValue, m_player->GetGUIDLow());
uint32 max_value = GetCriteriaProgressMaxCounter(criteria); uint32 max_value = GetCriteriaProgressMaxCounter(criteria, achievement);
if (!max_value)
max_value = std::numeric_limits<uint32>::max();
// change value must be in allowed value range for SET/HIGHEST directly // change value must be in allowed value range for SET/HIGHEST directly
if (changeValue > max_value) if (changeValue > max_value)
@ -2011,10 +2051,6 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* criteri
// update client side value // update client side value
SendCriteriaUpdate(criteria->ID, progress); SendCriteriaUpdate(criteria->ID, progress);
// nothing do for counter case
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
return;
// update dependent achievements state at criteria complete // update dependent achievements state at criteria complete
if (old_value < progress->counter) if (old_value < progress->counter)
{ {

View file

@ -287,7 +287,7 @@ class AchievementMgr
return iter != m_criteriaProgress.end() ? iter->second.counter : 0; return iter != m_criteriaProgress.end() ? iter->second.counter : 0;
} }
static uint32 GetCriteriaProgressMaxCounter(AchievementCriteriaEntry const* entry); static uint32 GetCriteriaProgressMaxCounter(AchievementCriteriaEntry const* entry, AchievementEntry const* achievement);
// Use PROGRESS_SET only for reset/downgrade criteria progress // Use PROGRESS_SET only for reset/downgrade criteria progress
enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST }; enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST };

View file

@ -1243,7 +1243,7 @@ void ChatHandler::ShowAchievementCriteriaListHelper(AchievementCriteriaEntry con
ss << GetMangosString(LANG_COUNTER); ss << GetMangosString(LANG_COUNTER);
else else
{ {
ss << " [" << AchievementMgr::GetCriteriaProgressMaxCounter(criEntry) << "]"; ss << " [" << AchievementMgr::GetCriteriaProgressMaxCounter(criEntry, achEntry) << "]";
if (target && target->GetAchievementMgr().IsCompletedCriteria(criEntry, achEntry)) if (target && target->GetAchievementMgr().IsCompletedCriteria(criEntry, achEntry))
ss << GetMangosString(LANG_COMPLETE); ss << GetMangosString(LANG_COMPLETE);
@ -1323,7 +1323,9 @@ bool ChatHandler::HandleAchievementAddCommand(char* args)
if (mgr.IsCompletedCriteria(*itr, achEntry)) if (mgr.IsCompletedCriteria(*itr, achEntry))
continue; continue;
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(*itr); uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(*itr, achEntry);
if (maxValue == std::numeric_limits<uint32>::max())
maxValue = 1; // Exception for counter like achievements, set them only to 1
mgr.SetCriteriaProgress(*itr, achEntry, maxValue, AchievementMgr::PROGRESS_SET); mgr.SetCriteriaProgress(*itr, achEntry, maxValue, AchievementMgr::PROGRESS_SET);
} }
} }
@ -1398,7 +1400,9 @@ bool ChatHandler::HandleAchievementCriteriaAddCommand(char* args)
LocaleConstant loc = GetSessionDbcLocale(); LocaleConstant loc = GetSessionDbcLocale();
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry); uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry, achEntry);
if (maxValue == std::numeric_limits<uint32>::max())
maxValue = 1; // Exception for counter like achievements, set them only to 1
AchievementMgr& mgr = target->GetAchievementMgr(); AchievementMgr& mgr = target->GetAchievementMgr();
@ -1463,7 +1467,9 @@ bool ChatHandler::HandleAchievementCriteriaRemoveCommand(char* args)
LocaleConstant loc = GetSessionDbcLocale(); LocaleConstant loc = GetSessionDbcLocale();
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry); uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry, achEntry);
if (maxValue == std::numeric_limits<uint32>::max())
maxValue = 1; // Exception for counter like achievements, set them only to 1
AchievementMgr& mgr = target->GetAchievementMgr(); AchievementMgr& mgr = target->GetAchievementMgr();

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "11944" #define REVISION_NR "11945"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__