aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/AchievementMgr.cpp42
-rw-r--r--src/game/AchievementMgr.h12
-rw-r--r--src/game/BattleGround.cpp10
3 files changed, 57 insertions, 7 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index c2eb744d3f1..2cf8949d4a7 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -78,6 +78,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
switch(criteria->requiredType)
{
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
@@ -90,6 +91,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
switch(dataType)
{
case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE:
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
return true;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE:
if(!creature.id || !objmgr.GetCreatureTemplate(creature.id))
@@ -174,7 +176,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
return false;
}
-bool AchievementCriteriaData::Meets(Player const* source, Unit const* target) const
+bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const
{
switch(dataType)
{
@@ -213,15 +215,17 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target) co
}
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:
return target && target->HasAuraEffect(aura.spell_id,aura.effect_idx);
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
+ return miscvalue1 >= value.minvalue;
}
return false;
}
-bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target) const
+bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, uint32 miscvalue /*= 0*/) const
{
for(Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr)
- if(!itr->Meets(source,target))
+ if(!itr->Meets(source,target,miscvalue))
return false;
return true;
@@ -289,6 +293,11 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
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
break;
}
@@ -924,6 +933,26 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue;
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetItemCount(achievementCriteria->own_item.itemID, true));
break;
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ // miscvalue1 contains the personal rating
+ if (!miscvalue1) // no update at login
+ continue;
+
+ // additional requirements
+ if(achievementCriteria->win_rated_arena.flag==ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
+ {
+ // those requirements couldn't be found in the dbc
+ AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
+ if(!data || !data->Meets(GetPlayer(),unit,miscvalue1))
+ {
+ // reset the progress as we have a win without the requirement.
+ SetCriteriaProgress(achievementCriteria, 0);
+ continue;
+ }
+ }
+
+ SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
+ break;
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
@@ -1189,7 +1218,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
@@ -1295,6 +1323,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
return progress->counter >= 1;
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
return progress->counter >= achievementCriteria->own_item.itemCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ return progress->counter >= achievementCriteria->win_rated_arena.count;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
@@ -1748,6 +1778,10 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
switch(criteria->requiredType)
{
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // need skip generic cases
+ if(criteria->win_rated_arena.flag!=ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
+ continue;
+ break;
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
if(criteria->do_emote.count==0)
continue;
diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h
index ecda3dcdc4d..73729f30998 100644
--- a/src/game/AchievementMgr.h
+++ b/src/game/AchievementMgr.h
@@ -50,9 +50,10 @@ enum AchievementCriteriaDataType
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5, // spell_id effect_idx
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA = 6, // area id 0
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx
+ ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8, // minvalue value provided with achievement update must be not less that limit
};
-#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 8 // maximum value in AchievementCriteriaDataType enum
+#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 9 // maximum value in AchievementCriteriaDataType enum
class Player;
class Unit;
@@ -95,6 +96,11 @@ struct AchievementCriteriaData
{
uint32 id;
} area;
+ // ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE
+ struct
+ {
+ uint32 minvalue;
+ } value;
// ...
struct
{
@@ -116,14 +122,14 @@ struct AchievementCriteriaData
}
bool IsValid(AchievementCriteriaEntry const* criteria);
- bool Meets(Player const* source, Unit const* target) const;
+ bool Meets(Player const* source, Unit const* target, uint32 miscvalue1 = 0) const;
};
struct AchievementCriteriaDataSet
{
typedef std::vector<AchievementCriteriaData> Storage;
void Add(AchievementCriteriaData const& data) { storage.push_back(data); }
- bool Meets(Player const* source, Unit const* target) const;
+ bool Meets(Player const* source, Unit const* target, uint32 miscvalue = 0) const;
private:
Storage storage;
};
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index 034182bdcc9..43c3516722b 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -736,9 +736,19 @@ void BattleGround::EndBattleGround(uint32 winner)
if (isArena() && isRated() && winner_arena_team && loser_arena_team)
{
if (team == winner)
+ {
+ // update achievement BEFORE personal rating update
+ plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, winner_arena_team->GetMember(plr->GetGUID())->personal_rating);
+
winner_arena_team->MemberWon(plr,loser_rating);
+ }
else
+ {
loser_arena_team->MemberLost(plr,winner_rating);
+
+ // Arena lost => reset the win_rated_arena having the "no_loose" condition
+ plr->GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE);
+ }
}
if (team == winner)