diff --git a/project/SPT.Launcher.Base/Controllers/GameStarter.cs b/project/SPT.Launcher.Base/Controllers/GameStarter.cs index a08ac56..e700593 100644 --- a/project/SPT.Launcher.Base/Controllers/GameStarter.cs +++ b/project/SPT.Launcher.Base/Controllers/GameStarter.cs @@ -20,6 +20,7 @@ using System.Threading.Tasks; using SPT.Launcher.Controllers; using SPT.Launcher.Interfaces; using System.Runtime.InteropServices; +using SPT.Launcher.Models.SPT; namespace SPT.Launcher { @@ -65,6 +66,13 @@ namespace SPT.Launcher LogManager.Instance.Error("[LaunchGame] Installed in Live :: YES"); return GameStarterResult.FromError(-1); } + + // Confirm core.dll version matches version server is running + if (IsCoreDllVersionMismatched(gamePath)) + { + LogManager.Instance.Error("[LaunchGame] Core dll mismatch :: FAILED"); + return GameStarterResult.FromError(-8); + } LogManager.Instance.Info("[LaunchGame] Installed in Live :: NO"); @@ -204,6 +212,39 @@ namespace SPT.Launcher return isInstalledInLive; } + static bool IsCoreDllVersionMismatched(string gamePath) + { + try + { + var serverVersion = new SPTVersion(ServerManager.GetVersion()); + + var coreDllVersionInfo = FileVersionInfo.GetVersionInfo(Path.Combine($"{gamePath}/BepinEx/plugins/spt", "spt-core.dll")); + var dllVersion = new SPTVersion(coreDllVersionInfo.FileVersion); + + LogManager.Instance.Info($"[LaunchGame] spt-core.dll version: {dllVersion}"); + + // Edge case, running on locally built modules dlls, ignore check and return ok + if (dllVersion.Major == 0) return false; + + // check 'X'.x.x + if (serverVersion.Major != dllVersion.Major) return true; + + // check x.'X'.x + if (serverVersion.Minor != dllVersion.Minor) return true; + + // check x.x.'X' + if (serverVersion.Tag != dllVersion.Tag) return true; + + return false; // Versions match, hooray + } + catch (Exception ex) + { + LogManager.Instance.Exception(ex); + } + + return true; + } + void SetupGameFiles(string gamePath) { var files = new [] diff --git a/project/SPT.Launcher.Base/Helpers/LocalizationProvider.cs b/project/SPT.Launcher.Base/Helpers/LocalizationProvider.cs index b4b4d73..d30c138 100644 --- a/project/SPT.Launcher.Base/Helpers/LocalizationProvider.cs +++ b/project/SPT.Launcher.Base/Helpers/LocalizationProvider.cs @@ -1792,7 +1792,25 @@ namespace SPT.Launcher.Helpers } } #endregion - + + #region core_dll_file_version_mismatch + private string _core_dll_file_version_mismatch; + + public string core_dll_file_version_mismatch + { + get => _core_dll_file_version_mismatch; + set + { + if (_core_dll_file_version_mismatch != value) + { + _core_dll_file_version_mismatch = value; + RaisePropertyChanged(nameof(core_dll_file_version_mismatch)); + } + } + } + + #endregion + #endregion public event PropertyChangedEventHandler PropertyChanged; diff --git a/project/SPT.Launcher.Base/Models/Launcher/GameStarterResult.cs b/project/SPT.Launcher.Base/Models/Launcher/GameStarterResult.cs index b397750..79044a5 100644 --- a/project/SPT.Launcher.Base/Models/Launcher/GameStarterResult.cs +++ b/project/SPT.Launcher.Base/Models/Launcher/GameStarterResult.cs @@ -47,7 +47,11 @@ namespace SPT.Launcher.Models.Launcher case -7: Message = ":("; break; - + + case -8: + Message = LocalizationProvider.Instance.core_dll_file_version_mismatch; + break; + default: Message = LocalizationProvider.Instance.login_failed; break; diff --git a/project/SPT.Launcher/SPT_Data/Launcher/Locales/English.json b/project/SPT.Launcher/SPT_Data/Launcher/Locales/English.json index 1655d75..33af706 100644 --- a/project/SPT.Launcher/SPT_Data/Launcher/Locales/English.json +++ b/project/SPT.Launcher/SPT_Data/Launcher/Locales/English.json @@ -95,5 +95,6 @@ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}", "open_link": "Open Link", "dev_mode": "Developer Mode", - "failed_to_save_settings": "Failed to save settings" + "failed_to_save_settings": "Failed to save settings", + "core_dll_file_version_mismatch": "Your BepinEx/plugins/spt/spt-core.dll file version doesn't match what was expected and is unable to start. Try reinstalling SPT" } \ No newline at end of file