diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.h | 7 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 14 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 3 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 5 |
6 files changed, 49 insertions, 40 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 605966e8e81..5c8ba2b3b3a 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -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) - { - plPRating = 0; - plMMRating = 1500; - } + plMMRating = sWorld.getIntConfig(CONFIG_ARENA_START_MATCHMAKER_RATING); + plPRating = 0; + + 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); + return (int32)ceil(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); diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index be9ddb597ba..5dac5bf6e25 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -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); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index fbb5ff01c5a..3e0ccbeb35d 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -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); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index aa9d24aaeae..e2993508b93 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -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); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index b3272e096c8..f43158075a8 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -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, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 4b6e435db4a..5ca4bf7a53e 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -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 |