From 6b6279b585b0c84cbb109a26121027f5e6b723b0 Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Thu, 27 Jul 2023 19:31:15 +1000 Subject: [PATCH] Fix flags and naming of cvars needed by the dedicated server The cl_curl* cvars also apply to the dedicated server so not registering them in 3a58ad52e63635c93e95955f984fd6052156e56b broke HTTP. These now have aliases for backwards compat (eg Xonotic, Nexuiz menus). cl_maxphysicsframesperserverframe is server-specific and was also used by the dedicated server for "catch up" if it got behind. Signed-off-by: bones_was_here --- host.c | 2 -- libcurl.c | 56 ++++++++++++++++++++++++++++++++----------------------- sv_main.c | 7 ++++--- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/host.c b/host.c index 43bfb2ff..543ab5a6 100644 --- a/host.c +++ b/host.c @@ -42,7 +42,6 @@ host_static_t host; // pretend frames take this amount of time (in seconds), 0 = realtime cvar_t host_framerate = {CF_CLIENT | CF_SERVER, "host_framerate","0", "locks frame timing to this value in seconds, 0.05 is 20fps for example, note that this can easily run too fast, use cl_maxfps if you want to limit your framerate instead, or sys_ticrate to limit server speed"}; -cvar_t cl_maxphysicsframesperserverframe = {CF_CLIENT, "cl_maxphysicsframesperserverframe","10", "maximum number of physics frames per server frame"}; // shows time used by certain subsystems cvar_t host_speeds = {CF_CLIENT | CF_SERVER, "host_speeds","0", "reports how much time is used in server/graphics/sound"}; cvar_t host_maxwait = {CF_CLIENT | CF_SERVER, "host_maxwait","1000", "maximum sleep time requested from the operating system in millisecond. Larger sleeps will be done using multiple host_maxwait length sleeps. Lowering this value will increase CPU load, but may help working around problems with accuracy of sleep times."}; @@ -270,7 +269,6 @@ static void Host_InitLocal (void) Cmd_AddCommand(CF_SHARED, "saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)"); Cmd_AddCommand(CF_SHARED, "loadconfig", Host_LoadConfig_f, "reset everything and reload configs"); Cmd_AddCommand(CF_SHARED, "sendcvar", SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC"); - Cvar_RegisterVariable (&cl_maxphysicsframesperserverframe); Cvar_RegisterVariable (&host_framerate); Cvar_RegisterCallback (&host_framerate, Host_Framerate_c); Cvar_RegisterVariable (&host_speeds); diff --git a/libcurl.c b/libcurl.c index b0ba3e21..1b2e5696 100644 --- a/libcurl.c +++ b/libcurl.c @@ -7,15 +7,17 @@ #include "jpeg.h" #include "image_png.h" -static cvar_t cl_curl_maxdownloads = {CF_CLIENT | CF_ARCHIVE, "cl_curl_maxdownloads","1", "maximum number of concurrent HTTP/FTP downloads"}; -static cvar_t cl_curl_maxspeed = {CF_CLIENT | CF_ARCHIVE, "cl_curl_maxspeed","300", "maximum download speed (KiB/s)"}; -static cvar_t sv_curl_defaulturl = {CF_SERVER | CF_ARCHIVE, "sv_curl_defaulturl","", "default autodownload source URL"}; -static cvar_t sv_curl_serverpackages = {CF_SERVER | CF_ARCHIVE, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}; -static cvar_t sv_curl_maxspeed = {CF_SERVER | CF_ARCHIVE, "sv_curl_maxspeed","0", "maximum download speed for clients downloading from sv_curl_defaulturl (KiB/s)"}; -static cvar_t cl_curl_enabled = {CF_CLIENT | CF_ARCHIVE, "cl_curl_enabled","1", "whether client's download support is enabled"}; -static cvar_t cl_curl_useragent = {CF_CLIENT, "cl_curl_useragent","1", "send the User-Agent string (note: turning this off may break stuff)"}; -static cvar_t cl_curl_useragent_append = {CF_CLIENT, "cl_curl_useragent_append","", "a string to append to the User-Agent string (useful for name and version number of your mod)"}; -static cvar_t developer_curl = {CF_CLIENT | CF_SERVER, "developer_curl","0", "whether verbose curl output should be printed to stderr"}; +static cvar_t curl_enabled = {CF_SHARED | CF_ARCHIVE, "curl_enabled","1", "whether libcurl may be used to GET files or POST data"}; +static cvar_t curl_maxdownloads = {CF_SHARED | CF_ARCHIVE, "curl_maxdownloads","1", "maximum number of concurrent HTTP/FTP downloads"}; +static cvar_t curl_maxspeed = {CF_SHARED | CF_ARCHIVE, "curl_maxspeed","300", "maximum download speed (KiB/s)"}; +static cvar_t curl_useragent = {CF_SHARED, "curl_useragent","1", "send the User-Agent string (note: turning this off may break stuff)"}; +static cvar_t curl_useragent_append = {CF_SHARED, "curl_useragent_append","", "a string to append to the User-Agent string (useful for name and version number of your mod)"}; + +static cvar_t sv_curl_defaulturl = {CF_SERVER, "sv_curl_defaulturl","", "default autodownload source URL"}; +static cvar_t sv_curl_serverpackages = {CF_SERVER, "sv_curl_serverpackages","", "list of required files for the clients, separated by spaces"}; +static cvar_t sv_curl_maxspeed = {CF_SERVER, "sv_curl_maxspeed","0", "maximum download speed for clients downloading from sv_curl_defaulturl (KiB/s)"}; + +static cvar_t developer_curl = {CF_SHARED, "developer_curl","0", "whether verbose libcurl output should be printed to stderr"}; /* ================================================================= @@ -685,7 +687,7 @@ static void CheckPendingDownloads(void) char vabuf[1024]; if(!curl_dll) return; - if(numdownloads < cl_curl_maxdownloads.integer) + if(numdownloads < curl_maxdownloads.integer) { downloadinfo *di; List_For_Each_Entry(di, &downloads, downloadinfo, list) @@ -719,7 +721,7 @@ static void CheckPendingDownloads(void) di->curle = qcurl_easy_init(); di->slist = NULL; qcurl_easy_setopt(di->curle, CURLOPT_URL, di->url); - if(cl_curl_useragent.integer) + if(curl_useragent.integer) { const char *ua #ifdef HTTP_USER_AGENT @@ -729,13 +731,13 @@ static void CheckPendingDownloads(void) #endif if(!ua) ua = ""; - if(*cl_curl_useragent_append.string) + if(*curl_useragent_append.string) ua = va(vabuf, sizeof(vabuf), "%s%s%s", ua, (ua[0] && ua[strlen(ua)-1] != ' ') ? " " : "", - cl_curl_useragent_append.string); + curl_useragent_append.string); qcurl_easy_setopt(di->curle, CURLOPT_USERAGENT, ua); } else @@ -790,7 +792,7 @@ static void CheckPendingDownloads(void) qcurl_multi_add_handle(curlm, di->curle); di->started = true; ++numdownloads; - if(numdownloads >= cl_curl_maxdownloads.integer) + if(numdownloads >= curl_maxdownloads.integer) break; } } @@ -887,7 +889,7 @@ static qbool Curl_Begin(const char *URL, const char *extraheaders, double maxspe if(loadtype != LOADTYPE_NONE) Host_Error("Curl_Begin: loadtype and buffer are both set"); - if(!curl_dll || !cl_curl_enabled.integer) + if(!curl_dll || !curl_enabled.integer) { return false; } @@ -1136,7 +1138,7 @@ void Curl_Frame(void) noclear = false; - if(!cl_curl_enabled.integer) + if(!curl_enabled.integer && cls.state != ca_dedicated) return; if(!curl_dll) @@ -1226,7 +1228,7 @@ void Curl_Frame(void) // use the slowest allowing download to derive the maxspeed... this CAN // be done better, but maybe later - maxspeed = cl_curl_maxspeed.value; + maxspeed = curl_maxspeed.value; List_For_Each_Entry(di, &downloads, downloadinfo, list) if(di->maxspeed > 0) if(di->maxspeed < maxspeed || maxspeed <= 0) @@ -1427,7 +1429,7 @@ static void Curl_Curl_f(cmd_state_t *cmd) return; } - if(!cl_curl_enabled.integer) + if(!curl_enabled.integer) { Con_Print("curl support not enabled. Set cl_curl_enabled to 1 to enable.\n"); return; @@ -1567,15 +1569,23 @@ loads the commands and cvars this library uses */ void Curl_Init_Commands(void) { - Cvar_RegisterVariable (&cl_curl_enabled); - Cvar_RegisterVariable (&cl_curl_maxdownloads); - Cvar_RegisterVariable (&cl_curl_maxspeed); + Cvar_RegisterVariable (&curl_enabled); + Cvar_RegisterVariable (&curl_maxdownloads); + Cvar_RegisterVariable (&curl_maxspeed); + Cvar_RegisterVariable (&curl_useragent); + Cvar_RegisterVariable (&curl_useragent_append); + Cvar_RegisterVirtual (&curl_enabled, "cl_curl_enabled"); + Cvar_RegisterVirtual (&curl_maxdownloads, "cl_curl_maxdownloads"); + Cvar_RegisterVirtual (&curl_maxspeed, "cl_curl_maxspeed"); + Cvar_RegisterVirtual (&curl_useragent, "cl_curl_useragent"); + Cvar_RegisterVirtual (&curl_useragent_append, "cl_curl_useragent_append"); + Cvar_RegisterVariable (&sv_curl_defaulturl); Cvar_RegisterVariable (&sv_curl_serverpackages); Cvar_RegisterVariable (&sv_curl_maxspeed); - Cvar_RegisterVariable (&cl_curl_useragent); - Cvar_RegisterVariable (&cl_curl_useragent_append); + Cvar_RegisterVariable (&developer_curl); + Cmd_AddCommand(CF_CLIENT | CF_CLIENT_FROM_SERVER, "curl", Curl_Curl_f, "download data from an URL and add to search path"); //Cmd_AddCommand(cmd_local, "curlcat", Curl_CurlCat_f, "display data from an URL (debugging command)"); } diff --git a/sv_main.c b/sv_main.c index ac35d949..35b61233 100644 --- a/sv_main.c +++ b/sv_main.c @@ -161,6 +161,7 @@ cvar_t sv_warsowbunny_backtosideratio = {CF_SERVER, "sv_warsowbunny_backtosidera cvar_t sv_onlycsqcnetworking = {CF_SERVER, "sv_onlycsqcnetworking", "0", "disables legacy entity networking code for higher performance (except on clients, which can still be legacy)"}; cvar_t sv_areadebug = {CF_SERVER, "sv_areadebug", "0", "disables physics culling for debugging purposes (only for development)"}; cvar_t sys_ticrate = {CF_SERVER | CF_ARCHIVE, "sys_ticrate","0.0138889", "how long a server frame is in seconds, 0.05 is 20fps server rate, 0.1 is 10fps (can not be set higher than 0.1), 0 runs as many server frames as possible (makes games against bots a little smoother, overwhelms network players), 0.0138889 matches QuakeWorld physics"}; +cvar_t sv_maxphysicsframesperserverframe = {CF_SERVER, "sv_maxphysicsframesperserverframe","10", "maximum number of physics frames per server frame"}; cvar_t teamplay = {CF_SERVER | CF_NOTIFY, "teamplay","0", "teamplay mode, values depend on mod but typically 0 = no teams, 1 = no team damage no self damage, 2 = team damage and self damage, some mods support 3 = no team damage but can damage self"}; cvar_t timelimit = {CF_SERVER | CF_NOTIFY, "timelimit","0", "ends level at this time (in minutes)"}; cvar_t sv_threaded = {CF_SERVER, "sv_threaded", "0", "enables a separate thread for server code, improving performance, especially when hosting a game while playing, EXPERIMENTAL, may be crashy"}; @@ -641,6 +642,7 @@ void SV_Init (void) Cvar_RegisterVariable (&sv_onlycsqcnetworking); Cvar_RegisterVariable (&sv_areadebug); Cvar_RegisterVariable (&sys_ticrate); + Cvar_RegisterVariable (&sv_maxphysicsframesperserverframe); Cvar_RegisterVariable (&teamplay); Cvar_RegisterVariable (&timelimit); Cvar_RegisterVariable (&sv_threaded); @@ -2507,7 +2509,6 @@ const char *SV_TimingReport(char *buf, size_t buflen) extern cvar_t host_maxwait; extern cvar_t host_framerate; -extern cvar_t cl_maxphysicsframesperserverframe; double SV_Frame(double time) { static double sv_timer; @@ -2603,8 +2604,8 @@ double SV_Frame(double time) { advancetime = sys_ticrate.value; // listen servers can run multiple server frames per client frame - if (cl_maxphysicsframesperserverframe.integer > 0) - framelimit = cl_maxphysicsframesperserverframe.integer; + if (sv_maxphysicsframesperserverframe.integer > 0) + framelimit = sv_maxphysicsframesperserverframe.integer; aborttime = Sys_DirtyTime() + 0.1; } -- 2.39.2