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;