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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user