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)); }
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}"); } } }
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}"); } }