//private readonly SystemTray _systemTray; public MainWindow() { InitializeComponent(); // Handler for exceptions in threads behind forms. App.SplashScreen?.SetText("Initializing main window..."); Application.ThreadException += GlobalThreadExceptionHandler; if (BasicTeraData.Instance.WindowData.InvisibleUi) { Visibility = Visibility.Hidden; } System.Windows.Application.Current.Resources["Scale"] = BasicTeraData.Instance.WindowData.Scale; if (BasicTeraData.Instance.WindowData.LowPriority) { Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle; } Console.WriteLine("SuperUniqueStringEasilyDetectableToBeAbleToRandomizeTheProgramAndBypassSignatureBasedBlock"); TeraSniffer.Instance.Enabled = true; TeraSniffer.Instance.Warning += PcapWarning; PacketProcessor.Instance.Connected += HandleConnected; PacketProcessor.Instance.TickUpdated += Update; PacketProcessor.Instance.SetClickThrouAction += SetClickThrou; PacketProcessor.Instance.UnsetClickThrouAction += UnsetClickThrou; PacketProcessor.Instance.GuildIconAction += InstanceOnGuildIconAction; PacketProcessor.Instance.PauseAction += PauseState; PacketProcessor.Instance.MapChangedAction += MapChanged; PacketProcessor.Instance.DisplayGeneralDataChanged += OnDisplayGeneralDataChanged; _dispatcherTimer = new DispatcherTimer(); _dispatcherTimer.Tick += UpdateKeyboard; _dispatcherTimer.Interval = new TimeSpan(0, 0, 1); _dispatcherTimer.Start(); if (BasicTeraData.Instance.WindowData.EnableOverlay) { DXrender = new D3D9Render.Renderer(); } EntityStatsImage.Source = BasicTeraData.Instance.ImageDatabase.EntityStats.Source; Chrono.Source = BasicTeraData.Instance.ImageDatabase.Chronobar.Source; Chrono.ToolTip = LP.MainWindow_Only_boss; CloseWindow.Source = BasicTeraData.Instance.ImageDatabase.Close.Source; History.Source = BasicTeraData.Instance.ImageDatabase.History.Source; Config.Source = BasicTeraData.Instance.ImageDatabase.Config.Source; Chatbox.Source = BasicTeraData.Instance.ImageDatabase.Chat.Source; BossGageImg.Source = BasicTeraData.Instance.ImageDatabase.BossGage.Source; HideNamesImage.Source = BasicTeraData.Instance.ImageDatabase.HideNicknames.Source; UserPauseBtn.Source = BasicTeraData.Instance.ImageDatabase.Pause.Source; HideNames.ToolTip = LP.Blur_player_names; ListEncounter.PreviewKeyDown += ListEncounterOnPreviewKeyDown; UpdateComboboxEncounter(new List <NpcEntity>(), null); Title = "Shinra Meter V" + UpdateManager.Version; BackgroundColor.Opacity = BasicTeraData.Instance.WindowData.MainWindowOpacity; Topmost = BasicTeraData.Instance.WindowData.Topmost; ShowInTaskbar = !BasicTeraData.Instance.WindowData.Topmost; Scroller.MaxHeight = BasicTeraData.Instance.WindowData.NumberOfPlayersDisplayed * 30; _entityStats = new EntityStatsMain() { Scale = BasicTeraData.Instance.WindowData.DebuffsStatus.Scale, DontClose = true }; _bossGageBar = new BossGageWindow() { Scale = BasicTeraData.Instance.WindowData.BossGageStatus.Scale, DontClose = true }; _popupNotification = new PopupNotification() { DontClose = true }; _windowHistory = new TeradpsHistory(new ConcurrentDictionary <UploadData, NpcEntity>()) { Scale = BasicTeraData.Instance.WindowData.HistoryStatus.Scale, DontClose = true }; KeyboardHook.Instance.SwitchTopMost += delegate { NotifyIcon.SwitchStayTop(); }; SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding); NotifyIcon.Initialize(this); NotifyIcon.InitializeServerList(PacketProcessor.Instance.Initialize()); if (BasicTeraData.Instance.WindowData.ClickThrou) { SetClickThrou(); } GraphViewModel = new GraphViewModel(); }
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); }