aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp61
-rwxr-xr-xsrc/server/game/Battlegrounds/ArenaTeam.cpp11
-rwxr-xr-xsrc/server/game/DataStores/DBCEnums.h2
-rwxr-xr-xsrc/server/game/DataStores/DBCStructure.h4
4 files changed, 57 insertions, 21 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index fe5467db35f..29f77cfacf1 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1503,11 +1503,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
{
- uint32 reqTeamType = type == ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING ?
- achievementCriteria->highest_team_rating.teamtype :
- achievementCriteria->reach_team_rating.teamtype;
+ uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype;
if (miscValue1)
{
@@ -1519,13 +1516,51 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
else // login case
{
for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
- if (uint32 arena_team_id = GetPlayer()->GetArenaTeamId(arena_slot))
- if (ArenaTeam * at = sArenaTeamMgr->GetArenaTeamById(arena_team_id))
- if (at->GetType() == reqTeamType)
- {
- SetCriteriaProgress(achievementCriteria, at->GetStats().Rating, PROGRESS_HIGHEST);
- break;
- }
+ {
+ uint32 teamId = GetPlayer()->GetArenaTeamId(arena_slot);
+ if (!teamId)
+ continue;
+
+ ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(teamId);
+ if (!team || team->GetType() != reqTeamType)
+ continue;
+
+ SetCriteriaProgress(achievementCriteria, team->GetStats().Rating, PROGRESS_HIGHEST);
+ break;
+ }
+ }
+
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
+ {
+ uint32 reqTeamType = achievementCriteria->highest_personal_rating.teamtype;
+
+ if (miscValue1)
+ {
+ if (miscValue2 != reqTeamType)
+ continue;
+
+ SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
+ }
+ else // login case
+ {
+ for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
+ {
+ uint32 teamId = GetPlayer()->GetArenaTeamId(arena_slot);
+ if (!teamId)
+ continue;
+
+ ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(teamId);
+ if (!team || team->GetType() != reqTeamType)
+ continue;
+
+ if (ArenaTeamMember const* member = team->GetMember(GetPlayer()->GetGUID()))
+ {
+ SetCriteriaProgress(achievementCriteria, member->PersonalRating, PROGRESS_HIGHEST);
+ break;
+ }
+ }
}
break;
@@ -1644,8 +1679,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
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_REACH_TEAM_RATING:
- return progress->counter >= achievementCriteria->reach_team_rating.teamrating;
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
+ return progress->counter >= achievementCriteria->highest_personal_rating.PersonalRating;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index 3eefccac409..15c426ecb60 100755
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -466,8 +466,12 @@ void ArenaTeamMember::ModifyPersonalRating(Player* plr, int32 mod, uint32 slot)
PersonalRating = 0;
else
PersonalRating += mod;
+
if (plr)
+ {
plr->SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, PersonalRating);
+ plr->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, PersonalRating, slot);
+ }
}
void ArenaTeamMember::ModifyMatchmakerRating(int32 mod, uint32 /*slot*/)
@@ -651,10 +655,7 @@ void ArenaTeam::FinishGame(int32 mod)
// Check if rating related achivements are met
for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr)
if (Player* member = ObjectAccessor::FindPlayer(itr->Guid))
- {
member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING, Stats.Rating, Type);
- member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING, Stats.Rating, Type);
- }
}
// Update number of games played per season or week
@@ -744,8 +745,8 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchMakerRating, i
itr->ModifyMatchmakerRating(mod, GetSlot());
// update personal played stats
- itr->WeekGames +=1;
- itr->SeasonGames +=1;
+ itr->WeekGames += 1;
+ itr->SeasonGames += 1;
return;
}
}
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index de5c31e572f..3a1129063b3 100755
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -140,7 +140,7 @@ enum AchievementCriteriaTypes
// TODO: the archievements 1162 and 1163 requires a special rating which can't be found in the dbc
ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37,
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
- ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39,
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42,
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 94edcf467b0..4189217c3fb 100755
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -261,8 +261,8 @@ struct AchievementCriteriaEntry
struct
{
uint32 teamtype; // 3 {2, 3, 5}
- uint32 teamrating; // 4
- } reach_team_rating;
+ uint32 PersonalRating; // 4
+ } highest_personal_rating;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
struct