|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using GCMM.Properties;
- using Newtonsoft.Json.Linq;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO.Compression;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace GCMM
- {
- partial class MainForm
- {
-
- public bool? CheckIfPatched()
- {
- if (!File.Exists(Settings.Default.GamePath + @"\IPA.exe"))
- {
- status.Text = "Status: Patcher missing\nClicking Play will install it";
- return null;
- }
- string nopatch = "Status: Unpatched\nClicking Play patches it";
- if (!Directory.Exists(Settings.Default.GamePath + @"\IPA\Backups\Gamecraft"))
- {
- status.Text = nopatch;
- return false;
- }
- string backup = Directory.EnumerateDirectories(Settings.Default.GamePath + @"\IPA\Backups\Gamecraft").OrderByDescending(s => s).FirstOrDefault();
- if (backup == null)
- {
- status.Text = nopatch;
- return false;
- }
- if (File.GetLastWriteTime(Settings.Default.GamePath + @"\Gamecraft_Data\Managed\Assembly-CSharp.dll")
- > //If the file was updated at least 2 minutes after patching
- Directory.GetLastWriteTime(backup).AddMinutes(2))
- {
- status.Text = nopatch;
- return false;
- }
- status.Text = "Status: Patched";
- return true;
- }
-
- public async void PatchGame()
- {
- UpdateButton(playbtn, false);
- UpdateButton(installbtn, false);
- UpdateButton(uninstallbtn, false);
- UpdateButton(settingsbtn, false);
- if (!CheckIfPatched().HasValue)
- {
- if (MessageBox.Show("The patcher (GCIPA) is not found. It will be downloaded from https://git.exmods.org/modtainers/GCIPA/releases and ran to patch the game.", "Patcher download needed", MessageBoxButtons.OKCancel)
- == DialogResult.Cancel)
- return;
- string releases = "/api/v1/repos/modtainers/GCIPA/releases";
- string url;
- this.status.Text = "Status: Patching...";
- using (WebClient client = GetClient())
- {
- url = JArray.Parse(await client.DownloadStringTaskAsync(releases)).First["assets"].First["browser_download_url"].ToString();
- await client.DownloadFileTaskAsync(url, "IPA.zip");
- ZipFile.ExtractToDirectory("IPA.zip", Settings.Default.GamePath);
- }
- }
- bool? status = CheckIfPatched();
- if (!status.HasValue) //Make sure it actually worked
- return;
- if (!status.Value)
- {
- var psi = new ProcessStartInfo(Settings.Default.GamePath + @"\IPA.exe", "Gamecraft.exe --nowait");
- psi.UseShellExecute = false;
- psi.RedirectStandardError = true;
- psi.RedirectStandardOutput = true;
- psi.WorkingDirectory = Settings.Default.GamePath;
- psi.CreateNoWindow = true;
- var process = Process.Start(psi);
- process.BeginErrorReadLine();
- process.BeginOutputReadLine();
- process.EnableRaisingEvents = true;
- modinfobox.Text = "";
- DataReceivedEventHandler onoutput = (sender, e) =>
- {
- Invoke((Action)(() => modinfobox.Text += e.Data + Environment.NewLine));
- };
- process.OutputDataReceived += onoutput;
- process.ErrorDataReceived += onoutput;
- process.Exited += CheckStartGame;
- }
- else
- CheckStartGame(null, null);
- }
- }
- }
|