From: havoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Fri, 16 Mar 2007 09:37:04 +0000 (+0000)
Subject: fixed cl_autodemo
X-Git-Tag: xonotic-v0.1.0preview~3426
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1ef645bbb85009f154e3a9c016ecfbeb811a04c8;p=xonotic%2Fdarkplaces.git

fixed cl_autodemo


git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6991 d7cf8633-e32d-0410-b094-e92efae38249
---

diff --git a/cl_demo.c b/cl_demo.c
index 0f92f2ce..5539c70c 100644
--- a/cl_demo.c
+++ b/cl_demo.c
@@ -99,7 +99,7 @@ CL_WriteDemoMessage
 Dumps the current net message, prefixed by the length and view angles
 ====================
 */
-void CL_WriteDemoMessage (void)
+void CL_WriteDemoMessage (sizebuf_t *message)
 {
 	int		len;
 	int		i;
@@ -108,14 +108,14 @@ void CL_WriteDemoMessage (void)
 	if (cls.demopaused) // LordHavoc: pausedemo
 		return;
 
-	len = LittleLong (net_message.cursize);
+	len = LittleLong (message->cursize);
 	FS_Write (cls.demofile, &len, 4);
 	for (i=0 ; i<3 ; i++)
 	{
 		f = LittleFloat (cl.viewangles[i]);
 		FS_Write (cls.demofile, &f, 4);
 	}
-	FS_Write (cls.demofile, net_message.data, net_message.cursize);
+	FS_Write (cls.demofile, message->data, message->cursize);
 }
 
 /*
@@ -232,6 +232,9 @@ stop recording a demo
 */
 void CL_Stop_f (void)
 {
+	sizebuf_t buf;
+	unsigned char bufdata[64];
+
 	if (!cls.demorecording)
 	{
 		Con_Print("Not recording a demo.\n");
@@ -239,9 +242,12 @@ void CL_Stop_f (void)
 	}
 
 // write a disconnect message to the demo file
-	SZ_Clear (&net_message);
-	MSG_WriteByte (&net_message, svc_disconnect);
-	CL_WriteDemoMessage ();
+	// LordHavoc: don't replace the net_message when doing this
+	buf.data = bufdata;
+	buf.maxsize = sizeof(bufdata);
+	SZ_Clear(&buf);
+	MSG_WriteByte(&buf, svc_disconnect);
+	CL_WriteDemoMessage(&buf);
 
 // finish up
 	FS_Close (cls.demofile);
diff --git a/cl_main.c b/cl_main.c
index ad7dfe08..f701acbe 100644
--- a/cl_main.c
+++ b/cl_main.c
@@ -51,10 +51,8 @@ cvar_t m_side = {CVAR_SAVE, "m_side","0.8","mouse side speed multiplier"};
 
 cvar_t freelook = {CVAR_SAVE, "freelook", "1","mouse controls pitch instead of forward/back"};
 
-#ifdef AUTODEMO_BROKEN
 cvar_t cl_autodemo = {0, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
 cvar_t cl_autodemo_nameformat = {0, "cl_autodemo_nameformat", "%Y-%m-%d_%H-%M", "The format of the cl_autodemo filename, followed by the map name" };
-#endif
 
 cvar_t r_draweffects = {0, "r_draweffects", "1","renders temporary sprite effects"};
 
@@ -2189,10 +2187,8 @@ void CL_Init (void)
 	Cmd_AddCommand ("playdemo", CL_PlayDemo_f, "watch a demo file");
 	Cmd_AddCommand ("timedemo", CL_TimeDemo_f, "play back a demo as fast as possible and save statistics to benchmark.log");
 
-#ifdef AUTODEMO_BROKEN
 	Cvar_RegisterVariable (&cl_autodemo);
 	Cvar_RegisterVariable (&cl_autodemo_nameformat);
-#endif
 
 	Cmd_AddCommand ("fog", CL_Fog_f, "set global fog parameters (density red green blue)");
 
diff --git a/cl_parse.c b/cl_parse.c
index 107a61c1..986defbd 100644
--- a/cl_parse.c
+++ b/cl_parse.c
@@ -1528,6 +1528,37 @@ void CL_ParseServerInfo (void)
 
 	// check memory integrity
 	Mem_CheckSentinelsGlobal();
+
+// if cl_autodemo is set, automatically start recording a demo if one isn't being recorded already
+	if (cl_autodemo.integer && cls.netcon && cls.protocol != PROTOCOL_QUAKEWORLD)
+	{
+		char demofile[MAX_OSPATH];
+		char levelname[MAX_QPATH];
+
+		if (cls.demorecording)
+		{
+			// finish the previous level's demo file
+			CL_Stop_f();
+		}
+
+		// start a new demo file
+		strlcpy(levelname, FS_FileWithoutPath(cl.model_name[1]), sizeof(levelname));
+		if (strrchr(levelname, '.'))
+			*(strrchr(levelname, '.')) = 0;
+		dpsnprintf (demofile, sizeof(demofile), "%s_%s.dem", Sys_TimeString (cl_autodemo_nameformat.string), levelname);
+
+		Con_Printf ("Auto-recording to %s.\n", demofile);
+
+		cls.demofile = FS_Open (demofile, "wb", false, false);
+		if (cls.demofile)
+		{
+			cls.forcetrack = -1;
+			FS_Printf (cls.demofile, "%i\n", cls.forcetrack);
+			cls.demorecording = true;
+		}
+		else
+			Con_Print ("ERROR: couldn't open.\n");
+	}
 }
 
 void CL_ValidateState(entity_state_t *s)
@@ -2624,8 +2655,11 @@ void CL_ParseServerMessage(void)
 	char		*cmdlogname[32], *temp;
 	int			cmdindex, cmdcount = 0;
 
-	if (cls.demorecording)
-		CL_WriteDemoMessage ();
+	// LordHavoc: moved demo message writing from before the packet parse to
+	// after the packet parse so that CL_Stop_f can be called by cl_autodemo
+	// code in CL_ParseServerinfo
+	//if (cls.demorecording)
+	//	CL_WriteDemoMessage (&net_message);
 
 	cl.last_received_message = realtime;
 
@@ -3400,6 +3434,11 @@ void CL_ParseServerMessage(void)
 	EntityFrameQuake_ISeeDeadEntities();
 
 	parsingerror = false;
+
+	// LordHavoc: this was at the start of the function before cl_autodemo was
+	// implemented
+	if (cls.demorecording)
+		CL_WriteDemoMessage (&net_message);
 }
 
 void CL_Parse_DumpPacket(void)
diff --git a/client.h b/client.h
index fea8d048..7141da00 100644
--- a/client.h
+++ b/client.h
@@ -1108,7 +1108,7 @@ int Key_StringToKeynum (const char *str);
 //
 void CL_StopPlayback(void);
 void CL_ReadDemoMessage(void);
-void CL_WriteDemoMessage(void);
+void CL_WriteDemoMessage(sizebuf_t *mesage);
 
 void CL_NextDemo(void);
 void CL_Stop_f(void);