private void Init() { instance = this; Log.Init(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; if (!Utils.IsUnixPlatform()) { foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { var registry = asm.GetType("Microsoft.Win32.Registry"); if (registry != null) { var getValue = registry.GetMethod("GetValue", new Type[] { typeof(string), typeof(string), typeof(object) }); if (getValue != null) { var exePath = getValue.Invoke(null, new object[] { REG_PATH, "ExePath", string.Empty }) as string; if (string.IsNullOrEmpty(exePath) || !File.Exists(exePath)) { var setValue = registry.GetMethod("SetValue", new Type[] { typeof(string), typeof(string), typeof(object) }); if (setValue != null) { setValue.Invoke(null, new object[] { REG_PATH, "ExePath", Path.Combine(Application.StartupPath, "UnityModManager.exe") }); setValue.Invoke(null, new object[] { REG_PATH, "Path", Application.StartupPath }); } } } break; } } } version = typeof(UnityModManager).Assembly.GetName().Version; currentVersion.Text = version.ToString(); config = Config.Load(); param = Param.Load(); if (config != null && config.GameInfo != null && config.GameInfo.Length > 0) { config.GameInfo = config.GameInfo.OrderBy(x => x.Name).ToArray(); selectedGame = config.GameInfo.First(); GameInfo selected = null; if (!string.IsNullOrEmpty(param.LastSelectedGame)) { selected = config.GameInfo.FirstOrDefault(x => x.Name == param.LastSelectedGame); } selected = selected ?? config.GameInfo.First(); selectedGame = selected; selectedGameParams = param.GetGameParam(selected); RefreshForm(); } else { InactiveForm(); Log.Print($"Error parsing file '{Config.filename}'."); return; } CheckLastVersion(); }
private void RefreshForm() { if (!IsValid(selectedGame)) { InactiveForm(); return; } btnInstall.Text = "Install"; btnRestore.Enabled = false; additionallyGroupBox.Visible = false; gamePath = ""; if (string.IsNullOrEmpty(selectedGameParams.Path) || !Directory.Exists(selectedGameParams.Path)) { var result = FindGameFolder(selectedGame.Folder); if (string.IsNullOrEmpty(result)) { InactiveForm(); btnOpenFolder.ForeColor = System.Drawing.Color.FromArgb(192, 0, 0); btnOpenFolder.Text = "Please find Autonauts.exe"; openFileDialog1.Reset(); Log.Print($"Game folder '{selectedGame.Folder}' not found."); return; } Log.Print($"Game path detected as '{result}'."); selectedGameParams.Path = result; } if (!Utils.IsUnixPlatform() && !Directory.GetFiles(selectedGameParams.Path, "*.exe", SearchOption.TopDirectoryOnly).Any()) { InactiveForm(); Log.Print("Select the game folder where an exe file is located."); return; } if (Utils.IsMacPlatform() && !selectedGameParams.Path.EndsWith(".app")) { InactiveForm(); Log.Print("Select the game folder where name ending with '.app'."); return; } Utils.TryParseEntryPoint(selectedGame.EntryPoint, out var assemblyName); gamePath = selectedGameParams.Path; btnOpenFolder.ForeColor = System.Drawing.Color.Black; btnOpenFolder.Text = "Found Autonauts.exe"; openFileDialog1.InitialDirectory = gamePath; managedPath = FindManagedFolder(gamePath); if (managedPath == null) { InactiveForm(); btnOpenFolder.Enabled = true; Log.Print("Select the game folder that contains the 'Data' folder."); return; } btnOpenFolder.Enabled = false; managerPath = Path.Combine(managedPath, nameof(UnityModManager)); entryAssemblyPath = Path.Combine(managedPath, assemblyName); injectedEntryAssemblyPath = entryAssemblyPath; managerAssemblyPath = Path.Combine(managerPath, typeof(UnityModManager).Module.Name); entryPoint = selectedGame.EntryPoint; injectedEntryPoint = selectedGame.EntryPoint; assemblyDef = null; injectedAssemblyDef = null; managerDef = null; if (!string.IsNullOrEmpty(selectedGame.GameExe)) { if (selectedGame.GameExe.Contains('*')) { foreach (var file in new DirectoryInfo(gamePath).GetFiles(selectedGame.GameExe, SearchOption.TopDirectoryOnly)) { selectedGame.GameExe = file.Name; } } gameExePath = Path.Combine(gamePath, selectedGame.GameExe); } else { gameExePath = string.Empty; } doorstopPath = Path.Combine(gamePath, doorstopFilename); doorstopConfigPath = Path.Combine(gamePath, doorstopConfigFilename); libraryPaths = new string[libraryFiles.Length]; for (int i = 0; i < libraryFiles.Length; i++) { libraryPaths[i] = Path.Combine(managerPath, libraryFiles[i]); } var parent = new DirectoryInfo(Application.StartupPath).Parent; for (int i = 0; i < 3; i++) { if (parent == null) { break; } if (parent.FullName == gamePath) { InactiveForm(); Log.Print("UMM Installer should not be located in the game folder."); return; } parent = parent.Parent; } //machineConfigPath = string.Empty; //machineDoc = null; //if (!string.IsNullOrEmpty(selectedGame.MachineConfig)) //{ // machineConfigPath = Path.Combine(gamePath, selectedGame.MachineConfig); // try // { // machineDoc = XDocument.Load(machineConfigPath); // } // catch (Exception e) // { // InactiveForm(); // Log.Print(e.ToString()); // return; // } //} try { assemblyDef = ModuleDefMD.Load(File.ReadAllBytes(entryAssemblyPath)); } catch (Exception e) { InactiveForm(); Log.Print(e.ToString()); return; } var useOldPatchTarget = false; GameInfo.filepathInGame = Path.Combine(managerPath, "Config.xml"); if (File.Exists(GameInfo.filepathInGame)) { var gameConfig = GameInfo.ImportFromGame(); if (gameConfig == null || !Utils.TryParseEntryPoint(gameConfig.EntryPoint, out assemblyName)) { InactiveForm(); return; } injectedEntryPoint = gameConfig.EntryPoint; injectedEntryAssemblyPath = Path.Combine(managedPath, assemblyName); } else if (!string.IsNullOrEmpty(selectedGame.OldPatchTarget)) { if (!Utils.TryParseEntryPoint(selectedGame.OldPatchTarget, out assemblyName)) { InactiveForm(); return; } useOldPatchTarget = true; injectedEntryPoint = selectedGame.OldPatchTarget; injectedEntryAssemblyPath = Path.Combine(managedPath, assemblyName); } try { if (injectedEntryAssemblyPath == entryAssemblyPath) { injectedAssemblyDef = assemblyDef; } else { injectedAssemblyDef = ModuleDefMD.Load(File.ReadAllBytes(injectedEntryAssemblyPath)); } if (File.Exists(managerAssemblyPath)) { managerDef = ModuleDefMD.Load(File.ReadAllBytes(managerAssemblyPath)); } } catch (Exception e) { InactiveForm(); Log.Print(e.ToString()); return; } var disabledMethods = new List <InstallType>(); var unavailableMethods = new List <InstallType>(); var managerType = typeof(UnityModManager); var starterType = typeof(Injection.UnityModManagerStarter); Rescan: var v0_12_Installed = injectedAssemblyDef.Types.FirstOrDefault(x => x.Name == managerType.Name); var newWayInstalled = injectedAssemblyDef.Types.FirstOrDefault(x => x.Name == starterType.Name); var hasInjectedAssembly = v0_12_Installed != null || newWayInstalled != null; if (useOldPatchTarget && !hasInjectedAssembly) { useOldPatchTarget = false; injectedEntryPoint = selectedGame.EntryPoint; injectedEntryAssemblyPath = entryAssemblyPath; injectedAssemblyDef = assemblyDef; goto Rescan; } //if (machineDoc == null) //{ // unavailableMethods.Add(InstallType.Config); // selectedGameParams.InstallType = InstallType.Assembly; //} //else if (hasInjectedAssembly) //{ // disabledMethods.Add(InstallType.Config); // selectedGameParams.InstallType = InstallType.Assembly; //} //else if (machineDoc.Descendants("cryptoClass").Any(x => x.HasAttributes && x.FirstAttribute.Name.LocalName == "ummRngWrapper")) //{ // disabledMethods.Add(InstallType.Assembly); // selectedGameParams.InstallType = InstallType.Config; //} if (Utils.IsUnixPlatform() || !File.Exists(gameExePath)) { unavailableMethods.Add(InstallType.DoorstopProxy); selectedGameParams.InstallType = InstallType.Assembly; } else if (File.Exists(doorstopPath)) { disabledMethods.Add(InstallType.Assembly); selectedGameParams.InstallType = InstallType.DoorstopProxy; } if (hasInjectedAssembly) { disabledMethods.Add(InstallType.DoorstopProxy); selectedGameParams.InstallType = InstallType.Assembly; } //if (selectedGameParams.InstallType == InstallType.Config) //{ // btnRestore.Enabled = IsDirty(machineDoc) && File.Exists($"{machineConfigPath}.original_"); //} if (selectedGameParams.InstallType == InstallType.Assembly) { btnRestore.Enabled = IsDirty(injectedAssemblyDef) && File.Exists($"{injectedEntryAssemblyPath}.original_"); } tabControl.TabPages[1].Enabled = true; managerDef = managerDef ?? injectedAssemblyDef; var managerInstalled = managerDef.Types.FirstOrDefault(x => x.Name == managerType.Name); if (managerInstalled != null && (hasInjectedAssembly || selectedGameParams.InstallType == InstallType.DoorstopProxy)) { btnInstall.Text = "Update"; btnInstall.Enabled = false; btnRemove.Enabled = true; Version version2; if (v0_12_Installed != null) { var versionString = managerInstalled.Fields.First(x => x.Name == nameof(UnityModManager.version)).Constant.Value.ToString(); version2 = Utils.ParseVersion(versionString); } else { version2 = managerDef.Assembly.Version; } installedVersion.Text = version2.ToString(); if (version > version2 && v0_12_Installed == null) { btnInstall.Enabled = true; } } else { installedVersion.Text = "-"; btnInstall.Enabled = true; btnRemove.Enabled = false; } if (!string.IsNullOrEmpty(selectedGame.Additionally)) { notesTextBox.Text = selectedGame.Additionally; additionallyGroupBox.Visible = true; } }
private bool IsValid(GameInfo gameInfo) { if (selectedGame == null) { Log.Print("Select a game."); return(false); } var ignoreFields = new List <string> { nameof(GameInfo.GameExe), nameof(GameInfo.StartingPoint), nameof(GameInfo.UIStartingPoint), nameof(GameInfo.OldPatchTarget), nameof(GameInfo.GameVersionPoint), nameof(GameInfo.Additionally), nameof(GameInfo.FixBlackUI), }; var prefix = (!string.IsNullOrEmpty(gameInfo.Name) ? $"[{gameInfo.Name}]" : "[?]"); var hasError = false; foreach (var field in typeof(GameInfo).GetFields()) { if (!field.IsStatic && field.IsPublic && !ignoreFields.Exists(x => x == field.Name)) { var value = field.GetValue(gameInfo); if (value == null || value.ToString() == "") { hasError = true; Log.Print($"{prefix} Field '{field.Name}' is empty."); } } } if (hasError) { return(false); } if (!string.IsNullOrEmpty(gameInfo.EntryPoint)) { if (!Utils.TryParseEntryPoint(gameInfo.EntryPoint, out _)) { return(false); } } if (!string.IsNullOrEmpty(gameInfo.StartingPoint)) { if (!Utils.TryParseEntryPoint(gameInfo.StartingPoint, out _)) { return(false); } } if (!string.IsNullOrEmpty(gameInfo.UIStartingPoint)) { if (!Utils.TryParseEntryPoint(gameInfo.UIStartingPoint, out _)) { return(false); } } if (!string.IsNullOrEmpty(gameInfo.OldPatchTarget)) { if (!Utils.TryParseEntryPoint(gameInfo.OldPatchTarget, out _)) { return(false); } } return(true); }
private void Init() { var skins = new Dictionary <string, string> { ["默认皮肤"] = "" }; skins = Utils.GetMatchedFiles(SKINS_PATH, "*.ssk", skins); var skinSet = new BindingSource { DataSource = skins }; skinSetBox.DataSource = skinSet; skinSetBox.DisplayMember = "Key"; skinSetBox.ValueMember = "Value"; _autoSizeFormControlUtil = new AutoSizeFormControlUtil(this); _autoSizeFormControlUtil.RefreshControlsInfo(this.Controls[0]); FormBorderStyle = FormBorderStyle.FixedDialog; instance = this; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; if (!Utils.IsUnixPlatform()) { foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { var registry = asm.GetType("Microsoft.Win32.Registry"); if (registry == null) { continue; } var getValue = registry.GetMethod("GetValue", new Type[] { typeof(string), typeof(string), typeof(object) }); if (getValue != null) { var exePath = getValue.Invoke(null, new object[] { REG_PATH, "ExePath", string.Empty }) as string; if (string.IsNullOrEmpty(exePath) || !File.Exists(exePath)) { var setValue = registry.GetMethod("SetValue", new Type[] { typeof(string), typeof(string), typeof(object) }); if (setValue != null) { setValue.Invoke(null, new object[] { REG_PATH, "ExePath", Path.Combine(Application.StartupPath, "DearUnityModManager.exe") }); setValue.Invoke(null, new object[] { REG_PATH, "Path", Application.StartupPath }); } } } break; } } var rbWidth = 0; for (var i = (InstallType)0; i < InstallType.Count; i++) { var rb = new RadioButton { Name = i.ToString(), Text = i == InstallType.DoorstopProxy ? $"{i.ToString()}(推荐)" : i.ToString(), AutoSize = true, Location = new Point(rbWidth + 8, 50), Margin = new Padding(0) }; rb.Click += installType_Click; installTypeGroup.Controls.Add(rb); rbWidth += rb.Width + 200; } version = typeof(UnityModManager).Assembly.GetName().Version; currentVersion.Text = version.ToString(); config = Config.Load(); param = Param.Load(); skinSetBox.SelectedIndex = param.LastSelectedSkin; if (config?.GameInfo != null && config.GameInfo.Length > 0) { config.GameInfo = config.GameInfo.OrderBy(x => x.GameName).ToArray(); gameList.Items.AddRange(config.GameInfo); GameInfo selected = null; if (!string.IsNullOrEmpty(param.LastSelectedGame)) { selected = config.GameInfo.FirstOrDefault(x => x.Name == param.LastSelectedGame); } selected = selected ?? config.GameInfo.First(); gameList.SelectedItem = selected; selectedGameParams = param.GetGameParam(selected); } else { InactiveForm(); Log.Print($"解析配置文件“{Config.filename}”失败!"); return; } CheckLastVersion(); }
private void RefreshForm() { if (!IsValid(selectedGame)) { InactiveForm(); return; } btnInstall.Text = "安装MOD管理器模块到游戏"; btnRestore.Enabled = false; additionallyGroupBox.Visible = false; gamePath = ""; if (string.IsNullOrEmpty(selectedGameParams.Path) || !Directory.Exists(selectedGameParams.Path)) { var result = FindGameFolder(selectedGame.Folder); if (string.IsNullOrEmpty(result)) { InactiveForm(); btnOpenFolder.ForeColor = Color.Red; btnOpenFolder.Text = "选择游戏主目录"; folderBrowserDialog.SelectedPath = null; Log.Print($"游戏主目录“{selectedGame.Folder}”不存在!"); return; } Log.Print($"已检测到游戏主目录“{result}”。"); selectedGameParams.Path = result; } if (!Utils.IsUnixPlatform() && !Directory.GetFiles(selectedGameParams.Path, "*.exe", SearchOption.TopDirectoryOnly).Any()) { InactiveForm(); Log.Print("请选择游戏可执行文件所在的目录。"); return; } if (Utils.IsMacPlatform() && !selectedGameParams.Path.EndsWith(".app")) { InactiveForm(); Log.Print("请选择游戏可执行文件(扩展名为.app)所在的目录。"); return; } Utils.TryParseEntryPoint(selectedGame.EntryPoint, out var assemblyName); gamePath = selectedGameParams.Path; btnOpenFolder.ForeColor = Color.Green; btnOpenFolder.Text = new DirectoryInfo(gamePath).Name; folderBrowserDialog.SelectedPath = gamePath; managedPath = FindManagedFolder(gamePath); managerPath = Path.Combine(managedPath, nameof(UnityModManager)); entryAssemblyPath = Path.Combine(managedPath, assemblyName); injectedEntryAssemblyPath = entryAssemblyPath; managerAssemblyPath = Path.Combine(managerPath, typeof(UnityModManager).Module.Name); entryPoint = selectedGame.EntryPoint; injectedEntryPoint = selectedGame.EntryPoint; assemblyDef = null; injectedAssemblyDef = null; managerDef = null; doorstopPath = Path.Combine(gamePath, doorstopFilename); doorstopConfigPath = Path.Combine(gamePath, doorstopConfigFilename); libraryPaths = new string[libraryFiles.Length]; if (!string.IsNullOrEmpty(selectedGame.GameExe)) { if (selectedGame.GameExe.Contains('*')) { foreach (var file in new DirectoryInfo(gamePath).GetFiles(selectedGame.GameExe, SearchOption.TopDirectoryOnly)) { selectedGame.GameExe = file.Name; } } gameExePath = Path.Combine(gamePath, selectedGame.GameExe); } else { gameExePath = string.Empty; } for (var i = 0; i < libraryFiles.Length; i++) { libraryPaths[i] = Path.Combine(managerPath, libraryFiles[i]); } var path = new DirectoryInfo(Application.StartupPath).FullName; if (path.StartsWith(gamePath)) { InactiveForm(); Log.Print("DUMM目录不能放在游戏主目录及其子目录下,请先关闭DUMM,再将DUMM目录移动到单独的目录下再试!"); return; } try { assemblyDef = ModuleDefMD.Load(File.ReadAllBytes(entryAssemblyPath)); } catch (Exception e) { InactiveForm(); Log.Print(e.ToString()); return; } var useOldPatchTarget = false; GameInfo.filepathInGame = Path.Combine(managerPath, "Config.xml"); if (File.Exists(GameInfo.filepathInGame)) { var gameConfig = GameInfo.ImportFromGame(); if (gameConfig == null || !Utils.TryParseEntryPoint(gameConfig.EntryPoint, out assemblyName)) { InactiveForm(); return; } injectedEntryPoint = gameConfig.EntryPoint; injectedEntryAssemblyPath = Path.Combine(managedPath, assemblyName); } else if (!string.IsNullOrEmpty(selectedGame.OldPatchTarget)) { if (!Utils.TryParseEntryPoint(selectedGame.OldPatchTarget, out assemblyName)) { InactiveForm(); return; } useOldPatchTarget = true; injectedEntryPoint = selectedGame.OldPatchTarget; injectedEntryAssemblyPath = Path.Combine(managedPath, assemblyName); } try { injectedAssemblyDef = injectedEntryAssemblyPath == entryAssemblyPath ? assemblyDef : ModuleDefMD.Load(File.ReadAllBytes(injectedEntryAssemblyPath)); if (File.Exists(managerAssemblyPath)) { managerDef = ModuleDefMD.Load(File.ReadAllBytes(managerAssemblyPath)); } } catch (Exception e) { InactiveForm(); Log.Print(e.ToString()); return; } var disabledMethods = new List <InstallType>(); var unavailableMethods = new List <InstallType>(); var managerType = typeof(UnityModManager); var starterType = typeof(Injection.UnityModManagerStarter); Rescan: var v0_12_Installed = injectedAssemblyDef.Types.FirstOrDefault(x => x.Name == managerType.Name); var newWayInstalled = injectedAssemblyDef.Types.FirstOrDefault(x => x.Name == starterType.Name); var hasInjectedAssembly = v0_12_Installed != null || newWayInstalled != null; if (useOldPatchTarget && !hasInjectedAssembly) { useOldPatchTarget = false; injectedEntryPoint = selectedGame.EntryPoint; injectedEntryAssemblyPath = entryAssemblyPath; injectedAssemblyDef = assemblyDef; goto Rescan; } if (Utils.IsUnixPlatform() || !File.Exists(gameExePath)) { unavailableMethods.Add(InstallType.DoorstopProxy); selectedGameParams.InstallType = InstallType.Assembly; } else if (File.Exists(doorstopPath)) { disabledMethods.Add(InstallType.Assembly); selectedGameParams.InstallType = InstallType.DoorstopProxy; } if (hasInjectedAssembly) { disabledMethods.Add(InstallType.DoorstopProxy); selectedGameParams.InstallType = InstallType.Assembly; } foreach (var ctrl in installTypeGroup.Controls) { if (!(ctrl is RadioButton btn)) { continue; } if (unavailableMethods.Exists(x => x.ToString() == btn.Name)) { btn.Visible = false; btn.Enabled = false; continue; } if (disabledMethods.Exists(x => x.ToString() == btn.Name)) { btn.Visible = true; btn.Enabled = false; continue; } btn.Visible = true; btn.Enabled = true; btn.Checked = btn.Name == selectedGameParams.InstallType.ToString(); } if (selectedGameParams.InstallType == InstallType.Assembly) { btnRestore.Enabled = IsDirty(injectedAssemblyDef) && File.Exists($"{injectedEntryAssemblyPath}{Utils.FileSuffixCache}"); } tabControl.TabPages[1].Enabled = true; managerDef ??= injectedAssemblyDef; var managerInstalled = managerDef.Types.FirstOrDefault(x => x.Name == managerType.Name); if (managerInstalled != null && (hasInjectedAssembly || selectedGameParams.InstallType == InstallType.DoorstopProxy)) { btnInstall.Text = "更新MOD管理器模块"; btnInstall.Enabled = false; btnRemove.Enabled = true; Version version2; if (v0_12_Installed != null) { var versionString = managerInstalled.Fields.First(x => x.Name == nameof(UnityModManager.version)).Constant.Value.ToString(); version2 = Utils.ParseVersion(versionString); } else { version2 = managerDef.Assembly.Version; } installedVersion.Text = version2.ToString(); if (version > version2 && v0_12_Installed == null) { btnInstall.Enabled = true; } } else { installedVersion.Text = "-"; btnInstall.Enabled = true; btnRemove.Enabled = false; } if (string.IsNullOrEmpty(selectedGame.Additionally)) { return; } notesTextBox.Text = selectedGame.Additionally; additionallyGroupBox.Visible = true; }
static GameParam CreateGameParam(GameInfo gameInfo) { return new GameParam { Name = gameInfo.Name }; }