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

263 lines
8.3 KiB
C#

using CmlLib.Core;
using CmlLib.Core.Installer.FabricMC;
using CmlLib.Core.Installer.Forge.Versions;
using CmlLib.Core.Version;
using CmlLib.Core.VersionLoader;
using CmlLib.Core.VersionMetadata;
using Semver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using WolfLauncher.core;
using WolfLauncher.model;
/**
* Author: HypherionSA
* Instance Creation dialog
**/
namespace WolfLauncher.gui.launcher
{
public partial class CreateVanillaInstance : Form
{
// Set launcher instance
private Launcher launcher = Launcher.INSTANCE;
private CMLauncher l;
// Cache
private List<ListViewItem> items = new List<ListViewItem>();
private ListViewItem lastItem;
// First MC version that supports fabric
private SemVersion fabricLowest = SemVersion.Parse("1.14.2");
public CreateVanillaInstance()
{
InitializeComponent();
l = launcher.getCMLauncher();
l.VersionLoader = new MojangVersionLoader();
this.Text = String.Format("{0} - {1} - {2}", "Create Instance", LauncherConstants.LauncherName, LauncherConstants.Version);
}
private async void CreateVanillaInstance_Load(object sender, EventArgs e)
{
// Get game versions
MVersionCollection versions = await l.GetAllVersionsAsync();
versionsList.Items.Clear();
// Load Versions into list
foreach(MVersionMetadata meta in versions)
{
ListViewItem itm = new ListViewItem(meta.Name);
itm.SubItems.Add(meta.ReleaseTimeStr);
itm.SubItems.Add(meta.Type);
versionsList.Items.Add(itm);
items.Add(itm);
}
// Apply version filtering
sortItems();
}
private void sortItems()
{
// Clear List
versionsList.Items.Clear();
foreach (ListViewItem itm in items)
{
// Release Version
if (itm.SubItems[2].Text.Equals("release") && releasesCheck.Checked)
versionsList.Items.Add(itm);
// Snapshot Version
if (itm.SubItems[2].Text.Equals("snapshot") && snapshotsCheck.Checked)
versionsList.Items.Add(itm);
// Beta Version
if (itm.SubItems[2].Text.Equals("old_beta") && betasCheck.Checked)
versionsList.Items.Add(itm);
// Alpha version
if (itm.SubItems[2].Text.Equals("old_alpha") && alphasCheck.Checked)
versionsList.Items.Add(itm);
}
// Select first item in list
if (versionsList.Items.Count > 0)
versionsList.Items[0].Selected = true;
}
private void releasesCheck_CheckedChanged(object sender, EventArgs e)
{
// Apply Filter
sortItems();
}
private void snapshotsCheck_CheckedChanged(object sender, EventArgs e)
{
// Apply Filter
sortItems();
}
private void betasCheck_CheckedChanged(object sender, EventArgs e)
{
// Apply Filter
sortItems();
}
private void alphasCheck_CheckedChanged(object sender, EventArgs e)
{
// Apply Filter
sortItems();
}
/**
* Selected version changed. Update Loaders list if needed
**/
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (versionsList.SelectedItems.Count > 0)
{
// Refresh Forge
if (forgeLoader.Checked)
loadForge();
// Refresh Fabric
if (fabricLoader.Enabled && fabricLoader.Checked)
loadFabric();
// Update instance name, if the user didn't change it
ListViewItem sel = versionsList.SelectedItems[0];
if (lastItem == null || instanceName.Text == lastItem.Text || String.IsNullOrEmpty(instanceName.Text))
{
instanceName.Text = sel.Text;
lastItem = sel;
}
// Load fabric versions if available
try
{
SemVersion currentVer = SemVersion.Parse(sel.Text);
fabricLoader.Enabled = currentVer.ComparePrecedenceTo(fabricLowest) >= 0;
} catch
{
fabricLoader.Enabled = true;
}
}
}
/**
* Load and Filter forge versions
**/
private async void loadForge()
{
// Clear dropdown
loaderDropdown.Items.Clear();
try
{
// Load Forge Versions for selected minecraft version
var forgeLoader = new ForgeVersionLoader(new System.Net.Http.HttpClient());
var versions = await forgeLoader.GetForgeVersions(versionsList.SelectedItems[0].Text);
var recommended = versions.First(v => v.IsRecommendedVersion);
foreach (var version in versions)
{
// Mark item as recommended if it is
String ver = version.ForgeVersionName;
if (recommended != null && version.ForgeVersionName == recommended.ForgeVersionName)
ver += " (Recommended)";
// Add item to dropdown
loaderDropdown.Items.Add(ver);
}
} catch { }
}
/**
* Load Fabric Versions
**/
private async void loadFabric()
{
// Clear dropdown
loaderDropdown.Items.Clear();
// Load Fabric Versions
var fabricLoader = new FabricVersionLoader();
var fabricVersions = await fabricLoader.GetVersionMetadatasAsync();
foreach (var v in fabricVersions)
{
// Add item to dropdown
loaderDropdown.Items.Add(v.Name);
}
}
/**
* Forge radio checked, so we refresh forge
**/
private void forgeLoader_CheckedChanged(object sender, EventArgs e)
{
if (forgeLoader.Checked)
loadForge();
}
/**
* Set up instance meta data ready to be written to the disk
**/
private void createInstance_Click(object sender, EventArgs e)
{
// Create new instance manifest
Instance instance = new Instance();
// Set game version for instance
instance.gameVersion = versionsList.SelectedItems[0].Text;
// Set instance name
instance.name = instanceName.Text;
// Local install. This instance will be ignored from update checkers
instance.localInstall = true;
// Check if a mod loader should be installed
if (loaderDropdown.Items.Count > 0 && loaderDropdown.SelectedItem != null)
{
// Loader is forge
if (forgeLoader.Checked)
instance.loader = "forge:" + loaderDropdown.SelectedItem.ToString().Replace(" (Recommended)", "");
// Loader is fabric
if (fabricLoader.Checked)
instance.loader = "fabric:" + loaderDropdown.SelectedItem.ToString();
}
// Set default settings for instance
instance.settings = new Instance.Settings
{
maxRam = 2024,
minRam = 512,
screenHeight = "auto",
screenWidth = "auto",
javaPath = "",
javaArgs = ""
};
// Persist to disk
var s = launcher.install(instance);
// Close the window if the instance was created
if (s)
this.Close();
}
private void fabricLoader_CheckedChanged(object sender, EventArgs e)
{
// Fabric selected, load fabric versions
if (fabricLoader.Checked)
loadFabric();
}
}
}