diff --git a/Fallout4VR/Fallout4VR.csproj b/Fallout4VR/Fallout4VR.csproj new file mode 100644 index 000000000..052151fdd --- /dev/null +++ b/Fallout4VR/Fallout4VR.csproj @@ -0,0 +1,121 @@ + + + + + Debug + AnyCPU + {5BD924D2-3909-40B4-9B0F-C837987A6849} + Library + Nexus.Client.Games.Fallout4VR + Fallout4VR + v4.6 + 512 + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Properties\AssemblyInformationalVersion.cs + + + Properties\SharedSolutionVersionInfo.Auto.cs + + + + + + + + + + Resources.resx + True + True + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + {1732bb96-1f74-4b99-82d6-4d1239c9d36a} + Commanding + + + {211400c3-e73e-4eba-a9c7-9900df9e7719} + Fallout3 + + + {90b15f92-e808-4e48-a4d7-bf2551959145} + Fallout4 + + + {0055fb79-3587-486e-a87e-70304a61d7a4} + GamebryoBase + + + {33f65739-7cfb-4ec1-89ef-8b0b5440ab82} + ModManager.Interface + + + {d586e7d8-9c8e-48f0-b20c-31a52b37e9d3} + NexusClient.Interface + + + {5edd4e37-b8f3-403d-a2e9-aff31b21a236} + UI + + + {44caa655-38c2-4ca2-ba68-a8d5c44b169d} + Util + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Fallout4VR/Fallout4VRGameMode.cs b/Fallout4VR/Fallout4VRGameMode.cs new file mode 100644 index 000000000..7bc5c0267 --- /dev/null +++ b/Fallout4VR/Fallout4VRGameMode.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Nexus.Client.Games.Fallout3; +using Nexus.Client.Games.Fallout4; +using Nexus.Client.Games.Fallout4.Tools; +using Nexus.Client.Games.Gamebryo; +using Nexus.Client.Games.Tools; +using Nexus.Client.Util; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// Provides information required for the programme to manage Fallout4 plugins and mods. + /// + public class Fallout4VRGameMode : Fallout4GameMode + { + private static string[] SCRIPT_EXTENDER_EXECUTABLES = { "f4se_loader.exe" }; + private static bool m_booOldEditsWarning = false; + private Fallout4VRGameModeDescriptor m_gmdGameModeInfo = null; + private Fallout4VRLauncher m_glnGameLauncher = null; + private Fallout4ToolLauncher m_gtlToolLauncher = null; + private Fallout4SupportedTools m_stlSupportedTools = null; + private string m_strFallout4VRIni = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"My Games\Fallout4VR\Fallout4.ini"); + private string m_strFallout4VRPrefs = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"My Games\Fallout4VR\Fallout4Prefs.ini"); + private string m_strFallout4VRCustom = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"My Games\Fallout4VR\Fallout4Custom.ini"); + private string m_strLooseDefaultValue = @"STRINGS\"; + private string m_strPluginsDefaultValue = @"0"; + private string m_strInvalidateRequiredValue = @"1"; + private string m_strGuideLink = @"http://wiki.nexusmods.com/index.php/Fallout_4_Mod_Installation"; + + #region Properties + + /// + /// Gets the version of the installed game. + /// + /// The version of the installed game. + public override Version GameVersion + { + get + { + Version FO4Version = new Version("0.0.0.0"); + try + { + string strFullPath = null; + strFullPath = Path.Combine(GameModeEnvironmentInfo.InstallationPath, "Fallout4VR.exe"); + if (File.Exists(strFullPath)) + { + FO4Version = new Version(System.Diagnostics.FileVersionInfo.GetVersionInfo(strFullPath).FileVersion.Replace(", ", ".")); + return FO4Version; + } + else + return null; + } + catch { } + + return FO4Version; + } + } + + /// + /// Gets the list of possible script extender executable files for the game. + /// + /// The list of possible script extender executable files for the game. + protected override string[] ScriptExtenderExecutables + { + get + { + return SCRIPT_EXTENDER_EXECUTABLES; + } + } + + /// + /// Gets the path to the per user Fallout4 data. + /// + /// The path to the per user Fallout4 data. + public override string UserGameDataPath + { + get + { + return Path.Combine(EnvironmentInfo.PersonalDataFolderPath, @"My games\Fallout4VR"); + } + } + + /// + /// Gets the game launcher for the game mode. + /// + /// The game launcher for the game mode. + public override IGameLauncher GameLauncher + { + get + { + if (m_glnGameLauncher == null) + m_glnGameLauncher = new Fallout4VRLauncher(this, EnvironmentInfo); + return m_glnGameLauncher; + } + } + + /// + /// Gets the tool launcher for the game mode. + /// + /// The tool launcher for the game mode. + public override IToolLauncher GameToolLauncher + { + get + { + if (m_gtlToolLauncher == null) + m_gtlToolLauncher = new Fallout4ToolLauncher(this, EnvironmentInfo); + return m_gtlToolLauncher; + } + } + + /// + /// Gets the supported tool launcher for the game mode. + /// + /// The supported tool launcher for the game mode. + public override ISupportedToolsLauncher SupportedToolsLauncher + { + get + { + if (m_stlSupportedTools == null) + m_stlSupportedTools = new Fallout4SupportedTools(this, EnvironmentInfo); + return m_stlSupportedTools; + } + } + + /// + /// Gets the default game categories. + /// + /// The default game categories stored in the resource file. + public override string GameDefaultCategories + { + get + { + return Properties.Resources.Categories; + } + } + + /// + /// Gets the game Base files. + /// + /// The default game categories stored in the resource file. + public override string BaseGameFiles + { + get + { + return Properties.Resources.fallout4vr_base; + } + } + + /// + /// Whether the game requires the profile manager to save optional files. + /// + public override bool RequiresOptionalFilesCheckOnProfileSwitch + { + get + { + return true; + } + } + + /// + /// Gets whether the game mode supports the automatic sorting + /// functionality for plugins. + /// + public override bool SupportsPluginAutoSorting + { + get + { + return false; + } + } + + /// + /// Whether the plugin sorter is properly initialized. + /// + public override bool PluginSorterInitialized + { + get + { + return false; + } + } + + #endregion + + #region Constructors + + /// + /// A simple constructor that initializes the object with the given values. + /// + /// The file utility class to be used by the game mode. + /// The application's environment info. + public Fallout4VRGameMode(IEnvironmentInfo p_eifEnvironmentInfo, FileUtil p_futFileUtility) + : base(p_eifEnvironmentInfo, p_futFileUtility) + { + + } + + #endregion + + #region Initialization + + /// + /// Instantiates the container to use to store the list of settings files. + /// + /// The container to use to store the list of settings files. + protected override GamebryoSettingsFiles CreateSettingsFileContainer() + { + return new Fallout4VRSettingsFiles(); + } + + /// + /// Adds the settings files to the game mode's list. + /// + protected override void SetupSettingsFiles() + { + base.SetupSettingsFiles(); + SettingsFiles.IniPath = Path.Combine(UserGameDataPath, "Fallout4Custom.ini"); + ((FalloutSettingsFiles)SettingsFiles).FOPrefsIniPath = Path.Combine(UserGameDataPath, "Fallout4Prefs.ini"); + } + + #endregion + + /// + /// Whether the profile manager should save extra files for the current game mode. + /// + /// The list of optional files to save (if present) in a profile. + /// The list of files/plugins/mods to check. + public override string[] GetOptionalFilesList(string[] p_strList) + { + List strOptionalFiles = new List(); + + return strOptionalFiles.ToArray(); + } + + /// + /// Creates a game mode descriptor for the current game mode. + /// + /// A game mode descriptor for the current game mode. + protected override IGameModeDescriptor CreateGameModeDescriptor() + { + if (m_gmdGameModeInfo == null) + m_gmdGameModeInfo = new Fallout4VRGameModeDescriptor(EnvironmentInfo); + return m_gmdGameModeInfo; + } + + /// + /// Whether the profile manager should load extra files for the current game mode. + /// + /// The list of optional files to load (if present) in a profile. + /// The list of files/plugins/mods to load. + public override void SetOptionalFilesList(string[] p_strList) + { + if ((p_strList != null) && (p_strList.Length > 0)) + foreach (string strFile in p_strList) + File.Copy(strFile, Path.Combine(PluginDirectory, Path.GetFileName(strFile)), true); + } + + /// + /// Checks whether the current game mode requires external config steps to be taken before installing mods. + /// + /// Whether the current game mode requires external config steps to be taken before installing mods. + /// The message to show to the user. + public override bool RequiresExternalConfig(out string p_strMessage) + { + bool booLoose = false; + bool booPlugins = false; + bool booNewLoose = false; + p_strMessage = string.Empty; + + if (m_booOldEditsWarning) + return false; + + if (!File.Exists(m_strFallout4VRIni)) + return false; + + GamebryoIniReader girIniReader = new GamebryoIniReader(m_strFallout4VRIni); + string strLoose = girIniReader.GetValue("Archive", "sResourceDataDirsFinal", m_strLooseDefaultValue); + + if (!File.Exists(m_strFallout4VRPrefs)) + return false; + + girIniReader = new GamebryoIniReader(m_strFallout4VRPrefs); + string strPlugins = girIniReader.GetValue("Launcher", "bEnableFileSelection", null); + + if (!File.Exists(m_strFallout4VRCustom)) + return false; + + girIniReader = new GamebryoIniReader(m_strFallout4VRCustom); + string strCustomLoose = girIniReader.GetValue("Archive", "sResourceDataDirsFinal", m_strLooseDefaultValue); + string strCustomInvalidate = girIniReader.GetValue("Archive", "bInvalidateOlderFiles", null); + + if (!string.IsNullOrEmpty(strLoose)) + if (!strLoose.Equals(m_strLooseDefaultValue, StringComparison.OrdinalIgnoreCase)) + booLoose = true; + + if (string.IsNullOrEmpty(strPlugins)) + booPlugins = true; + else if (strPlugins.Equals(m_strPluginsDefaultValue, StringComparison.OrdinalIgnoreCase)) + booPlugins = true; + + if (string.IsNullOrEmpty(strCustomInvalidate)) + booNewLoose = true; + else if (!strCustomInvalidate.Equals(m_strInvalidateRequiredValue, StringComparison.OrdinalIgnoreCase)) + booNewLoose = true; + else if (strCustomLoose.Equals(m_strLooseDefaultValue, StringComparison.OrdinalIgnoreCase)) + booNewLoose = true; + + if (booNewLoose) + { + if (booLoose) + p_strMessage = string.Format("The old Fallout 4 ini edits are deprecated (the long string in the Fallout4.ini caused long loading times). Please remove the old edits and follow this updated guide:" + Environment.NewLine + Environment.NewLine + "{0}", m_strGuideLink); + else + p_strMessage = string.Format("To use Fallout 4 mods you are REQUIRED to make some necessary ini edits ({0}{1}{2}), please follow this guide:" + Environment.NewLine + Environment.NewLine + "{3}", booNewLoose ? "Fallout4Custom.ini" : "", (booNewLoose && booPlugins) ? " and " : "", booPlugins ? "Fallout4Prefs.ini" : "", m_strGuideLink); + } + else + { + if (booLoose) + { + p_strMessage = string.Format("The old Fallout4.ini edit is causing long loading times, please remove it from your .ini file, set it as:" + Environment.NewLine + "sResourceDataDirsFinal=" + Environment.NewLine + "(nothing after the '=')"); + m_booOldEditsWarning = true; + return true; + } + } + + m_booOldEditsWarning = true; + return (booNewLoose); + } + } +} diff --git a/Fallout4VR/Fallout4VRGameModeDescriptor.cs b/Fallout4VR/Fallout4VRGameModeDescriptor.cs new file mode 100644 index 000000000..481b83f43 --- /dev/null +++ b/Fallout4VR/Fallout4VRGameModeDescriptor.cs @@ -0,0 +1,118 @@ +using System.Drawing; +using Nexus.Client.Games.Gamebryo; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// Provides the basic information about the Fallout4 game mode. + /// + public class Fallout4VRGameModeDescriptor : GamebryoGameModeDescriptorBase + { + private static string[] EXECUTABLES = { "Fallout4VR.exe" }; + private static string[] CRITICAL_PLUGINS = { "Fallout4.esm", "Fallout4_VR.esm" }; + private static string[] OFFICIAL_PLUGINS = { }; + private static string[] OFFICIAL_UNMANAGED_PLUGINS = { }; + private const string MODE_ID = "Fallout4VR"; + + #region Properties + + /// + /// Gets the display name of the game mode. + /// + /// The display name of the game mode. + public override string Name + { + get + { + return "Fallout 4 VR"; + } + } + + /// + /// Gets the unique id of the game mode. + /// + /// The unique id of the game mode. + public override string ModeId + { + get + { + return MODE_ID; + } + } + + /// + /// Gets the list of possible executable files for the game. + /// + /// The list of possible executable files for the game. + public override string[] GameExecutables + { + get + { + return EXECUTABLES; + } + } + + /// + /// Gets the list of critical plugin filenames, ordered by load order. + /// + /// The list of critical plugin filenames, ordered by load order. + protected override string[] OrderedCriticalPluginFilenames + { + get + { + return CRITICAL_PLUGINS; + } + } + + /// + /// Gets the list of official plugin names, ordered by load order. + /// + /// The list of official plugin names, ordered by load order. + protected override string[] OrderedOfficialPluginFilenames + { + get + { + return OFFICIAL_PLUGINS; + } + } + + /// + /// Gets the list of official unmanageable plugin names, ordered by load order. + /// + /// The list of official unmanageable plugin names, ordered by load order. + protected override string[] OrderedOfficialUnmanagedPluginFilenames + { + get + { + return OFFICIAL_UNMANAGED_PLUGINS; + } + } + + /// + /// Gets the theme to use for this game mode. + /// + /// The theme to use for this game mode. + public override Theme ModeTheme + { + get + { + return new Theme(Properties.Resources.Fallout4VR_logo, Color.FromArgb(50, 104, 158),null); + } + } + + #endregion + + #region Constructors + + /// + /// A simple constructor that initializes the object with the given dependencies. + /// + /// The application's envrionment info. + public Fallout4VRGameModeDescriptor(IEnvironmentInfo p_eifEnvironmentInfo) + : base(p_eifEnvironmentInfo) + { + } + + #endregion + } +} diff --git a/Fallout4VR/Fallout4VRGameModeFactory.cs b/Fallout4VR/Fallout4VRGameModeFactory.cs new file mode 100644 index 000000000..22ad98d27 --- /dev/null +++ b/Fallout4VR/Fallout4VRGameModeFactory.cs @@ -0,0 +1,81 @@ +using Nexus.Client.Games.Gamebryo; +using Nexus.Client.UI; +using Nexus.Client.Util; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// The game mode factory that builds s. + /// + public class Fallout4VRGameModeFactory : GamebryoGameModeFactory + { + private readonly IGameModeDescriptor m_gmdGameModeDescriptor = null; + + #region Properties + + /// + /// Gets the descriptor of the game mode that this factory builds. + /// + /// The descriptor of the game mode that this factory builds. + public override IGameModeDescriptor GameModeDescriptor + { + get + { + return m_gmdGameModeDescriptor; + } + } + + #endregion + + #region Constructors + + /// + /// A simple consturctor that initializes the object with the given values. + /// + /// The application's environement info. + public Fallout4VRGameModeFactory(IEnvironmentInfo p_eifEnvironmentInfo) + : base(p_eifEnvironmentInfo) + { + m_gmdGameModeDescriptor = new Fallout4VRGameModeDescriptor(p_eifEnvironmentInfo); + } + + #endregion + + /// + /// Instantiates the game mode. + /// + /// The file utility class to be used by the game mode. + /// The game mode for which this is a factory. + protected override GamebryoGameModeBase InstantiateGameMode(FileUtil p_futFileUtility) + { + return new Fallout4VRGameMode(EnvironmentInfo, p_futFileUtility); + } + + /// + /// Performs the initializtion for the game mode being created. + /// + /// The delegate to use to display a view. + /// The delegate to use to display a message. + /// true if the setup completed successfully; + /// false otherwise. + public override bool PerformInitialization(ShowViewDelegate p_dlgShowView, ShowMessageDelegate p_dlgShowMessage) + { + return true; + } + + /// + /// Gets the path where mod files should be installed. + /// + /// The path where mod files should be installed, or + /// null if the path could not be determined. + public override string GetInstallationPath() + { + var strValue = SteamInstallationPathDetector.Instance.GetSteamInstallationPath("611660", "Fallout4VR", "Fallout4VR.exe"); + + if (string.IsNullOrEmpty(strValue)) + strValue = base.GetInstallationPath(); + + return strValue; + } + } +} diff --git a/Fallout4VR/Fallout4VRLauncher.cs b/Fallout4VR/Fallout4VRLauncher.cs new file mode 100644 index 000000000..c3e5bab08 --- /dev/null +++ b/Fallout4VR/Fallout4VRLauncher.cs @@ -0,0 +1,97 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using Nexus.Client.Commands; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// Launches Fallout4. + /// + public class Fallout4VRLauncher : GameLauncherBase + { + #region Constructors + + /// + /// A simple constructor that initializes the object with the given dependencies. + /// + /// >The game mode currently being managed. + /// The application's envrionment info. + public Fallout4VRLauncher(IGameMode p_gmdGameMode, IEnvironmentInfo p_eifEnvironmentInfo) + :base(p_gmdGameMode, p_eifEnvironmentInfo) + { + } + + #endregion + + /// + /// Initializes the game launch commands. + /// + protected override void SetupCommands() + { + Trace.TraceInformation("Launch Commands:"); + Trace.Indent(); + + ClearLaunchCommands(); + + string strCommand = GetPlainLaunchCommand(); + Trace.TraceInformation("Plain Command: {0} (IsNull={1})", strCommand, (strCommand == null)); + Image imgIcon = File.Exists(strCommand) ? Icon.ExtractAssociatedIcon(strCommand).ToBitmap() : null; + AddLaunchCommand(new Command("PlainLaunch", "Launch Fallout4VR", "Launches Fallout 4 VR.", imgIcon, LaunchFallout4VR, true)); + + Trace.Unindent(); + } + + #region Launch Commands + + /// + /// Launches the game, without OBSE. + /// + private void LaunchFallout4VR() + { + ForceReadOnlyPluginsFile(); + Trace.TraceInformation("Launching Fallout 4 VR..."); + Trace.Indent(); + string strCommand = GetPlainLaunchCommand(); + Trace.TraceInformation("Command: " + strCommand); + Launch(strCommand, null); + } + + /// + /// Gets the plain launch command. + /// + /// The plain launch command. + private string GetPlainLaunchCommand() + { + return Path.Combine(GameMode.GameModeEnvironmentInfo.InstallationPath, "Fallout4VR.exe"); + } + + #endregion + + private void ForceReadOnlyPluginsFile() + { + Trace.TraceInformation("Setting plugins.txt to read-only"); + Trace.Indent(); + string strLocalAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + string strPluginsFilePath = Path.Combine(strLocalAppData, GameMode.ModeId, "plugins.txt"); + SetFileReadAccess(strPluginsFilePath, true); + } + + /// + /// Sets the read-only value of a file. + /// + private static void SetFileReadAccess(string p_strFileName, bool p_booSetReadOnly) + { + try + { + // Create a new FileInfo object. + FileInfo fInfo = new FileInfo(p_strFileName); + + // Set the IsReadOnly property. + fInfo.IsReadOnly = p_booSetReadOnly; + } + catch { } + } + } +} diff --git a/Fallout4VR/Fallout4VRSettingsFiles.cs b/Fallout4VR/Fallout4VRSettingsFiles.cs new file mode 100644 index 000000000..3cec0f3dc --- /dev/null +++ b/Fallout4VR/Fallout4VRSettingsFiles.cs @@ -0,0 +1,30 @@ +using Nexus.Client.Games.Fallout3; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// The paths of the settings files used by Fallout4. + /// + public class Fallout4VRSettingsFiles : FalloutSettingsFiles + { + #region Properties + + /// + /// Gets or sets the path to the Fallout4_default.ini file. + /// + /// The path to the Fallout4_default.ini file. + public string Fallout4VRDefaultIniPath + { + get + { + return this["Fallout4VRDefaultIniPath"]; + } + set + { + this["Fallout4VRDefaultIniPath"] = value; + } + } + + #endregion + } +} diff --git a/Fallout4VR/Fallout4VRSupportedTools.cs b/Fallout4VR/Fallout4VRSupportedTools.cs new file mode 100644 index 000000000..e84840ea6 --- /dev/null +++ b/Fallout4VR/Fallout4VRSupportedTools.cs @@ -0,0 +1,352 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using Nexus.Client.Commands; +using Nexus.Client.Util; +using Microsoft.Win32; + +namespace Nexus.Client.Games.Fallout4VR +{ + /// + /// Launches Fallout4. + /// + public class Fallout4SupportedTools : SupportedToolsLauncherBase + { + #region Constructors + + /// + /// A simple constructor that initializes the object with the given dependencies. + /// + public Fallout4SupportedTools(IGameMode p_gmdGameMode, IEnvironmentInfo p_eifEnvironmentInfo) + : base(p_gmdGameMode, p_eifEnvironmentInfo) + { + } + + #endregion + + /// + /// Initializes the supported tools launch commands. + /// + public override void SetupCommands() + { + + Trace.TraceInformation("Launch Commands:"); + Trace.Indent(); + Image imgIcon = null; + + ClearLaunchCommands(); + + string strCommand = GetLOOTLaunchCommand(); + Trace.TraceInformation("LOOT Command: {0} (IsNull={1})", strCommand, (strCommand == null)); + if ((strCommand != null) && (File.Exists(strCommand))) + { + imgIcon = File.Exists(strCommand) ? Icon.ExtractAssociatedIcon(strCommand).ToBitmap() : null; + AddLaunchCommand(new Command("LOOT", "Launch LOOT", "Launches LOOT.", imgIcon, LaunchLOOT, true)); + } + else + { + imgIcon = null; + AddLaunchCommand(new Command("Config#LOOT", "Config LOOT", "Configures LOOT.", imgIcon, ConfigLOOT, true)); + } + + strCommand = GetFO4EditLaunchCommand(); + Trace.TraceInformation("FO4Edit Command: {0} (IsNull={1})", strCommand, (strCommand == null)); + if ((strCommand != null) && (File.Exists(strCommand))) + { + imgIcon = File.Exists(strCommand) ? Icon.ExtractAssociatedIcon(strCommand).ToBitmap() : null; + AddLaunchCommand(new Command("FO4Edit", "Launch FO4Edit", "Launches FO4Edit.", imgIcon, LaunchFO4Edit, true)); + } + else + { + imgIcon = null; + AddLaunchCommand(new Command("Config#FO4Edit", "Config FO4Edit", "Configures FO4Edit.", imgIcon, ConfigFO4Edit, true)); + } + + strCommand = GetBSLaunchCommand(); + Trace.TraceInformation("BodySlide Command: {0} (IsNull={1})", strCommand, (strCommand == null)); + if ((strCommand != null) && (File.Exists(strCommand))) + { + imgIcon = File.Exists(strCommand) ? Icon.ExtractAssociatedIcon(strCommand).ToBitmap() : null; + AddLaunchCommand(new Command("BS2", "Launch BodySlide", "Launches BodySlide.", imgIcon, LaunchBS, true)); + } + else + { + imgIcon = null; + AddLaunchCommand(new Command("Config#BodySlide", "Config BodySlide", "Configures BodySlide.", imgIcon, ConfigBS, true)); + } + + Trace.Unindent(); + } + + #region Launch Commands + + private void LaunchLOOT() + { + Trace.TraceInformation("Launching LOOT"); + Trace.Indent(); + string strCommand = GetLOOTLaunchCommand(); + Trace.TraceInformation("Command: " + strCommand); + Launch(strCommand, "--game=Fallout4VR"); + } + + private void LaunchFO4Edit() + { + Trace.TraceInformation("Launching FO4Edit"); + Trace.Indent(); + string strCommand = GetFO4EditLaunchCommand(); + Trace.TraceInformation("Command: " + strCommand); + Launch(strCommand, null); + } + + private void LaunchBS() + { + Trace.TraceInformation("Launching BodySlide"); + Trace.Indent(); + string strCommand = GetBSLaunchCommand(); + Trace.TraceInformation("Command: " + strCommand); + Launch(strCommand, null); + } + + /// + /// Launches the default command if any. + /// + public override void LaunchDefaultCommand() + { + Trace.TraceInformation("Launching FNIS"); + Trace.Indent(); + string strCommand = GetFO4EditLaunchCommand(); + Trace.TraceInformation("Command: " + strCommand); + Launch(strCommand, null); + } + + /// + /// Gets the LOOT launch command. + /// + /// The LOOT launch command. + private string GetLOOTLaunchCommand() + { + string strLOOT = String.Empty; + string strRegLOOT = String.Empty; + if (IntPtr.Size == 8) + strRegLOOT = @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LOOT\"; + else + strRegLOOT = @"HKEY_LOCAL_MACHINE\SOFTWARE\LOOT\"; + + if (EnvironmentInfo.Settings.SupportedTools.ContainsKey(GameMode.ModeId) && EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId].ContainsKey("LOOT")) + { + strLOOT = EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["LOOT"]; + if (!String.IsNullOrWhiteSpace(strLOOT) && ((strLOOT.IndexOfAny(Path.GetInvalidPathChars()) >= 0) || !Directory.Exists(strLOOT))) + { + strLOOT = String.Empty; + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["LOOT"] = String.Empty; + EnvironmentInfo.Settings.Save(); + } + } + + if (String.IsNullOrEmpty(strLOOT)) + if (RegistryUtil.CanReadKey(strRegLOOT)) + { + string strRegPath = (string)Registry.GetValue(strRegLOOT, "Installed Path", null); + if (!String.IsNullOrWhiteSpace(strRegPath) && ((strRegPath.IndexOfAny(Path.GetInvalidPathChars()) >= 0) || !Directory.Exists(strRegPath))) + { + strLOOT = String.Empty; + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["LOOT"] = strLOOT; + EnvironmentInfo.Settings.Save(); + } + else + strLOOT = strRegPath; + } + + if (!String.IsNullOrWhiteSpace(strLOOT)) + strLOOT = Path.Combine(strLOOT, "LOOT.exe"); + + return strLOOT; + } + + /// + /// Gets the FO4Edit launch command. + /// + /// The FO4Edit launch command. + private string GetFO4EditLaunchCommand() + { + string strFO4Edit = String.Empty; + + if (EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId].ContainsKey("FO4Edit")) + { + strFO4Edit = EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["FO4Edit"]; + if (!String.IsNullOrEmpty(strFO4Edit)) + strFO4Edit = Path.Combine(strFO4Edit, @"FO4Edit.exe"); + } + + return strFO4Edit; + } + + /// + /// Gets the BodySlide launch command. + /// + /// The BodySlide launch command. + private string GetBSLaunchCommand() + { + string strBS = String.Empty; + + if (EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId].ContainsKey("BS2")) + { + strBS = EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["BS2"]; + if (!String.IsNullOrWhiteSpace(strBS) && ((strBS.IndexOfAny(Path.GetInvalidPathChars()) >= 0) || !Directory.Exists(strBS))) + { + strBS = String.Empty; + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["BS2"] = String.Empty; + EnvironmentInfo.Settings.Save(); + } + } + + if (String.IsNullOrEmpty(strBS)) + { + string strBSPath = Path.Combine(GameMode.GameModeEnvironmentInfo.InstallationPath, @"Data\Tools\BodySlide"); + if (Directory.Exists(strBSPath)) + { + strBS = strBSPath; + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId]["BS2"] = strBS; + EnvironmentInfo.Settings.Save(); + } + } + + if (!String.IsNullOrEmpty(strBS)) + { + string str64bit = Path.Combine(strBS, "BodySlide x64.exe"); + + if (Environment.Is64BitProcess && File.Exists(str64bit)) + strBS = str64bit; + else + strBS = Path.Combine(strBS, "BodySlide.exe"); + } + + return strBS; + } + + #endregion + + #region Config Commands + + /// + /// Configures the selected command. + /// + public override void ConfigCommand(string p_strCommandID) + { + if (string.IsNullOrWhiteSpace(p_strCommandID)) + return; + + switch (p_strCommandID) + { + case "LOOT": + ConfigLOOT(); + break; + + case "BS2": + ConfigBS(); + break; + + case "FO4Edit": + ConfigFO4Edit(); + break; + + default: + break; + } + } + + private void ConfigFO4Edit() + { + string p_strToolName = "FO4Edit"; + string p_strExecutableName = "FO4Edit.exe"; + string p_strToolID = "FO4Edit"; + Trace.TraceInformation(string.Format("Configuring {0}", p_strToolName)); + Trace.Indent(); + + FolderBrowserDialog fbd = new FolderBrowserDialog(); + fbd.Description = string.Format("Select the folder where the {0} executable is located.", p_strToolName); + fbd.ShowNewFolderButton = false; + + fbd.ShowDialog(); + + string strPath = fbd.SelectedPath; + + if (!String.IsNullOrEmpty(strPath)) + if (Directory.Exists(strPath)) + { + string strExecutablePath = Path.Combine(strPath, p_strExecutableName); + + if (!string.IsNullOrWhiteSpace(strExecutablePath) && File.Exists(strExecutablePath)) + { + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId][p_strToolID] = strPath; + EnvironmentInfo.Settings.Save(); + OnChangedToolPath(new EventArgs()); + } + } + } + + private void ConfigLOOT() + { + string p_strToolName = "LOOT"; + string p_strExecutableName = "LOOT.exe"; + string p_strToolID = "LOOT"; + Trace.TraceInformation(string.Format("Configuring {0}", p_strToolName)); + Trace.Indent(); + + FolderBrowserDialog fbd = new FolderBrowserDialog(); + fbd.Description = string.Format("Select the folder where the {0} executable is located.", p_strToolName); + fbd.ShowNewFolderButton = false; + + fbd.ShowDialog(); + + string strPath = fbd.SelectedPath; + + if (!String.IsNullOrEmpty(strPath)) + if (Directory.Exists(strPath)) + { + string strExecutablePath = Path.Combine(strPath, p_strExecutableName); + + if (!string.IsNullOrWhiteSpace(strExecutablePath) && File.Exists(strExecutablePath)) + { + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId][p_strToolID] = strPath; + EnvironmentInfo.Settings.Save(); + OnChangedToolPath(new EventArgs()); + } + } + } + + private void ConfigBS() + { + string p_strToolName = "BS2"; + string p_strExecutableName = "BodySlide.exe"; + string p_strToolID = "BS2"; + Trace.TraceInformation(string.Format("Configuring {0}", p_strToolName)); + Trace.Indent(); + + FolderBrowserDialog fbd = new FolderBrowserDialog(); + fbd.Description = string.Format("Select the folder where the {0} executable is located.", p_strToolName); + fbd.ShowNewFolderButton = false; + + fbd.ShowDialog(); + + string strPath = fbd.SelectedPath; + + if (!String.IsNullOrEmpty(strPath)) + if (Directory.Exists(strPath)) + { + string strExecutablePath = Path.Combine(strPath, p_strExecutableName); + + if (!string.IsNullOrWhiteSpace(strExecutablePath) && File.Exists(strExecutablePath)) + { + EnvironmentInfo.Settings.SupportedTools[GameMode.ModeId][p_strToolID] = strPath; + EnvironmentInfo.Settings.Save(); + OnChangedToolPath(new EventArgs()); + } + } + } + + #endregion + } +} diff --git a/Fallout4VR/Properties/AssemblyInfo.cs b/Fallout4VR/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..5caf0ad29 --- /dev/null +++ b/Fallout4VR/Properties/AssemblyInfo.cs @@ -0,0 +1,23 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle(Nexus.Client.ProgrammeMetadata.ModManagerName + " - Fallout4VR Module")] +[assembly: AssemblyDescription("The Fallout4VR Module for the official Mod Manager the Nexus network of game mod websites.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Black Tree Gaming")] +[assembly: AssemblyProduct("Fallout4VR")] +[assembly: AssemblyCopyright("Copyright © Black Tree Gaming 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6f5440c7-b78a-4b8a-a9b2-774278eeff11")] diff --git a/Fallout4VR/Properties/Resources.Designer.cs b/Fallout4VR/Properties/Resources.Designer.cs new file mode 100644 index 000000000..e80f00938 --- /dev/null +++ b/Fallout4VR/Properties/Resources.Designer.cs @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Nexus.Client.Games.Fallout4VR.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Nexus.Client.Games.Fallout4VR.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<categoryManager fileVersion="0.1.0.0"> + /// <categoryList> + /// <category path="Ammo" ID="3"> + /// <name>Ammo</name> + /// </category> + /// <category path="Animation" ID="4"> + /// <name>Animation</name> + /// </category> + /// <category path="Armour" ID="5"> + /// <name>Armour</name> + /// </category> + /// <category path="Audio - Misc" ID="35"> + /// <name>Audio - Misc</name> + /// </category> + /// <category path="Audio - Music" ID="34"> + /// <name>Audio - Music</na [rest of string was truncated]";. + /// + internal static string Categories { + get { + return ResourceManager.GetString("Categories", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLCCoast - Geometry.csg + ///DLCCoast - Main.ba2 + ///DLCCoast - Textures.ba2 + ///DLCCoast - Voices_en.ba2 + ///DLCCoast.cdx + ///DLCCoast.esm + ///DLCNukaWorld - Geometry.csg + ///DLCNukaWorld - Main.ba2 + ///DLCNukaWorld - Textures.ba2 + ///DLCNukaWorld - Voices_en.ba2 + ///DLCNukaWorld.cdx + ///DLCNukaWorld.esm + ///DLCRobot - Geometry.csg + ///DLCRobot - Main.ba2 + ///DLCRobot - Textures.ba2 + ///DLCRobot - Voices_en.ba2 + ///DLCRobot.cdx + ///DLCRobot.esm + ///DLCworkshop01 - Geometry.csg + ///DLCworkshop01 - Main.ba2 + ///DLCworkshop01 - Textures.ba2 + ///DLCworkshop01.cdx + ///DLCworks [rest of string was truncated]";. + /// + internal static string fallout4vr_base { + get { + return ResourceManager.GetString("fallout4vr_base", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon Fallout4VR_logo { + get { + object obj = ResourceManager.GetObject("Fallout4VR_logo", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/Fallout4VR/Properties/Resources.resx b/Fallout4VR/Properties/Resources.resx new file mode 100644 index 000000000..b05bc0c64 --- /dev/null +++ b/Fallout4VR/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Categories.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\fallout4VR_base.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\Fallout4VR_logo.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Fallout4VR/Resources/Categories.xml b/Fallout4VR/Resources/Categories.xml new file mode 100644 index 000000000..5109429c1 --- /dev/null +++ b/Fallout4VR/Resources/Categories.xml @@ -0,0 +1,170 @@ + + + + + Ammo + + + Animation + + + Armour + + + Audio - Misc + + + Audio - Music + + + Audio - SFX + + + Audio - Voice + + + Bug Fixes + + + Buildings + + + Cheats and God items + + + Clothing + + + Clothing - Backpacks + + + Collectibles, Treasure Hunts, and Puzzles + + + Companions + + + Crafting - Equipment + + + Crafting - Home + + + Crafting - Other + + + Creatures + + + ENB Presets + + + Environment + + + Factions + + + Gameplay Effects and Changes + + + Hair, Face, and Body + + + Immersion + + + Items - Food/Drinks/Chems/etc + + + Locations - New + + + Locations - Vanilla + + + Miscellaneous + + + Modders Resources and Tutorials + + + Models and Textures + + + New Lands + + + NPC + + + NPC - Vendors + + + Overhauls + + + Patches + + + Performance + + + Perks + + + Pip-boy + + + Player Homes + + + Player Settlement + + + Poses + + + Power Armour + + + Quests and Adventures + + + Radio + + + ReShade Presets + + + Save Games + + + Skills and Leveling + + + Tattoos + + + User Interface + + + Utilities + + + Vehicles + + + Visuals and Graphics + + + Weapons + + + Weapons and Armour + + + Weather + + + \ No newline at end of file diff --git a/Fallout4VR/Resources/fallout4vr_base.txt b/Fallout4VR/Resources/fallout4vr_base.txt new file mode 100644 index 000000000..e35beacb8 --- /dev/null +++ b/Fallout4VR/Resources/fallout4vr_base.txt @@ -0,0 +1,42 @@ +Fallout4 - Animations.ba2 +Fallout4 - Geometry.csg +Fallout4 - Interface.ba2 +Fallout4 - Materials.ba2 +Fallout4 - Meshes.ba2 +Fallout4 - MeshesExtra.ba2 +Fallout4 - Misc - Beta.ba2 +Fallout4 - Misc - Debug.ba2 +Fallout4 - Misc.ba2 +Fallout4 - Shaders.ba2 +Fallout4 - Sounds.ba2 +Fallout4 - Startup.ba2 +Fallout4 - Textures1.ba2 +Fallout4 - Textures2.ba2 +Fallout4 - Textures3.ba2 +Fallout4 - Textures4.ba2 +Fallout4 - Textures5.ba2 +Fallout4 - Textures6.ba2 +Fallout4 - Textures7.ba2 +Fallout4 - Textures8.ba2 +Fallout4 - Textures9.ba2 +Fallout4 - Voices.ba2 +Fallout4.cdx +Fallout4.esm +Fallout4_VR - Main.ba2 +Fallout4_VR - Shaders.ba2 +Fallout4_VR - Textures.ba2 +Fallout4_VR.esm +Video\AGILITY.bk2 +Video\CHARISMA.bk2 +Video\Endgame_FEMALE_A.bk2 +Video\Endgame_FEMALE_B.bk2 +Video\Endgame_MALE_A.bk2 +Video\Endgame_MALE_B.bk2 +Video\ENDURANCE.bk2 +Video\GameIntro_V3_B.bk2 +Video\INTELLIGENCE.bk2 +Video\Intro.bk2 +Video\LUCK.bk2 +Video\MainMenuLoop.bk2 +Video\PERCEPTION.bk2 +Video\STRENGTH.bk2 diff --git a/Fallout4VR/Resources/fallout4vr_logo.ico b/Fallout4VR/Resources/fallout4vr_logo.ico new file mode 100644 index 000000000..4198ff60d Binary files /dev/null and b/Fallout4VR/Resources/fallout4vr_logo.ico differ diff --git a/GamebryoBase/PluginManagement/LoadOrderManager/PluginOrderManager.cs b/GamebryoBase/PluginManagement/LoadOrderManager/PluginOrderManager.cs index 14df6a02c..bf0f9220f 100644 --- a/GamebryoBase/PluginManagement/LoadOrderManager/PluginOrderManager.cs +++ b/GamebryoBase/PluginManagement/LoadOrderManager/PluginOrderManager.cs @@ -324,7 +324,13 @@ private void InitializeManager() throw ex; } break; - case "SkyrimSE": + case "Fallout4VR": + TimestampOrder = false; + SingleFileManagement = true; + Fallout4PluginManagement = true; + ForcedReadOnly = false; + break; + case "SkyrimSE": AppDataGameFolderName = "Skyrim Special Edition"; IgnoreOfficialPlugins = true; TimestampOrder = false; diff --git a/NexusClient.sln b/NexusClient.sln index 8469140d5..83c604ddc 100644 --- a/NexusClient.sln +++ b/NexusClient.sln @@ -128,6 +128,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkyrimSE.XmlScript", "Skyri EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreakingWheel", "BreakingWheel\BreakingWheel.csproj", "{7EEFB043-53CB-419D-89B4-69F5958E9629}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fallout4VR", "Fallout4VR\Fallout4VR.csproj", "{5BD924D2-3909-40B4-9B0F-C837987A6849}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkyrimVR", "SkyrimVR\SkyrimVR.csproj", "{1F520A7A-6DC7-4284-8647-76380A60C97D}" EndProject Global @@ -352,6 +354,10 @@ Global {7EEFB043-53CB-419D-89B4-69F5958E9629}.Debug|Any CPU.Build.0 = Debug|Any CPU {7EEFB043-53CB-419D-89B4-69F5958E9629}.Release|Any CPU.ActiveCfg = Release|Any CPU {7EEFB043-53CB-419D-89B4-69F5958E9629}.Release|Any CPU.Build.0 = Release|Any CPU + {5BD924D2-3909-40B4-9B0F-C837987A6849}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BD924D2-3909-40B4-9B0F-C837987A6849}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BD924D2-3909-40B4-9B0F-C837987A6849}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BD924D2-3909-40B4-9B0F-C837987A6849}.Release|Any CPU.Build.0 = Release|Any CPU {1F520A7A-6DC7-4284-8647-76380A60C97D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F520A7A-6DC7-4284-8647-76380A60C97D}.Debug|Any CPU.Build.0 = Debug|Any CPU {1F520A7A-6DC7-4284-8647-76380A60C97D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -404,6 +410,7 @@ Global {C6BA9724-B13B-4FAC-9E79-BA61E8B9334A} = {512B02AB-C927-4F3F-A7BF-26E6EE4CF678} {0D79098F-BEFC-431D-A4E2-1C4FA12C1F03} = {512B02AB-C927-4F3F-A7BF-26E6EE4CF678} {7EEFB043-53CB-419D-89B4-69F5958E9629} = {512B02AB-C927-4F3F-A7BF-26E6EE4CF678} + {5BD924D2-3909-40B4-9B0F-C837987A6849} = {512B02AB-C927-4F3F-A7BF-26E6EE4CF678} {1F520A7A-6DC7-4284-8647-76380A60C97D} = {512B02AB-C927-4F3F-A7BF-26E6EE4CF678} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/NexusClient/Bootstrapper.cs b/NexusClient/Bootstrapper.cs index 6254a4c55..0818a4442 100644 --- a/NexusClient/Bootstrapper.cs +++ b/NexusClient/Bootstrapper.cs @@ -54,6 +54,13 @@ private string DetermineRequestedGameMode(string p_strGameModeFromUri) return "SkyrimVR"; } + // Hack to allow Fallout 4 VR to use NMM links from the website. + // If the default mode is Fallout 4 VR and a Fallout 4 link is opened, we rewrite the requested game mode. + if (p_strGameModeFromUri.Equals("fallout4", StringComparison.OrdinalIgnoreCase) && m_eifEnvironmentInfo.Settings.RememberedGameMode.Equals("fallout4vr", StringComparison.OrdinalIgnoreCase)) + { + return "Fallout4VR"; + } + return p_strGameModeFromUri; } diff --git a/NexusClient/ModRepositories/Nexus/NexusModRepository.cs b/NexusClient/ModRepositories/Nexus/NexusModRepository.cs index cdd3ab79b..ead54b1dc 100644 --- a/NexusClient/ModRepositories/Nexus/NexusModRepository.cs +++ b/NexusClient/ModRepositories/Nexus/NexusModRepository.cs @@ -253,11 +253,12 @@ protected void SetWebsite(IGameMode p_gmdGameMode) m_intRemoteGameId = 130; break; case "Fallout4": + case "Fallout4VR": m_strWebsite = "www.nexusmods.com/fallout4"; m_strEndpoint = "FO4NexusREST"; m_intRemoteGameId = 1151; break; - case "Morrowind": + case "Morrowind": m_strWebsite = "www.nexusmods.com/morrowind"; m_strEndpoint = "MWNexusREST"; m_intRemoteGameId = 100;