aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp154
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h11
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp33
-rw-r--r--src/server/game/Battlegrounds/Battleground.h3
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp11
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h2
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp24
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h4
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h24
-rw-r--r--src/server/game/Entities/Player/Player.cpp49
-rw-r--r--src/server/game/Entities/Player/Player.h20
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp2
-rw-r--r--src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp34
-rw-r--r--src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp3
14 files changed, 246 insertions, 128 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index e2b2be9390c..0a4a5b7c11c 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -32,6 +32,14 @@ void ArenaTeamMember::ModifyPersonalRating(Player* plr, int32 mod, uint32 slot)
plr->SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, personal_rating);
}
+void ArenaTeamMember::ModifyMatchmakerRating(int32 mod, uint32 slot)
+{
+ if (int32(matchmaker_rating) + mod < 0)
+ matchmaker_rating = 0;
+ else
+ matchmaker_rating += mod;
+}
+
ArenaTeam::ArenaTeam()
{
m_TeamId = 0;
@@ -102,6 +110,8 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
{
std::string plName;
uint8 plClass;
+ uint32 plPRating;
+ uint32 plMMRating;
// arena team is full (can't have more than type * 2 players!)
if (GetMembersSize() >= GetType() * 2)
@@ -137,6 +147,18 @@ 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;
+ }
+ else
+ {
+ plPRating = (*result)[0].GetUInt32();
+ plMMRating = (*result)[1].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());
@@ -149,9 +171,10 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
newmember.games_week = 0;
newmember.wins_season = 0;
newmember.wins_week = 0;
- newmember.personal_rating = 0;
+ newmember.personal_rating = plPRating;
+ newmember.matchmaker_rating = plMMRating;
- if (sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING) > 0)
+/* if (sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING) > 0)
newmember.personal_rating = sWorld.getIntConfig(CONFIG_ARENA_START_PERSONAL_RATING);
else
{
@@ -160,17 +183,16 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
else
if (GetRating() >= 1000)
newmember.personal_rating = 1000;
- }
+ }*/
m_members.push_back(newmember);
- CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid, personal_rating) VALUES ('%u', '%u', '%u')", m_TeamId, GUID_LOPART(newmember.guid), newmember.personal_rating);
+ CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid) VALUES ('%u', '%u')", m_TeamId, GUID_LOPART(newmember.guid));
if (pl)
{
pl->SetInArenaTeam(m_TeamId, GetSlot(), GetType());
pl->SetArenaTeamIdInvited(0);
- pl->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_PERSONAL_RATING, newmember.personal_rating);
// hide promote/remove buttons
if (m_CaptainGuid != PlayerGuid)
@@ -233,15 +255,30 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult_AutoPtr arenaTeamMembersResult)
//we loaded all members for this arena_team already, break cycle
break;
+ uint32 player_guid = fields[1].GetUInt32();
+
+ QueryResult_AutoPtr result = CharacterDatabase.PQuery(
+ "SELECT personal_rating, matchmaker_rating FROM character_arena_stats WHERE guid = '%u' AND slot = '%u'", player_guid, GetSlot());
+
+ uint32 personalrating = 0;
+ uint32 matchmakerrating = 1500;
+
+ if (result)
+ {
+ personalrating = (*result)[0].GetUInt32();
+ matchmakerrating = (*result)[1].GetUInt32();
+ }
+
ArenaTeamMember newmember;
- newmember.guid = MAKE_NEW_GUID(fields[1].GetUInt32(), 0, HIGHGUID_PLAYER);
- newmember.games_week = fields[2].GetUInt32();
- newmember.wins_week = fields[3].GetUInt32();
- newmember.games_season = fields[4].GetUInt32();
- newmember.wins_season = fields[5].GetUInt32();
- newmember.personal_rating = fields[6].GetUInt32();
- newmember.name = fields[7].GetCppString();
- newmember.Class = fields[8].GetUInt8();
+ newmember.guid = MAKE_NEW_GUID(player_guid, 0, HIGHGUID_PLAYER);
+ newmember.games_week = fields[2].GetUInt32();
+ newmember.wins_week = fields[3].GetUInt32();
+ newmember.games_season = fields[4].GetUInt32();
+ newmember.wins_season = fields[5].GetUInt32();
+ newmember.name = fields[6].GetCppString();
+ newmember.Class = fields[7].GetUInt8();
+ newmember.personal_rating = personalrating;
+ newmember.matchmaker_rating = matchmakerrating;
//check if member exists in characters table
if (newmember.name.empty())
@@ -563,6 +600,22 @@ uint32 ArenaTeam::GetPoints(uint32 MemberRating)
return (uint32) points;
}
+uint32 ArenaTeam::GetAverageMMR(Group *group) const
+{
+ if (!group) //should never happen
+ return 0;
+ uint32 matchmakerrating = 0;
+ for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
+ {
+ if (group->IsMember(itr->guid))
+ matchmakerrating += itr->matchmaker_rating;
+ }
+
+ matchmakerrating /= GetType();
+
+ return matchmakerrating;
+}
+
float ArenaTeam::GetChanceAgainst(uint32 own_rating, uint32 enemy_rating)
{
// returns the chance to win against a team with the given rating, used in the rating adjustment calculation
@@ -598,9 +651,13 @@ int32 ArenaTeam::WonAgainst(uint32 againstRating)
// called when the team has won
// 'chance' calculation - to beat the opponent
float chance = GetChanceAgainst(m_stats.rating, againstRating);
- float K = (m_stats.rating < 1000) ? 48.0f : 32.0f;
- // calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
- int32 mod = (int32)floor(K* (1.0f - chance));
+ // calculate the rating modification
+ // simulation on how it works. Not much info on how it really works
+ int32 mod;
+ if (m_stats.rating < 1500)
+ mod = (int32)ceil(48.0f * (1.0f - chance) * (1.0f - chance));
+ else
+ mod = (int32)ceil(24.0f * (1.0f - chance));
// modify the team stats accordingly
FinishGame(mod);
@@ -611,7 +668,7 @@ int32 ArenaTeam::WonAgainst(uint32 againstRating)
return mod;
}
-int32 ArenaTeam::LostAgainst(uint32 againstRating)
+int32 ArenaTeam::LostAgainst(uint32 againstRating, bool winnerlowrating)
{
// called when the team has lost
//'chance' calculation - to loose to the opponent
@@ -621,9 +678,14 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating)
FinishGame(0);
return 0;
}
+ // calculate the rating lost
+ // there is not much info on the formula, but this is a very good simulation
+ int32 mod;
+ if (winnerlowrating)
+ mod = (int32)floor(48.0f * chance * chance) * -1;
+ else
+ mod = (int32)floor(24.0f * (0.0f - chance));
- float K = 32.0f;
- int32 mod = (int32)ceil(K * (0.0f - chance));
// modify the team stats accordingly
FinishGame(mod);
@@ -631,7 +693,7 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating)
return mod;
}
-void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
+void ArenaTeam::MemberLost(Player * plr, uint32 againstMatchmakerRating)
{
// called for each participant of a match after losing
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -639,11 +701,15 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
if (itr->guid == plr->GetGUID())
{
// update personal rating
- float chance = GetChanceAgainst(itr->personal_rating, againstRating);
- float K = (itr->personal_rating < 1000) ? 48.0f : 32.0f;
- // calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
- int32 mod = (int32)ceil(K * (0.0f - chance));
+ float chance = GetChanceAgainst(itr->personal_rating, m_stats.rating);
+ // calculate the rating modification
+ int32 mod = (int32)floor(24.0f * (0.0f - chance));
itr->ModifyPersonalRating(plr, mod, GetSlot());
+ // update matchmaker rating
+ chance = GetChanceAgainst(itr->matchmaker_rating, againstMatchmakerRating);
+ // calculate the rating modification
+ mod = (int32)floor(24.0f * (0.0f - chance));
+ itr->ModifyMatchmakerRating(mod, GetSlot());
// update personal played stats
itr->games_week +=1;
itr->games_season +=1;
@@ -655,7 +721,7 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
}
}
-void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
+void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating)
{
// called for offline player after ending rated arena match!
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -663,14 +729,15 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
if (itr->guid == guid)
{
// update personal rating
- float chance = GetChanceAgainst(itr->personal_rating, againstRating);
- float K = (itr->personal_rating < 1000) ? 48.0f : 32.0f;
- // calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
- int32 mod = (int32)ceil(K * (0.0f - chance));
- if (int32(itr->personal_rating) + mod < 0)
- itr->personal_rating = 0;
- else
- itr->personal_rating += mod;
+ float chance = GetChanceAgainst(itr->personal_rating, m_stats.rating);
+ // calculate the rating modification
+ int32 mod = (int32)ceil(24.0f * (0.0f - chance));
+ itr->ModifyPersonalRating(NULL, mod, GetSlot());
+ // update matchmaker rating
+ chance = GetChanceAgainst(itr->matchmaker_rating, againstMatchmakerRating);
+ // calculate the rating modification
+ mod = (int32)ceil(24.0f * (0.0f - chance));
+ itr->ModifyMatchmakerRating(mod, GetSlot());
// update personal played stats
itr->games_week +=1;
itr->games_season +=1;
@@ -679,19 +746,25 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
}
}
-void ArenaTeam::MemberWon(Player * plr, uint32 againstRating)
+void ArenaTeam::MemberWon(Player * plr, uint32 againstMatchmakerRating)
{
// called for each participant after winning a match
for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
if (itr->guid == plr->GetGUID())
{
+ uint32 matchmakerrating = itr->matchmaker_rating;
// update personal rating
- float chance = GetChanceAgainst(itr->personal_rating, againstRating);
- float K = (itr->personal_rating < 1000) ? 48.0f : 32.0f;
- // calculate the rating modification (ELO system with k=32 or k=48 if rating<1000)
- int32 mod = (int32)floor(K* (1.0f - chance));
+ float chance = GetChanceAgainst(itr->personal_rating, m_stats.rating);
+ // calculate the rating modification
+ int32 mod = (int32)ceil(24.0f * (1.0f - chance));
itr->ModifyPersonalRating(plr, mod, GetSlot());
+ // update matchmaker rating
+ chance = GetChanceAgainst(matchmakerrating, againstMatchmakerRating);
+ // calculate the rating modification
+ mod = (int32)ceil(24.0f * (1.0f - chance));
+ itr->ModifyMatchmakerRating(mod, GetSlot());
+
// update personal stats
itr->games_week +=1;
itr->games_season +=1;
@@ -741,7 +814,10 @@ void ArenaTeam::SaveToDB()
SQLTransaction trans = CharacterDatabase.BeginTransaction();
trans->PAppend("UPDATE arena_team_stats SET rating = '%u',games = '%u',played = '%u',rank = '%u',wins = '%u',wins2 = '%u' WHERE arenateamid = '%u'", m_stats.rating, m_stats.games_week, m_stats.games_season, m_stats.rank, m_stats.wins_week, m_stats.wins_season, GetId());
for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- trans->PAppend("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, itr->personal_rating, m_TeamId, GUID_LOPART(itr->guid));
+ {
+ trans->PAppend("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, m_TeamId, GUID_LOPART(itr->guid));
+ trans->PAppend("REPLACE INTO character_arena_stats (guid,slot,personal_rating,matchmaker_rating) VALUES ('%u', '%u', '%u', '%u')", GUID_LOPART(itr->guid), GetSlot(), itr->personal_rating, itr->matchmaker_rating);
+ }
CharacterDatabase.CommitTransaction(trans);
}
diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index 9165b6b7ea9..7e747ae3e0a 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
@@ -101,8 +101,10 @@ struct ArenaTeamMember
uint32 games_season;
uint32 wins_season;
uint32 personal_rating;
+ uint32 matchmaker_rating;
void ModifyPersonalRating(Player* plr, int32 mod, uint32 slot);
+ void ModifyMatchmakerRating(int32 mod, uint32 slot);
};
struct ArenaTeamStats
@@ -137,6 +139,7 @@ class ArenaTeam
const ArenaTeamStats& GetStats() const { return m_stats; }
void SetStats(uint32 stat_type, uint32 value);
uint32 GetRating() const { return m_stats.rating; }
+ uint32 GetAverageMMR(Group *group) const;
uint32 GetEmblemStyle() const { return m_EmblemStyle; }
uint32 GetEmblemColor() const { return m_EmblemColor; }
@@ -196,10 +199,10 @@ class ArenaTeam
uint32 GetPoints(uint32 MemberRating);
float GetChanceAgainst(uint32 own_rating, uint32 enemy_rating);
int32 WonAgainst(uint32 againstRating);
- void MemberWon(Player * plr, uint32 againstRating);
- int32 LostAgainst(uint32 againstRating);
- void MemberLost(Player * plr, uint32 againstRating);
- void OfflineMemberLost(uint64 guid, uint32 againstRating);
+ void MemberWon(Player * plr, uint32 againstMatchmakerRating);
+ int32 LostAgainst(uint32 againstRating, bool winnerlowrating);
+ void MemberLost(Player * plr, uint32 againstMatchmakerRating);
+ void OfflineMemberLost(uint64 guid, uint32 againstMatchmakerRating);
void UpdateArenaPointsHelper(std::map<uint32, uint32> & PlayerPoints);
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 73b0d08bbf1..7cdc8ddedf1 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -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))));
}
}
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 787dbfc51c9..68917a97a41 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -513,6 +513,8 @@ class Battleground
uint32 GetArenaTeamIdForTeam(uint32 Team) const { return m_ArenaTeamIds[GetTeamIndexByTeamId(Team)]; }
void SetArenaTeamRatingChangeForTeam(uint32 Team, int32 RatingChange) { m_ArenaTeamRatingChanges[GetTeamIndexByTeamId(Team)] = RatingChange; }
int32 GetArenaTeamRatingChangeForTeam(uint32 Team) const { return m_ArenaTeamRatingChanges[GetTeamIndexByTeamId(Team)]; }
+ void SetArenaMatchmakerRating(uint32 Team, uint32 MMR){ m_ArenaTeamMMR[GetTeamIndexByTeamId(Team)] = MMR; }
+ uint32 GetArenaMatchmakerRating(uint32 Team) { return m_ArenaTeamMMR[GetTeamIndexByTeamId(Team)]; }
void CheckArenaWinConditions();
void UpdateArenaWorldState();
@@ -649,6 +651,7 @@ class Battleground
uint32 m_ArenaTeamIds[BG_TEAMS_COUNT];
int32 m_ArenaTeamRatingChanges[BG_TEAMS_COUNT];
+ uint32 m_ArenaTeamMMR[BG_TEAMS_COUNT];
/* Limits */
uint32 m_LevelMin;
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index cb832457054..881e84e77ca 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -131,12 +131,12 @@ void BattlegroundMgr::Update(uint32 diff)
for (uint8 i = 0; i < scheduled.size(); i++)
{
- uint32 arenaRating = scheduled[i] >> 32;
+ uint32 arenaMMRating = scheduled[i] >> 32;
uint8 arenaType = scheduled[i] >> 24 & 255;
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId(scheduled[i] >> 16 & 255);
BattlegroundTypeId bgTypeId = BattlegroundTypeId((scheduled[i] >> 8) & 255);
BattlegroundBracketId bracket_id = BattlegroundBracketId(scheduled[i] & 255);
- m_BattlegroundQueues[bgQueueTypeId].Update(bgTypeId, bracket_id, arenaType, arenaRating > 0, arenaRating);
+ m_BattlegroundQueues[bgQueueTypeId].Update(bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating);
}
}
@@ -243,10 +243,11 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket *data, Battleground *bg)
{
uint32 pointsLost = bg->m_ArenaTeamRatingChanges[i] < 0 ? abs(bg->m_ArenaTeamRatingChanges[i]) : 0;
uint32 pointsGained = bg->m_ArenaTeamRatingChanges[i] > 0 ? bg->m_ArenaTeamRatingChanges[i] : 0;
+ uint32 MatchmakerRating = bg->m_ArenaTeamMMR[i];
*data << uint32(pointsLost); // Rating Lost
*data << uint32(pointsGained); // Rating gained
- *data << uint32(0); // Matchmaking Value
+ *data << uint32(MatchmakerRating); // Matchmaking Value
sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]);
}
for (int i = 1; i >= 0; --i)
@@ -1058,11 +1059,11 @@ void BattlegroundMgr::SetHolidayWeekends(uint32 mask)
}
}
-void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
+void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
{
//This method must be atomic, TODO add mutex
//we will use only 1 number created of bgTypeId and bracket_id
- uint64 schedule_id = ((uint64)arenaRating << 32) | (arenaType << 24) | (bgQueueTypeId << 16) | (bgTypeId << 8) | bracket_id;
+ uint64 schedule_id = ((uint64)arenaMatchmakerRating << 32) | (arenaType << 24) | (bgQueueTypeId << 16) | (bgTypeId << 8) | bracket_id;
bool found = false;
for (uint8 i = 0; i < m_QueueUpdateScheduler.size(); i++)
{
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index c645aa8b1f9..334edaf2e32 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
@@ -80,7 +80,7 @@ class BattlegroundMgr
BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID];
- void ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id);
+ void ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id);
uint32 GetMaxRatingDifference() const;
uint32 GetRatingDiscardTimer() const;
uint32 GetPrematureFinishTime() const;
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
index a40180ea476..6fc4ede2277 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
@@ -125,7 +125,7 @@ bool BattlegroundQueue::SelectionPool::AddGroup(GroupQueueInfo *ginfo, uint32 de
/*********************************************************/
// add group or player (grp == NULL) to bg queue with the given leader and bg specifications
-GroupQueueInfo * BattlegroundQueue::AddGroup(Player *leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* backetEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 arenateamid)
+GroupQueueInfo * BattlegroundQueue::AddGroup(Player *leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* backetEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid)
{
BattlegroundBracketId bracketId = backetEntry->GetBracketId();
@@ -139,8 +139,10 @@ GroupQueueInfo * BattlegroundQueue::AddGroup(Player *leader, Group* grp, Battleg
ginfo->JoinTime = getMSTime();
ginfo->RemoveInviteTime = 0;
ginfo->Team = leader->GetTeam();
- ginfo->ArenaTeamRating = arenaRating;
+ ginfo->ArenaTeamRating = ArenaRating;
+ ginfo->ArenaMatchmakerRating = MatchmakerRating;
ginfo->OpponentsTeamRating = 0;
+ ginfo->OpponentsMatchmakerRating = 0;
ginfo->Players.clear();
@@ -366,9 +368,9 @@ void BattlegroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCou
sLog.outDebug("UPDATING memberLost's personal arena rating for %u by opponents rating: %u", GUID_LOPART(guid), group->OpponentsTeamRating);
Player *plr = sObjectMgr.GetPlayer(guid);
if (plr)
- at->MemberLost(plr, group->OpponentsTeamRating);
+ at->MemberLost(plr, group->OpponentsMatchmakerRating);
else
- at->OfflineMemberLost(guid, group->OpponentsTeamRating);
+ at->OfflineMemberLost(guid, group->OpponentsMatchmakerRating);
at->SaveToDB();
}
}
@@ -886,17 +888,17 @@ void BattlegroundQueue::Update(BattlegroundTypeId bgTypeId, BattlegroundBracketI
if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty())
{
front1 = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].front();
- arenaRating = front1->ArenaTeamRating;
+ arenaRating = front1->ArenaMatchmakerRating;
}
if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty())
{
front2 = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].front();
- arenaRating = front2->ArenaTeamRating;
+ arenaRating = front2->ArenaMatchmakerRating;
}
if (front1 && front2)
{
if (front1->JoinTime < front2->JoinTime)
- arenaRating = front1->ArenaTeamRating;
+ arenaRating = front1->ArenaMatchmakerRating;
}
else if (!front1 && !front2)
return; //queues are empty
@@ -925,7 +927,7 @@ void BattlegroundQueue::Update(BattlegroundTypeId bgTypeId, BattlegroundBracketI
{
// if group match conditions, then add it to pool
if (!(*itr_team[i])->IsInvitedToBGInstanceGUID
- && (((*itr_team[i])->ArenaTeamRating >= arenaMinRating && (*itr_team[i])->ArenaTeamRating <= arenaMaxRating)
+ && (((*itr_team[i])->ArenaMatchmakerRating >= arenaMinRating && (*itr_team[i])->ArenaMatchmakerRating <= arenaMaxRating)
|| (*itr_team[i])->JoinTime < discardTime))
{
m_SelectionPools[i].AddGroup((*itr_team[i]), MaxPlayersPerTeam);
@@ -945,7 +947,7 @@ void BattlegroundQueue::Update(BattlegroundTypeId bgTypeId, BattlegroundBracketI
for (; itr_team[BG_TEAM_ALLIANCE] != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end(); ++(itr_team[BG_TEAM_ALLIANCE]))
{
if (!(*itr_team[BG_TEAM_ALLIANCE])->IsInvitedToBGInstanceGUID
- && (((*itr_team[BG_TEAM_ALLIANCE])->ArenaTeamRating >= arenaMinRating && (*itr_team[BG_TEAM_ALLIANCE])->ArenaTeamRating <= arenaMaxRating)
+ && (((*itr_team[BG_TEAM_ALLIANCE])->ArenaMatchmakerRating >= arenaMinRating && (*itr_team[BG_TEAM_ALLIANCE])->ArenaMatchmakerRating <= arenaMaxRating)
|| (*itr_team[BG_TEAM_ALLIANCE])->JoinTime < discardTime))
{
m_SelectionPools[BG_TEAM_ALLIANCE].AddGroup((*itr_team[BG_TEAM_ALLIANCE]), MaxPlayersPerTeam);
@@ -961,7 +963,7 @@ void BattlegroundQueue::Update(BattlegroundTypeId bgTypeId, BattlegroundBracketI
for (; itr_team[BG_TEAM_HORDE] != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end(); ++(itr_team[BG_TEAM_HORDE]))
{
if (!(*itr_team[BG_TEAM_HORDE])->IsInvitedToBGInstanceGUID
- && (((*itr_team[BG_TEAM_HORDE])->ArenaTeamRating >= arenaMinRating && (*itr_team[BG_TEAM_HORDE])->ArenaTeamRating <= arenaMaxRating)
+ && (((*itr_team[BG_TEAM_HORDE])->ArenaMatchmakerRating >= arenaMinRating && (*itr_team[BG_TEAM_HORDE])->ArenaMatchmakerRating <= arenaMaxRating)
|| (*itr_team[BG_TEAM_HORDE])->JoinTime < discardTime))
{
m_SelectionPools[BG_TEAM_HORDE].AddGroup((*itr_team[BG_TEAM_HORDE]), MaxPlayersPerTeam);
@@ -981,8 +983,10 @@ void BattlegroundQueue::Update(BattlegroundTypeId bgTypeId, BattlegroundBracketI
}
(*(itr_team[BG_TEAM_ALLIANCE]))->OpponentsTeamRating = (*(itr_team[BG_TEAM_HORDE]))->ArenaTeamRating;
+ (*(itr_team[BG_TEAM_ALLIANCE]))->OpponentsMatchmakerRating = (*(itr_team[BG_TEAM_HORDE]))->ArenaMatchmakerRating;
sLog.outDebug("setting oposite teamrating for team %u to %u", (*(itr_team[BG_TEAM_ALLIANCE]))->ArenaTeamId, (*(itr_team[BG_TEAM_ALLIANCE]))->OpponentsTeamRating);
(*(itr_team[BG_TEAM_HORDE]))->OpponentsTeamRating = (*(itr_team[BG_TEAM_ALLIANCE]))->ArenaTeamRating;
+ (*(itr_team[BG_TEAM_HORDE]))->OpponentsMatchmakerRating = (*(itr_team[BG_TEAM_ALLIANCE]))->ArenaMatchmakerRating;
sLog.outDebug("setting oposite teamrating for team %u to %u", (*(itr_team[BG_TEAM_HORDE]))->ArenaTeamId, (*(itr_team[BG_TEAM_HORDE]))->OpponentsTeamRating);
// now we must move team if we changed its faction to another faction queue, because then we will spam log by errors in Queue::RemovePlayer
if ((*(itr_team[BG_TEAM_ALLIANCE]))->Team != ALLIANCE)
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h
index 248c9cac6a5..8c623df3504 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.h
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h
@@ -50,7 +50,9 @@ struct GroupQueueInfo // stores informatio
uint32 RemoveInviteTime; // time when we will remove invite for players in group
uint32 IsInvitedToBGInstanceGUID; // was invited to certain BG
uint32 ArenaTeamRating; // if rated match, inited to the rating of the team
+ uint32 ArenaMatchmakerRating; // if rated match, inited to the rating of the team
uint32 OpponentsTeamRating; // for rated arena matches
+ uint32 OpponentsMatchmakerRating; // for rated arena matches
};
enum BattlegroundQueueGroupTypes
@@ -75,7 +77,7 @@ class BattlegroundQueue
bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam);
- GroupQueueInfo * AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* backetEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 ArenaTeamId = 0);
+ GroupQueueInfo * AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* backetEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0);
void RemovePlayer(const uint64& guid, bool decreaseInvitedCount);
bool IsPlayerInvited(const uint64& pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);
bool GetPlayerGroupInfoData(const uint64& guid, GroupQueueInfo* ginfo);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index ecef0276e7a..deac07891a5 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -381,18 +381,18 @@ enum EUnitFields
PLAYER_FIELD_BYTES2 = UNIT_END + 0x0439, // Size: 1, Type: 6, Flags: PRIVATE
PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x043A, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x043B, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 21, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0469, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x046A, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x046B, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x046C, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0485, // Size: 4, Type: FLOAT, Flags: PRIVATE
- PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x0489, // Size: 3, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x048C, // Size: 6, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0492, // Size: 6, Type: INT, Flags: PRIVATE
- PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0498, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_PET_SPELL_POWER = UNIT_END + 0x0499, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_END = UNIT_END + 0x049A,
+ PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 24, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x046C, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x046D, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x046E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x046F, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0488, // Size: 4, Type: FLOAT, Flags: PRIVATE
+ PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x048C, // Size: 3, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x048F, // Size: 6, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0495, // Size: 6, Type: INT, Flags: PRIVATE
+ PLAYER_GLYPHS_ENABLED = UNIT_END + 0x049B, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_PET_SPELL_POWER = UNIT_END + 0x049C, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_END = UNIT_END + 0x049D,
};
enum EGameObjectFields
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3fce503c5c7..73bb481d0bc 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15674,7 +15674,7 @@ void Player::_LoadDeclinedNames(QueryResult_AutoPtr result)
void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result)
{
- // arenateamid, played_week, played_season, personal_rating
+ // arenateamid, played_week, played_season, personal_rating, matchmaker_rating
memset((void*)&m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1], 0, sizeof(uint32) * MAX_ARENA_SLOT * ARENA_TEAM_END);
if (!result)
return;
@@ -15683,11 +15683,10 @@ void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result)
{
Field *fields = result->Fetch();
- uint32 arenateamid = fields[0].GetUInt32();
- uint32 played_week = fields[1].GetUInt32();
- uint32 played_season = fields[2].GetUInt32();
- uint32 wons_season = fields[3].GetUInt32();
- uint32 personal_rating = fields[4].GetUInt32();
+ uint32 arenateamid = fields[0].GetUInt32();
+ uint32 played_week = fields[1].GetUInt32();
+ uint32 played_season = fields[2].GetUInt32();
+ uint32 wons_season = fields[3].GetUInt32();
ArenaTeam* aTeam = sObjectMgr.GetArenaTeamById(arenateamid);
if (!aTeam)
@@ -15703,11 +15702,44 @@ void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result)
SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_WEEK, played_week);
SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_SEASON, played_season);
SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_WINS_SEASON, wons_season);
- SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_PERSONAL_RATING, personal_rating);
-
}while (result->NextRow());
}
+void Player::_LoadArenaStatsInfo(QueryResult_AutoPtr result)
+{
+ uint8 slot = 0;
+ if (!result)
+ {
+ for (; slot <= 2; ++slot)
+ {
+ CharacterDatabase.PExecute("INSERT INTO character_arena_stats (guid, slot, personal_rating, matchmaker_rating) VALUES (%u, %u, 0, 1500)", GetGUIDLow(), slot);
+ SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, 0);
+ }
+ return;
+ }
+
+ bool nextrow = true;
+ do
+ {
+ Field *fields = result->Fetch();
+ uint32 personalrating = 0;
+ uint32 matchmakerrating = 1500;
+ if (fields[0].GetUInt8() > slot)
+ {
+ CharacterDatabase.PExecute("INSERT INTO character_arena_stats (guid, slot, personal_rating, matchmaker_rating) VALUES (%u, %u, %u, %u)", GetGUIDLow(), slot, personalrating, matchmakerrating);
+ SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, personalrating);
+ slot++;
+ continue;
+ }
+
+ personalrating = fields[1].GetUInt32();
+ matchmakerrating = fields[2].GetUInt32();
+ SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, personalrating);
+ slot++;
+ nextrow = result->NextRow();
+ }while (nextrow);
+}
+
void Player::_LoadEquipmentSets(QueryResult_AutoPtr result)
{
// SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
@@ -15936,6 +15968,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
_LoadGroup(holder->GetResult(PLAYER_LOGIN_QUERY_LOADGROUP));
_LoadArenaTeamInfo(holder->GetResult(PLAYER_LOGIN_QUERY_LOADARENAINFO));
+ _LoadArenaStatsInfo(holder->GetResult(PLAYER_LOGIN_QUERY_LOADARENASTATS));
uint32 arena_currency = fields[39].GetUInt32();
if (arena_currency > sWorld.getIntConfig(CONFIG_MAX_ARENA_POINTS))
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 90d5b4494b3..267abba9e9f 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -700,14 +700,14 @@ enum InstanceResetWarningType
// PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets
enum ArenaTeamInfoType
{
- ARENA_TEAM_ID = 0,
- ARENA_TEAM_TYPE = 1, // new in 3.2 - team type?
- ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member
- ARENA_TEAM_GAMES_WEEK = 3,
- ARENA_TEAM_GAMES_SEASON = 4,
- ARENA_TEAM_WINS_SEASON = 5,
- ARENA_TEAM_PERSONAL_RATING = 6,
- ARENA_TEAM_END = 7
+ ARENA_TEAM_ID = 0,
+ ARENA_TEAM_TYPE = 1, // new in 3.2 - team type?
+ ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member
+ ARENA_TEAM_GAMES_WEEK = 3,
+ ARENA_TEAM_GAMES_SEASON = 4,
+ ARENA_TEAM_WINS_SEASON = 5,
+ ARENA_TEAM_PERSONAL_RATING = 6,
+ ARENA_TEAM_END = 7
};
class InstanceSave;
@@ -786,7 +786,8 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADSKILLS = 25,
PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS = 26,
PLAYER_LOGIN_QUERY_LOADRANDOMBG = 27,
- MAX_PLAYER_LOGIN_QUERY = 28
+ PLAYER_LOGIN_QUERY_LOADARENASTATS = 28,
+ MAX_PLAYER_LOGIN_QUERY = 29
};
enum PlayerDelayedOperations
@@ -2429,6 +2430,7 @@ class Player : public Unit, public GridObject<Player>
bool _LoadHomeBind(QueryResult_AutoPtr result);
void _LoadDeclinedNames(QueryResult_AutoPtr result);
void _LoadArenaTeamInfo(QueryResult_AutoPtr result);
+ void _LoadArenaStatsInfo(QueryResult_AutoPtr result);
void _LoadEquipmentSets(QueryResult_AutoPtr result);
void _LoadBGData(QueryResult_AutoPtr result);
void _LoadGlyphs(QueryResult_AutoPtr result);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 3929c980a53..1e425dbe430 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3552,7 +3552,7 @@ void ObjectMgr::LoadArenaTeams()
// load arena_team members
QueryResult_AutoPtr arenaTeamMembersResult = CharacterDatabase.Query(
// 0 1 2 3 4 5 6 7 8
- "SELECT arenateamid,member.guid,played_week,wons_week,played_season,wons_season,personal_rating,name,class "
+ "SELECT arenateamid,member.guid,played_week,wons_week,played_season,wons_season,name,class "
"FROM arena_team_member member LEFT JOIN characters chars on member.guid = chars.guid ORDER BY member.arenateamid ASC");
barGoLink bar(result->GetRowCount());
diff --git a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
index 64a7355aa0e..b1bc9a89f49 100644
--- a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp
@@ -172,7 +172,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data)
BattlegroundQueue& bgQueue = sBattlegroundMgr.m_BattlegroundQueues[bgQueueTypeId];
- GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, 0, false, isPremade, 0);
+ GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0);
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
// already checked if queueSlot is valid, now just get it
uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId);
@@ -201,7 +201,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data)
if (err > 0)
{
sLog.outDebug("Battleground: the following players are joining as group:");
- ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0);
+ ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0);
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
}
@@ -472,7 +472,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data)
if (at)
{
sLog.outDebug("UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!", GUID_LOPART(_player->GetGUID()), ginfo.OpponentsTeamRating);
- at->MemberLost(_player, ginfo.OpponentsTeamRating);
+ at->MemberLost(_player, ginfo.OpponentsMatchmakerRating);
at->SaveToDB();
}
}
@@ -481,7 +481,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data)
bgQueue.RemovePlayer(_player->GetGUID(), true);
// player left queue, we should update it - do not update Arena Queue
if (!ginfo.ArenaType)
- sBattlegroundMgr.ScheduleQueueUpdate(ginfo.ArenaTeamRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
+ sBattlegroundMgr.ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
SendPacket(&data);
sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetTypeID(), bgQueueTypeId);
break;
@@ -641,6 +641,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
uint8 arenatype = 0;
uint32 arenaRating = 0;
+ uint32 matchmakerRating = 0;
switch(arenaslot)
{
@@ -715,23 +716,8 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
}
// get the team rating for queueing
arenaRating = at->GetRating();
+ matchmakerRating = at->GetAverageMMR(grp);
// the arenateam id must match for everyone in the group
- // get the personal ratings for queueing
- uint32 avg_pers_rating = 0;
- for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player *member = itr->getSource();
-
- // calc avg personal rating
- avg_pers_rating += member->GetArenaPersonalRating(arenaslot);
- }
-
- if (arenatype)
- avg_pers_rating /= arenatype;
-
- // if avg personal rating is more than 150 points below the teams rating, the team will be queued against an opponent matching or similar to the average personal rating
- if (avg_pers_rating + 150 < arenaRating)
- arenaRating = avg_pers_rating;
if (arenaRating <= 0)
arenaRating = 1;
@@ -747,13 +733,13 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
sLog.outDebug("Battleground: arena join as group start");
if (isRated)
{
- sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
+ sLog.outDebug("Battleground: arena team id %u, leader %s queued with matchmaker rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),matchmakerRating,arenatype);
bg->SetRated(true);
}
else
bg->SetRated(false);
- GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
+ GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId);
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
}
@@ -785,7 +771,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
}
else
{
- GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
+ GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId);
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId);
@@ -795,7 +781,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
SendPacket(&data);
sLog.outDebug("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
}
- sBattlegroundMgr.ScheduleQueueUpdate(arenaRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
+ sBattlegroundMgr.ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
}
void WorldSession::HandleReportPvPAFK(WorldPacket & recv_data)
diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
index 5454268f87a..87786c27ac2 100644
--- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
@@ -88,7 +88,7 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = '%u'",GUID_LOPART(m_guid));
// in other case still be dummy query
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGUILD, "SELECT guildid,rank FROM guild_member WHERE guid = '%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, wons_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, wons_season FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
@@ -98,6 +98,7 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACCOUNTDATA, "SELECT type, time, data FROM character_account_data WHERE guid='%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADRANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENASTATS, "SELECT slot, personal_rating, matchmaker_rating FROM character_arena_stats WHERE guid = '%u' ORDER BY slot ASC", GUID_LOPART(m_guid));
return res;
}