Added a "log_file" cvar to control the log file name (default: "" which means no...
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index a50b143..8a90463 100644 (file)
--- a/host.c
+++ b/host.c
@@ -98,35 +98,6 @@ cvar_t timeformat = {CVAR_SAVE, "timeformat", "[%b %e %X] "};
 
 /*
 ================
-Host_EndGame
-================
-*/
-void Host_EndGame (const char *format, ...)
-{
-       va_list argptr;
-       char string[1024];
-
-       va_start (argptr,format);
-       vsprintf (string,format,argptr);
-       va_end (argptr);
-       Con_DPrintf ("Host_EndGame: %s\n",string);
-
-       if (sv.active)
-               Host_ShutdownServer (false);
-
-       if (cls.state == ca_dedicated)
-               Sys_Error ("Host_EndGame: %s\n",string);        // dedicated servers exit
-
-       if (cls.demonum != -1)
-               CL_NextDemo ();
-       else
-               CL_Disconnect ();
-
-       longjmp (host_abortserver, 1);
-}
-
-/*
-================
 Host_Error
 
 This shuts down both the client and server
@@ -136,8 +107,6 @@ void PRVM_ProcessError(void);
 static char hosterrorstring1[4096];
 static char hosterrorstring2[4096];
 static qboolean hosterror = false;
-extern char sv_spawnmap[MAX_QPATH];
-extern char sv_loadgame[MAX_OSPATH];
 void Host_Error (const char *error, ...)
 {
        va_list argptr;
@@ -146,7 +115,7 @@ void Host_Error (const char *error, ...)
        vsprintf (hosterrorstring1,error,argptr);
        va_end (argptr);
 
-       Con_Printf ("Host_Error: %s\n", hosterrorstring1);
+       Con_Printf("Host_Error: %s\n", hosterrorstring1);
 
        // LordHavoc: if first frame has not been shown, or currently shutting
        // down, do Sys_Error instead
@@ -159,10 +128,6 @@ void Host_Error (const char *error, ...)
 
        strcpy(hosterrorstring2, hosterrorstring1);
 
-       // make sure we don't get in a loading loop
-       sv_loadgame[0] = 0;
-       sv_spawnmap[0] = 0;
-
        CL_Parse_DumpPacket();
 
        PR_Crash();
@@ -174,8 +139,7 @@ void Host_Error (const char *error, ...)
 
        PRVM_ProcessError();
 
-       if (sv.active)
-               Host_ShutdownServer (false);
+       Host_ShutdownServer (false);
 
        if (cls.state == ca_dedicated)
                Sys_Error ("Host_Error: %s\n",hosterrorstring2);        // dedicated servers exit
@@ -259,9 +223,12 @@ void Host_ServerOptions (void)
 Host_InitLocal
 ======================
 */
+void Host_SaveConfig_f(void);
 void Host_InitLocal (void)
 {
        Host_InitCommands ();
+       
+       Cmd_AddCommand("saveconfig", Host_SaveConfig_f);
 
        Cvar_RegisterVariable (&host_framerate);
        Cvar_RegisterVariable (&host_speeds);
@@ -299,12 +266,12 @@ void Host_InitLocal (void)
 
 /*
 ===============
-Host_WriteConfiguration
+Host_SaveConfig_f
 
 Writes key bindings and archived cvars to config.cfg
 ===============
 */
-void Host_WriteConfiguration (void)
+void Host_SaveConfig_f(void)
 {
        qfile_t *f;
 
@@ -315,7 +282,7 @@ void Host_WriteConfiguration (void)
                f = FS_Open ("config.cfg", "w", false);
                if (!f)
                {
-                       Con_Print("Couldn't write config.cfg.\n");
+                       Con_Print("Couldn't write config.cfg.\n");
                        return;
                }
 
@@ -329,6 +296,20 @@ void Host_WriteConfiguration (void)
 
 /*
 =================
+SV_ClientPrint
+
+Sends text across to be displayed
+FIXME: make this just a stuffed echo?
+=================
+*/
+void SV_ClientPrint(const char *msg)
+{
+       MSG_WriteByte(&host_client->message, svc_print);
+       MSG_WriteString(&host_client->message, msg);
+}
+
+/*
+=================
 SV_ClientPrintf
 
 Sends text across to be displayed
@@ -338,45 +319,57 @@ FIXME: make this just a stuffed echo?
 void SV_ClientPrintf(const char *fmt, ...)
 {
        va_list argptr;
-       char string[1024];
+       char msg[4096];
 
-       va_start (argptr,fmt);
-       vsprintf (string, fmt,argptr);
-       va_end (argptr);
+       va_start(argptr,fmt);
+       vsnprintf(msg,sizeof(msg),fmt,argptr);
+       va_end(argptr);
 
-       MSG_WriteByte (&host_client->message, svc_print);
-       MSG_WriteString (&host_client->message, string);
+       SV_ClientPrint(msg);
 }
 
 /*
 =================
-SV_BroadcastPrintf
+SV_BroadcastPrint
 
 Sends text to all active clients
 =================
 */
-void SV_BroadcastPrintf(const char *fmt, ...)
+void SV_BroadcastPrint(const char *msg)
 {
-       va_list argptr;
-       char string[4096];
        int i;
        client_t *client;
 
-       va_start(argptr,fmt);
-       vsnprintf(string, sizeof(string), fmt,argptr);
-       va_end(argptr);
-
        for (i = 0, client = svs.clients;i < svs.maxclients;i++, client++)
        {
                if (client->spawned)
                {
                        MSG_WriteByte(&client->message, svc_print);
-                       MSG_WriteString(&client->message, string);
+                       MSG_WriteString(&client->message, msg);
                }
        }
 
        if (sv_echobprint.integer && cls.state == ca_dedicated)
-               Sys_Printf("%s", string);
+               Sys_Print(msg);
+}
+
+/*
+=================
+SV_BroadcastPrintf
+
+Sends text to all active clients
+=================
+*/
+void SV_BroadcastPrintf(const char *fmt, ...)
+{
+       va_list argptr;
+       char msg[4096];
+
+       va_start(argptr,fmt);
+       vsnprintf(msg,sizeof(msg),fmt,argptr);
+       va_end(argptr);
+
+       SV_BroadcastPrint(msg);
 }
 
 /*
@@ -481,17 +474,14 @@ void Host_ShutdownServer(qboolean crash)
        sizebuf_t buf;
        char message[4];
 
+       Con_DPrintf("Host_ShutdownServer\n");
+
        if (!sv.active)
                return;
 
        // print out where the crash happened, if it was caused by QC
        PR_Crash();
 
-       sv.active = false;
-
-// stop all client sounds immediately
-       CL_Disconnect();
-
        NetConn_Heartbeat(2);
        NetConn_Heartbeat(2);
 
@@ -510,6 +500,8 @@ void Host_ShutdownServer(qboolean crash)
 
        NetConn_CloseServerPorts();
 
+       sv.active = false;
+
 //
 // clear structures
 //
@@ -528,7 +520,7 @@ not reinitialize anything.
 */
 void Host_ClearMemory (void)
 {
-       Con_DPrint("Clearing memory\n");
+       Con_DPrint("Clearing memory\n");
        Mod_ClearAll ();
 
        cls.signon = 0;
@@ -567,17 +559,20 @@ qboolean Host_FilterTime (double time)
                // default to sys_ticrate (server framerate - presumably low) unless we
                // have a good reason to run faster
                timecap = sys_ticrate.value;
-               if (cl_avidemo.value >= 0.1f)
-                       timecap = 1.0 / (double)cl_avidemo.value;
-               else if (vid_activewindow && !scr_con_current)
-                       timecap = 1.0 / host_maxfps.value;
+               if (cls.state != ca_dedicated)
+               {
+                       if (cl_avidemo.value >= 0.1f)
+                               timecap = 1.0 / (double)cl_avidemo.value;
+                       else if (vid_activewindow)
+                               timecap = 1.0 / host_maxfps.value;
+               }
 
                timeleft = oldrealtime + timecap - realtime;
                if (timeleft > 0)
                {
                        // don't totally hog the CPU
                        if (timeleft >= 0.02)
-                               Sys_Sleep();
+                               Sys_Sleep((int)(timeleft * 1000) - 5);
                        return false;
                }
        }
@@ -713,9 +708,6 @@ void _Host_Frame (float time)
        // process console commands
        Cbuf_Execute();
 
-       // LordHavoc: map and load are delayed until video is initialized
-       Host_PerformSpawnServerAndLoadGame();
-
        // if running the server locally, make intentions now
        if (cls.state == ca_connected && sv.active)
                CL_SendCmd(&cmd);
@@ -752,7 +744,7 @@ void _Host_Frame (float time)
                CL_ReadFromServer();
        }
 
-       ui_update();
+       //ui_update();
 
        CL_VideoFrame();
 
@@ -760,6 +752,7 @@ void _Host_Frame (float time)
        if (host_speeds.integer)
                time1 = Sys_DoubleTime();
 
+       R_UpdateWorld();
        CL_UpdateScreen();
 
        if (host_speeds.integer)
@@ -826,7 +819,7 @@ void Host_Frame (float time)
                        c++;
        }
 
-       Con_Printf ("serverprofile: %2i clients %2i msec\n",  c,  m);
+       Con_Printf("serverprofile: %2i clients %2i msec\n",  c,  m);
 }
 
 //============================================================================
@@ -840,6 +833,8 @@ Host_Init
 */
 void Host_Init (void)
 {
+       int i;
+
        // LordHavoc: quake never seeded the random number generator before... heh
        srand(time(NULL));
 
@@ -866,7 +861,7 @@ void Host_Init (void)
        NetConn_Init();
        SV_Init();
 
-       Con_Printf ("Builddate: %s\n", buildstring);
+       Con_Printf("Builddate: %s\n", buildstring);
 
        if (cls.state != ca_dedicated)
        {
@@ -880,22 +875,40 @@ void Host_Init (void)
                CL_Init();
        }
 
-       Cbuf_InsertText ("exec quake.rc\n");
-       Cbuf_Execute();
-       Cbuf_Execute();
-       Cbuf_Execute();
+       // only cvars are executed when host_initialized == false
+       if (gamemode == GAME_TEU)
+               Cbuf_InsertText("exec teu.rc\n");
+       else
+               Cbuf_InsertText("exec quake.rc\n");
        Cbuf_Execute();
 
        host_initialized = true;
 
-       Con_DPrint("========Initialized=========\n");
+       Con_DPrint("========Initialized=========\n");
 
        if (cls.state != ca_dedicated)
        {
                VID_Open();
-               MR_Init();
                SCR_BeginLoadingPlaque();
+               MR_Init();
        }
+
+       // stuff it again so the first host frame will execute it again, this time
+       // in its entirety
+       if (gamemode == GAME_TEU)
+               Cbuf_InsertText("exec teu.rc\n");
+       else
+               Cbuf_InsertText("exec quake.rc\n");
+
+       // check for special benchmark mode
+       i = COM_CheckParm("-benchmark");
+       if (i && i + 1 < com_argc)
+               Cbuf_InsertText(va("timedemo %s\n", com_argv[i + 1]));
+
+       Cbuf_Execute();
+
+       // We must wait for the log_file cvar to be initialized to start the log
+       Log_Start ();
 }
 
 
@@ -913,7 +926,7 @@ void Host_Shutdown(void)
 
        if (isdown)
        {
-               Con_Print("recursive shutdown\n");
+               Con_Print("recursive shutdown\n");
                return;
        }
        isdown = true;
@@ -926,7 +939,7 @@ void Host_Shutdown(void)
        // AK hmm, no PRVM_Shutdown(); yet
 
 
-       Host_WriteConfiguration ();
+       Host_SaveConfig_f();
 
        CDAudio_Shutdown ();
        NetConn_Shutdown ();