From 12161b94dc2571fbb32066d2a3520d156054c37a Mon Sep 17 00:00:00 2001 From: EVEJay Date: Tue, 9 Jul 2024 15:14:18 +0200 Subject: [PATCH] Added multiple checks to catch null exceptions in different places. --- SMT/Overlay.xaml.cs | 104 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 23 deletions(-) diff --git a/SMT/Overlay.xaml.cs b/SMT/Overlay.xaml.cs index dfca66d..ae73aea 100644 --- a/SMT/Overlay.xaml.cs +++ b/SMT/Overlay.xaml.cs @@ -18,6 +18,7 @@ using System.Windows.Threading; using Windows.Services; using Microsoft.IdentityModel.Tokens; +using Microsoft.VisualBasic.Logging; using NHotkey; using SMT.EVEData; using static SMT.EVEData.Navigation; @@ -487,10 +488,12 @@ private float CalculatedOverlaySystemSize(string systemName) if (gathererMode) return overlaySystemSizeGatherer; - if (systemName == currentPlayersSystemData[OverlayCharacter]?.system?.Name) + if (OverlayCharacter != null && + currentPlayersSystemData[OverlayCharacter].system != null && + systemName == currentPlayersSystemData[OverlayCharacter]?.system?.Name) return overlaySystemSizeHunter * overlayCurrentSystemSizeHunterModifier; - if (currentPlayersSystemData.Any(s => s.Value.system.Name == systemName)) + if (currentPlayersSystemData.Where(s => s.Value.system != null).Any(s => s.Value.system.Name == systemName)) { return overlaySystemSizeHunter * overlayAdditionalCharacterSystemSizeHunterModifier; } @@ -642,37 +645,81 @@ private void UpdateCharacterData() } } - private void UpdatePlayerLocations(object sender, EventArgs e) + /// + /// Check if all chars in the internal list are still registered + /// with the main window. Clean up or close if not. + /// + private void ValidateCharacters() { - if (OverlayCharacter != null) + // It is ok to have the overlay character be null. + if (OverlayCharacter == null) { - if (currentPlayersSystemData[OverlayCharacter].system == null) - { - RefreshCurrentView(); - } - else if (OverlayCharacter.Location != currentPlayersSystemData[OverlayCharacter].system.Name || routeLines.Count > 0 && (routeLines.Count != OverlayCharacter.ActiveRoute.Count - 1)) + return; + } + + if (!mainWindow.EVEManager.LocalCharacters.Contains(OverlayCharacter)) + { + Close(); + } + + List pruneCharacters = new(); + foreach (KeyValuePair characterPair in currentPlayersSystemData) + { + if (!mainWindow.EVEManager.LocalCharacters.Contains(characterPair.Key)) { - RefreshCurrentView(); + pruneCharacters.Add(characterPair.Key); } - else + } + + foreach (LocalCharacter pruneCharacter in pruneCharacters) + { + currentPlayersSystemData.Remove(pruneCharacter); + } + } + + private void UpdatePlayerLocations(object sender, EventArgs e) + { + ValidateCharacters(); + + try + { + if (OverlayCharacter != null) { - foreach (LocalCharacter additionalCharacter in mainWindow.EVEManager.LocalCharacters) + if (currentPlayersSystemData[OverlayCharacter].system == null) { - if (additionalCharacter != OverlayCharacter) + RefreshCurrentView(); + } + else if (OverlayCharacter.Location != currentPlayersSystemData[OverlayCharacter].system.Name || + routeLines.Count > 0 && (routeLines.Count != OverlayCharacter.ActiveRoute.Count - 1)) + { + RefreshCurrentView(); + } + else + { + foreach (LocalCharacter additionalCharacter in mainWindow.EVEManager.LocalCharacters) { - if (additionalCharacter.Location != currentPlayersSystemData[additionalCharacter].system.Name) + if (additionalCharacter != OverlayCharacter) { - RefreshCurrentView(); - break; + if (additionalCharacter.Location != + currentPlayersSystemData[additionalCharacter].system.Name) + { + RefreshCurrentView(); + break; + } } } - } + } } } + catch (Exception) + { + } } private void UpdateDataOverlay(object sender, EventArgs e) { + ValidateCharacters(); + try { UpdateIntelData(); @@ -1002,14 +1049,16 @@ private void UpdateSystemList() // Gather data currentPlayersSystemData.Clear(); string currentLocation = OverlayCharacter.Location; - EVEData.System currentSystem = mainWindow.EVEManager.GetEveSystem(currentLocation); - currentPlayersSystemData.Add(OverlayCharacter, new OverlaySystemData(currentSystem)); - foreach (LocalCharacter additionalChar in mainWindow.EVEManager.LocalCharacters) + + // Bail out if the system name is empty or null. May happen during update. + if (String.IsNullOrEmpty(currentLocation)) { - if (!currentPlayersSystemData.ContainsKey(additionalChar)) - currentPlayersSystemData.Add(additionalChar, new OverlaySystemData(mainWindow.EVEManager.GetEveSystem(additionalChar.Location))); + ClearView(); + return; } - + + EVEData.System currentSystem = mainWindow.EVEManager.GetEveSystem(currentLocation); + // Bail out if the system does not exist. I.e. wormhole systems. if (currentSystem == null) { @@ -1017,6 +1066,15 @@ private void UpdateSystemList() ClearView(); return; } + + currentPlayersSystemData.Add(OverlayCharacter, new OverlaySystemData(currentSystem)); + foreach (LocalCharacter additionalChar in mainWindow.EVEManager.LocalCharacters) + { + if (!currentPlayersSystemData.ContainsKey(additionalChar)) + currentPlayersSystemData.Add(additionalChar, new OverlaySystemData(mainWindow.EVEManager.GetEveSystem(additionalChar.Location))); + } + + List> hierarchie = new List>();