aborts the current host frame and goes on with the next one
================
*/
-void Host_AbortCurrentFrame(void) DP_FUNC_NORETURN;
void Host_AbortCurrentFrame(void)
{
// in case we were previously nice, make us mean again
}
}
-/*
-=======================
-Host_InitLocal
-======================
-*/
-void Host_SaveConfig_f(cmd_state_t *cmd);
-void Host_LoadConfig_f(cmd_state_t *cmd);
-extern cvar_t sv_writepicture_quality;
-extern cvar_t r_texture_jpeg_fastpicmip;
-static void Host_InitLocal (void)
-{
- Cmd_AddCommand(CF_SHARED, "quit", Host_Quit_f, "quit the game");
- Cmd_AddCommand(CF_SHARED, "version", Host_Version_f, "print engine version");
- 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);
- Cvar_RegisterVariable (&host_maxwait);
- Cvar_RegisterVariable (&host_isclient);
-
- Cvar_RegisterVariable (&developer);
- Cvar_RegisterVariable (&developer_extra);
- Cvar_RegisterVariable (&developer_insane);
- Cvar_RegisterVariable (&developer_loadfile);
- Cvar_RegisterVariable (&developer_loading);
- Cvar_RegisterVariable (&developer_entityparsing);
-
- Cvar_RegisterVariable (×tamps);
- Cvar_RegisterVariable (&timeformat);
-
- Cvar_RegisterVariable (&sv_writepicture_quality);
- Cvar_RegisterVariable (&r_texture_jpeg_fastpicmip);
-}
-
-
/*
===============
Host_SaveConfig_f
Writes key bindings and archived cvars to config.cfg
===============
*/
-static void Host_SaveConfig_to(const char *file)
+void Host_SaveConfig(const char *file)
{
qfile_t *f;
FS_Close (f);
}
}
-void Host_SaveConfig(void)
-{
- Host_SaveConfig_to(CONFIGFILENAME);
-}
-void Host_SaveConfig_f(cmd_state_t *cmd)
+
+static void Host_SaveConfig_f(cmd_state_t *cmd)
{
const char *file = CONFIGFILENAME;
Con_Printf("Saving to %s\n", file);
}
- Host_SaveConfig_to(file);
+ Host_SaveConfig(file);
}
static void Host_AddConfigText(cmd_state_t *cmd)
Resets key bindings and cvars to defaults and then reloads scripts
===============
*/
-void Host_LoadConfig_f(cmd_state_t *cmd)
+static void Host_LoadConfig_f(cmd_state_t *cmd)
{
// reset all cvars, commands and aliases to init values
Cmd_RestoreInitState();
Host_AddConfigText(cmd_local);
}
-//============================================================================
-
-/*
-==================
-Host_TimeReport
-
-Returns a time report string, for example for
-==================
-*/
-const char *Host_TimingReport(char *buf, size_t buflen)
-{
- return va(buf, buflen, "%.1f%% CPU, %.2f%% lost, offset avg %.1fms, max %.1fms, sdev %.1fms", svs.perf_cpuload * 100, svs.perf_lost * 100, svs.perf_offset_avg * 1000, svs.perf_offset_max * 1000, svs.perf_offset_sdev * 1000);
-}
-
/*
-==================
-Host_Frame
-
-Runs all active servers
-==================
+=======================
+Host_InitLocal
+======================
*/
-static void Host_Init(void);
-double Host_Frame(double time)
-{
- double cl_wait, sv_wait;
-
- TaskQueue_Frame(false);
-
- // keep the random time dependent, but not when playing demos/benchmarking
- if(!*sv_random_seed.string && !host.restless)
- rand();
-
- NetConn_UpdateSockets();
-
- Log_DestBuffer_Flush();
-
- // Run any downloads
- Curl_Frame();
-
- // process console commands
- Cbuf_Frame(host.cbuf);
-
- R_TimeReport("---");
-
- sv_wait = SV_Frame(time);
- cl_wait = CL_Frame(time);
-
-// Con_Printf("%6.0f %6.0f\n", cl_wait * 1000000.0, sv_wait * 1000000.0);
-
- Mem_CheckSentinelsGlobal();
-
- if(host.restless)
- return 0;
-
- // if the accumulators haven't become positive yet, wait a while
- if (cls.state == ca_dedicated)
- return sv_wait * -1000000.0; // dedicated
- else if (!sv.active || svs.threaded)
- return cl_wait * -1000000.0; // connected to server, main menu, or server is on different thread
- else
- return max(cl_wait, sv_wait) * -1000000.0; // listen server or singleplayer
-}
-
-static inline void Host_Sleep(double time)
-{
- double delta, time0;
-
- if(host_maxwait.value <= 0)
- time = min(time, 1000000.0);
- else
- time = min(time, host_maxwait.value * 1000.0);
- if(time < 1)
- time = 1; // because we cast to int
-
- time0 = Sys_DirtyTime();
- if (sv_checkforpacketsduringsleep.integer && !sys_usenoclockbutbenchmark.integer && !svs.threaded) {
- NetConn_SleepMicroseconds((int)time);
- if (cls.state != ca_dedicated)
- NetConn_ClientFrame(); // helps server browser get good ping values
- // TODO can we do the same for ServerFrame? Probably not.
- }
- else
- Sys_Sleep((int)time);
- delta = Sys_DirtyTime() - time0;
- if (delta < 0 || delta >= 1800)
- delta = 0;
- host.sleeptime += delta;
-// R_TimeReport("sleep");
- return;
-}
-
-// Cloudwalk: Most overpowered function declaration...
-static inline double Host_UpdateTime (double newtime, double oldtime)
-{
- double time = newtime - oldtime;
-
- if (time < 0)
- {
- // warn if it's significant
- if (time < -0.01)
- Con_Printf(CON_WARN "Host_UpdateTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, time);
- time = 0;
- }
- else if (time >= 1800)
- {
- Con_Printf(CON_WARN "Host_UpdateTime: time stepped forward (went from %f to %f, difference %f)\n", oldtime, newtime, time);
- time = 0;
- }
-
- return time;
-}
-
-void Host_Main(void)
+extern cvar_t r_texture_jpeg_fastpicmip;
+static void Host_InitLocal (void)
{
- double time, newtime, oldtime, sleeptime;
-
- Host_Init(); // Start!
-
- host.realtime = 0;
- oldtime = Sys_DirtyTime();
-
- // Main event loop
- while(host.state != host_shutdown)
- {
- // Something bad happened, or the server disconnected
- if (setjmp(host.abortframe))
- {
- host.state = host_active; // In case we were loading
- continue;
- }
-
- newtime = host.dirtytime = Sys_DirtyTime();
- host.realtime += time = Host_UpdateTime(newtime, oldtime);
-
- sleeptime = Host_Frame(time);
- oldtime = newtime;
+ Cmd_AddCommand(CF_SHARED, "quit", Host_Quit_f, "quit the game");
+ Cmd_AddCommand(CF_SHARED, "version", Host_Version_f, "print engine version");
+ 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);
+ Cvar_RegisterVariable (&host_maxwait);
+ Cvar_RegisterVariable (&host_isclient);
- if (sleeptime >= 1)
- {
- Host_Sleep(sleeptime);
- continue;
- }
+ Cvar_RegisterVariable (&developer);
+ Cvar_RegisterVariable (&developer_extra);
+ Cvar_RegisterVariable (&developer_insane);
+ Cvar_RegisterVariable (&developer_loadfile);
+ Cvar_RegisterVariable (&developer_loading);
+ Cvar_RegisterVariable (&developer_entityparsing);
- host.framecount++;
- }
+ Cvar_RegisterVariable (×tamps);
+ Cvar_RegisterVariable (&timeformat);
- return;
+ Cvar_RegisterVariable (&r_texture_jpeg_fastpicmip);
}
-//============================================================================
-
char engineversion[128];
qbool sys_nostdout = false;
}
}
}
+
void Host_LockSession(void)
{
if(locksession_run)
}
}
}
+
void Host_UnlockSession(void)
{
if(!locksession_run)
SV_StartThread();
}
-
/*
===============
Host_Shutdown
// AK shutdown PRVM
// AK hmm, no PRVM_Shutdown(); yet
- Host_SaveConfig();
+ Host_SaveConfig(CONFIGFILENAME);
Curl_Shutdown ();
NetConn_Shutdown ();
Memory_Shutdown();
}
-void Host_NoOperation_f(cmd_state_t *cmd)
+//============================================================================
+
+/*
+==================
+Host_Frame
+
+Runs all active servers
+==================
+*/
+static double Host_Frame(double time)
{
+ double cl_wait, sv_wait;
+
+ TaskQueue_Frame(false);
+
+ // keep the random time dependent, but not when playing demos/benchmarking
+ if(!*sv_random_seed.string && !host.restless)
+ rand();
+
+ NetConn_UpdateSockets();
+
+ Log_DestBuffer_Flush();
+
+ // Run any downloads
+ Curl_Frame();
+
+ // process console commands
+ Cbuf_Frame(host.cbuf);
+
+ R_TimeReport("---");
+
+ sv_wait = SV_Frame(time);
+ cl_wait = CL_Frame(time);
+
+// Con_Printf("%6.0f %6.0f\n", cl_wait * 1000000.0, sv_wait * 1000000.0);
+
+ Mem_CheckSentinelsGlobal();
+
+ if(host.restless)
+ return 0;
+
+ // if the accumulators haven't become positive yet, wait a while
+ if (cls.state == ca_dedicated)
+ return sv_wait * -1000000.0; // dedicated
+ else if (!sv.active || svs.threaded)
+ return cl_wait * -1000000.0; // connected to server, main menu, or server is on different thread
+ else
+ return max(cl_wait, sv_wait) * -1000000.0; // listen server or singleplayer
+}
+
+static inline void Host_Sleep(double time)
+{
+ double delta, time0;
+
+ if(host_maxwait.value <= 0)
+ time = min(time, 1000000.0);
+ else
+ time = min(time, host_maxwait.value * 1000.0);
+ if(time < 1)
+ time = 1; // because we cast to int
+
+ time0 = Sys_DirtyTime();
+ if (sv_checkforpacketsduringsleep.integer && !sys_usenoclockbutbenchmark.integer && !svs.threaded) {
+ NetConn_SleepMicroseconds((int)time);
+ if (cls.state != ca_dedicated)
+ NetConn_ClientFrame(); // helps server browser get good ping values
+ // TODO can we do the same for ServerFrame? Probably not.
+ }
+ else
+ Sys_Sleep((int)time);
+ delta = Sys_DirtyTime() - time0;
+ if (delta < 0 || delta >= 1800)
+ delta = 0;
+ host.sleeptime += delta;
+// R_TimeReport("sleep");
+ return;
+}
+
+// Cloudwalk: Most overpowered function declaration...
+static inline double Host_UpdateTime (double newtime, double oldtime)
+{
+ double time = newtime - oldtime;
+
+ if (time < 0)
+ {
+ // warn if it's significant
+ if (time < -0.01)
+ Con_Printf(CON_WARN "Host_UpdateTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, time);
+ time = 0;
+ }
+ else if (time >= 1800)
+ {
+ Con_Printf(CON_WARN "Host_UpdateTime: time stepped forward (went from %f to %f, difference %f)\n", oldtime, newtime, time);
+ time = 0;
+ }
+
+ return time;
+}
+
+void Host_Main(void)
+{
+ double time, newtime, oldtime, sleeptime;
+
+ Host_Init(); // Start!
+
+ host.realtime = 0;
+ oldtime = Sys_DirtyTime();
+
+ // Main event loop
+ while(host.state != host_shutdown)
+ {
+ // Something bad happened, or the server disconnected
+ if (setjmp(host.abortframe))
+ {
+ host.state = host_active; // In case we were loading
+ continue;
+ }
+
+ newtime = host.dirtytime = Sys_DirtyTime();
+ host.realtime += time = Host_UpdateTime(newtime, oldtime);
+
+ sleeptime = Host_Frame(time);
+ oldtime = newtime;
+
+ if (sleeptime >= 1)
+ {
+ Host_Sleep(sleeptime);
+ continue;
+ }
+
+ host.framecount++;
+ }
+
+ return;
}