public void EnsureCoreContentPackageSelected() { if (SelectedContentPackages.Any(cp => cp.CorePackage)) { return; } if (GameMain.VanillaContent != null) { SelectedContentPackages.Add(GameMain.VanillaContent); } else { var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); if (availablePackage != null) { SelectedContentPackages.Add(availablePackage); } } }
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(); } }
private void LoadContentPackages(IEnumerable <string> contentPackagePaths) { var missingPackagePaths = new List <string>(); var incompatiblePackages = new List <ContentPackage>(); SelectedContentPackages.Clear(); foreach (string path in contentPackagePaths) { 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); } } TextManager.LoadTextPacks(SelectedContentPackages); 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(); } //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())); } }
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(); } }