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;
|
break;
|
||||||
}
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
|
||||||
{
|
{
|
||||||
uint32 reqTeamType = type == ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING ?
|
uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype;
|
||||||
achievementCriteria->highest_team_rating.teamtype :
|
|
||||||
achievementCriteria->reach_team_rating.teamtype;
|
|
||||||
|
|
||||||
if (miscValue1)
|
if (miscValue1)
|
||||||
{
|
{
|
||||||
@@ -1519,13 +1516,51 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
else // login case
|
else // login case
|
||||||
{
|
{
|
||||||
for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
|
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))
|
uint32 teamId = GetPlayer()->GetArenaTeamId(arena_slot);
|
||||||
if (at->GetType() == reqTeamType)
|
if (!teamId)
|
||||||
{
|
continue;
|
||||||
SetCriteriaProgress(achievementCriteria, at->GetStats().Rating, PROGRESS_HIGHEST);
|
|
||||||
break;
|
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;
|
break;
|
||||||
@@ -1644,8 +1679,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
|||||||
return progress->counter >= achievementCriteria->own_item.itemCount;
|
return progress->counter >= achievementCriteria->own_item.itemCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||||
return progress->counter >= achievementCriteria->win_rated_arena.count;
|
return progress->counter >= achievementCriteria->win_rated_arena.count;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
|
||||||
return progress->counter >= achievementCriteria->reach_team_rating.teamrating;
|
return progress->counter >= achievementCriteria->highest_personal_rating.PersonalRating;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||||
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||||
|
|||||||
@@ -466,8 +466,12 @@ void ArenaTeamMember::ModifyPersonalRating(Player* plr, int32 mod, uint32 slot)
|
|||||||
PersonalRating = 0;
|
PersonalRating = 0;
|
||||||
else
|
else
|
||||||
PersonalRating += mod;
|
PersonalRating += mod;
|
||||||
|
|
||||||
if (plr)
|
if (plr)
|
||||||
|
{
|
||||||
plr->SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, PersonalRating);
|
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*/)
|
void ArenaTeamMember::ModifyMatchmakerRating(int32 mod, uint32 /*slot*/)
|
||||||
@@ -651,10 +655,7 @@ void ArenaTeam::FinishGame(int32 mod)
|
|||||||
// Check if rating related achivements are met
|
// Check if rating related achivements are met
|
||||||
for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr)
|
for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr)
|
||||||
if (Player* member = ObjectAccessor::FindPlayer(itr->Guid))
|
if (Player* member = ObjectAccessor::FindPlayer(itr->Guid))
|
||||||
{
|
|
||||||
member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING, Stats.Rating, Type);
|
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
|
// 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());
|
itr->ModifyMatchmakerRating(mod, GetSlot());
|
||||||
|
|
||||||
// update personal played stats
|
// update personal played stats
|
||||||
itr->WeekGames +=1;
|
itr->WeekGames += 1;
|
||||||
itr->SeasonGames +=1;
|
itr->SeasonGames += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ enum AchievementCriteriaTypes
|
|||||||
// TODO: the archievements 1162 and 1163 requires a special rating which can't be found in the dbc
|
// 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_WIN_RATED_ARENA = 37,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
|
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_LEARN_SKILL_LEVEL = 40,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
|
ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
|
||||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42,
|
ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42,
|
||||||
|
|||||||
@@ -261,8 +261,8 @@ struct AchievementCriteriaEntry
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint32 teamtype; // 3 {2, 3, 5}
|
uint32 teamtype; // 3 {2, 3, 5}
|
||||||
uint32 teamrating; // 4
|
uint32 PersonalRating; // 4
|
||||||
} reach_team_rating;
|
} highest_personal_rating;
|
||||||
|
|
||||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
||||||
struct
|
struct
|
||||||
|
|||||||
Reference in New Issue
Block a user