List installed mods, launch game, patching if needed
This commit is contained in:
parent
e890c99c16
commit
eeb4074440
3 changed files with 149 additions and 17 deletions
|
@ -6,6 +6,14 @@
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Update="SettingsForm.cs">
|
<Compile Update="SettingsForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
|
24
GCMM/MainForm.Designer.cs
generated
24
GCMM/MainForm.Designer.cs
generated
|
@ -28,9 +28,9 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
System.Windows.Forms.ListViewGroup listViewGroup9 = new System.Windows.Forms.ListViewGroup("Installed", System.Windows.Forms.HorizontalAlignment.Center);
|
System.Windows.Forms.ListViewGroup listViewGroup13 = new System.Windows.Forms.ListViewGroup("Installed", System.Windows.Forms.HorizontalAlignment.Center);
|
||||||
System.Windows.Forms.ListViewGroup listViewGroup10 = new System.Windows.Forms.ListViewGroup("Available", System.Windows.Forms.HorizontalAlignment.Left);
|
System.Windows.Forms.ListViewGroup listViewGroup14 = new System.Windows.Forms.ListViewGroup("Available", System.Windows.Forms.HorizontalAlignment.Left);
|
||||||
System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(new string[] {
|
System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem(new string[] {
|
||||||
"Mod",
|
"Mod",
|
||||||
"1.0",
|
"1.0",
|
||||||
"2020.06.15. 2:01:43",
|
"2020.06.15. 2:01:43",
|
||||||
|
@ -63,19 +63,19 @@
|
||||||
this.latestVersion});
|
this.latestVersion});
|
||||||
this.modlist.ForeColor = System.Drawing.Color.Green;
|
this.modlist.ForeColor = System.Drawing.Color.Green;
|
||||||
this.modlist.FullRowSelect = true;
|
this.modlist.FullRowSelect = true;
|
||||||
listViewGroup9.Header = "Installed";
|
listViewGroup13.Header = "Installed";
|
||||||
listViewGroup9.HeaderAlignment = System.Windows.Forms.HorizontalAlignment.Center;
|
listViewGroup13.HeaderAlignment = System.Windows.Forms.HorizontalAlignment.Center;
|
||||||
listViewGroup9.Name = "installed";
|
listViewGroup13.Name = "installed";
|
||||||
listViewGroup10.Header = "Available";
|
listViewGroup14.Header = "Available";
|
||||||
listViewGroup10.Name = "available";
|
listViewGroup14.Name = "available";
|
||||||
this.modlist.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
|
this.modlist.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
|
||||||
listViewGroup9,
|
listViewGroup13,
|
||||||
listViewGroup10});
|
listViewGroup14});
|
||||||
this.modlist.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
this.modlist.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||||
this.modlist.HideSelection = false;
|
this.modlist.HideSelection = false;
|
||||||
listViewItem5.Group = listViewGroup9;
|
listViewItem7.Group = listViewGroup13;
|
||||||
this.modlist.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
this.modlist.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
||||||
listViewItem5});
|
listViewItem7});
|
||||||
this.modlist.Location = new System.Drawing.Point(12, 12);
|
this.modlist.Location = new System.Drawing.Point(12, 12);
|
||||||
this.modlist.Name = "modlist";
|
this.modlist.Name = "modlist";
|
||||||
this.modlist.Size = new System.Drawing.Size(491, 468);
|
this.modlist.Size = new System.Drawing.Size(491, 468);
|
||||||
|
|
134
GCMM/MainForm.cs
134
GCMM/MainForm.cs
|
@ -1,12 +1,13 @@
|
||||||
using GCMM.Properties;
|
using GCMM.Properties;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Diagnostics;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
@ -34,6 +35,13 @@ namespace GCMM
|
||||||
MessageBox.Show("Found game at " + Settings.Default.GamePath);
|
MessageBox.Show("Found game at " + Settings.Default.GamePath);
|
||||||
Settings.Default.Save();
|
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)
|
public void UpdateButton(Button button, bool enabled)
|
||||||
|
@ -88,13 +96,129 @@ namespace GCMM
|
||||||
return Directory.GetParent(ofd.FileName).FullName;
|
return Directory.GetParent(ofd.FileName).FullName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
private void playbtn_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (playbtn.ForeColor == Color.Green) return; //Disabled
|
||||||
|
PatchGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void settingsbtn_Click(object sender, EventArgs e)
|
private void settingsbtn_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (settingsbtn.ForeColor == Color.Green) return; //Disabled
|
||||||
var sf = new SettingsForm();
|
var sf = new SettingsForm();
|
||||||
sf.ShowDialog(this);
|
sf.ShowDialog(this);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue