diff options
author | Shauren <none@none> | 2010-08-07 18:31:06 +0200 |
---|---|---|
committer | Shauren <none@none> | 2010-08-07 18:31:06 +0200 |
commit | b56cfe03d5f7a325f6cb0671c26b76bd17c29a96 (patch) | |
tree | 2cdf45608ab4072df770b06165baf2e6d4dbb305 /src/server/game/Achievements/AchievementMgr.cpp | |
parent | 9794e99d8a69e02fd0fa292287d5dbb03e0574ac (diff) |
Implemented ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
Added support for "in single battleground" and "without dying" requirement to battleground achievements
Add examples of scripting achievement (School of Hard Knocks, Storm Glory)
--HG--
branch : trunk
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index ec384f9a995..cc8a3b96961 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -96,6 +96,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: break; default: sLog.outErrorDb("Table `achievement_criteria_data` has data for non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType); @@ -405,7 +406,7 @@ void AchievementMgr::Reset() CheckAllAchievementCriteria(); } -void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2) +void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, bool evenIfCriteriaComplete) { if ((sLog.getLogFilter() & LOG_FILTER_ACHIEVEMENT_UPDATES) == 0) sLog.outDetail("AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscvalue1, miscvalue2); @@ -422,26 +423,18 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin if (!achievement) continue; - // don't update already completed criteria - if (IsCompletedCriteria(achievementCriteria,achievement)) + // don't update already completed criteria if not forced or achievement already complete + if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID)) continue; - switch (type) - { - case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: // have total statistic also not expected to be reset - case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: // have total statistic also not expected to be reset - if (achievementCriteria->healing_done.flag == miscvalue1 && - achievementCriteria->healing_done.mapid == miscvalue2) - SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET); - break; - case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // have total statistic also not expected to be reset - // reset only the criteria having the miscvalue1 condition - if (achievementCriteria->win_rated_arena.flag == miscvalue1) - SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET); - break; - default: // reset all cases + for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j) + if (achievementCriteria->additionalRequrements[j].additionalRequirement_type == miscvalue1 && + (!achievementCriteria->additionalRequrements[j].additionalRequirement_value || + achievementCriteria->additionalRequrements[j].additionalRequirement_value == miscvalue2)) + { + SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET); break; - } + } } } @@ -793,7 +786,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId()) continue; - if (achievementCriteria->win_bg.additionalRequirement1_type) + if (achievementCriteria->additionalRequrements[0].additionalRequirement_type) { // those requirements couldn't be found in the dbc AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria); @@ -1469,6 +1462,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE); break; } + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + if (!miscvalue1 || miscvalue1 != achievementCriteria->bg_objective.objectiveId) + continue; + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; // std case: not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: @@ -1479,7 +1477,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; // FIXME: not triggered in code as result, need to implement case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: - case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA: @@ -1582,6 +1579,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: return progress->counter >= achievementCriteria->cast_spell.castCount; + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + return progress->counter >= achievementCriteria->bg_objective.completeCount; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: return progress->counter >= 1; case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: @@ -2165,7 +2164,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() switch(criteria->requiredType) { case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: - if (!criteria->win_bg.additionalRequirement1_type) + if (!criteria->additionalRequrements[0].additionalRequirement_type) continue; break; case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: @@ -2222,6 +2221,8 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (criteria->loot_type.lootTypeCount != 1) continue; break; + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + break; // any cases default: // type not use DB data, ignore continue; } |