using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.IO; using System.Diagnostics; using System.Reflection; using RageCoop.Core; using System.Threading; using System.Net; using System.Windows.Forms; using Path = System.IO.Path; using MessageBox = System.Windows.MessageBox; using OpenFileDialog = Microsoft.Win32.OpenFileDialog; namespace RageCoop.Client.Installer { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Choose(); } private void Choose() { var od = new OpenFileDialog() { Filter = "GTA 5 executable |GTA5.exe;PlayGTAV.exe", Title="Select you GTAV executable" }; if (od.ShowDialog() ?? false == true) { Task.Run(() => { try { Install(Directory.GetParent(od.FileName).FullName); } catch (Exception ex) { MessageBox.Show("Installation failed: " + ex.ToString()); Environment.Exit(1); } }); } else { Environment.Exit(0); } } void Install(string root) { UpdateStatus("Checking requirements"); var shvPath = Path.Combine(root, "ScriptHookV.dll"); var shvdnPath = Path.Combine(root, "ScriptHookVDotNet3.dll"); var scriptsPath = Path.Combine(root, "Scripts"); var lemonPath = Path.Combine(scriptsPath, "LemonUI.SHVDN3.dll"); var installPath = Path.Combine(scriptsPath, "RageCoop"); if(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName == installPath) { throw new InvalidOperationException("The installer is not meant to be run in the game folder, please extract the zip to somewhere else and run again."); } Directory.CreateDirectory(installPath); if (!File.Exists(shvPath)) { MessageBox.Show("Please install ScriptHookV first!"); Environment.Exit(1); } if (!File.Exists(shvdnPath)) { MessageBox.Show("Please install ScriptHookVDotNet first!"); Environment.Exit(1); } var shvdnVer = GetVer(shvdnPath); if (shvdnVer !x.StartsWith(";") && x.EndsWith(" = " +(int)settings.MenuKey)); if (lines.Any()) { if(MessageBox.Show("Following menyoo config value will conflict with RAGECOOP menu key\n" + string.Join("\n", lines) + "\nDo you wish to change the Menu Key?", "Warning!", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { var ae=new AutoResetEvent(false); UpdateStatus("Press the key you wish to change to"); Dispatcher.BeginInvoke(new Action(() => KeyDown += (s,e) => { settings.MenuKey = (Keys)KeyInterop.VirtualKeyFromKey(e.Key); ae.Set(); })); ae.WaitOne(); if (!Util.SaveSettings(settingsPath,settings)) { MessageBox.Show("Error occurred when saving settings"); Environment.Exit(1); } MessageBox.Show("Menu key changed to "+settings.MenuKey); goto checkKeys; } } } UpdateStatus("Checking ZeroTier"); try { ZeroTierHelper.Check(); } catch { if (MessageBox.Show("You can't join ZeroTier server unless ZeroTier is installed, do you want to download and install it?","Install ZeroTier",MessageBoxButton.YesNo)==MessageBoxResult.Yes) { var url = "https://download.zerotier.com/dist/ZeroTier%20One.msi"; UpdateStatus("Downloading ZeroTier from "+url); try { HttpHelper.DownloadFile(url, "ZeroTier.msi", (p) => UpdateStatus("Downloading ZeroTier " + p + "%")); UpdateStatus("Installing ZeroTier"); Process.Start("ZeroTier.msi").WaitForExit(); } catch { MessageBox.Show("Failed to download ZeroTier, please download it from officail website"); Process.Start(url); } } } UpdateStatus("Completed!"); MessageBox.Show("Installation sucessful!"); Environment.Exit(0); } } void UpdateStatus(string status) { Dispatcher.BeginInvoke(new Action(() => Status.Content = status)); } Version GetVer(string location) { return Version.Parse(FileVersionInfo.GetVersionInfo(location).FileVersion); } byte[] getLemon() { return (byte[])Resource.ResourceManager.GetObject("LemonUI_SHVDN3"); } } }