Updates the arena rating system to use Matchmaker Rating.
The arena_team_stats sql in this commit sets all ratings to 0. You start with 0 Team Rating and 1500 Matchmaker Rating. Personal rating is moved to character_arena_stats, and will not reset when disbanding an arena team. This new system is based on all the info I could get, but Blizzard didn't leak much info about the new system. At least this system is really close to the official system. Any issues found should be reported in an issue. Huge thanks go to Aokromes for the intensive testing he has done with me. Also thanks to Parzival for hearing me out and giving his ideas. Fixes issue #3189 --HG-- branch : trunk
This commit is contained in:
@@ -687,8 +687,10 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
|
||||
ArenaTeam * winner_arena_team = NULL;
|
||||
ArenaTeam * loser_arena_team = NULL;
|
||||
uint32 loser_rating = 0;
|
||||
uint32 winner_rating = 0;
|
||||
uint32 loser_team_rating = 0;
|
||||
uint32 loser_matchmaker_rating = 0;
|
||||
uint32 winner_team_rating = 0;
|
||||
uint32 winner_matchmaker_rating = 0;
|
||||
WorldPacket data;
|
||||
int32 winmsg_id = 0;
|
||||
|
||||
@@ -724,13 +726,18 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
loser_arena_team = sObjectMgr.GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(winner)));
|
||||
if (winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team)
|
||||
{
|
||||
loser_rating = loser_arena_team->GetStats().rating;
|
||||
winner_rating = winner_arena_team->GetStats().rating;
|
||||
int32 winner_change = winner_arena_team->WonAgainst(loser_rating);
|
||||
int32 loser_change = loser_arena_team->LostAgainst(winner_rating);
|
||||
sLog.outDebug("--- Winner rating: %u, Loser rating: %u, Winner change: %u, Losser change: %u ---", winner_rating, loser_rating, winner_change, loser_change);
|
||||
loser_team_rating = loser_arena_team->GetRating();
|
||||
loser_matchmaker_rating = loser_arena_team->GetAverageMMR(GetBgRaid(GetOtherTeam(winner)));
|
||||
winner_team_rating = winner_arena_team->GetRating();
|
||||
winner_matchmaker_rating = winner_arena_team->GetAverageMMR(GetBgRaid(winner));
|
||||
int32 winner_change = winner_arena_team->WonAgainst(loser_matchmaker_rating);
|
||||
int32 loser_change = loser_arena_team->LostAgainst(winner_matchmaker_rating, winner_team_rating < 1500);
|
||||
sLog.outDebug("--- Winner rating: %u, Loser rating: %u, Winner MMR: %u, Loser MMR: %u, Winner change: %u, Losser change: %u ---", winner_team_rating, loser_team_rating,
|
||||
winner_matchmaker_rating, loser_matchmaker_rating, winner_change, loser_change);
|
||||
SetArenaTeamRatingChangeForTeam(winner, winner_change);
|
||||
SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loser_change);
|
||||
SetArenaMatchmakerRating(winner, winner_matchmaker_rating);
|
||||
SetArenaMatchmakerRating(GetOtherTeam(winner), loser_matchmaker_rating);
|
||||
sLog.outArena("Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. RatingChange: %i.", m_ArenaType, m_ArenaTeamIds[BG_TEAM_ALLIANCE], m_ArenaTeamIds[BG_TEAM_HORDE], winner_arena_team->GetId(), winner_change);
|
||||
}
|
||||
else
|
||||
@@ -750,9 +757,9 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
if (isArena() && isRated() && winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team)
|
||||
{
|
||||
if (team == winner)
|
||||
winner_arena_team->OfflineMemberLost(itr->first, loser_rating);
|
||||
winner_arena_team->OfflineMemberLost(itr->first, loser_matchmaker_rating);
|
||||
else
|
||||
loser_arena_team->OfflineMemberLost(itr->first, winner_rating);
|
||||
loser_arena_team->OfflineMemberLost(itr->first, winner_matchmaker_rating);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -792,11 +799,11 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
if (member)
|
||||
plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, member->personal_rating);
|
||||
|
||||
winner_arena_team->MemberWon(plr,loser_rating);
|
||||
winner_arena_team->MemberWon(plr,loser_matchmaker_rating);
|
||||
}
|
||||
else
|
||||
{
|
||||
loser_arena_team->MemberLost(plr,winner_rating);
|
||||
loser_arena_team->MemberLost(plr, winner_matchmaker_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);
|
||||
@@ -949,7 +956,7 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
|
||||
ArenaTeam * winner_arena_team = sObjectMgr.GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team)));
|
||||
ArenaTeam * loser_arena_team = sObjectMgr.GetArenaTeamById(GetArenaTeamIdForTeam(team));
|
||||
if (winner_arena_team && loser_arena_team && winner_arena_team != loser_arena_team)
|
||||
loser_arena_team->MemberLost(plr,winner_arena_team->GetRating());
|
||||
loser_arena_team->MemberLost(plr, winner_arena_team->GetAverageMMR(GetBgRaid(team)));
|
||||
}
|
||||
}
|
||||
if (SendPacket)
|
||||
@@ -971,7 +978,7 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
|
||||
ArenaTeam * others_arena_team = sObjectMgr.GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team)));
|
||||
ArenaTeam * players_arena_team = sObjectMgr.GetArenaTeamById(GetArenaTeamIdForTeam(team));
|
||||
if (others_arena_team && players_arena_team)
|
||||
players_arena_team->OfflineMemberLost(guid, others_arena_team->GetRating());
|
||||
players_arena_team->OfflineMemberLost(guid, others_arena_team->GetAverageMMR(GetBgRaid(GetOtherTeam(team))));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user