X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host.c;h=4b106a6904203ba0363901e58de5844b6709f56f;hb=0cb5b69ba8fd5ec367d139b8ac3dd2fa82c2ab1d;hp=b7bad6c41e99423176d342b5c41694276ea26e88;hpb=58315d61e02a6c6eee7c14457f7dd1894125d57c;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index b7bad6c4..4b106a69 100644 --- a/host.c +++ b/host.c @@ -97,6 +97,7 @@ Host_AbortCurrentFrame 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 @@ -667,11 +668,11 @@ void Host_Main(void) double wait; int pass1, pass2, pass3, i; char vabuf[1024]; + qboolean playing; Host_Init(); realtime = 0; - dirtytime = Sys_DirtyTime(); for (;;) { if (setjmp(host_abortframe)) @@ -706,14 +707,15 @@ void Host_Main(void) svs.perf_acc_realtime += deltacleantime; // Look for clients who have spawned + playing = false; for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++) if(host_client->spawned) if(host_client->netconnection) - break; - if(i == svs.maxclients) + playing = true; + if(sv.time < 10) { - // Nobody is looking? Then we won't do timing... - // Instead, reset it to zero + // don't accumulate time for the first 10 seconds of a match + // so things can settle svs.perf_acc_realtime = svs.perf_acc_sleeptime = svs.perf_acc_lost = svs.perf_acc_offset = svs.perf_acc_offset_squared = svs.perf_acc_offset_max = svs.perf_acc_offset_samples = 0; } else if(svs.perf_acc_realtime > 5) @@ -727,7 +729,8 @@ void Host_Main(void) svs.perf_offset_sdev = sqrt(svs.perf_acc_offset_squared / svs.perf_acc_offset_samples - svs.perf_offset_avg * svs.perf_offset_avg); } if(svs.perf_lost > 0 && developer_extra.integer) - Con_DPrintf("Server can't keep up: %s\n", Host_TimingReport(vabuf, sizeof(vabuf))); + if(playing) // only complain if anyone is looking + Con_DPrintf("Server can't keep up: %s\n", Host_TimingReport(vabuf, sizeof(vabuf))); svs.perf_acc_realtime = svs.perf_acc_sleeptime = svs.perf_acc_lost = svs.perf_acc_offset = svs.perf_acc_offset_squared = svs.perf_acc_offset_max = svs.perf_acc_offset_samples = 0; } } @@ -896,7 +899,7 @@ void Host_Main(void) SV_SendClientMessages(); if (sv.paused == 1 && realtime > sv.pausedstart && sv.pausedstart > 0) { - prog->globals.generic[OFS_PARM0] = realtime - sv.pausedstart; + prog->globals.fp[OFS_PARM0] = realtime - sv.pausedstart; PRVM_serverglobalfloat(time) = sv.time; prog->ExecuteProgram(prog, PRVM_serverfunction(SV_PausedTic), "QC function SV_PausedTic is missing"); } @@ -958,13 +961,15 @@ void Host_Main(void) if (cls.demopaused) clframetime = 0; } + else + { + // host_framerate overrides all else + if (host_framerate.value) + clframetime = host_framerate.value; - // host_framerate overrides all else - if (host_framerate.value) - clframetime = host_framerate.value; - - if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) - clframetime = 0; + if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) + clframetime = 0; + } if (cls.timedemo) clframetime = cl.realframetime = cl_timer; @@ -1101,7 +1106,7 @@ void Host_LockSession(void) if(locksession_run) return; locksession_run = true; - if(locksession.integer != 0) + if(locksession.integer != 0 && !COM_CheckParm("-readonly")) { char vabuf[1024]; char *p = va(vabuf, sizeof(vabuf), "%slock%s", *fs_userdir ? fs_userdir : fs_basedir, sessionid.string); @@ -1297,7 +1302,7 @@ static void Host_Init (void) } // put up the loading image so the user doesn't stare at a black screen... - SCR_BeginLoadingPlaque(); + SCR_BeginLoadingPlaque(true); if (cls.state != ca_dedicated) {