From 25fbe2f22b16b3815caaaf6e035bf82f9bac5388 Mon Sep 17 00:00:00 2001 From: IveBeenAlone Date: Sun, 18 Jan 2026 20:03:35 -0500 Subject: [PATCH] Rebased the entire system to have a built-in downloader. Also probably fixed some bugs? --- Form1.Designer.cs | 92 ++++++++++++- Form1.cs | 269 +++++++++++++++++++++++++++++++++++-- IBAHytaleLauncher.csproj | 2 + Properties/AssemblyInfo.cs | 4 +- 4 files changed, 354 insertions(+), 13 deletions(-) diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 233bfb4..188bf19 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -39,6 +39,13 @@ this.checkUUID = new System.Windows.Forms.CheckBox(); this.btnPlay = new System.Windows.Forms.Button(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.btnInstallVersion = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.installProgressBar1 = new System.Windows.Forms.ProgressBar(); + this.label2 = new System.Windows.Forms.Label(); + this.comboBox2Play = new System.Windows.Forms.ComboBox(); + this.btnUninstallVersion = new System.Windows.Forms.Button(); this.SuspendLayout(); // // textBoxUsername @@ -111,7 +118,7 @@ // // btnPlay // - this.btnPlay.Location = new System.Drawing.Point(285, 26); + this.btnPlay.Location = new System.Drawing.Point(550, 26); this.btnPlay.Name = "btnPlay"; this.btnPlay.Size = new System.Drawing.Size(104, 104); this.btnPlay.TabIndex = 9; @@ -127,11 +134,83 @@ this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; this.toolTip1.ToolTipTitle = "UUID"; // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(270, 25); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(200, 21); + this.comboBox1.TabIndex = 10; + this.comboBox1.Text = "Select A Version"; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // btnInstallVersion + // + this.btnInstallVersion.Location = new System.Drawing.Point(408, 52); + this.btnInstallVersion.Name = "btnInstallVersion"; + this.btnInstallVersion.Size = new System.Drawing.Size(62, 20); + this.btnInstallVersion.TabIndex = 11; + this.btnInstallVersion.Text = "Install"; + this.btnInstallVersion.UseVisualStyleBackColor = true; + this.btnInstallVersion.Click += new System.EventHandler(this.btnInstallVersion_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(270, 10); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(271, 13); + this.label1.TabIndex = 12; + this.label1.Text = "Game Updater (May freeze launcher while downloading)"; + // + // installProgressBar1 + // + this.installProgressBar1.Location = new System.Drawing.Point(270, 52); + this.installProgressBar1.Name = "installProgressBar1"; + this.installProgressBar1.Size = new System.Drawing.Size(132, 20); + this.installProgressBar1.TabIndex = 13; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(273, 94); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(73, 13); + this.label2.TabIndex = 16; + this.label2.Text = "Game Version"; + // + // comboBox2Play + // + this.comboBox2Play.FormattingEnabled = true; + this.comboBox2Play.Location = new System.Drawing.Point(273, 109); + this.comboBox2Play.Name = "comboBox2Play"; + this.comboBox2Play.Size = new System.Drawing.Size(200, 21); + this.comboBox2Play.TabIndex = 14; + this.comboBox2Play.Text = "Select A Version"; + this.comboBox2Play.SelectedIndexChanged += new System.EventHandler(this.comboBox2Play_SelectedIndexChanged); + // + // btnUninstallVersion + // + this.btnUninstallVersion.Location = new System.Drawing.Point(408, 136); + this.btnUninstallVersion.Name = "btnUninstallVersion"; + this.btnUninstallVersion.Size = new System.Drawing.Size(62, 20); + this.btnUninstallVersion.TabIndex = 17; + this.btnUninstallVersion.Text = "Uninstall"; + this.btnUninstallVersion.UseVisualStyleBackColor = true; + this.btnUninstallVersion.Click += new System.EventHandler(this.btnUninstallVersion_Click); + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(404, 161); + this.ClientSize = new System.Drawing.Size(684, 161); + this.Controls.Add(this.btnUninstallVersion); + this.Controls.Add(this.label2); + this.Controls.Add(this.comboBox2Play); + this.Controls.Add(this.installProgressBar1); + this.Controls.Add(this.label1); + this.Controls.Add(this.btnInstallVersion); + this.Controls.Add(this.comboBox1); this.Controls.Add(this.btnPlay); this.Controls.Add(this.checkUUID); this.Controls.Add(this.checkUsername); @@ -140,7 +219,9 @@ this.Controls.Add(this.textBoxUUID); this.Controls.Add(this.labelUsername); this.Controls.Add(this.textBoxUsername); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; this.Name = "Form1"; this.Text = "IveBeenAlone\'s Hytale Launcher"; this.ResumeLayout(false); @@ -158,6 +239,13 @@ private System.Windows.Forms.CheckBox checkUUID; private System.Windows.Forms.Button btnPlay; private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Button btnInstallVersion; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ProgressBar installProgressBar1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox comboBox2Play; + private System.Windows.Forms.Button btnUninstallVersion; } } diff --git a/Form1.cs b/Form1.cs index 4ae5fd3..af9ed25 100644 --- a/Form1.cs +++ b/Form1.cs @@ -5,12 +5,18 @@ using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; +using System.IO.Compression; using System.Linq; +using System.Net.Http; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + + + namespace HelloWorld { @@ -19,6 +25,10 @@ namespace HelloWorld public Form1() { InitializeComponent(); + LoadComboBoxItems(); + LoadDownloadedFiles(); + + string path = ".ibalaunch"; string uuidsave = ".ibalaunch\\uuid"; string usersave = ".ibalaunch\\username"; @@ -159,22 +169,57 @@ namespace HelloWorld Console.WriteLine("UUID Shit done."); + // All of this shit is Last Played version data. + string DropDownGameVers = comboBox2Play.Text; + string verssave = ".ibalaunch\\lastplayedversion"; + File.Create(verssave).Dispose(); + Console.WriteLine("LastPlayedVersion File exists, comparing textbox"); + string VersFileText = File.ReadAllText(verssave); + if (VersFileText != DropDownGameVers) + { + Console.WriteLine("LastPlayedVersion mismatch, writing!"); + try + { + File.WriteAllText(verssave, DropDownGameVers); + Console.WriteLine("LastPlayedVersion file saved."); + } + catch (Exception) + { + Console.WriteLine("An error occurred: idfk probably rw permission error?"); + } + } + else + { + Console.WriteLine("LastPlayedVersion already saved."); + } + + Console.WriteLine("LastPlayedVersion Shit done."); + + + + // Genuinely FUCK windows and C# and fucking whatever else to make this shit work // I swear to fucking god I spent a solid 3 hours trying to make this thing // OPEN A FUCKING EXE AND PASS ARGS CORRECTLY - string relativeExePath = Path.Combine("release\\package\\game\\latest\\Client\\", "HytaleClient.exe"); + string relativeExePath = Path.Combine("install\\release\\package\\game\\latest\\Client\\", "HytaleClient.exe"); string baseDirectory = AppDomain.CurrentDomain.BaseDirectory; - string workingDirectory = Path.Combine(baseDirectory, "install"); - string Hytaleappdir = "\\release\\package\\game\\latest"; - string HytaleJava = "\\release\\package\\jre\\latest\\bin\\java.exe"; + string workingDirectory = Path.Combine(baseDirectory, "Versions"); + string Hytaleappdir = "\\install\\release\\package\\game\\latest"; + string HytaleJava = "\\install\\release\\package\\jre\\latest\\bin\\java.exe"; - string GamePath = "\"" + workingDirectory + "\\" + relativeExePath + "\""; //hytale.exe - string AppPath = "\"" + workingDirectory + Hytaleappdir + "\""; // game\latest - string UserdataPath = "\"" + baseDirectory + "UserData"+"\""; // game\latest - string JavaPath = "\"" + workingDirectory + HytaleJava + "\""; // java + + string LaunchVersion = comboBox2Play.Text; + + + string GamePath = "\"" + workingDirectory + "\\" + LaunchVersion + "\\" + relativeExePath + "\""; //hytale.exe + string AppPath = "\"" + workingDirectory + "\\" + LaunchVersion + Hytaleappdir + "\""; // game\latest + string UserdataPath = "\"" + baseDirectory + "UserData"+"\""; + string JavaPath = "\"" + workingDirectory + "\\" + LaunchVersion + HytaleJava + "\""; // java string arguments = " --app-dir " +AppPath+ " --user-dir " + UserdataPath + " --java-exec " + JavaPath + " --auth-mode offline --uuid 13371337-1337-1337-1337-1337" + textBoxUUID.Text + " --name \"" + textBoxUsername.Text + "\""; // Command-line arguments for the VB app + + ProcessStartInfo startInfo = new ProcessStartInfo { FileName = GamePath, @@ -191,7 +236,7 @@ namespace HelloWorld } catch (Exception ex) { - MessageBox.Show($"Error starting the VB.NET application: {ex.Message}"); + MessageBox.Show($"Error starting the application: {ex.Message}\n" + GamePath + arguments); } } @@ -204,5 +249,211 @@ namespace HelloWorld textBoxUUID.Text = GeneratedUUIDVal.ToString(); } private void checkUUID_CheckedChanged(object sender, EventArgs e){} + + + private async void LoadComboBoxItems() + { + string url = "https://ibatv.xyz/data/list.txt"; + + try + { + using (HttpClient client = new HttpClient()) + { + string fileContents = await client.GetStringAsync(url); + + string[] lines = fileContents + .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + + comboBox1.Items.Clear(); + comboBox1.Items.AddRange(lines); + } + } + catch (Exception ex) + { + MessageBox.Show("Failed to load items: " + ex.Message); + } + } + + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){} + + private async void btnInstallVersion_Click(object sender, EventArgs e) + { + + if (comboBox1.SelectedItem == null) + { + MessageBox.Show("Please select a version first."); + return; + } + + string baseUrl = "https://ibatv.xyz/data/files/"; + string rawName = comboBox1.SelectedItem.ToString(); + string fileName = rawName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) + ? rawName + : rawName + ".zip"; + string fileUrl = baseUrl + fileName; + + string InstallBaseDirectory = AppDomain.CurrentDomain.BaseDirectory; + string savePath = Path.Combine(InstallBaseDirectory, fileName); + string installDir = Path.Combine(InstallBaseDirectory, "Versions"); + + string localListPath = Path.Combine(installDir,"versions.txt"); + + + try + { + using (HttpClient client = new HttpClient()) + using (HttpResponseMessage response = await client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead)) + { + response.EnsureSuccessStatusCode(); + + long? totalBytes = response.Content.Headers.ContentLength; + + using (var contentStream = await response.Content.ReadAsStreamAsync()) + using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None, 41943040, true)) + { + var buffer = new byte[41943040]; //40MiB apparently. :shrug: + long totalRead = 0; + int bytesRead; + installProgressBar1.Value = 0; + + while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await fileStream.WriteAsync(buffer, 0, bytesRead); + totalRead += bytesRead; + + if (totalBytes.HasValue) + { + int progress = (int)((totalRead * 100L) / totalBytes.Value); + installProgressBar1.Value = Math.Min(progress, 100); + } + } + } + } + + string folderName = Path.GetFileNameWithoutExtension(fileName); + string extractPath = Path.Combine(installDir, folderName); + + Directory.CreateDirectory(extractPath); + ZipFile.ExtractToDirectory(savePath, extractPath); + + File.Delete(savePath); + + string baseName = Path.GetFileNameWithoutExtension(fileName); + + List downloadedFiles = new List(); + if (File.Exists(localListPath)) + downloadedFiles = File.ReadAllLines(localListPath).ToList(); + + // Append only if not already in the list + if (!downloadedFiles.Contains(baseName, StringComparer.OrdinalIgnoreCase)) + { + File.AppendAllText(localListPath, baseName + Environment.NewLine); + LoadDownloadedFiles(); + } + + MessageBox.Show("Download complete:\n" + savePath + "\n" + "Extracted to:\n" + installDir); + } + catch (Exception ex) + { + MessageBox.Show("Download failed:\n" + ex.Message); + } + + } + + private void comboBox2Play_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + + private void LoadDownloadedFiles() + { + + string InstallBaseDirectory = AppDomain.CurrentDomain.BaseDirectory; + string installDir = Path.Combine(InstallBaseDirectory, "Versions"); + string localListPath = Path.Combine(installDir, "versions.txt"); + + comboBox2Play.Items.Clear(); // Clear old items + + if (File.Exists(localListPath)) + { + var downloadedFiles = File.ReadAllLines(localListPath); + + foreach (var file in downloadedFiles) + { + if (!string.IsNullOrWhiteSpace(file)) + comboBox2Play.Items.Add(file); + } + } + } + + private void btnUninstallVersion_Click(object sender, EventArgs e) + { + //string baseUrl = "https://ibatv.xyz/data/files/"; + string rawName = comboBox1.SelectedItem.ToString(); + string fileName = rawName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) + ? rawName + : rawName + ".zip"; + //string fileUrl = baseUrl + fileName; + + string InstallBaseDirectory = AppDomain.CurrentDomain.BaseDirectory; + string savePath = Path.Combine(InstallBaseDirectory, fileName); + string installDir = Path.Combine(InstallBaseDirectory, "Versions"); + + string localListPath = Path.Combine(installDir, "versions.txt"); + + + + if (comboBox2Play.SelectedItem == null) + { + MessageBox.Show("Please select a version to delete.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + string selectedVersion = comboBox2Play.SelectedItem.ToString(); + + // Confirm deletion + var result = MessageBox.Show( + $"Are you sure you want to delete the version '{selectedVersion}'?", + "Confirm Deletion", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question + ); + + if (result != DialogResult.Yes) + return; + + try + { + // Delete installed folder + //string installDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string versionPath = Path.Combine(installDir, selectedVersion); + + if (Directory.Exists(versionPath)) + Directory.Delete(versionPath, true); // true = recursive delete + + // Update local list + // string localListPath = Path.Combine(installDir, "downloaded_files.txt"); + if (File.Exists(localListPath)) + { + var downloadedFiles = File.ReadAllLines(localListPath).ToList(); + downloadedFiles.RemoveAll(f => string.Equals(f, selectedVersion, StringComparison.OrdinalIgnoreCase)); + File.WriteAllLines(localListPath, downloadedFiles); + } + + // Remove from ComboBox + comboBox2Play.Items.Remove(selectedVersion); + + LoadDownloadedFiles(); + + MessageBox.Show($"Version '{selectedVersion}' has been deleted.", "Deleted", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show("Error deleting version:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } } } \ No newline at end of file diff --git a/IBAHytaleLauncher.csproj b/IBAHytaleLauncher.csproj index 05536a5..5be63da 100644 --- a/IBAHytaleLauncher.csproj +++ b/IBAHytaleLauncher.csproj @@ -56,6 +56,8 @@ + + diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 84d29fc..fbc8053 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.9.7.0")] -[assembly: AssemblyFileVersion("2.9.7.0")] +[assembly: AssemblyVersion("3.7.26.0")] +[assembly: AssemblyFileVersion("3.7.26.0")]