aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp59
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h7
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp14
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/worldserver/worldserver.conf.dist5
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