public Skills(PlayerStats parent, PlayerDamageDealt playerDamageDealt, EntityInformation entityInformation, Database.Structures.Skills skills, PlayerAbnormals buffs, bool timedEncounter) { InitializeComponent(); _parent = parent; CloseWindow.Source = BasicTeraData.Instance.ImageDatabase.Close.Source; BackgroundColor.Opacity = BasicTeraData.Instance.WindowData.SkillWindowOpacity; Update(playerDamageDealt, entityInformation, skills, buffs, timedEncounter); }
public void Update(long nfirstHit, long nlastHit, long ntotalDamage, long npartyDps, Dictionary <Entity, EntityInfo> nentities, List <PlayerInfo> nstats, Entity ncurrentBoss, bool ntimedEncounter, Tera.Game.AbnormalityStorage nabnormals, ConcurrentDictionary <string, Entity> nbossHistory, List <ChatMessage> nchatbox) { NetworkController.UpdateUiHandler changeUi = delegate(long firstHit, long lastHit, long totalDamage, long partyDps, Dictionary <Entity, EntityInfo> entities, List <PlayerInfo> stats, Entity currentBoss, bool timedEncounter, Tera.Game.AbnormalityStorage abnormals, ConcurrentDictionary <string, Entity> bossHistory, List <ChatMessage> chatbox) { var entitiesStats = new LinkedList <KeyValuePair <Entity, EntityInfo> >(entities.ToList().OrderByDescending(e => e.Value.LastHit)); UpdateComboboxEncounter(entitiesStats, currentBoss); _entityStats.Update(entities, abnormals, currentBoss); _windowHistory.Update(bossHistory); _chatbox.Update(chatbox); PartyDps.Content = FormatHelpers.Instance.FormatValue(partyDps) + "/s"; var visiblePlayerStats = new HashSet <PlayerInfo>(); var counter = 0; foreach (var playerStats in stats) { PlayerStats playerStatsControl; Controls.TryGetValue(playerStats, out playerStatsControl); if (playerStats.Dealt.Damage(currentBoss, timedEncounter) == 0 && playerStats.Received.Hits(currentBoss, firstHit, lastHit, timedEncounter) == 0) { continue; } visiblePlayerStats.Add(playerStats); if (playerStatsControl != null) { continue; } playerStatsControl = new PlayerStats(playerStats, abnormals.Get(playerStats.Player)); Controls.Add(playerStats, playerStatsControl); if (counter == 9) { break; } counter++; } var invisibleControls = Controls.Where(x => !visiblePlayerStats.Contains(x.Key)).ToList(); foreach (var invisibleControl in invisibleControls) { Controls[invisibleControl.Key].CloseSkills(); Controls.Remove(invisibleControl.Key); } TotalDamage.Content = FormatHelpers.Instance.FormatValue(totalDamage); var intervalvalue = lastHit - firstHit; var interval = TimeSpan.FromSeconds(intervalvalue); Timer.Content = interval.ToString(@"mm\:ss"); Players.Items.Clear(); var sortedDict = from entry in Controls orderby stats[stats.IndexOf(entry.Value.PlayerInfo)].Dealt.DamageFraction(currentBoss, totalDamage, timedEncounter) descending select entry; foreach (var item in sortedDict) { Players.Items.Add(item.Value); var data = stats.IndexOf(item.Value.PlayerInfo); item.Value.Repaint(stats[data], abnormals.Get(stats[data].Player), totalDamage, firstHit, lastHit, currentBoss, timedEncounter); } if (BasicTeraData.Instance.WindowData.InvisibleUI) { if (Controls.Count > 0 && !_forceWindowVisibilityHidden) { Visibility = Visibility.Visible; } if (Controls.Count == 0) { Visibility = Visibility.Hidden; } } else { if (!_forceWindowVisibilityHidden) { Visibility = Visibility.Visible; } } }; Dispatcher.Invoke(changeUi, nfirstHit, nlastHit, ntotalDamage, npartyDps, nentities, nstats, ncurrentBoss, ntimedEncounter, nabnormals, nbossHistory, nchatbox); }
public void Update(UiUpdateMessage nmessage) { void ChangeUi(UiUpdateMessage message) { RefreshClickThrou(); Scroller.MaxHeight = BasicTeraData.Instance.WindowData.NumberOfPlayersDisplayed * 30; UpdateComboboxEncounter(message.Entities, message.StatsSummary.EntityInformation.Entity); _entityStats.Update(message.StatsSummary.EntityInformation, message.Abnormals); _windowHistory.Update(message.BossHistory); _chatbox?.Update(message.Chatbox); _popupNotification.AddNotification(message.Flash); PartyDps.Content = FormatHelpers.Instance.FormatValue(message.StatsSummary.EntityInformation.Interval == 0 ? message.StatsSummary.EntityInformation.TotalDamage : message.StatsSummary.EntityInformation.TotalDamage * TimeSpan.TicksPerSecond / message.StatsSummary.EntityInformation.Interval) + LP.PerSecond; var visiblePlayerStats = new HashSet <Player>(); var statsDamage = message.StatsSummary.PlayerDamageDealt; var statsHeal = message.StatsSummary.PlayerHealDealt; foreach (var playerStats in statsDamage) { PlayerStats playerStatsControl; Controls.TryGetValue(playerStats.Source, out playerStatsControl); if (playerStats.Amount == 0) { continue; } visiblePlayerStats.Add(playerStats.Source); if (playerStatsControl != null) { continue; } playerStatsControl = new PlayerStats(playerStats, statsHeal.FirstOrDefault(x => x.Source == playerStats.Source), message.StatsSummary.EntityInformation, message.Skills, message.Abnormals.Get(playerStats.Source)); Controls.Add(playerStats.Source, playerStatsControl); } DXrender?.Draw(statsDamage.ToClassInfo(message.StatsSummary.EntityInformation.TotalDamage, message.StatsSummary.EntityInformation.Interval)); var invisibleControls = Controls.Where(x => !visiblePlayerStats.Contains(x.Key)).ToList(); foreach (var invisibleControl in invisibleControls) { Controls[invisibleControl.Key].CloseSkills(); Controls.Remove(invisibleControl.Key); } SGrid.Visibility = !_hideGeneralData ? Visibility.Visible : Visibility.Collapsed; TotalDamage.Content = FormatHelpers.Instance.FormatValue(message.StatsSummary.EntityInformation.TotalDamage); if (BasicTeraData.Instance.WindowData.ShowTimeLeft && message.StatsSummary.EntityInformation.TimeLeft > 0) { var interval = TimeSpan.FromSeconds(message.StatsSummary.EntityInformation.TimeLeft / TimeSpan.TicksPerSecond); Timer.Content = interval.ToString(@"mm\:ss"); Timer.Foreground = Brushes.LightCoral; } else { var interval = TimeSpan.FromSeconds(message.StatsSummary.EntityInformation.Interval / TimeSpan.TicksPerSecond); Timer.Content = interval.ToString(@"mm\:ss"); if (message.StatsSummary.EntityInformation.Interval == 0 && BasicTeraData.Instance.WindowData.ShowTimeLeft) { Timer.Foreground = Brushes.LightCoral; } else { Timer.Foreground = Brushes.White; } } Players.Items.Clear(); foreach (var item in statsDamage) { if (!Controls.ContainsKey(item.Source)) { continue; } if (Players.Items.Contains(Controls[item.Source])) { BasicTeraData.LogError( "duplicate playerinfo: \r\n" + string.Join("\r\n ", statsDamage.Select(x => x.Source.ToString() + " -> " + x.Amount)), false, true); continue; } Players.Items.Add(Controls[item.Source]); Controls[item.Source].Repaint(item, statsHeal.FirstOrDefault(x => x.Source == item.Source), message.StatsSummary.EntityInformation, message.Skills, message.Abnormals.Get(item.Source), message.TimedEncounter); } if (BasicTeraData.Instance.WindowData.InvisibleUi && !_paused) { if (Controls.Count > 0 && !ForceWindowVisibilityHidden && Visibility != Visibility.Visible) { ShowWindow(); } //Visibility = Visibility.Visible; } if (Controls.Count == 0 && Visibility != Visibility.Hidden) { HideWindow(); } //Visibility = Visibility.Hidden; } } else if (!ForceWindowVisibilityHidden && Visibility != Visibility.Visible) { ShowWindow(); } //Visibility = Visibility.Visible; } if (TeraWindow.IsTeraActive() && BasicTeraData.Instance.WindowData.Topmost) { StayTopMost(); } if (BasicTeraData.Instance.WindowData.RealtimeGraphEnabled) { GraphViewModel.Update(message); Graph.Visibility = Visibility.Visible; } else { Graph.Visibility = Visibility.Collapsed; GraphViewModel.Reset(); } } Dispatcher.Invoke((PacketProcessor.UpdateUiHandler)ChangeUi, nmessage); }
public Skills(Dictionary <long, Dictionary <DamageMeter.Skills.Skill.Skill, SkillStats> > timedSkills, Dictionary <long, Dictionary <DamageMeter.Skills.Skill.Skill, SkillStats> > timedAllSkills, PlayerStats parent, PlayerInfo playerInfo, PlayerAbnormals buffs, Entity currentBoss, bool timedEncounter, long firstHit, long lastHit) { InitializeComponent(); TabControl.SelectionChanged += TabControlOnSelectionChanged; _parent = parent; CloseWindow.Source = BasicTeraData.Instance.ImageDatabase.Close.Source; BackgroundColor.Opacity = BasicTeraData.Instance.WindowData.SkillWindowOpacity; Update(timedSkills, timedAllSkills, playerInfo, buffs, currentBoss, timedEncounter, firstHit, lastHit); }