aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
diff options
context:
space:
mode:
authorShauren <none@none>2010-08-07 18:31:06 +0200
committerShauren <none@none>2010-08-07 18:31:06 +0200
commitb56cfe03d5f7a325f6cb0671c26b76bd17c29a96 (patch)
tree2cdf45608ab4072df770b06165baf2e6d4dbb305 /src/server/game/Achievements/AchievementMgr.cpp
parent9794e99d8a69e02fd0fa292287d5dbb03e0574ac (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.cpp43
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;
}