mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
[11945] Fix a bunch of counter achievements. Some still require more work
Signed-off-by: Schmoozerd <schmoozerd@scriptdev2.com>
This commit is contained in:
parent
f09fa8d245
commit
43dd16ff60
4 changed files with 136 additions and 94 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "11944"
|
||||
#define REVISION_NR "11945"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue