From 1ef645bbb85009f154e3a9c016ecfbeb811a04c8 Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 16 Mar 2007 09:37:04 +0000 Subject: [PATCH] fixed cl_autodemo git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6991 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_demo.c | 18 ++++++++++++------ cl_main.c | 4 ---- cl_parse.c | 43 +++++++++++++++++++++++++++++++++++++++++-- client.h | 2 +- 4 files changed, 54 insertions(+), 13 deletions(-) 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); -- 2.39.2