aboutsummaryrefslogtreecommitdiff
path: root/src/game/AchievementMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/AchievementMgr.cpp')
-rw-r--r--src/game/AchievementMgr.cpp76
1 files changed, 66 insertions, 10 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index fdaa5dd82a8..e9c493f088b 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -36,6 +36,8 @@
#include "SpellMgr.h"
#include "MapManager.h"
+#include "BattleGround.h"
+#include "BattleGroundAB.h"
INSTANTIATE_SINGLETON_1(AchievementGlobalMgr);
@@ -81,6 +83,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
switch(criteria->requiredType)
{
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
@@ -233,6 +236,8 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
return false;
}
return true;
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE:
+ return true; // not check correctness node indexes
default:
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType);
return false;
@@ -301,6 +306,13 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= drunk.state;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
return IsHolidayActive(HolidayIds(holiday.id));
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE:
+ {
+ BattleGround* bg = source->GetBattleGround();
+ if(!bg)
+ return false;
+ return bg->IsTeamScoreInRange(source->GetTeam()==ALLIANCE ? HORDE : ALLIANCE,bg_loss_team_score.min_score,bg_loss_team_score.max_score);
+ }
}
return false;
}
@@ -720,6 +732,54 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
// specialized cases
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ {
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if (!miscvalue1)
+ continue;
+ if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
+ continue;
+
+ if (achievementCriteria->win_bg.additionalRequirement1_type)
+ {
+ // those requirements couldn't be found in the dbc
+ AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
+ if (!data || !data->Meets(GetPlayer(),unit))
+ continue;
+ }
+ // some hardcoded requirements
+ else
+ {
+ BattleGround* bg = GetPlayer()->GetBattleGround();
+ if (!bg)
+ continue;
+
+ switch(achievementCriteria->referredAchievement)
+ {
+ case 161: // AB, Overcome a 500 resource disadvantage
+ {
+ if (bg->GetTypeID() != BATTLEGROUND_AB)
+ continue;
+ if(!((BattleGroundAB*)bg)->IsTeamScores500disadvantage(GetPlayer()->GetTeam()))
+ continue;
+ break;
+ }
+ case 156: // AB, win while controlling all 5 flags (all nodes)
+ case 784: // EY, win while holding 4 bases (all nodes)
+ {
+ if(!bg->IsAllNodesConrolledByTeam(GetPlayer()->GetTeam()))
+ continue;
+ break;
+ }
+ case 1762: // SA, win without losing any siege vehicles
+ case 2192: // SA, win without losing any siege vehicles
+ continue; // not implemented
+ }
+ }
+
+ SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE);
+ break;
+ }
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
{
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
@@ -790,14 +850,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue;
SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE);
break;
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(GetPlayer()->GetMapId() != achievementCriteria->win_bg.bgMapID)
- continue;
- SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
@@ -1347,6 +1399,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
switch(achievementCriteria->requiredType)
{
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ return progress->counter >= achievementCriteria->win_bg.winCount;
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
@@ -1438,8 +1492,6 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
return progress->counter >= achievementCriteria->learn_skill_line.spellCount;
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
return progress->counter >= achievementCriteria->honorable_kill.killCount;
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
- return progress->counter >= achievementCriteria->win_bg.winCount;
// handle all statistic-only criteria here
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
@@ -1853,6 +1905,10 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
switch(criteria->requiredType)
{
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ if(!criteria->win_bg.additionalRequirement1_type)
+ continue;
+ break;
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
break; // any cases
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: