public LauncherForm() { var appLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var associatedLaunchers = Helpers.GetAssociatedLaunchers(appLocation); if (!Helpers.LauncherInLineageDirectory(appLocation)) { MessageBox.Show("The launcher must be installed in your Lineage directory!\n\n " + @"Please reinstall if you used the installer, or move this file to your lineage directory.", @"Invalid Directory", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; } // If no launchers are available, let's assume resurrection if (associatedLaunchers.Count == 0) { associatedLaunchers.Add("Lineage Resurrection"); } if (associatedLaunchers.Count > 1) { MessageBox.Show("More than one launcher associated with this folder! Using the first one found."); } var launcherConfig = Helpers.GetLauncherConfig(associatedLaunchers[0], appLocation); if (launcherConfig == null) { MessageBox.Show("There was an error loading the config. Please re-install the launcher."); this.Close(); return; } this._config = launcherConfig; if (this._config == null || this._config.Servers == null || this._config.Servers.Count == 0) { MessageBox.Show(@"No servers configured, contact your server admin. Closing launcher.", @"No Servers Found", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Load += (s, e) => { this.Close(); Application.Exit(); }; } this._isWin8OrHigher = Helpers.IsWin8OrHigher(out this._windowsVersion); InitializeComponent(); this.BannerBrowser.Url = this._config.NewsUrl; }
} //end LauncherForm_KeyDown private void updateChecker_DoWork(object sender, DoWorkEventArgs e) { try { var force = e.Argument != null && (bool)e.Argument; var versionInfo = Helpers.GetVersionInfo(this._config.VersionInfoUrl, this._config.PublicKey); var launcherKey = Registry.CurrentUser.OpenSubKey(@"Software\" + this._config.KeyName, true); var lastUpdatedCheck = launcherKey.GetValue("LastUpdated"); var updatesLastRun = (int?)lastUpdatedCheck ?? 0; if (versionInfo == null) { return; } var settings = Helpers.LoadSettings(this._config.KeyName); if (Helpers.UpdateConfig(versionInfo)) { MessageBox.Show("Configuration information was updated from the server.\n\nThe launcher will close. Please re-launch.", @"Configuration Updated", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); return; } var applicationPath = Application.ExecutablePath; var appDataPath = Directory.GetParent(Application.UserAppDataPath).ToString(); var updaterLocation = Path.Combine(appDataPath, "Updater.exe"); var updaterChecksum = Helpers.GetChecksum(updaterLocation); if (!File.Exists(updaterLocation) || updaterChecksum != versionInfo.FileChecksums["Updater.exe"]) { using (var client = new WebClient()) { client.DownloadProgressChanged += client_DownloadProgressChanged; client.DownloadFileAsyncSync(new Uri(this._config.UpdaterUrl.ToString()), updaterLocation); } this.updateChecker.ReportProgress(1); } //end if if (versionInfo.Version != Version) { var result = DialogResult.Cancel; // push to the UI thread to actually display the dialog... ugly hack var dialog = this.BeginInvoke(new MethodInvoker(delegate { result = new UpdateForm(versionInfo).ShowDialog(); })); this.EndInvoke(dialog); if (result == DialogResult.OK) { var info = new ProcessStartInfo(updaterLocation); info.Arguments = "\"" + applicationPath + "\""; if (Environment.OSVersion.Version.Major >= 6) { info.Verb = "runas"; } Process.Start(info); } //end if } //end if if (versionInfo.LastUpdated < updatesLastRun && !force) { return; } // checks for > 1 because the Updater.exe is always present. if (versionInfo.FileChecksums != null && versionInfo.FileChecksums.Count > 1) { Helpers.SetControlPropertyThreadSafe(this.prgUpdates, "Maximum", versionInfo.FileChecksums.Count); for (var i = 1; i < versionInfo.FileChecksums.Count; i++) { var file = versionInfo.FileChecksums.ElementAt(i).Key; var checksum = versionInfo.FileChecksums.ElementAt(i).Value; var filePath = Path.Combine(this._config.InstallDir, file); if (!File.Exists(filePath) || Helpers.GetChecksum(filePath) != checksum) { var extension = Path.GetExtension(file); using (var client = new WebClient()) { client.DownloadProgressChanged += client_DownloadProgressChanged; if (File.Exists(filePath) && extension != null && extension.Equals(".pak", StringComparison.CurrentCultureIgnoreCase) && !file.Contains("zelgo")) { var idxFile = filePath.Replace(".pak", ".idx"); var pakIndex = PakTools.RebuildPak(filePath, versionInfo.PakFiles[file], true); PakTools.RebuildIndex(idxFile, pakIndex, true); } else { client.DownloadFileAsyncSync( new Uri(this._config.UpdaterFilesRoot + file.Replace("\\", "/")), filePath); } } } this.updateChecker.ReportProgress(i); } //end for var currentTime = DateTime.UtcNow - new DateTime(1970, 1, 1); launcherKey.SetValue("LastUpdated", (int)currentTime.TotalSeconds, RegistryValueKind.DWord); string versionName; var isWin8OrHigher = Helpers.IsWin8OrHigher(out versionName); if (isWin8OrHigher && versionName == "Windows 10" && settings.ClientBin.ToLower() != "s3ep1u.bin") { settings.ClientBin = "S3EP1U.bin"; Helpers.SaveSettings(this._config.KeyName, settings, this._config.InstallDir, true); MessageBox.Show( "You're running Windows 10, but aren't using the S3EP1U.bin file. It has now been automatically set.\n\n" + @"If you want to use the normal S3EP1.bin file, you can update it under Settings -> Client Settings.", @"Windows 10 Detected", MessageBoxButtons.OK, MessageBoxIcon.Information); } //end if } //end if } finally { this.updateChecker.ReportProgress(this.prgUpdates.Maximum); } //end try/finally } //end updateChecker