]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
experimental new persistent console history (uses same buffer as console output)...
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index dbad918f04bd65a6e7dc45bf07853f3c55cd13a9..afce873dd0cc686f63adf1487527198ad9179662 100644 (file)
--- a/host.c
+++ b/host.c
@@ -54,11 +54,13 @@ double realtime;
 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"};
@@ -188,7 +190,7 @@ void Host_ServerOptions (void)
                }
        }
 
-       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);
 
@@ -211,6 +213,7 @@ static void Host_InitLocal (void)
 
        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);
@@ -612,11 +615,14 @@ void Host_Main(void)
        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();
@@ -664,9 +670,6 @@ void Host_Main(void)
 
                cl.islocalgame = NetConn_IsLocalGame();
 
-               // begin gathering mouse input
-               in_mouse_x = in_mouse_y = 0;
-
                // get new key events
                Sys_SendKeyEvents();
 
@@ -855,6 +858,9 @@ void Host_Main(void)
                        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;
 
@@ -902,6 +908,9 @@ void Host_Main(void)
 
                        CDAudio_Update();
 
+                       // reset gathering of mouse input
+                       in_mouse_x = in_mouse_y = 0;
+
                        if (host_speeds.integer)
                        {
                                pass1 = (int)((time1 - time3)*1000000);
@@ -911,6 +920,9 @@ void Host_Main(void)
                                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 there is some time remaining from this frame, reset the timers
@@ -1203,6 +1215,7 @@ void Host_Shutdown(void)
        }
 
        Cmd_Shutdown();
+       Key_Shutdown();
        CL_Shutdown();
        Sys_Shutdown();
        Log_Close();