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 299ecad..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
@@ -144,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
@@ -168,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
@@ -312,7 +282,7 @@ void Host_SaveConfig_f(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;
                }
 
@@ -326,6 +296,20 @@ void Host_SaveConfig_f(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
@@ -335,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);
 }
 
 /*
@@ -478,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);
 
@@ -507,6 +500,8 @@ void Host_ShutdownServer(qboolean crash)
 
        NetConn_CloseServerPorts();
 
+       sv.active = false;
+
 //
 // clear structures
 //
@@ -525,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;
@@ -824,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);
 }
 
 //============================================================================
@@ -838,6 +833,8 @@ Host_Init
 */
 void Host_Init (void)
 {
+       int i;
+
        // LordHavoc: quake never seeded the random number generator before... heh
        srand(time(NULL));
 
@@ -864,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)
        {
@@ -879,12 +876,15 @@ void Host_Init (void)
        }
 
        // only cvars are executed when host_initialized == false
-       Cbuf_InsertText("exec quake.rc\n");
+       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)
        {
@@ -895,8 +895,20 @@ void Host_Init (void)
 
        // stuff it again so the first host frame will execute it again, this time
        // in its entirety
-       Cbuf_InsertText("exec quake.rc\n");
+       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 ();
 }
 
 
@@ -914,7 +926,7 @@ void Host_Shutdown(void)
 
        if (isdown)
        {
-               Con_Print("recursive shutdown\n");
+               Con_Print("recursive shutdown\n");
                return;
        }
        isdown = true;