|
|
@@ -1,12 +1,13 @@ |
|
|
|
using GCMM.Properties; |
|
|
|
using Newtonsoft.Json.Linq; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.ComponentModel; |
|
|
|
using System.Data; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Drawing; |
|
|
|
using System.IO; |
|
|
|
using System.IO.Compression; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using System.Net; |
|
|
|
using System.Reflection; |
|
|
|
using System.Text.RegularExpressions; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using System.Windows.Forms; |
|
|
@@ -34,6 +35,13 @@ namespace GCMM |
|
|
|
MessageBox.Show("Found game at " + Settings.Default.GamePath); |
|
|
|
Settings.Default.Save(); |
|
|
|
} |
|
|
|
if(string.IsNullOrWhiteSpace(Settings.Default.GamePath)) |
|
|
|
{ |
|
|
|
status.Text = "Status: Game not found"; |
|
|
|
return; |
|
|
|
} |
|
|
|
CheckIfPatched(); |
|
|
|
GetInstalledMods(); |
|
|
|
} |
|
|
|
|
|
|
|
public void UpdateButton(Button button, bool enabled) |
|
|
@@ -88,13 +96,129 @@ namespace GCMM |
|
|
|
return Directory.GetParent(ofd.FileName).FullName; |
|
|
|
} |
|
|
|
|
|
|
|
private void playbtn_Click(object sender, EventArgs e) |
|
|
|
public void GetInstalledMods() |
|
|
|
{ |
|
|
|
foreach (var mod in Directory.GetFiles(Settings.Default.GamePath + @"\Plugins", "*.dll")) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
var an = AssemblyName.GetAssemblyName(mod); |
|
|
|
if (an.Name == "0Harmony") continue; |
|
|
|
modlist.Items.Add(new ListViewItem(new[] { an.Name, an.Version.ToString(), File.GetLastWriteTime(mod).ToString(), "" }, modlist.Groups["installed"])); |
|
|
|
} |
|
|
|
catch (BadImageFormatException) |
|
|
|
{ //Not a .NET assembly |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public bool? CheckIfPatched() |
|
|
|
{ |
|
|
|
if (!File.Exists(Settings.Default.GamePath + @"\IPA.exe")) |
|
|
|
{ |
|
|
|
status.Text = "Status: Patcher missing\nInstalling a mod downloads it"; |
|
|
|
return null; |
|
|
|
} |
|
|
|
string nopatch = "Status: Unpatched\nClick play"; |
|
|
|
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 a minute after patching |
|
|
|
Directory.GetLastWriteTime(backup).AddMinutes(1)) |
|
|
|
{ |
|
|
|
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 = "https://git.exmods.org/api/v1/repos/modtainers/GCIPA/releases"; |
|
|
|
string url; |
|
|
|
this.status.Text = "Status: Patching..."; |
|
|
|
await Task.Run(() => |
|
|
|
{ |
|
|
|
using (WebClient client = new WebClient()) |
|
|
|
{ |
|
|
|
url = JArray.Parse(client.DownloadString(releases)).First["assets"].First["browser_download_url"].ToString(); |
|
|
|
client.DownloadFile(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); |
|
|
|
} |
|
|
|
|
|
|
|
private void CheckStartGame(object sender, EventArgs e) |
|
|
|
{ |
|
|
|
Action act = () => |
|
|
|
{ |
|
|
|
if ((sender as Process).ExitCode != 0) |
|
|
|
{ |
|
|
|
status.Text = "Status: Patching failed"; |
|
|
|
return; |
|
|
|
} |
|
|
|
if (CheckIfPatched() ?? false) |
|
|
|
Process.Start("steam://run/1078000/"); |
|
|
|
}; |
|
|
|
if (InvokeRequired) |
|
|
|
Invoke(act); |
|
|
|
} |
|
|
|
|
|
|
|
private void playbtn_Click(object sender, EventArgs e) |
|
|
|
{ |
|
|
|
if (playbtn.ForeColor == Color.Green) return; //Disabled |
|
|
|
PatchGame(); |
|
|
|
} |
|
|
|
|
|
|
|
private void settingsbtn_Click(object sender, EventArgs e) |
|
|
|
{ |
|
|
|
if (settingsbtn.ForeColor == Color.Green) return; //Disabled |
|
|
|
var sf = new SettingsForm(); |
|
|
|
sf.ShowDialog(this); |
|
|
|
} |
|
|
|