Core/Achievements: Achievement criteria type 39 should check player's personal rating, not team rating
Closes #803
This commit is contained in:
@@ -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,17 +1516,55 @@ 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);
|
||||
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;
|
||||
}
|
||||
// std case: not exist in DBC, not triggered in code as result
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user