]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
Refactor the code to make r_view and r_viewcache members of r_refdef,
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index d8201610cba9d9436acda80cfa8023084689583c..060bbea771352ffa12236382c08349955f30b4cb 100644 (file)
--- a/host.c
+++ b/host.c
@@ -19,13 +19,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 // host.c -- coordinates spawning and killing of local servers
 
-#include <time.h>
 #include "quakedef.h"
+
+#include <time.h>
 #include "libcurl.h"
 #include "cdaudio.h"
+#include "cl_gecko.h"
 #include "cl_video.h"
 #include "progsvm.h"
 #include "csprogs.h"
+#include "sv_demo.h"
 
 /*
 
@@ -57,7 +60,8 @@ cvar_t host_framerate = {0, "host_framerate","0", "locks frame timing to this va
 // shows time used by certain subsystems
 cvar_t host_speeds = {0, "host_speeds","0", "reports how much time is used in server/graphics/sound"};
 // LordHavoc: framerate upper cap
-cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "1000", "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", "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_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)"};
 cvar_t developer_entityparsing = {0, "developer_entityparsing", "0", "prints detailed network entities information each time a packet is received"};
@@ -193,12 +197,13 @@ void Host_SaveConfig_f(void);
 void Host_LoadConfig_f(void);
 static void Host_InitLocal (void)
 {
-       Cmd_AddCommand("saveconfig", Host_SaveConfig_f, "save settings to config.cfg immediately (also automatic when quitting)");
+       Cmd_AddCommand("saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)");
        Cmd_AddCommand("loadconfig", Host_LoadConfig_f, "reset everything and reload configs");
 
        Cvar_RegisterVariable (&host_framerate);
        Cvar_RegisterVariable (&host_speeds);
        Cvar_RegisterVariable (&cl_maxfps);
+       Cvar_RegisterVariable (&cl_maxidlefps);
 
        Cvar_RegisterVariable (&developer);
        Cvar_RegisterVariable (&developer_entityparsing);
@@ -215,7 +220,7 @@ Host_SaveConfig_f
 Writes key bindings and archived cvars to config.cfg
 ===============
 */
-void Host_SaveConfig_f(void)
+void Host_SaveConfig_to(const char *file)
 {
        qfile_t *f;
 
@@ -224,10 +229,10 @@ void Host_SaveConfig_f(void)
        // 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 ("config.cfg", "wb", false, false);
+               f = FS_Open (file, "wb", false, false);
                if (!f)
                {
-                       Con_Print("Couldn't write config.cfg.\n");
+                       Con_Printf("Couldn't write %s.\n", file);
                        return;
                }
 
@@ -237,7 +242,21 @@ void Host_SaveConfig_f(void)
                FS_Close (f);
        }
 }
+void Host_SaveConfig(void)
+{
+       Host_SaveConfig_to("config.cfg");
+}
+void Host_SaveConfig_f(void)
+{
+       const char *file = "config.cfg";
 
+       if(Cmd_Argc() >= 2) {
+               file = Cmd_Argv(1);
+               Con_Printf("Saving to %s\n", file);
+       }
+
+       Host_SaveConfig_to(file);
+}
 
 /*
 ===============
@@ -371,6 +390,8 @@ void SV_DropClient(qboolean crash)
        int i;
        Con_Printf("Client \"%s\" dropped\n", host_client->name);
 
+       SV_StopDemoRecording(host_client);
+
        // make sure edict is not corrupt (from a level change for example)
        host_client->edict = PRVM_EDICT_NUM(host_client - svs.clients + 1);
 
@@ -457,6 +478,18 @@ void SV_DropClient(qboolean crash)
        // update server listing on the master because player count changed
        // (which the master uses for filtering empty/full servers)
        NetConn_Heartbeat(1);
+
+       if (sv.loadgame)
+       {
+               for (i = 0;i < svs.maxclients;i++)
+                       if (svs.clients[i].active && !svs.clients[i].spawned)
+                               break;
+               if (i == svs.maxclients)
+               {
+                       Con_Printf("Loaded game, everyone rejoined - unpausing\n");
+                       sv.paused = sv.loadgame = false; // we're basically done with loading now
+               }
+       }
 }
 
 /*
@@ -522,7 +555,7 @@ void Host_GetConsoleCommands (void)
 ==================
 Host_TimeReport
 
-Returns a time report string, for example for 
+Returns a time report string, for example for
 ==================
 */
 const char *Host_TimingReport()
@@ -594,12 +627,10 @@ void Host_Main(void)
                        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;
                }
 
-               if (slowmo.value < 0)
+               if (slowmo.value < 0.00001 && slowmo.value != 0)
                        Cvar_SetValue("slowmo", 0);
                if (host_framerate.value < 0.00001 && host_framerate.value != 0)
                        Cvar_SetValue("host_framerate", 0);
-               if (cl_maxfps.value < 1)
-                       Cvar_SetValue("cl_maxfps", 1);
 
                // keep the random time dependent, but not when playing demos/benchmarking
                if(!*sv_random_seed.string && !cls.demoplayback)
@@ -612,6 +643,8 @@ void Host_Main(void)
 
                NetConn_UpdateSockets();
 
+               Log_DestBuffer_Flush();
+
                // receive packets on each main loop iteration, as the main loop may
                // be undersleeping due to select() detecting a new packet
                if (sv.active)
@@ -774,9 +807,9 @@ void Host_Main(void)
                                }
                        }
                        else if (vid_activewindow)
-                               clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxfps.value);
+                               clframetime = cl.realframetime = max(cl_timer, 1.0 / max(5.0f, cl_maxfps.value));
                        else
-                               clframetime = cl.realframetime = 0.1;
+                               clframetime = cl.realframetime = max(cl_timer, 1.0 / max(5.0f, cl_maxidlefps.value));
 
                        // apply slowmo scaling
                        clframetime *= cl.movevars_timescale;
@@ -823,7 +856,10 @@ void Host_Main(void)
 
                        //ui_update();
 
-                       CL_VideoFrame();
+                       CL_Video_Frame();
+#ifdef SUPPORT_GECKO
+                       CL_Gecko_Frame();
+#endif
 
                        CL_UpdateScreen();
 
@@ -837,7 +873,7 @@ void Host_Main(void)
                                cl.csqc_usecsqclistener = false;
                        }
                        else
-                               S_Update(&r_view.matrix);
+                               S_Update(&r_refdef.view.matrix);
 
                        CDAudio_Update();
 
@@ -901,6 +937,9 @@ static void Host_Init (void)
        int i;
        const char* os;
 
+       if (COM_CheckParm("-profilegameonly"))
+               Sys_AllowProfiling(false);
+
        // LordHavoc: quake never seeded the random number generator before... heh
        if (COM_CheckParm("-benchmark"))
                srand(0); // predictable random sequence for -benchmark
@@ -1083,10 +1122,7 @@ static void Host_Init (void)
 
        if (!sv.active && !cls.demoplayback && !cls.connect_trying)
        {
-               if (gamemode == GAME_NEXUIZ)
-                       Cbuf_AddText("togglemenu\nplayvideo logo\ncd loop 1\n");
-               else
-                       Cbuf_AddText("togglemenu\n");
+               Cbuf_AddText("togglemenu\n");
                Cbuf_Execute();
        }
 
@@ -1136,9 +1172,12 @@ void Host_Shutdown(void)
        // AK shutdown PRVM
        // AK hmm, no PRVM_Shutdown(); yet
 
+#ifdef SUPPORT_GECKO
+       CL_Gecko_Shutdown();
+#endif
        CL_Video_Shutdown();
 
-       Host_SaveConfig_f();
+       Host_SaveConfig();
 
        CDAudio_Shutdown ();
        S_Terminate ();