Core/Arena: Fixes the Config option for the start rating of personal rating.

Add a Config option for the start rating of matchmaker rating.
Personal rating now resets when joining a new team.
Fixes the strange behaviour Personal rating gain/loss can have opposing to team rating,
by using a better way of calculating the personal rating gain.
Fixes issue #3871
Fixes issue #3847
Fixes issue #3843
Fixes issue #3839

--HG--
branch : trunk
This commit is contained in:
Liberate
2010-09-10 23:08:49 +02:00
parent 320929ff40
commit 50a90522f9
6 changed files with 49 additions and 40 deletions
+27 -28
View File
@@ -147,18 +147,24 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
}
}
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT personal_rating, matchmaker_rating FROM character_arena_stats WHERE guid='%u' AND slot='%u'", GUID_LOPART(PlayerGuid), GetSlot());
if (!result)
{
plMMRating = sWorld.getIntConfig(CONFIG_ARENA_START_MATCHMAKER_RATING);
plPRating = 0;
plMMRating = 1500;
}
if (sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING) > 0)
plPRating = sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING);
else
{
plPRating = (*result)[0].GetUInt32();
plMMRating = (*result)[1].GetUInt32();
if (sWorld.getIntConfig(CONFIG_ARENA_SEASON_ID) < 6)
plPRating = 1500;
else
if (GetRating() >= 1000)
plPRating = 1000;
}
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT matchmaker_rating FROM character_arena_stats WHERE guid='%u' AND slot='%u'", GUID_LOPART(PlayerGuid), GetSlot());
if (result)
plMMRating = (*result)[0].GetUInt32();
// remove all player signs from another petitions
// this will be prevent attempt joining player to many arenateams and corrupt arena team data integrity
Player::RemovePetitionsAndSigns(PlayerGuid, GetType());
@@ -174,17 +180,6 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
newmember.personal_rating = plPRating;
newmember.matchmaker_rating = plMMRating;
/* if (sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING) > 0)
newmember.personal_rating = sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING);
else
{
if (sWorld.getIntConfig(CONFIG_ARENA_SEASON_ID) < 6)
newmember.personal_rating = 1500;
else
if (GetRating() >= 1000)
newmember.personal_rating = 1000;
}*/
m_members.push_back(newmember);
CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid) VALUES ('%u', '%u')", m_TeamId, GUID_LOPART(newmember.guid));
@@ -663,10 +658,14 @@ int32 ArenaTeam::GetRatingMod(uint32 own_rating, uint32 enemy_rating, bool won,
else
mod = 24.0f * (won_mod - chance);
if (won)
return (int32)ceil(mod);
else
return (int32)floor(mod);
}
int32 ArenaTeam::GetPersonalRatingMod(int32 base_rating, uint32 own_rating, uint32 enemy_rating)
{
float chance = GetChanceAgainst(own_rating, enemy_rating);
chance *= 2.0f;
return (int32)ceil(float(base_rating) * chance);
}
void ArenaTeam::FinishGame(int32 mod)
@@ -714,7 +713,7 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating)
return mod;
}
void ArenaTeam::MemberLost(Player * plr, uint32 againstMatchmakerRating)
void ArenaTeam::MemberLost(Player * plr, uint32 againstMatchmakerRating, int32 teamratingchange)
{
// called for each participant of a match after losing
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -722,7 +721,7 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstMatchmakerRating)
if (itr->guid == plr->GetGUID())
{
// update personal rating
int32 mod = GetRatingMod(itr->personal_rating, m_stats.rating, false);
int32 mod = GetPersonalRatingMod(teamratingchange, itr->personal_rating, (m_stats.rating - teamratingchange));
itr->ModifyPersonalRating(plr, mod, GetSlot());
// update matchmaker rating
@@ -740,7 +739,7 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstMatchmakerRating)
}
}
void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating)
void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating, int32 teamratingchange)
{
// called for offline player after ending rated arena match!
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -748,7 +747,7 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating)
if (itr->guid == guid)
{
// update personal rating
int32 mod = GetRatingMod(itr->personal_rating, m_stats.rating, false);
int32 mod = GetPersonalRatingMod(teamratingchange, itr->personal_rating, (m_stats.rating - teamratingchange));
itr->ModifyPersonalRating(NULL, mod, GetSlot());
// update matchmaker rating
@@ -763,7 +762,7 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating)
}
}
void ArenaTeam::MemberWon(Player * plr, uint32 againstMatchmakerRating)
void ArenaTeam::MemberWon(Player * plr, uint32 againstMatchmakerRating, int32 teamratingchange)
{
// called for each participant after winning a match
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -771,8 +770,8 @@ void ArenaTeam::MemberWon(Player * plr, uint32 againstMatchmakerRating)
if (itr->guid == plr->GetGUID())
{
// update personal rating
int32 mod = GetRatingMod(itr->personal_rating, m_stats.rating, true);
itr->ModifyPersonalRating(NULL, mod, GetSlot());
int32 mod = GetPersonalRatingMod(teamratingchange, (m_stats.rating - teamratingchange), itr->personal_rating);
itr->ModifyPersonalRating(plr, mod, GetSlot());
// update matchmaker rating
mod = GetRatingMod(itr->matchmaker_rating, againstMatchmakerRating, true, true);
+4 -3
View File
@@ -198,12 +198,13 @@ class ArenaTeam
uint32 GetPoints(uint32 MemberRating);
int32 GetRatingMod(uint32 own_rating, uint32 enemy_rating, bool won, bool calculating_mmr = false);
int32 GetPersonalRatingMod(int32 base_rating, uint32 own_rating, uint32 enemy_rating);
float GetChanceAgainst(uint32 own_rating, uint32 enemy_rating);
int32 WonAgainst(uint32 againstRating);
void MemberWon(Player * plr, uint32 againstMatchmakerRating);
void MemberWon(Player * plr, uint32 againstMatchmakerRating, int32 teamratingchange = 12);
int32 LostAgainst(uint32 againstRating);
void MemberLost(Player * plr, uint32 againstMatchmakerRating);
void OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating);
void MemberLost(Player * plr, uint32 againstMatchmakerRating, int32 teamratingchange = 12);
void OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating, int32 teamratingchange = 12);
void UpdateArenaPointsHelper(std::map<uint32, uint32> & PlayerPoints);
@@ -689,8 +689,10 @@ void Battleground::EndBattleground(uint32 winner)
ArenaTeam * loser_arena_team = NULL;
uint32 loser_team_rating = 0;
uint32 loser_matchmaker_rating = 0;
int32 loser_change = 0;
uint32 winner_team_rating = 0;
uint32 winner_matchmaker_rating = 0;
int32 winner_change = 0;
WorldPacket data;
int32 winmsg_id = 0;
@@ -730,8 +732,8 @@ void Battleground::EndBattleground(uint32 winner)
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_change = winner_arena_team->WonAgainst(loser_matchmaker_rating);
loser_change = loser_arena_team->LostAgainst(winner_matchmaker_rating);
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);
@@ -761,9 +763,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_matchmaker_rating);
winner_arena_team->OfflineMemberLost(itr->first, loser_matchmaker_rating, winner_change);
else
loser_arena_team->OfflineMemberLost(itr->first, winner_matchmaker_rating);
loser_arena_team->OfflineMemberLost(itr->first, winner_matchmaker_rating, loser_change);
}
continue;
}
@@ -803,11 +805,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_matchmaker_rating);
winner_arena_team->MemberWon(plr,loser_matchmaker_rating, winner_change);
}
else
{
loser_arena_team->MemberLost(plr, winner_matchmaker_rating);
loser_arena_team->MemberLost(plr, winner_matchmaker_rating, loser_change);
// 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);
+2 -1
View File
@@ -1043,7 +1043,8 @@ void World::LoadConfigSettings(bool reload)
m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = sConfig.GetBoolDefault("Arena.QueueAnnouncer.PlayerOnly", false);
m_int_configs[CONFIG_ARENA_SEASON_ID] = sConfig.GetIntDefault ("Arena.ArenaSeason.ID", 1);
m_int_configs[CONFIG_ARENA_START_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartRating", 0);
m_int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartPersonalRating", 0);
m_int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartPersonalRating", 1000);
m_int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartMatchmakerRating", 1500);
m_bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfig.GetBoolDefault("Arena.ArenaSeason.InProgress", true);
m_bool_configs[CONFIG_ARENA_LOG_EXTENDED_INFO] = sConfig.GetBoolDefault("ArenaLog.ExtendedInfo", false);
+1
View File
@@ -284,6 +284,7 @@ enum WorldIntConfigs
CONFIG_ARENA_SEASON_ID,
CONFIG_ARENA_START_RATING,
CONFIG_ARENA_START_PERSONAL_RATING,
CONFIG_ARENA_START_MATCHMAKER_RATING,
CONFIG_MAX_WHO,
CONFIG_HONOR_AFTER_DUEL,
CONFIG_PVP_TOKEN_MAP_TYPE,
@@ -1839,6 +1839,10 @@ Battleground.Random.ResetHour = 6
# Start personal rating on entry in team
# Default: 0
#
# Arena.StartMatchmakerRating
# Start matchmaker rating for players
# Default: 1500
#
###############################################################################
Arena.MaxRatingDifference = 150
@@ -1851,6 +1855,7 @@ Arena.ArenaSeason.ID = 1
Arena.ArenaSeason.InProgress = 1
Arena.ArenaStartRating = 0
Arena.ArenaStartPersonalRating = 0
Arena.ArenaStartMatchmakerRating = 1500
###############################################################################
# NETWORK CONFIG