client_t *host_client;
jmp_buf host_abortframe;
+double host_starttime = 0;
// pretend frames take this amount of time (in seconds), 0 = realtime
cvar_t host_framerate = {0, "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"};
// shows time used by certain subsystems
cvar_t host_speeds = {0, "host_speeds","0", "reports how much time is used in server/graphics/sound"};
+cvar_t host_sleep = {0, "host_sleep","0", "gives up some processing time to other applications each frame, value in milliseconds"};
cvar_t cl_minfps = {CVAR_SAVE, "cl_minfps", "40", "minimum fps target - while the rendering performance is below this, it will drift toward lower quality"};
cvar_t cl_minfps_fade = {CVAR_SAVE, "cl_minfps_fade", "0.2", "how fast the quality adapts to varying framerate"};
cvar_t cl_minfps_qualitymax = {CVAR_SAVE, "cl_minfps_qualitymax", "1", "highest allowed drawdistance multiplier"};
va_list argptr;
// turn off rcon redirect if it was active when the crash occurred
- rcon_redirect = false;
+ // to prevent loops when it is a networking problem
+ Con_Rcon_Redirect_Abort();
va_start (argptr,error);
dpvsnprintf (hosterrorstring1,sizeof(hosterrorstring1),error,argptr);
}
}
- svs.maxclients = bound(1, svs.maxclients, MAX_SCOREBOARD);
+ svs.maxclients = svs.maxclients_next = bound(1, svs.maxclients, MAX_SCOREBOARD);
svs.clients = (client_t *)Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients);
Cvar_RegisterVariable (&host_framerate);
Cvar_RegisterVariable (&host_speeds);
+ Cvar_RegisterVariable (&host_sleep);
Cvar_RegisterVariable (&cl_minfps);
Cvar_RegisterVariable (&cl_minfps_fade);
Cvar_RegisterVariable (&cl_minfps_qualitymax);
// LordHavoc: don't save a config if it crashed in startup
if (host_framecount >= 3 && cls.state != ca_dedicated && !COM_CheckParm("-benchmark") && !COM_CheckParm("-capturedemo"))
{
- f = FS_Open (file, "wb", false, false);
+ f = FS_OpenRealFile(file, "wb", false);
if (!f)
{
Con_Printf("Couldn't write %s.\n", file);
cl_timer = 0;
sv_timer = 0;
- realtime = Sys_DoubleTime();
+ realtime = host_starttime = Sys_DoubleTime();
for (;;)
{
if (setjmp(host_abortframe))
+ {
+ SCR_ClearLoadingScreen(false);
continue; // something bad happened, or the server disconnected
+ }
oldrealtime = realtime;
realtime = Sys_DoubleTime();
cl.islocalgame = NetConn_IsLocalGame();
- // begin gathering mouse input
- in_mouse_x = in_mouse_y = 0;
-
// get new key events
Sys_SendKeyEvents();
// send all messages to the clients
SV_SendClientMessages();
+
+ if (sv.paused == 1 && realtime > sv.pausedstart && sv.pausedstart > 0) {
+ prog->globals.generic[OFS_PARM0] = realtime - sv.pausedstart;
+ PRVM_ExecuteProgram(prog->funcoffsets.SV_PausedTic, "QC function SV_PausedTic is missing");
+ }
// end the server VM frame
SV_VM_End();
if (host_framerate.value)
clframetime = host_framerate.value;
+ if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive)))
+ clframetime = 0;
+
if (cls.timedemo)
clframetime = cl.realframetime = cl_timer;
CDAudio_Update();
+ // reset gathering of mouse input
+ in_mouse_x = in_mouse_y = 0;
+
if (host_speeds.integer)
{
pass1 = (int)((time1 - time3)*1000000);
Con_Printf("%6ius total %6ius server %6ius gfx %6ius snd\n",
pass1+pass2+pass3, pass1, pass2, pass3);
}
+ wait = bound(0, host_sleep.value * 1000, 100000);
+ if (!cls.timedemo && wait >= 1)
+ Sys_Sleep((int)wait);
}
+#if MEMPARANOIA
+ Mem_CheckSentinelsGlobal();
+#endif
+
// if there is some time remaining from this frame, reset the timers
if (cl_timer >= 0)
cl_timer = 0;
if (!vid_opened && cls.state != ca_dedicated)
{
vid_opened = true;
+ // make sure we open sockets before opening video because the Windows Firewall "unblock?" dialog can screw up the graphics context on some graphics drivers
+ NetConn_UpdateSockets();
VID_Start();
CDAudio_Startup();
}
}
Cmd_Shutdown();
+ Key_Shutdown();
CL_Shutdown();
Sys_Shutdown();
Log_Close();
FS_Shutdown();
+ Con_Shutdown();
Memory_Shutdown();
}