From 7a8d262aed50a3f09c8b355b48284bebfc18b33f Mon Sep 17 00:00:00 2001 From: Max Nullov Date: Wed, 26 Feb 2025 16:04:13 +0300 Subject: [PATCH] Feature done: Licensed minecraft support --- Launcher-Core/Launcher.cs | 24 ++++++++++++++----- Launcher-UI/ConfigManager.cs | 5 +--- Launcher-UI/LauncherUtils.cs | 18 ++++++++++---- Launcher-UI/ViewModels/MainWindowViewModel.cs | 3 --- Launcher-UI/Views/LoadingWindow.axaml.cs | 15 ++++++++---- .../Views/SessionManagmentWindow.axaml | 22 +++++++++++------ .../Views/SessionManagmentWindow.axaml.cs | 19 ++++++++++++++- 7 files changed, 77 insertions(+), 29 deletions(-) diff --git a/Launcher-Core/Launcher.cs b/Launcher-Core/Launcher.cs index 3a36263..fcf7170 100644 --- a/Launcher-Core/Launcher.cs +++ b/Launcher-Core/Launcher.cs @@ -17,17 +17,15 @@ namespace Plombir; public class Launcher { private readonly string _version; - private readonly string _nickname; static private MinecraftPath? _mcPath; static private MinecraftLauncher? _mcLauncher; public int DownloadProgress; public string? DownloadStatus; - public Launcher(string userName, string version, string? location = null) + public Launcher(string version, string? location = null) { _version = version; - _nickname = userName; _mcPath = new($"{location}/{version}/minecraft"); _mcLauncher = new(_mcPath); } @@ -51,15 +49,29 @@ public class Launcher return; } - async public Task RunLauncher() + public MSession CreateOfflineSession(string nickname) + { + var s = MSession.CreateOfflineSession(nickname); + if (s is null) throw new NullReferenceException("Tried creating offline session, but it's resulted in null!"); + return s; + } + + public MSession CreateLicensedSession(string uuid, string accsessToken, string nickname) + { + var s = new MSession(nickname, accsessToken, uuid); + if (s is null) throw new NullReferenceException("Tried creating licensed session, but it's resulted in null!"); + return s; + } + + async public Task RunLauncher(MSession session) { if (_mcLauncher is null) throw new NullReferenceException("Failed to run launcher! Launcher is null!"); var process = await _mcLauncher.BuildProcessAsync(_version, new MLaunchOption { - - Session = MSession.CreateOfflineSession(_nickname), + // Passing session, to support offline and licensed login methods. + Session = session, MaximumRamMb = 4096, }) ?? throw new Exception("Failed to start minecraft process!"); diff --git a/Launcher-UI/ConfigManager.cs b/Launcher-UI/ConfigManager.cs index 4d17fad..8d07037 100644 --- a/Launcher-UI/ConfigManager.cs +++ b/Launcher-UI/ConfigManager.cs @@ -10,12 +10,11 @@ public class ConfigManager static private readonly string defaultVersion = "1.20.1"; static private readonly string defaultNickname = "slugcat"; - static private readonly string currentTweaksVersion = "1.2.0"; + static private readonly string currentTweaksVersion = "1.2.1"; static private readonly string defaultLoginType = "offline"; static private readonly string defaultUuid = "offline"; static private readonly string defaultAccsessToken = "offline"; - static private readonly string defaultClientToken = "offline"; public static void BuildDefault() { @@ -40,7 +39,6 @@ public class ConfigManager ["login-method"] = defaultLoginType, ["uuid"] = defaultUuid, ["accsess-token"] = defaultAccsessToken, - ["client-token"] = defaultClientToken, }; @@ -87,7 +85,6 @@ public class ConfigManager case "nickname": { WriteInConfig(key, defaultNickname); return defaultNickname; } case "accsess-token": { WriteInConfig(key, defaultAccsessToken); return defaultAccsessToken; } - case "client-token": { WriteInConfig(key, defaultClientToken); return defaultClientToken; } case "uuid": { WriteInConfig(key, defaultUuid); return defaultUuid; } case "login-method": { WriteInConfig(key, defaultLoginType); return defaultLoginType; } case "tweaks-version": diff --git a/Launcher-UI/LauncherUtils.cs b/Launcher-UI/LauncherUtils.cs index 0fb7874..90befe0 100644 --- a/Launcher-UI/LauncherUtils.cs +++ b/Launcher-UI/LauncherUtils.cs @@ -10,18 +10,23 @@ public class LauncherUtils { public async static Task CreateMinecraftInstance(MainWindowViewModel vm, Window windowCaller) { + var licenseStatus = ConfigManager.ReadConfig("login-method"); + if (vm.Usernick is null) throw new NullReferenceException("Failed to create minecraft instance! Nickname is null!"); if (vm.SelectedVersion is null) throw new NullReferenceException("Failed to create minecraft instance! Selected version is null!"); System.Console.WriteLine($"Creating minecraft instance for {vm.Usernick}, {vm.SelectedVersion} in {vm.RuntimeLocation}"); - LoadingWindow loading = new(vm.Usernick, vm.SelectedVersion, vm.RuntimeLocation); - ConfigManager.WriteInConfig("last-version-launched", vm.SelectedVersion); - ConfigManager.WriteInConfig("nickname", vm.Usernick); + LoadingWindow loading = new(vm); + + SaveCurrentVariablesToConfig(vm); loading.Show(); await loading.InitLoading(); loading.Close(); - await loading.RunMinecraft(); + + if (licenseStatus == "microsoft") await loading.RunMinecraft(true); + else await loading.RunMinecraft(false); + return; } @@ -29,4 +34,9 @@ public class LauncherUtils { } + + private static void SaveCurrentVariablesToConfig(MainWindowViewModel vm) + { + ConfigManager.WriteInConfig("last-version-launched", vm.SelectedVersion); + } } diff --git a/Launcher-UI/ViewModels/MainWindowViewModel.cs b/Launcher-UI/ViewModels/MainWindowViewModel.cs index bcde692..f700160 100644 --- a/Launcher-UI/ViewModels/MainWindowViewModel.cs +++ b/Launcher-UI/ViewModels/MainWindowViewModel.cs @@ -23,9 +23,6 @@ public partial class MainWindowViewModel : ViewModelBase private string? _accsessToken = ConfigManager.ReadConfig("accsess-token"); public string? AccsesToken { get => _accsessToken; set { _accsessToken = value; OnPropertyChanged(nameof(AccsesToken)); } } - private string? _clientToken = ConfigManager.ReadConfig("client-token"); - public string? ClientToken { get => _clientToken; set { _clientToken = value; OnPropertyChanged(nameof(ClientToken)); } } - private string? _uuid = ConfigManager.ReadConfig("uuid"); public string? UUID { get => _uuid; set { _uuid = value; OnPropertyChanged(nameof(UUID)); } } diff --git a/Launcher-UI/Views/LoadingWindow.axaml.cs b/Launcher-UI/Views/LoadingWindow.axaml.cs index 1f9aeac..53d317c 100644 --- a/Launcher-UI/Views/LoadingWindow.axaml.cs +++ b/Launcher-UI/Views/LoadingWindow.axaml.cs @@ -13,12 +13,14 @@ public partial class LoadingWindow : Window { private Launcher ln; private Task? _buildingTask; + private readonly MainWindowViewModel _mainWindowVM; // Tokens for controlling download task. CancellationTokenSource tokenSource = new CancellationTokenSource(); - public LoadingWindow(string nickname, string? version = null, string? location = null) + public LoadingWindow(MainWindowViewModel mainWindowVM) { - ln = new Launcher(nickname, version ?? "1.20.1", location ?? "./runtime"); + _mainWindowVM = mainWindowVM; + ln = new Launcher(_mainWindowVM.SelectedVersion ?? "1.20.1", _mainWindowVM.RuntimeLocation ?? "./runtime"); InitializeComponent(); DataContext = new LoadingWindowViewModel(); } @@ -52,9 +54,14 @@ public partial class LoadingWindow : Window } - public async Task RunMinecraft() + public async Task RunMinecraft(bool IsLicensed) { - await ln.RunLauncher(); + var session = ln.CreateOfflineSession(_mainWindowVM.Usernick); + if (IsLicensed) + { + session = ln.CreateLicensedSession(_mainWindowVM.UUID, _mainWindowVM.AccsesToken, _mainWindowVM.Usernick); + } + await ln.RunLauncher(session); } private void onStopDownloadClick(object sender, RoutedEventArgs e) diff --git a/Launcher-UI/Views/SessionManagmentWindow.axaml b/Launcher-UI/Views/SessionManagmentWindow.axaml index 6682519..388e954 100644 --- a/Launcher-UI/Views/SessionManagmentWindow.axaml +++ b/Launcher-UI/Views/SessionManagmentWindow.axaml @@ -50,6 +50,14 @@ + + + + + @@ -86,6 +94,13 @@ HorizontalAlignment="Left" /> +