X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sv_demo.c;h=9a9cc1641feda26a1d3c4256b4f9fd540e68e4d7;hb=2075ae43356d724bae305ce8fd36ea570718b14a;hp=3ba4349a47f58923acaea273fd39094a129a4a8e;hpb=fa8c676e225398a6157e591248a12d6847cef9a4;p=xonotic%2Fdarkplaces.git diff --git a/sv_demo.c b/sv_demo.c index 3ba4349a..9a9cc164 100644 --- a/sv_demo.c +++ b/sv_demo.c @@ -1,8 +1,11 @@ #include "quakedef.h" #include "sv_demo.h" +extern cvar_t sv_autodemo_perclient_discardable; + void SV_StartDemoRecording(client_t *client, const char *filename, int forcetrack) { + prvm_prog_t *prog = SVVM_prog; char name[MAX_QPATH]; if(client->sv_demo_file != NULL) @@ -13,7 +16,10 @@ void SV_StartDemoRecording(client_t *client, const char *filename, int forcetrac Con_Printf("Recording demo for # %d (%s) to %s\n", PRVM_NUM_FOR_EDICT(client->edict), client->netaddress, name); - client->sv_demo_file = FS_Open(name, "wb", false, false); + // Reset discardable flag for every new demo. + PRVM_serveredictfloat(client->edict, discardabledemo) = 0; + + client->sv_demo_file = FS_OpenRealFile(name, "wb", false); if(!client->sv_demo_file) { Con_Print("ERROR: couldn't open.\n"); @@ -23,21 +29,24 @@ void SV_StartDemoRecording(client_t *client, const char *filename, int forcetrac FS_Printf(client->sv_demo_file, "%i\n", forcetrack); } -void SV_WriteDemoMessage(client_t *client, sizebuf_t *sendbuffer) +void SV_WriteDemoMessage(client_t *client, sizebuf_t *sendbuffer, qboolean clienttoserver) { + prvm_prog_t *prog = SVVM_prog; int len, i; float f; + int temp; if(client->sv_demo_file == NULL) return; if(sendbuffer->cursize == 0) return; - len = LittleLong(sendbuffer->cursize); + temp = sendbuffer->cursize | (clienttoserver ? DEMOMSG_CLIENT_TO_SERVER : 0); + len = LittleLong(temp); FS_Write(client->sv_demo_file, &len, 4); for(i = 0; i < 3; ++i) { - f = LittleFloat(client->edict->fields.server->v_angle[i]); + f = LittleFloat(PRVM_serveredictvector(client->edict, v_angle)[i]); FS_Write(client->sv_demo_file, &f, 4); } FS_Write(client->sv_demo_file, sendbuffer->data, sendbuffer->cursize); @@ -45,6 +54,7 @@ void SV_WriteDemoMessage(client_t *client, sizebuf_t *sendbuffer) void SV_StopDemoRecording(client_t *client) { + prvm_prog_t *prog = SVVM_prog; sizebuf_t buf; unsigned char bufdata[64]; @@ -55,18 +65,25 @@ void SV_StopDemoRecording(client_t *client) buf.maxsize = sizeof(bufdata); SZ_Clear(&buf); MSG_WriteByte(&buf, svc_disconnect); - SV_WriteDemoMessage(client, &buf); + SV_WriteDemoMessage(client, &buf, false); + + if (sv_autodemo_perclient_discardable.integer && PRVM_serveredictfloat(client->edict, discardabledemo)) + { + FS_RemoveOnClose(client->sv_demo_file); + Con_Printf("Stopped recording discardable demo for # %d (%s)\n", PRVM_NUM_FOR_EDICT(client->edict), client->netaddress); + } + else + Con_Printf("Stopped recording demo for # %d (%s)\n", PRVM_NUM_FOR_EDICT(client->edict), client->netaddress); FS_Close(client->sv_demo_file); client->sv_demo_file = NULL; - Con_Printf("Stopped recording demo for # %d (%s)\n", PRVM_NUM_FOR_EDICT(client->edict), client->netaddress); } void SV_WriteNetnameIntoDemo(client_t *client) { // This "pseudo packet" is written so a program can easily find out whose demo this is sizebuf_t buf; - unsigned char bufdata[128]; + unsigned char bufdata[MAX_SCOREBOARDNAME + 64]; if(client->sv_demo_file == NULL) return; @@ -78,5 +95,5 @@ void SV_WriteNetnameIntoDemo(client_t *client) MSG_WriteUnterminatedString(&buf, "\n// this demo contains the point of view of: "); MSG_WriteUnterminatedString(&buf, client->name); MSG_WriteString(&buf, "\n"); - SV_WriteDemoMessage(client, &buf); + SV_WriteDemoMessage(client, &buf, false); }