diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Achievements/AchievementMgr.cpp | 61 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/ArenaTeam.cpp | 11 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCEnums.h | 2 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 4 |
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 |