[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.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
if (criteria->timeLimit)
{
AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
// Add not-completed achievements to time map
if (!IsCompletedCriteria(criteria, achievement))
{
@ -594,7 +594,7 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
}
// check intergiry with max allowed counter value
if (uint32 maxcounter = GetCriteriaProgressMaxCounter(criteria))
if (uint32 maxcounter = GetCriteriaProgressMaxCounter(criteria, achievement))
{
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)
{
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
return achievementCriteria->win_bg.winCount;
resultValue = achievementCriteria->win_bg.winCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
return achievementCriteria->kill_creature.creatureCount;
resultValue = achievementCriteria->kill_creature.creatureCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
return achievementCriteria->reach_level.level;
resultValue = achievementCriteria->reach_level.level;
break;
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:
return 1;
resultValue = 1;
break;
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:
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_HEALING_DONE:
return achievementCriteria->healing_done.count;
resultValue = achievementCriteria->healing_done.count;
break;
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:
return achievementCriteria->fall_without_dying.fallHeight;
resultValue = achievementCriteria->fall_without_dying.fallHeight;
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
return 1;
resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
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_SPELL2:
return achievementCriteria->cast_spell.castCount;
resultValue = achievementCriteria->cast_spell.castCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
return 1;
resultValue = 1;
break;
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
return achievementCriteria->own_item.itemCount;
resultValue = achievementCriteria->own_item.itemCount;
break;
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:
return achievementCriteria->learn_skill_level.skillLevel * 75;
resultValue = achievementCriteria->learn_skill_level.skillLevel * 75;
break;
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
return achievementCriteria->use_item.itemCount;
resultValue = achievementCriteria->use_item.itemCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
return achievementCriteria->loot_item.itemCount;
resultValue = achievementCriteria->loot_item.itemCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
return 1;
resultValue = 1;
break;
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:
return achievementCriteria->gain_reputation.reputationAmount;
resultValue = achievementCriteria->gain_reputation.reputationAmount;
break;
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:
return achievementCriteria->visit_barber.numberOfVisits;
resultValue = achievementCriteria->visit_barber.numberOfVisits;
break;
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_GREED_ON_LOOT:
return achievementCriteria->roll_greed_on_loot.count;
resultValue = achievementCriteria->roll_greed_on_loot.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
return achievementCriteria->hk_class.count;
resultValue = achievementCriteria->hk_class.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
return achievementCriteria->hk_race.count;
resultValue = achievementCriteria->hk_race.count;
break;
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
return achievementCriteria->do_emote.count;
resultValue = achievementCriteria->do_emote.count;
break;
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:
return achievementCriteria->quest_reward_money.goldInCopper;
resultValue = achievementCriteria->quest_reward_money.goldInCopper;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
return achievementCriteria->loot_money.goldInCopper;
resultValue = achievementCriteria->loot_money.goldInCopper;
break;
case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
return achievementCriteria->use_gameobject.useCount;
resultValue = achievementCriteria->use_gameobject.useCount;
break;
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:
return achievementCriteria->fish_in_gameobject.lootCount;
resultValue = achievementCriteria->fish_in_gameobject.lootCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
return 1;
resultValue = 1;
break;
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:
return achievementCriteria->win_duel.duelCount;
resultValue = achievementCriteria->win_duel.duelCount;
break;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
return achievementCriteria->loot_type.lootTypeCount;
resultValue = achievementCriteria->loot_type.lootTypeCount;
break;
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:
return achievementCriteria->honorable_kill.killCount;
resultValue = achievementCriteria->honorable_kill.killCount;
break;
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
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_FLIGHT_PATHS_TAKEN:
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
@ -1850,13 +1897,9 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
CriteriaProgress const* progress = &itr->second;
uint32 maxcounter = GetCriteriaProgressMaxCounter(achievementCriteria);
uint32 maxcounter = GetCriteriaProgressMaxCounter(achievementCriteria, achievement);
// different counters or non-completable criteria
if (!maxcounter)
return false;
return progress->counter >= maxcounter;
return progress->counter >= maxcounter || (achievement->flags & ACHIEVEMENT_FLAG_REQ_COUNT && progress->counter);
}
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());
uint32 max_value = GetCriteriaProgressMaxCounter(criteria);
if (!max_value)
max_value = std::numeric_limits<uint32>::max();
uint32 max_value = GetCriteriaProgressMaxCounter(criteria, achievement);
// change value must be in allowed value range for SET/HIGHEST directly
if (changeValue > max_value)
@ -2011,10 +2051,6 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* criteri
// update client side value
SendCriteriaUpdate(criteria->ID, progress);
// nothing do for counter case
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
return;
// update dependent achievements state at criteria complete
if (old_value < progress->counter)
{

View file

@ -287,7 +287,7 @@ class AchievementMgr
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
enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST };

View file

@ -1243,7 +1243,7 @@ void ChatHandler::ShowAchievementCriteriaListHelper(AchievementCriteriaEntry con
ss << GetMangosString(LANG_COUNTER);
else
{
ss << " [" << AchievementMgr::GetCriteriaProgressMaxCounter(criEntry) << "]";
ss << " [" << AchievementMgr::GetCriteriaProgressMaxCounter(criEntry, achEntry) << "]";
if (target && target->GetAchievementMgr().IsCompletedCriteria(criEntry, achEntry))
ss << GetMangosString(LANG_COMPLETE);
@ -1323,7 +1323,9 @@ bool ChatHandler::HandleAchievementAddCommand(char* args)
if (mgr.IsCompletedCriteria(*itr, achEntry))
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);
}
}
@ -1398,7 +1400,9 @@ bool ChatHandler::HandleAchievementCriteriaAddCommand(char* args)
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();
@ -1463,7 +1467,9 @@ bool ChatHandler::HandleAchievementCriteriaRemoveCommand(char* args)
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();

View file

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