X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=inline;f=cl_demo.c;h=5e77cad13dee5ef97c12a1637f6d6a61e96547a4;hb=bbfc7709f79e2855c3f8bcb25164afd359b3089c;hp=8a93daf6ce3082168093ec4e80881977558529de;hpb=90c7b73cb4726de4318b54a146c54a43ebbe667a;p=xonotic%2Fdarkplaces.git diff --git a/cl_demo.c b/cl_demo.c index 8a93daf6..5e77cad1 100644 --- a/cl_demo.c +++ b/cl_demo.c @@ -63,7 +63,7 @@ void CL_NextDemo (void) } } - sprintf (str,"playdemo %s\n", cls.demos[cls.demonum]); + dpsnprintf (str, sizeof(str), "playdemo %s\n", cls.demos[cls.demonum]); Cbuf_InsertText (str); cls.demonum++; } @@ -119,6 +119,57 @@ void CL_WriteDemoMessage (sizebuf_t *message) FS_Write (cls.demofile, message->data, message->cursize); } +/* +==================== +CL_CutDemo + +Dumps the current demo to a buffer, and resets the demo to its starting point. +Used to insert csprogs.dat files as a download to the beginning of a demo file. +==================== +*/ +void CL_CutDemo (unsigned char **buf, fs_offset_t *filesize) +{ + *buf = NULL; + *filesize = 0; + + FS_Close(cls.demofile); + *buf = FS_LoadFile(cls.demoname, tempmempool, false, filesize); + + // restart the demo recording + cls.demofile = FS_OpenRealFile(cls.demoname, "wb", false); + if(!cls.demofile) + Host_Error("failed to reopen the demo file"); + FS_Printf(cls.demofile, "%i\n", cls.forcetrack); +} + +/* +==================== +CL_PasteDemo + +Adds the cut stuff back to the demo. Also frees the buffer. +Used to insert csprogs.dat files as a download to the beginning of a demo file. +==================== +*/ +void CL_PasteDemo (unsigned char **buf, fs_offset_t *filesize) +{ + fs_offset_t startoffset = 0; + + if(!*buf) + return; + + // skip cdtrack + while(startoffset < *filesize && ((char *)(*buf))[startoffset] != '\n') + ++startoffset; + if(startoffset < *filesize) + ++startoffset; + + FS_Write(cls.demofile, *buf + startoffset, *filesize - startoffset); + + Mem_Free(*buf); + *buf = NULL; + *filesize = 0; +} + /* ==================== CL_ReadDemoMessage @@ -209,6 +260,9 @@ void CL_ReadDemoMessage(void) MSG_BeginReading(); CL_ParseServerMessage(); + if (cls.signon != SIGNONS) + Cbuf_Execute(); // immediately execute svc_stufftext if in the demo before connect! + // In case the demo contains a "svc_disconnect" message if (!cls.demoplayback) return; @@ -311,17 +365,20 @@ void CL_Record_f (void) // open the demo file Con_Printf("recording to %s.\n", name); - cls.demofile = FS_Open (name, "wb", false, false); + cls.demofile = FS_OpenRealFile(name, "wb", false); if (!cls.demofile) { Con_Print("ERROR: couldn't open.\n"); return; } + strlcpy(cls.demoname, name, sizeof(cls.demoname)); cls.forcetrack = track; FS_Printf(cls.demofile, "%i\n", cls.forcetrack); cls.demorecording = true; + cls.demo_lastcsprogssize = -1; + cls.demo_lastcsprogscrc = -1; } @@ -357,15 +414,15 @@ void CL_PlayDemo_f (void) cls.protocol = PROTOCOL_QUAKE; Con_Printf("Playing demo %s.\n", name); - cls.demofile = FS_Open (name, "rb", false, false); + cls.demofile = FS_OpenVirtualFile(name, false); if (!cls.demofile) { Con_Print("ERROR: couldn't open.\n"); cls.demonum = -1; // stop demo loop return; } - strlcpy(cls.demoname, name, sizeof(cls.demoname)); + cls.demoplayback = true; cls.state = ca_connected; cls.forcetrack = 0;