Files
WolfLauncher/gui/launcher/InstallerForm.cs
2023-08-02 14:01:07 +02:00

138 lines
4.6 KiB
C#

using CmlLib.Core;
using CmlLib.Core.Downloader;
using CmlLib.Core.Files;
using CmlLib.Core.Installer.FabricMC;
using CmlLib.Core.Installer.Forge;
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
using WolfLauncher.core;
using WolfLauncher.model;
/**
* Author: HypherionSA
* Instance Installer/Verifier
**/
namespace WolfLauncher.gui.launcher
{
public partial class InstallerForm : Form
{
// References to Launcher instance
private Launcher launcer = Launcher.INSTANCE;
private Instance i;
private CMLauncher l;
public InstallerForm(Instance instance)
{
InitializeComponent();
// Setup Variables
i = instance;
l = launcer.getCMLauncher();
Control.CheckForIllegalCrossThreadCalls = false;
this.Text = String.Format("{0} - {1} - {2}", "Preparing " + instance.name, LauncherConstants.LauncherName, LauncherConstants.Version);
}
private void InstallerForm_Load(object sender, EventArgs e)
{
// Register Event Listeners
l.FileChanged += downloadFileChanged;
l.ProgressChanged += downloadProgress;
}
private void downloadProgress(object sender, ProgressChangedEventArgs e)
{
// Update Progress Bar
dlProgressbar.Value = e.ProgressPercentage;
}
private void downloadFileChanged(DownloadFileChangedEventArgs e)
{
// Verification, so we ignore
if (e.Source is IFileChecker)
return;
try
{
// Update progress label
downloadLabel.Text = "Downloading " + e.FileKind.ToString() + " - " + e.ProgressedFileCount + "/" + e.TotalFileCount + " files";
}
catch { }
}
private void InstallerForm_Shown(object sender, EventArgs e)
{
// Start Installation/Verifaction Process
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();
}
private async void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Check if we should install a loader
if (i.loader != null && i.loader != "none")
{
// Instance requires forge
if (i.loader.Contains("forge:"))
{
// Parse forge version from manifest
var loader = i.loader.Replace("forge:", "");
LauncherLogger.INSTANCE.addLog("Installing Forge " + loader);
// Install Forge
var forge = new MForge(l);
forge.ProgressChanged += downloadProgress;
forge.FileChanged += downloadFileChanged;
forge.Install(i.gameVersion, loader).Wait();
l.GetAllVersions();
}
// Instance requires Fabric
if (i.loader.Contains("fabric:"))
{
// Parse fabric version from manifest
var loader = i.loader.Replace("fabric:", "");
LauncherLogger.INSTANCE.addLog("Installing Fabric " + loader);
// Install Fabric
var fabricLoader = new FabricVersionLoader();
var fabricV = await fabricLoader.GetVersionMetadatasAsync();
var fabric = fabricV.GetVersionMetadata(loader);
fabric.Save(l.MinecraftPath);
// Vanilla Install
l.CheckAndDownload(l.GetVersion(i.gameVersion));
l.GetAllVersions();
}
} else
{
// Vanilla Install
l.CheckAndDownload(l.GetVersion(i.gameVersion));
l.GetAllVersions();
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Progress is finished, so we remove listeners
l.FileChanged -= downloadFileChanged;
l.ProgressChanged -= downloadProgress;
// Wait for all threads to shut down and close the dialog
Thread.Sleep(1000);
this.DialogResult = DialogResult.OK;
this.Close();
}
private void InstallerForm_FormClosing(object sender, FormClosingEventArgs e)
{
// Worker is busy, so form cannot be closed
if (backgroundWorker1.IsBusy)
e.Cancel = true;
}
}
}