/// <summary> /// Launch SA:MP /// </summary> /// <param name="server">Server</param> /// <param name="username">Username</param> /// <param name="serverPassword">Server password</param> /// <param name="rconPassword">RCON password</param> /// <param name="debug">Debug mode</param> /// <param name="quitWhenDone">Quit when done</param> /// <param name="createSessionLog">Create session log</param> /// <param name="plugins">Plugins</param> /// <param name="f">Form to close</param> public static void LaunchSAMP(Server server, string username, string serverPassword, string rconPassword, bool debug, bool quitWhenDone, bool createSessionLog, PluginDataContract[] plugins, Form f) { if ((server != null) || debug) { if (debug || server.IsValid) { IntPtr mh = Kernel32.GetModuleHandle("kernel32.dll"); if (mh != IntPtr.Zero) { IntPtr load_library_w = Kernel32.GetProcAddress(mh, "LoadLibraryW"); if (load_library_w != IntPtr.Zero) { Kernel32.PROCESS_INFORMATION process_info; Kernel32.STARTUPINFO startup_info = new Kernel32.STARTUPINFO(); if (CheckIfGTASanAndreasIsLaunchable) { string modified_username = ((username == null) ? "" : username.Trim().Replace(' ', '_')); if (createSessionLog) { lastMediaState = SessionProvider.GetCurrentMediaState(); lastSessionData = new SessionDataContract(DateTime.Now, TimeSpan.Zero, SAMPProvider.CurrentVersion.Name, modified_username, (server == null) ? "" : server.IPPortString, (server == null) ? "" : server.Hostname, (server == null) ? "" : server.Gamemode, (server == null) ? "" : server.Language); } if (Kernel32.CreateProcess(GTASAExe, debug ? "-d" : "-c " + ((rconPassword == null) ? "" : rconPassword) + " -h " + server.IPv4AddressString + " -p " + server.Port + " -n " + modified_username + ((serverPassword == null) ? "" : (" -z " + serverPassword)), IntPtr.Zero, IntPtr.Zero, false, /* DETACHED_PROCESS */ 0x8 | /* CREATE_SUSPENDED */ 0x4, IntPtr.Zero, ExeDir, ref startup_info, out process_info)) { InjectPlugin(SAMPDLLPath, process_info.hProcess, load_library_w); PluginDataContract[] load_plugins = ((plugins == null) ? PluginsDataIO : plugins); foreach (PluginDataContract plugin in load_plugins) { if (plugin != null) { if (plugin.Enabled) { InstalledPlugin installed_plugin = PluginProvider.Update(plugin); if (installed_plugin != null) { InjectPlugin(installed_plugin.Path, process_info.hProcess, load_library_w); } } } } Kernel32.ResumeThread(process_info.hThread); Kernel32.CloseHandle(process_info.hProcess); if ((f != null)) { if (quitWhenDone && (!createSessionLog)) { f.Close(); } f.WindowState = FormWindowState.Minimized; } } } } } } } }
/// <summary> /// Update plugin /// </summary> /// <param name="plugin">Plugin</param> /// <returns>Installed plugin information if plugin is up to date, otherwise "null"</returns> public static InstalledPlugin Update(PluginDataContract plugin) { InstalledPlugin ret = null; if (plugin != null) { string download_path = null; string download_url = null; GitHubLatestReleaseDataContract last_release_info = null; GitHubLatestReleaseDataContract latest_release_info = null; if (plugin.Enabled) { try { InstalledPlugin installed_plugin = null; Uri uri = new Uri(plugin.URI); if (!(Directory.Exists("./plugins"))) { Directory.CreateDirectory("./plugins"); } if (installedPlugins.ContainsKey(plugin)) { installed_plugin = installedPlugins[plugin]; } switch (plugin.Provider) { case EPluginProvider.URI: if (uri.IsFile) { if (!(File.Exists(plugin.URI))) { ret = new InstalledPlugin(plugin.URI); } } else { download_path = Path.Combine(Path.GetFullPath("./plugins/"), uri.LocalPath); switch (plugin.UpdateFrequency) { case EUpdateFrequency.IfMissing: case EUpdateFrequency.WhenNewer: if (File.Exists(download_path)) { ret = new InstalledPlugin(download_path); installedPlugins.Add(plugin, ret); } else { if (File.Exists(download_path)) { File.Delete(download_path); } download_url = plugin.URI; } break; case EUpdateFrequency.Always: download_url = plugin.URI; break; } } break; case EPluginProvider.GitHub: string github_user_repo = uri.AbsolutePath.Trim('/'); string github_api_url = "https://api.github.com/repos/" + github_user_repo + "/releases/latest"; download_path = Path.GetFullPath("./plugins/" + github_user_repo.Replace('/', '$') + ".asi"); string info_path = download_path + ".json"; if (installed_plugin != null) { last_release_info = installed_plugin.LastReleaseInfo; latest_release_info = installed_plugin.LatestReleaseInfo; } switch (plugin.UpdateFrequency) { case EUpdateFrequency.IfMissing: if (File.Exists(download_path)) { ret = new InstalledPlugin(download_path); } else { download_url = GetDownloadURL(info_path, github_api_url, ref last_release_info, ref latest_release_info); } break; case EUpdateFrequency.WhenNewer: string dl_url = GetDownloadURL(info_path, github_api_url, ref last_release_info, ref latest_release_info); if (latest_release_info != null) { if (last_release_info != null) { if (last_release_info.TagName != latest_release_info.TagName) { download_url = dl_url; } else { ret = new InstalledPlugin(download_path); } } else { download_url = dl_url; } } break; case EUpdateFrequency.Always: download_url = GetDownloadURL(info_path, github_api_url, ref last_release_info, ref latest_release_info); break; } break; } } catch (Exception e) { MessageBox.Show(e.Message, Translator.GetTranslation("PLUGIN_ERROR_TITLE"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } if ((download_path != null) && (download_url != null)) { if (File.Exists(download_path)) { File.Delete(download_path); } DownloadProgressForm dpf = new DownloadProgressForm(download_url, download_path); if (latest_release_info != null) { last_release_info = latest_release_info; } if (dpf.ShowDialog() == DialogResult.OK) { ret = new InstalledPlugin(download_path, last_release_info, latest_release_info); if (plugin.Provider == EPluginProvider.GitHub) { try { string info_path = download_path + ".json"; if (File.Exists(info_path)) { File.Delete(info_path); } using (FileStream stream = File.Open(info_path, FileMode.Create)) { serializer.WriteObject(stream, latest_release_info); } } catch (Exception e) { MessageBox.Show(e.Message, Translator.GetTranslation("PLUGIN_ERROR_TITLE"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } if (ret != null) { if (installedPlugins.ContainsKey(plugin)) { installedPlugins[plugin] = ret; } else { installedPlugins.Add(plugin, ret); } } } return(ret); }