private void LoadGraphicSettings(XDocument doc) { XElement graphicsMode = doc.Root.Element("graphicsmode"); GraphicsWidth = graphicsMode.GetAttributeInt("width", GraphicsWidth); GraphicsHeight = graphicsMode.GetAttributeInt("height", GraphicsHeight); VSyncEnabled = graphicsMode.GetAttributeBool("vsync", VSyncEnabled); XElement graphicsSettings = doc.Root.Element("graphicssettings"); ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", ParticleLimit); LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", LightMapScale), 0.1f, 1.0f); SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", SpecularityEnabled); ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", ChromaticAberrationEnabled); HUDScale = graphicsSettings.GetAttributeFloat("hudscale", HUDScale); InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", InventoryScale); var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent"); if (!Enum.TryParse(losModeStr, out losMode)) { losMode = LosMode.Transparent; } #if CLIENT if (GraphicsWidth == 0 || GraphicsHeight == 0) { GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; } #endif var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen"); if (!Enum.TryParse(windowModeStr, out windowMode)) { windowMode = WindowMode.Fullscreen; } }
private void SetDefaultValues(bool resetLanguage = true) { GraphicsWidth = 0; GraphicsHeight = 0; VSyncEnabled = true; #if DEBUG EnableSplashScreen = false; #else EnableSplashScreen = true; #endif ParticleLimit = 1500; LightMapScale = 0.5f; SpecularityEnabled = false; ChromaticAberrationEnabled = true; PauseOnFocusLost = true; MuteOnFocusLost = false; UseDirectionalVoiceChat = true; VoiceSetting = VoiceMode.Disabled; VoiceCaptureDevice = null; NoiseGateThreshold = -45; windowMode = WindowMode.Fullscreen; losMode = LosMode.Transparent; useSteamMatchmaking = true; requireSteamAuthentication = true; QuickStartSubmarineName = string.Empty; CharacterHeadIndex = 1; CharacterHairIndex = -1; CharacterBeardIndex = -1; CharacterMoustacheIndex = -1; CharacterFaceAttachmentIndex = -1; CharacterGender = Gender.None; CharacterRace = Race.White; aimAssistAmount = 0.5f; EnableMouseLook = true; CrewMenuOpen = true; ChatOpen = true; soundVolume = 0.5f; musicVolume = 0.3f; DynamicRangeCompressionEnabled = true; VoipAttenuationEnabled = true; voiceChatVolume = 0.5f; microphoneVolume = 1.0f; AutoCheckUpdates = true; defaultPlayerName = string.Empty; HUDScale = 1; InventoryScale = 1; AutoUpdateWorkshopItems = true; CampaignDisclaimerShown = false; if (resetLanguage) { Language = "English"; } MasterServerUrl = "http://www.undertowgames.com/baromaster"; WasGameUpdated = false; VerboseLogging = false; SaveDebugConsoleLogs = false; AutoUpdateWorkshopItems = true; }
private void LoadDefaultConfig(bool setLanguage = true) { XDocument doc = XMLExtensions.TryLoadXml(savePath); if (setLanguage || string.IsNullOrEmpty(Language)) { Language = doc.Root.GetAttributeString("language", "English"); } MasterServerUrl = doc.Root.GetAttributeString("masterserverurl", ""); AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", true); WasGameUpdated = doc.Root.GetAttributeBool("wasgameupdated", false); VerboseLogging = doc.Root.GetAttributeBool("verboselogging", false); SaveDebugConsoleLogs = doc.Root.GetAttributeBool("savedebugconsolelogs", false); QuickStartSubmarineName = doc.Root.GetAttributeString("quickstartsub", ""); if (doc == null) { GraphicsWidth = 1024; GraphicsHeight = 678; MasterServerUrl = ""; SelectedContentPackages.Add(ContentPackage.List.Any() ? ContentPackage.List[0] : new ContentPackage("")); jobPreferences = new List <string>(); foreach (JobPrefab job in JobPrefab.List) { jobPreferences.Add(job.Identifier); } return; } XElement graphicsMode = doc.Root.Element("graphicsmode"); GraphicsWidth = 0; GraphicsHeight = 0; VSyncEnabled = graphicsMode.GetAttributeBool("vsync", true); XElement graphicsSettings = doc.Root.Element("graphicssettings"); ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", 1500); LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", 0.5f), 0.1f, 1.0f); SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", true); ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", true); HUDScale = graphicsSettings.GetAttributeFloat("hudscale", 1.0f); InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", 1.0f); var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent"); if (!Enum.TryParse(losModeStr, out losMode)) { losMode = LosMode.Transparent; } #if CLIENT if (GraphicsWidth == 0 || GraphicsHeight == 0) { GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; } #endif var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen"); if (!Enum.TryParse(windowModeStr, out WindowMode wm)) { wm = WindowMode.Fullscreen; } WindowMode = wm; useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", true); requireSteamAuthentication = doc.Root.GetAttributeBool("requiresteamauthentication", true); AutoUpdateWorkshopItems = doc.Root.GetAttributeBool("autoupdateworkshopitems", true); #if DEBUG EnableSplashScreen = false; #else EnableSplashScreen = doc.Root.GetAttributeBool("enablesplashscreen", true); #endif AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f); SetDefaultBindings(doc, legacy: false); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "keymapping": LoadKeyBinds(subElement); break; case "gameplay": jobPreferences = new List <string>(); foreach (XElement ele in subElement.Element("jobpreferences").Elements("job")) { string jobIdentifier = ele.GetAttributeString("identifier", ""); if (string.IsNullOrEmpty(jobIdentifier)) { continue; } jobPreferences.Add(jobIdentifier); } break; case "player": defaultPlayerName = subElement.GetAttributeString("name", ""); CharacterHeadIndex = subElement.GetAttributeInt("headindex", CharacterHeadIndex); if (Enum.TryParse(subElement.GetAttributeString("gender", "none"), true, out Gender g)) { CharacterGender = g; } if (Enum.TryParse(subElement.GetAttributeString("race", "white"), true, out Race r)) { CharacterRace = r; } else { CharacterRace = Race.White; } CharacterHairIndex = subElement.GetAttributeInt("hairindex", -1); CharacterBeardIndex = subElement.GetAttributeInt("beardindex", -1); CharacterMoustacheIndex = subElement.GetAttributeInt("moustacheindex", -1); CharacterFaceAttachmentIndex = subElement.GetAttributeInt("faceattachmentindex", -1); break; } } List <string> missingPackagePaths = new List <string>(); List <ContentPackage> incompatiblePackages = new List <ContentPackage>(); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "contentpackage": string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", "")); var matchingContentPackage = ContentPackage.List.Find(cp => System.IO.Path.GetFullPath(cp.Path) == path); if (matchingContentPackage == null) { missingPackagePaths.Add(path); } else if (!matchingContentPackage.IsCompatible()) { incompatiblePackages.Add(matchingContentPackage); } else { SelectedContentPackages.Add(matchingContentPackage); } break; } } TextManager.LoadTextPacks(SelectedContentPackages); //display error messages after all content packages have been loaded //to make sure the package that contains text files has been loaded before we attempt to use TextManager foreach (string missingPackagePath in missingPackagePaths) { DebugConsole.ThrowError(TextManager.GetWithVariable("ContentPackageNotFound", "[packagepath]", missingPackagePath)); } foreach (ContentPackage incompatiblePackage in incompatiblePackages) { DebugConsole.ThrowError(TextManager.GetWithVariables(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage", new string[3] { "[packagename]", "[packageversion]", "[gameversion]" }, new string[3] { incompatiblePackage.Name, incompatiblePackage.GameVersion.ToString(), GameMain.Version.ToString() })); } foreach (ContentPackage contentPackage in SelectedContentPackages) { bool packageOk = contentPackage.VerifyFiles(out List <string> errorMessages); if (!packageOk) { DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\":\n" + string.Join("\n", errorMessages)); continue; } foreach (ContentFile file in contentPackage.Files) { ToolBox.IsProperFilenameCase(file.Path); } } if (!SelectedContentPackages.Any()) { var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); if (availablePackage != null) { SelectedContentPackages.Add(availablePackage); } } //save to get rid of the invalid selected packages in the config file if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); } }
// TODO: DRY /// <summary> /// Returns false if no player config file was found, in which case a new file is created. /// </summary> private bool LoadPlayerConfigInternal() { XDocument doc = XMLExtensions.LoadXml(playerSavePath); if (doc == null || doc.Root == null) { ShowUserStatisticsPrompt = true; return(false); } Language = doc.Root.GetAttributeString("language", Language); AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", AutoCheckUpdates); sendUserStatistics = doc.Root.GetAttributeBool("senduserstatistics", true); XElement graphicsMode = doc.Root.Element("graphicsmode"); GraphicsWidth = graphicsMode.GetAttributeInt("width", GraphicsWidth); GraphicsHeight = graphicsMode.GetAttributeInt("height", GraphicsHeight); VSyncEnabled = graphicsMode.GetAttributeBool("vsync", VSyncEnabled); XElement graphicsSettings = doc.Root.Element("graphicssettings"); ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", ParticleLimit); LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", LightMapScale), 0.1f, 1.0f); SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", SpecularityEnabled); ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", ChromaticAberrationEnabled); HUDScale = graphicsSettings.GetAttributeFloat("hudscale", HUDScale); InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", InventoryScale); var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent"); if (!Enum.TryParse(losModeStr, out losMode)) { losMode = LosMode.Transparent; } #if CLIENT if (GraphicsWidth == 0 || GraphicsHeight == 0) { GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; } #endif var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen"); if (!Enum.TryParse(windowModeStr, out windowMode)) { windowMode = WindowMode.Fullscreen; } XElement audioSettings = doc.Root.Element("audio"); if (audioSettings != null) { SoundVolume = audioSettings.GetAttributeFloat("soundvolume", SoundVolume); MusicVolume = audioSettings.GetAttributeFloat("musicvolume", MusicVolume); VoiceChatVolume = audioSettings.GetAttributeFloat("voicechatvolume", VoiceChatVolume); MuteOnFocusLost = audioSettings.GetAttributeBool("muteonfocuslost", false); UseDirectionalVoiceChat = audioSettings.GetAttributeBool("usedirectionalvoicechat", true); string voiceSettingStr = audioSettings.GetAttributeString("voicesetting", "Disabled"); VoiceCaptureDevice = audioSettings.GetAttributeString("voicecapturedevice", ""); NoiseGateThreshold = audioSettings.GetAttributeFloat("noisegatethreshold", -45); var voiceSetting = VoiceMode.Disabled; if (Enum.TryParse(voiceSettingStr, out voiceSetting)) { VoiceSetting = voiceSetting; } } useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", useSteamMatchmaking); requireSteamAuthentication = doc.Root.GetAttributeBool("requiresteamauthentication", requireSteamAuthentication); EnableSplashScreen = doc.Root.GetAttributeBool("enablesplashscreen", EnableSplashScreen); PauseOnFocusLost = doc.Root.GetAttributeBool("pauseonfocuslost", PauseOnFocusLost); AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", AimAssistAmount); EnableMouseLook = doc.Root.GetAttributeBool("enablemouselook", EnableMouseLook); CrewMenuOpen = doc.Root.GetAttributeBool("crewmenuopen", CrewMenuOpen); ChatOpen = doc.Root.GetAttributeBool("chatopen", ChatOpen); CampaignDisclaimerShown = doc.Root.GetAttributeBool("campaigndisclaimershown", false); EditorDisclaimerShown = doc.Root.GetAttributeBool("editordisclaimershown", false); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "keymapping": LoadKeyBinds(subElement); break; case "gameplay": jobPreferences = new List <string>(); foreach (XElement ele in subElement.Element("jobpreferences").Elements("job")) { string jobIdentifier = ele.GetAttributeString("identifier", ""); if (string.IsNullOrEmpty(jobIdentifier)) { continue; } jobPreferences.Add(jobIdentifier); } break; case "player": defaultPlayerName = subElement.GetAttributeString("name", defaultPlayerName); CharacterHeadIndex = subElement.GetAttributeInt("headindex", CharacterHeadIndex); if (Enum.TryParse(subElement.GetAttributeString("gender", "none"), true, out Gender g)) { CharacterGender = g; } if (Enum.TryParse(subElement.GetAttributeString("race", "white"), true, out Race r)) { CharacterRace = r; } else { CharacterRace = Race.White; } CharacterHairIndex = subElement.GetAttributeInt("hairindex", CharacterHairIndex); CharacterBeardIndex = subElement.GetAttributeInt("beardindex", CharacterBeardIndex); CharacterMoustacheIndex = subElement.GetAttributeInt("moustacheindex", CharacterMoustacheIndex); CharacterFaceAttachmentIndex = subElement.GetAttributeInt("faceattachmentindex", CharacterFaceAttachmentIndex); break; case "tutorials": foreach (XElement tutorialElement in subElement.Elements()) { CompletedTutorialNames.Add(tutorialElement.GetAttributeString("name", "")); } break; } } UnsavedSettings = false; selectedContentPackagePaths = new HashSet <string>(); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "contentpackage": string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", "")); selectedContentPackagePaths.Add(path); break; } } LoadContentPackages(selectedContentPackagePaths); return(true); }
public void LoadDefaultConfig() { XDocument doc = XMLExtensions.TryLoadXml(savePath); Language = doc.Root.GetAttributeString("language", "English"); MasterServerUrl = doc.Root.GetAttributeString("masterserverurl", ""); AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", true); WasGameUpdated = doc.Root.GetAttributeBool("wasgameupdated", false); VerboseLogging = doc.Root.GetAttributeBool("verboselogging", false); SaveDebugConsoleLogs = doc.Root.GetAttributeBool("savedebugconsolelogs", false); #if DEBUG UseSteam = doc.Root.GetAttributeBool("usesteam", true); #endif QuickStartSubmarineName = doc.Root.GetAttributeString("quickstartsub", ""); if (doc == null) { GraphicsWidth = 1024; GraphicsHeight = 678; MasterServerUrl = ""; SelectedContentPackages.Add(ContentPackage.List.Any() ? ContentPackage.List[0] : new ContentPackage("")); jobPreferences = new List <string>(); foreach (JobPrefab job in JobPrefab.List) { jobPreferences.Add(job.Identifier); } return; } XElement graphicsMode = doc.Root.Element("graphicsmode"); GraphicsWidth = 0; GraphicsHeight = 0; VSyncEnabled = graphicsMode.GetAttributeBool("vsync", true); XElement graphicsSettings = doc.Root.Element("graphicssettings"); ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", 1500); LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", 0.5f), 0.1f, 1.0f); SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", true); ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", true); HUDScale = graphicsSettings.GetAttributeFloat("hudscale", 1.0f); InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", 1.0f); var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent"); if (!Enum.TryParse(losModeStr, out losMode)) { losMode = LosMode.Transparent; } #if CLIENT if (GraphicsWidth == 0 || GraphicsHeight == 0) { GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; } #endif var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen"); if (!Enum.TryParse(windowModeStr, out WindowMode wm)) { wm = WindowMode.Fullscreen; } WindowMode = wm; useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", true); requireSteamAuthentication = doc.Root.GetAttributeBool("requiresteamauthentication", true); AutoUpdateWorkshopItems = doc.Root.GetAttributeBool("autoupdateworkshopitems", true); #if DEBUG EnableSplashScreen = false; #else EnableSplashScreen = doc.Root.GetAttributeBool("enablesplashscreen", true); #endif AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f); keyMapping = new KeyOrMouse[Enum.GetNames(typeof(InputType)).Length]; keyMapping[(int)InputType.Up] = new KeyOrMouse(Keys.W); keyMapping[(int)InputType.Down] = new KeyOrMouse(Keys.S); keyMapping[(int)InputType.Left] = new KeyOrMouse(Keys.A); keyMapping[(int)InputType.Right] = new KeyOrMouse(Keys.D); keyMapping[(int)InputType.Run] = new KeyOrMouse(Keys.LeftShift); keyMapping[(int)InputType.InfoTab] = new KeyOrMouse(Keys.Tab); keyMapping[(int)InputType.Chat] = new KeyOrMouse(Keys.T); keyMapping[(int)InputType.RadioChat] = new KeyOrMouse(Keys.Y); keyMapping[(int)InputType.CrewOrders] = new KeyOrMouse(Keys.C); keyMapping[(int)InputType.Select] = new KeyOrMouse(Keys.E); keyMapping[(int)InputType.SelectNextCharacter] = new KeyOrMouse(Keys.Tab); keyMapping[(int)InputType.SelectPreviousCharacter] = new KeyOrMouse(Keys.Q); keyMapping[(int)InputType.Voice] = new KeyOrMouse(Keys.V); keyMapping[(int)InputType.Use] = new KeyOrMouse(0); keyMapping[(int)InputType.Aim] = new KeyOrMouse(1); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "keymapping": foreach (XAttribute attribute in subElement.Attributes()) { if (Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType)) { if (int.TryParse(attribute.Value.ToString(), out int mouseButton)) { keyMapping[(int)inputType] = new KeyOrMouse(mouseButton); } else { if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key)) { keyMapping[(int)inputType] = new KeyOrMouse(key); } } } } break; case "gameplay": jobPreferences = new List <string>(); foreach (XElement ele in subElement.Element("jobpreferences").Elements("job")) { string jobIdentifier = ele.GetAttributeString("identifier", ""); if (string.IsNullOrEmpty(jobIdentifier)) { continue; } jobPreferences.Add(jobIdentifier); } break; case "player": defaultPlayerName = subElement.GetAttributeString("name", ""); CharacterHeadIndex = subElement.GetAttributeInt("headindex", CharacterHeadIndex); if (Enum.TryParse(subElement.GetAttributeString("gender", "none"), true, out Gender g)) { CharacterGender = g; } if (Enum.TryParse(subElement.GetAttributeString("race", "white"), true, out Race r)) { CharacterRace = r; } else { CharacterRace = Race.White; } CharacterHairIndex = subElement.GetAttributeInt("hairindex", -1); CharacterBeardIndex = subElement.GetAttributeInt("beardindex", -1); CharacterMoustacheIndex = subElement.GetAttributeInt("moustacheindex", -1); CharacterFaceAttachmentIndex = subElement.GetAttributeInt("faceattachmentindex", -1); break; } } foreach (InputType inputType in Enum.GetValues(typeof(InputType))) { if (keyMapping[(int)inputType] == null) { DebugConsole.ThrowError("Key binding for the input type \"" + inputType + " not set!"); keyMapping[(int)inputType] = new KeyOrMouse(Keys.D1); } } List <string> missingPackagePaths = new List <string>(); List <ContentPackage> incompatiblePackages = new List <ContentPackage>(); foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "contentpackage": string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", "")); var matchingContentPackage = ContentPackage.List.Find(cp => System.IO.Path.GetFullPath(cp.Path) == path); if (matchingContentPackage == null) { missingPackagePaths.Add(path); } else if (!matchingContentPackage.IsCompatible()) { incompatiblePackages.Add(matchingContentPackage); } else { SelectedContentPackages.Add(matchingContentPackage); } break; } } TextManager.LoadTextPacks(SelectedContentPackages); //display error messages after all content packages have been loaded //to make sure the package that contains text files has been loaded before we attempt to use TextManager foreach (string missingPackagePath in missingPackagePaths) { DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath)); } foreach (ContentPackage incompatiblePackage in incompatiblePackages) { DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") .Replace("[packagename]", incompatiblePackage.Name) .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString()) .Replace("[gameversion]", GameMain.Version.ToString())); } foreach (ContentPackage contentPackage in SelectedContentPackages) { foreach (ContentFile file in contentPackage.Files) { if (!System.IO.File.Exists(file.Path)) { DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); continue; } ToolBox.IsProperFilenameCase(file.Path); } } if (!SelectedContentPackages.Any()) { var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); if (availablePackage != null) { SelectedContentPackages.Add(availablePackage); } } //save to get rid of the invalid selected packages in the config file if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); } }