Exemplo n.º 1
0
        SegmentEligiblePlayers(
            IEnumerable <KeyValuePair <uint, int> > allContributingPlayers, Realms lockingRealm, IContributionManager contributionManager, bool updateHonor = true, bool updateAnalytics = true)
        {
            var winningRealmPlayers         = new ConcurrentDictionary <Player, int>();
            var losingRealmPlayers          = new ConcurrentDictionary <Player, int>();
            var allEligiblePlayerDictionary = new ConcurrentDictionary <Player, int>();


            // Partition the players by winning realm.
            foreach (var contributingPlayer in allContributingPlayers)
            {
                var player = Player.GetPlayer(contributingPlayer.Key);
                if (player != null)
                {
                    if (updateHonor)
                    {
                        // Update the Honor Points of the Contributing Players
                        var oldHonorPoints = player.Info.HonorPoints;
                        player.Info.HonorPoints += (ushort)contributingPlayer.Value;
                        Logger.Debug($"Updating honor for {player.Info.Name} ({player.Info.CharacterId}) {oldHonorPoints} => {player.Info.HonorPoints} ({player.Info.HonorRank})");
                        CharMgr.Database.SaveObject(player.Info);


                        PlayerUtil.RecordHonorHistory(oldHonorPoints, player.Info.HonorPoints, player.CharacterId, player.Name);
                    }

                    if (player.Realm == lockingRealm)
                    {
                        winningRealmPlayers.TryAdd(player, contributingPlayer.Value);
                    }
                    else
                    {
                        losingRealmPlayers.TryAdd(player, contributingPlayer.Value);
                    }

                    allEligiblePlayerDictionary.TryAdd(player, contributingPlayer.Value);

                    if (updateAnalytics)
                    {
                        // Get the contribution list for this player
                        var contributionDictionary =
                            contributionManager.GetContributionStageDictionary(contributingPlayer.Key);
                        // Record the contribution types and values for the player for analytics
                        PlayerContributionManager.RecordContributionAnalytics(player, contributionDictionary);
                    }
                }
            }
            // Update and inform players of change in Honor Rank.
            UpdateHonorRankAllPlayers(false);

            return(new Tuple <ConcurrentDictionary <Player, int>, ConcurrentDictionary <Player, int>, ConcurrentDictionary <Player, int> >(allEligiblePlayerDictionary, winningRealmPlayers, losingRealmPlayers));
        }
Exemplo n.º 2
0
        public static void UpdateHonorRankAllPlayers(bool announce)
        {
            var eligiblePlayers = CharMgr.Chars.Where(x => x.Value.HonorPoints >= 10);

            foreach (var player in eligiblePlayers)
            {
                try
                {
                    var currentHonorPoints = player.Value.HonorPoints;
                    // Reduce honor points by X%, unless they are < 10 - in which case make it 0
                    var newHonorPoints = 0;
                    if (currentHonorPoints < 10)
                    {
                        newHonorPoints = 0;
                    }
                    else
                    {
                        newHonorPoints = (int)(currentHonorPoints * HONOR_REDUCTION_PERCENT);
                    }

                    player.Value.HonorPoints = (ushort)newHonorPoints;
                    var oldHonorRank = player.Value.HonorRank;

                    // Recalculate Honor Rank
                    var honorLevel = new Common.HonorCalculation().GetHonorLevel((int)newHonorPoints);
                    player.Value.HonorRank = (ushort)honorLevel;
                    Logger.Trace(
                        $"Updating honor for {player.Value.Name} [{currentHonorPoints-newHonorPoints}] ({player.Value.CharacterId}) Current => New Honor Pts: {currentHonorPoints} => {player.Value.HonorPoints} ({player.Value.HonorRank}) ");

                    CharMgr.Database.SaveObject(player.Value);

                    PlayerUtil.RecordHonorHistory(currentHonorPoints, (ushort)newHonorPoints,
                                                  player.Value.CharacterId, player.Value.Name);

                    if (announce)
                    {
                        if (honorLevel > oldHonorRank)
                        {
                            var playerToAnnounce = Player.GetPlayer((uint)player.Value.CharacterId);
                            if (playerToAnnounce.CharacterId == player.Value.CharacterId)
                            {
                                playerToAnnounce.SendClientMessage($"You have reached Honor Rank {honorLevel}", ChatLogFilters.CHATLOGFILTERS_C_ORANGE_L);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.Error($"{e.Message} {e.StackTrace}");
                }
            }
        }
Exemplo n.º 3
0
        public static void RecordMetrics(Logger logger, int tier, RegionMgr region, IBattleFrontManager battleFrontManager)
        {
            try
            {
                var groupId = Guid.NewGuid().ToString();

                logger.Trace($"There are {battleFrontManager.GetBattleFrontStatusList().Count} battlefront statuses ({battleFrontManager.GetType().ToString()}).");
                foreach (var status in battleFrontManager.GetBattleFrontStatusList())
                {
                    lock (status)
                    {
                        if (status.RegionId == region.RegionId)
                        {
                            logger.Trace($"Recording metrics for BF Status : ({status.BattleFrontId}) {status.Description}");
                            if (!status.Locked)
                            {
                                var metrics = new RVRMetrics
                                {
                                    BattlefrontId            = status.BattleFrontId,
                                    BattlefrontName          = status.Description,
                                    DestructionVictoryPoints = (int)battleFrontManager.ActiveBattleFront.DestroVP,
                                    OrderVictoryPoints       = (int)battleFrontManager.ActiveBattleFront.OrderVP,
                                    Locked                   = status.LockStatus,
                                    OrderPlayersInLake       = PlayerUtil.GetTotalOrderPVPPlayerCountInZone(battleFrontManager.ActiveBattleFront.ZoneId),
                                    DestructionPlayersInLake = PlayerUtil.GetTotalDestPVPPlayerCountInZone(battleFrontManager.ActiveBattleFront.ZoneId),
                                    Tier      = tier,
                                    Timestamp = DateTime.UtcNow,
                                    GroupId   = groupId,
                                    TotalPlayerCountInRegion      = PlayerUtil.GetTotalPVPPlayerCountInRegion(status.RegionId),
                                    TotalDestPlayerCountInRegion  = PlayerUtil.GetTotalDestPVPPlayerCountInRegion(status.RegionId),
                                    TotalOrderPlayerCountInRegion = PlayerUtil.GetTotalOrderPVPPlayerCountInRegion(status.RegionId),
                                    TotalPlayerCount        = Player._Players.Count(x => !x.IsDisposed && x.IsInWorld() && x != null),
                                    TotalFlaggedPlayerCount = Player._Players.Count(x => !x.IsDisposed && x.IsInWorld() && x != null && x.CbtInterface.IsPvp)
                                };
                                WorldMgr.Database.AddObject(metrics);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error($"Could not write rvr metrics..continuing. {e.Message} {e.StackTrace}");
            }
        }