diff --git a/GCMM/MainForm.cs b/GCMM/MainForm.cs index 26d73f9..d508bea 100644 --- a/GCMM/MainForm.cs +++ b/GCMM/MainForm.cs @@ -250,6 +250,8 @@ You may also want to verify the game's files by right clicking the game in Steam return; if (MessageBox.Show("Validating the game's files is useful if the game doesn't start even without mods. Make sure to click Refresh once Steam finished verifying the game. The Steam window that shows the progress might open in the background. Note that you will need to patch the game again using the Play button in order to use mods.\n\nContinue?", "Verify game files", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return; + string exe = GetExe(); + File.Delete(GamePath($@"\{exe.Replace(".exe", "")}_Data\Managed\IllusionInjector.dll")); //Used to check if game is patched if (Environment.OSVersion.Platform == PlatformID.Win32NT) Process.Start("steam://validate/1078000/"); else diff --git a/GCMM/MainModInstaller.cs b/GCMM/MainModInstaller.cs index cc1fa8c..ce50ef2 100644 --- a/GCMM/MainModInstaller.cs +++ b/GCMM/MainModInstaller.cs @@ -122,22 +122,35 @@ namespace GCMM public void UninstallMod(ModInfo mod) { - LoadFileList(mod); - if (mod.ModFiles.Count == 0) //A single DLL - File.Delete(GamePath(@"\Plugins\" + mod.Name + ".dll")); - else //A ZIP + try { - foreach (string file in mod.ModFiles) + LoadFileList(mod); + if (mod.ModFiles.Count == 0) //A single DLL + File.Delete(GamePath(@"\Plugins\" + mod.Name + ".dll")); + else //A ZIP + { + foreach (string file in mod.ModFiles) + { + File.Delete(file); + var parent = Directory.GetParent(file); + if (!parent.EnumerateFileSystemInfos().Any()) + parent.Delete(); //May delete the Plugins dir if empty + } + } + File.Delete(mod.Name + ".json"); + mod.Version = null; //Not installed + if (mod.Author != null) + AddUpdateModInList(mod); //Update list + else { - File.Delete(file); - var parent = Directory.GetParent(file); - if (!parent.EnumerateFiles().Any()) - parent.Delete(); //May delete the Plugins dir if empty + mods.Remove(mod.Name); + modlist.Items[mod.Name].Remove(); } } - File.Delete(mod.Name + ".json"); - mod.Version = null; //Not installed - AddUpdateModInList(mod); //Update list + catch (Exception e) when (e is UnauthorizedAccessException || e is IOException) + { + MessageBox.Show("Could not remove mod files! Make sure the game isn't running.\n" + e.Message); + } } public async Task UpdateAPI() diff --git a/GCMM/MainModList.cs b/GCMM/MainModList.cs index 77e0b3c..7c97f20 100644 --- a/GCMM/MainModList.cs +++ b/GCMM/MainModList.cs @@ -175,12 +175,17 @@ namespace GCMM public void CheckUninstalledMods(HashSet installed) { + List delete = new List(); foreach (string name in mods.Keys.Except(installed)) { var mod = mods[name]; mod.Version = null; - AddUpdateModInList(mod); + if (mod.Author != null) + AddUpdateModInList(mod); + else + delete.Add(name); } + delete.ForEach(name => { mods.Remove(name); modlist.Items[name].Remove(); }); } } } diff --git a/GCMM/MainPatcher.cs b/GCMM/MainPatcher.cs index adeb8d7..5ca9311 100644 --- a/GCMM/MainPatcher.cs +++ b/GCMM/MainPatcher.cs @@ -30,12 +30,12 @@ namespace GCMM playbtn.Text = pnp; return GameState.NoPatcher; } - if (gcipa.Updatable) + if (gcipa.Updatable && !(gcipa.Version == new Version(1, 0, 0, 0) && gcipa.LatestVersion == new Version(4, 0, 0, 0))) { status.Text = "Status: Patcher outdated\nClicking play will update it"; playbtn.Text = pnp; return GameState.OldPatcher; - } + } string nopatch = "Status: Unpatched\nClicking Play patches it"; string gc = GetExe().Replace(".exe", ""); string backups = GamePath(@"\IPA\Backups\" + gc); @@ -54,7 +54,8 @@ namespace GCMM } if (File.GetLastWriteTime(GamePath($@"\{gc}_Data\Managed\Assembly-CSharp.dll")) > //If the file was updated at least 2 minutes after patching - Directory.GetLastWriteTime(backup).AddMinutes(2)) + Directory.GetLastWriteTime(backup).AddMinutes(2) + || !File.Exists(GamePath($@"\{gc}_Data\Managed\IllusionInjector.dll"))) { status.Text = nopatch; playbtn.Text = pnp; @@ -89,7 +90,6 @@ namespace GCMM EndWork(); return; } - string releases = "/api/v1/repos/modtainers/GCIPA/releases"; this.status.Text = "Status: Patching..."; using (WebClient client = GetClient()) {