Esempio n. 1
0
        public override void RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool SendPacket)
        {
            if (IsRated() && GetStatus() == BattlegroundStatus.InProgress)
            {
                var bgPlayer = GetPlayers().LookupByKey(guid);
                if (bgPlayer != null) // check if the player was a participant of the match, or only entered through gm command (appear)
                {
                    // if the player was a match participant, calculate rating

                    ArenaTeam winnerArenaTeam = Global.ArenaTeamMgr.GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(bgPlayer.Team)));
                    ArenaTeam loserArenaTeam  = Global.ArenaTeamMgr.GetArenaTeamById(GetArenaTeamIdForTeam(bgPlayer.Team));

                    // left a rated match while the encounter was in progress, consider as loser
                    if (winnerArenaTeam != null && loserArenaTeam != null && winnerArenaTeam != loserArenaTeam)
                    {
                        Player player = _GetPlayer(guid, bgPlayer.OfflineRemoveTime != 0, "Arena.RemovePlayerAtLeave");
                        if (player)
                        {
                            loserArenaTeam.MemberLost(player, GetArenaMatchmakerRating(GetOtherTeam(bgPlayer.Team)));
                        }
                        else
                        {
                            loserArenaTeam.OfflineMemberLost(guid, GetArenaMatchmakerRating(GetOtherTeam(bgPlayer.Team)));
                        }
                    }
                }
            }

            // remove player
            base.RemovePlayerAtLeave(guid, Transport, SendPacket);
        }
Esempio n. 2
0
        public void ModifyPersonalRating(Player player, int mod, uint type)
        {
            if (PersonalRating + mod < 0)
            {
                PersonalRating = 0;
            }
            else
            {
                PersonalRating += (ushort)mod;
            }

            if (player)
            {
                player.SetArenaTeamInfoField(ArenaTeam.GetSlotByType(type), ArenaTeamInfoType.PersonalRating, PersonalRating);
                player.UpdateCriteria(CriteriaTypes.HighestPersonalRating, PersonalRating, type);
            }
        }
Esempio n. 3
0
        public void LoadArenaTeams()
        {
            uint oldMSTime = Time.GetMSTime();

            // Clean out the trash before loading anything
            DB.Characters.DirectExecute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)");       // One-time query

            //                                                        0        1         2         3          4              5            6            7           8
            SQLResult result = DB.Characters.Query("SELECT arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, " +
                                                   //      9        10        11         12           13       14
                                                   "rating, weekGames, weekWins, seasonGames, seasonWins, rank FROM arena_team ORDER BY arenaTeamId ASC");

            if (result.IsEmpty())
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 arena teams. DB table `arena_team` is empty!");
                return;
            }

            SQLResult result2 = DB.Characters.Query(
                //              0              1           2             3              4                 5          6     7          8                  9
                "SELECT arenaTeamId, atm.guid, atm.weekGames, atm.weekWins, atm.seasonGames, atm.seasonWins, c.name, class, personalRating, matchMakerRating FROM arena_team_member atm" +
                " INNER JOIN arena_team ate USING (arenaTeamId) LEFT JOIN characters AS c ON atm.guid = c.guid" +
                " LEFT JOIN character_arena_stats AS cas ON c.guid = cas.guid AND (cas.slot = 0 AND ate.type = 2 OR cas.slot = 1 AND ate.type = 3 OR cas.slot = 2 AND ate.type = 5)" +
                " ORDER BY atm.arenateamid ASC");

            uint count = 0;

            do
            {
                ArenaTeam newArenaTeam = new ArenaTeam();

                if (!newArenaTeam.LoadArenaTeamFromDB(result) || !newArenaTeam.LoadMembersFromDB(result2))
                {
                    newArenaTeam.Disband(null);
                    continue;
                }

                AddArenaTeam(newArenaTeam);

                ++count;
            }while (result.NextRow());

            Log.outInfo(LogFilter.ServerLoading, "Loaded {0} arena teams in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
        }
Esempio n. 4
0
        public override void EndBattleground(Team winner)
        {
            // arena rating calculation
            if (IsRated())
            {
                uint loserTeamRating;
                uint loserMatchmakerRating;
                int  loserChange           = 0;
                int  loserMatchmakerChange = 0;
                uint winnerTeamRating;
                uint winnerMatchmakerRating;
                int  winnerChange           = 0;
                int  winnerMatchmakerChange = 0;
                bool guildAwarded           = false;

                // In case of arena draw, follow this logic:
                // winnerArenaTeam => ALLIANCE, loserArenaTeam => HORDE
                ArenaTeam winnerArenaTeam = Global.ArenaTeamMgr.GetArenaTeamById(GetArenaTeamIdForTeam(winner == 0 ? Team.Alliance : winner));
                ArenaTeam loserArenaTeam  = Global.ArenaTeamMgr.GetArenaTeamById(GetArenaTeamIdForTeam(winner == 0 ? Team.Horde : GetOtherTeam(winner)));

                if (winnerArenaTeam != null && loserArenaTeam != null && winnerArenaTeam != loserArenaTeam)
                {
                    // In case of arena draw, follow this logic:
                    // winnerMatchmakerRating => ALLIANCE, loserMatchmakerRating => HORDE
                    loserTeamRating        = loserArenaTeam.GetRating();
                    loserMatchmakerRating  = GetArenaMatchmakerRating(winner == 0 ? Team.Horde : GetOtherTeam(winner));
                    winnerTeamRating       = winnerArenaTeam.GetRating();
                    winnerMatchmakerRating = GetArenaMatchmakerRating(winner == 0 ? Team.Alliance : winner);

                    if (winner != 0)
                    {
                        winnerMatchmakerChange = winnerArenaTeam.WonAgainst(winnerMatchmakerRating, loserMatchmakerRating, ref winnerChange);
                        loserMatchmakerChange  = loserArenaTeam.LostAgainst(loserMatchmakerRating, winnerMatchmakerRating, ref loserChange);

                        Log.outDebug(LogFilter.Arena, "match Type: {0} --- Winner: old rating: {1}, rating gain: {2}, old MMR: {3}, MMR gain: {4} --- Loser: old rating: {5}, " +
                                     "rating loss: {6}, old MMR: {7}, MMR loss: {8} ---", GetArenaType(), winnerTeamRating, winnerChange, winnerMatchmakerRating, winnerMatchmakerChange,
                                     loserTeamRating, loserChange, loserMatchmakerRating, loserMatchmakerChange);

                        SetArenaMatchmakerRating(winner, (uint)(winnerMatchmakerRating + winnerMatchmakerChange));
                        SetArenaMatchmakerRating(GetOtherTeam(winner), (uint)(loserMatchmakerRating + loserMatchmakerChange));

                        // bg team that the client expects is different to TeamId
                        // alliance 1, horde 0
                        byte winnerTeam = (byte)(winner == Team.Alliance ? PvPTeamId.Alliance : PvPTeamId.Horde);
                        byte loserTeam  = (byte)(winner == Team.Alliance ? PvPTeamId.Horde : PvPTeamId.Alliance);

                        _arenaTeamScores[winnerTeam].Assign(winnerTeamRating, (uint)(winnerTeamRating + winnerChange), winnerMatchmakerRating, GetArenaMatchmakerRating(winner));
                        _arenaTeamScores[loserTeam].Assign(loserTeamRating, (uint)(loserTeamRating + loserChange), loserMatchmakerRating, GetArenaMatchmakerRating(GetOtherTeam(winner)));

                        Log.outDebug(LogFilter.Arena, "Arena match Type: {0} for Team1Id: {1} - Team2Id: {2} ended. WinnerTeamId: {3}. Winner rating: +{4}, Loser rating: {5}",
                                     GetArenaType(), GetArenaTeamIdByIndex(TeamId.Alliance), GetArenaTeamIdByIndex(TeamId.Horde), winnerArenaTeam.GetId(), winnerChange, loserChange);

                        if (WorldConfig.GetBoolValue(WorldCfg.ArenaLogExtendedInfo))
                        {
                            foreach (var score in PlayerScores)
                            {
                                Player player = Global.ObjAccessor.FindPlayer(score.Key);
                                if (player)
                                {
                                    Log.outDebug(LogFilter.Arena, "Statistics match Type: {0} for {1} (GUID: {2}, Team: {3}, IP: {4}): {5}",
                                                 GetArenaType(), player.GetName(), score.Key, player.GetArenaTeamId((byte)(GetArenaType() == ArenaTypes.Team5v5 ? 2 : (GetArenaType() == ArenaTypes.Team3v3 ? 1 : 0))),
                                                 player.GetSession().GetRemoteAddress(), score.Value.ToString());
                                }
                            }
                        }
                    }
                    // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes
                    else
                    {
                        _arenaTeamScores[(int)PvPTeamId.Alliance].Assign(winnerTeamRating, (uint)(winnerTeamRating + SharedConst.ArenaTimeLimitPointsLoss), winnerMatchmakerRating, GetArenaMatchmakerRating(Team.Alliance));
                        _arenaTeamScores[(int)PvPTeamId.Horde].Assign(loserTeamRating, (uint)(loserTeamRating + SharedConst.ArenaTimeLimitPointsLoss), loserMatchmakerRating, GetArenaMatchmakerRating(Team.Horde));

                        winnerArenaTeam.FinishGame(SharedConst.ArenaTimeLimitPointsLoss);
                        loserArenaTeam.FinishGame(SharedConst.ArenaTimeLimitPointsLoss);
                    }

                    uint aliveWinners = GetAlivePlayersCountByTeam(winner);
                    foreach (var pair in GetPlayers())
                    {
                        Team team = pair.Value.Team;

                        if (pair.Value.OfflineRemoveTime != 0)
                        {
                            // if rated arena match - make member lost!
                            if (team == winner)
                            {
                                winnerArenaTeam.OfflineMemberLost(pair.Key, loserMatchmakerRating, winnerMatchmakerChange);
                            }
                            else
                            {
                                if (winner == 0)
                                {
                                    winnerArenaTeam.OfflineMemberLost(pair.Key, loserMatchmakerRating, winnerMatchmakerChange);
                                }

                                loserArenaTeam.OfflineMemberLost(pair.Key, winnerMatchmakerRating, loserMatchmakerChange);
                            }
                            continue;
                        }

                        Player player = _GetPlayer(pair.Key, pair.Value.OfflineRemoveTime != 0, "Arena.EndBattleground");
                        if (!player)
                        {
                            continue;
                        }

                        // per player calculation
                        if (team == winner)
                        {
                            // update achievement BEFORE personal rating update
                            uint rating = player.GetArenaPersonalRating(winnerArenaTeam.GetSlot());
                            player.UpdateCriteria(CriteriaType.WinAnyRankedArena, rating != 0 ? rating : 1);
                            player.UpdateCriteria(CriteriaType.WinArena, GetMapId());

                            // Last standing - Rated 5v5 arena & be solely alive player
                            if (GetArenaType() == ArenaTypes.Team5v5 && aliveWinners == 1 && player.IsAlive())
                            {
                                player.CastSpell(player, ArenaSpellIds.LastManStanding, true);
                            }

                            if (!guildAwarded)
                            {
                                guildAwarded = true;
                                ulong guildId = GetBgMap().GetOwnerGuildId(player.GetBGTeam());
                                if (guildId != 0)
                                {
                                    Guild guild = Global.GuildMgr.GetGuildById(guildId);
                                    if (guild)
                                    {
                                        guild.UpdateCriteria(CriteriaType.WinAnyRankedArena, Math.Max(winnerArenaTeam.GetRating(), 1), 0, 0, null, player);
                                    }
                                }
                            }

                            winnerArenaTeam.MemberWon(player, loserMatchmakerRating, winnerMatchmakerChange);
                        }
                        else
                        {
                            if (winner == 0)
                            {
                                winnerArenaTeam.MemberLost(player, loserMatchmakerRating, winnerMatchmakerChange);
                            }

                            loserArenaTeam.MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange);

                            // Arena lost => reset the win_rated_arena having the "no_lose" condition
                            player.ResetCriteria(CriteriaFailEvent.LoseRankedArenaMatchWithTeamSize, 0);
                        }
                    }

                    // save the stat changes
                    winnerArenaTeam.SaveToDB();
                    loserArenaTeam.SaveToDB();
                    // send updated arena team stats to players
                    // this way all arena team members will get notified, not only the ones who participated in this match
                    winnerArenaTeam.NotifyStatsChanged();
                    loserArenaTeam.NotifyStatsChanged();
                }
            }

            // end Battleground
            base.EndBattleground(winner);
        }
Esempio n. 5
0
 public void AddArenaTeam(ArenaTeam arenaTeam)
 {
     ArenaTeamStorage[arenaTeam.GetId()] = arenaTeam;
 }