/// <summary> /// Asynchronously runs the patcher. /// </summary> public async Task RunAsync() { Steam steam = Steam.GetSteamInstallation(); if (steam.IsInstalled) { bool isHaloInstalled = await steam.IsAppInstalledAsync(HaloAppId) .ConfigureAwait(false); if (isHaloInstalled) { SteamApp haloApp = await steam.GetAppAsync(HaloAppId).ConfigureAwait(false); await this.PatchSteamVersionAsync(haloApp).ConfigureAwait(false); } else { MsgBoxHelpers.Error(Resources.HaloNotInstalledViaSteam); await this.ConfirmManualPatchAsync().ConfigureAwait(false); } } else { MsgBoxHelpers.Error(Resources.SteamNotInstalled); await this.ConfirmManualPatchAsync().ConfigureAwait(false); } }
/// <summary> /// Asynchronously patches the game found in the Steam library. /// </summary> /// <param name="app">The <see cref="SteamApp"/> instance.</param> private async Task PatchSteamVersionAsync(SteamApp app) { if (!app.InstallDirectory.Exists) { MsgBoxHelpers.Error(String.Format(Resources.ManifestButNoInstall, app.Name)); await this.ConfirmManualPatchAsync().ConfigureAwait(false); return; } await this.PatchAsync(new HaloInstallation(app.InstallDirectory)).ConfigureAwait(false); }
/// <summary> /// Presents the user with a <see cref="FolderBrowserDialog"/> to manually find their Halo installation. /// </summary> /// <returns>Returns the <see cref="HaloInstallation"/> associated with the chosen directory, or /// <see langword="null"/>.</returns> private HaloInstallation ManuallyFindHaloInstallation() { string path = String.Empty; Thread thread = new Thread(() => { FolderBrowserDialog dialog = new FolderBrowserDialog { Description = Resources.HaloMCCTitle, SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) }; while (true) { DialogResult result = dialog.ShowDialog(); if (result == DialogResult.Cancel) { bool cancel = MsgBoxHelpers.ConfirmYesNo(Resources.ConfirmPatchCancel, yes: () => true, no: () => { } // do nothing ); if (cancel) { Environment.Exit(0); } } else if (result == DialogResult.OK) { if (Directory.Exists(dialog.SelectedPath)) { HaloInstallation halo = new HaloInstallation(new DirectoryInfo(dialog.SelectedPath)); if (halo.GetGameExecutablePath().Exists&& halo.GetPakFilePath().Exists) { break; } } MsgBoxHelpers.Error(Resources.InvalidFolder); } } path = dialog.SelectedPath; }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); return(new HaloInstallation(new DirectoryInfo(path))); }
/// <summary> /// Asynchronously runs the patching process on the specified file. /// </summary> /// <param name="halo">The Halo installation.</param> private async Task PatchAsync(HaloInstallation halo) { FileInfo pakFile = halo.GetPakFilePath(); if (!(pakFile?.Exists ?? false)) { MsgBoxHelpers.Error(Resources.PakFileNotFound, callback: () => Environment.Exit(0)); return; } Stream stream = File.Open(pakFile.FullName, FileMode.Open); if (halo.GetGameVersion() > new Version(1, 1270, 0, 0)) { bool abort = !MsgBoxHelpers.ConfirmYesNo( String.Format(Resources.UntestedVersion, halo.GetGameVersion()), icon: MessageBoxIcon.Warning, yes: () => true, no: () => { } // internally returns default(T) ); if (abort) { Environment.Exit(0); } } else { if (!this.ConfirmPatchNeeded(stream)) { MsgBoxHelpers.Info(Resources.GameAlreadyPatched, Resources.PatchSkipped, () => Environment.Exit(0)); return; } } if (this.ConfirmBackup()) { // must close stream for backup to take place stream.Close(); stream.Dispose(); BackupProgressForm progressForm = new BackupProgressForm(); progressForm.Show(); progressForm.BringToFront(); await FileHelpers.CreateBackupAsync(pakFile.FullName, percentage => { progressForm.PercentageProgressBar.Value = (int)Math.Floor(percentage); progressForm.Text = String.Format(Resources.CreatingBackupPercentage, percentage); Application.DoEvents(); }) .ConfigureAwait(false); // reopen stream for patching stream = File.Open(pakFile.FullName, FileMode.Open); } this.ApplyPatch(stream); stream.Close(); stream.Dispose(); MsgBoxHelpers.Info(Resources.PatchSuccessful, Resources.Done, () => Environment.Exit(0)); }