X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=host.c;h=c8521f2753dd8300bb9e44c05d0aca2f44612d95;hb=4c7b42b047585a7e609ec241b0e9c7e14ee11103;hp=38571e69a60c92c001bc5e2dc6ebc426277df505;hpb=facaed0509e7b7c30d6ec3f9d3438ee21f77c6e8;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 38571e69..c8521f27 100644 --- a/host.c +++ b/host.c @@ -54,18 +54,20 @@ 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","1", "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"}; cvar_t cl_minfps_qualitymin = {CVAR_SAVE, "cl_minfps_qualitymin", "0.25", "lowest allowed drawdistance multiplier"}; cvar_t cl_minfps_qualitypower = {CVAR_SAVE, "cl_minfps_qualitypower", "4", "raises quality value to a power of itself, higher values make quality drop more sharply in relation to framerate"}; cvar_t cl_minfps_qualityscale = {CVAR_SAVE, "cl_minfps_qualityscale", "0.5", "multiplier for quality"}; -cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "1000000", "maximum fps cap, if game is running faster than this it will wait before running another frame (useful to make cpu time available to other programs)"}; +cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "0", "maximum fps cap, 0 = unlimited, if game is running faster than this it will wait before running another frame (useful to make cpu time available to other programs)"}; cvar_t cl_maxidlefps = {CVAR_SAVE, "cl_maxidlefps", "20", "maximum fps cap when the game is not the active window (makes cpu time available to other programs"}; cvar_t developer = {0, "developer","0", "prints additional debugging messages and information (recommended for modders and level designers)"}; @@ -103,7 +105,8 @@ void Host_Error (const char *error, ...) 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); @@ -187,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); @@ -202,6 +205,7 @@ Host_InitLocal */ void Host_SaveConfig_f(void); void Host_LoadConfig_f(void); +extern cvar_t sv_writepicture_quality; static void Host_InitLocal (void) { Cmd_AddCommand("saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)"); @@ -209,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); @@ -225,6 +230,8 @@ static void Host_InitLocal (void) Cvar_RegisterVariable (×tamps); Cvar_RegisterVariable (&timeformat); + + Cvar_RegisterVariable (&sv_writepicture_quality); } @@ -244,7 +251,7 @@ void Host_SaveConfig_to(const char *file) // 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); @@ -608,7 +615,7 @@ void Host_Main(void) cl_timer = 0; sv_timer = 0; - realtime = Sys_DoubleTime(); + realtime = host_starttime = Sys_DoubleTime(); for (;;) { if (setjmp(host_abortframe)) @@ -660,6 +667,9 @@ 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(); @@ -679,8 +689,8 @@ void Host_Main(void) // when a server is running we only execute console commands on server frames // (this mainly allows frikbot .way config files to work properly by staying in sync with the server qc) - // otherwise we execute them on all frames - if (sv_timer > 0 || !sv.active) + // otherwise we execute them on client frames + if (sv.active ? sv_timer > 0 : cl_timer > 0) { // process console commands Cbuf_Execute(); @@ -794,6 +804,11 @@ void Host_Main(void) // 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(); @@ -821,10 +836,12 @@ void Host_Main(void) cl.realframetime = max(cl_timer, clframetime); } } - else if (vid_activewindow) - clframetime = cl.realframetime = max(cl_timer, 1.0 / max(5.0f, cl_maxfps.value)); + else if (vid_activewindow && cl_maxfps.value >= 1) + clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxfps.value); + else if (!vid_activewindow && cl_maxidlefps.value >= 1) + clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxidlefps.value); else - clframetime = cl.realframetime = max(cl_timer, 1.0 / max(5.0f, cl_maxidlefps.value)); + clframetime = cl.realframetime = cl_timer; // apply slowmo scaling clframetime *= cl.movevars_timescale; @@ -897,6 +914,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 @@ -920,6 +940,8 @@ void Host_StartVideo(void) 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(); } @@ -1027,7 +1049,9 @@ static void Host_Init (void) Host_InitLocal(); Host_ServerOptions(); - if (cls.state != ca_dedicated) + if (cls.state == ca_dedicated) + Cmd_AddCommand ("disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)"); + else { Con_DPrintf("Initializing client\n");