diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.cpp | 154 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.h | 11 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.h | 3 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundMgr.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundQueue.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 24 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 49 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 20 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp | 3 |
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; } |