Index: code/client/cl_cgame.c
===================================================================
--- code/client/cl_cgame.c (revision 263)
+++ code/client/cl_cgame.c (working copy)
@@ -418,8 +418,49 @@
#define VMA(x) VM_ArgPtr(args[x])
#define VMF(x) ((float *)args)[x]
int CL_CgameSystemCalls( int *args ) {
+ char timestamp[MAX_OSPATH]; //Required for auto Screenshot&ConsoleDump stuff
switch( args[0] ) {
case CG_PRINT:
+ if (cl_autoScreenshotJPEG->integer || cl_autoScreenshot->integer || cl_autoConsoleDump->integer) {
+ if (Q_strncmp(VMA(1),Cvar_VariableString("g_blueteamname"),strlen(Cvar_VariableString("g_blueteamname"))) == 0) {
+ if (Q_strncmp((const char*)VMA(1)+strlen(Cvar_VariableString("g_blueteamname"))," hit the scorelimit.",20) == 0) {
+ CL_CurrentTimestamp(timestamp);
+ if (cl_autoConsoleDump->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; condump \"%s.txt\"",cl_autoScreenshotTime->integer, timestamp) );
+ }
+ if (cl_autoScreenshotJPEG->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshotJPEG \"%s\"",cl_autoScreenshotTime->integer, timestamp ) );
+ }
+ if (cl_autoScreenshot->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshot \"%s\"",cl_autoScreenshotTime->integer+1, timestamp ) );
+ }
+ }
+ } else if (Q_strncmp(VMA(1),Cvar_VariableString("g_redteamname"),strlen(Cvar_VariableString("g_redteamname"))) == 0) {
+ if (Q_strncmp((const char*)VMA(1)+strlen(Cvar_VariableString("g_redteamname"))," hit the scorelimit.",20) == 0) {
+ CL_CurrentTimestamp(timestamp);
+ if (cl_autoConsoleDump->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; condump \"%s.txt\"",cl_autoScreenshotTime->integer, timestamp) );
+ }
+ if (cl_autoScreenshotJPEG->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshotJPEG \"%s\"",cl_autoScreenshotTime->integer, timestamp ) );
+ }
+ if (cl_autoScreenshot->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshot \"%s\"",cl_autoScreenshotTime->integer+1, timestamp ) );
+ }
+ }
+ } else if (Q_strncmp(VMA(1),"Timelimit hit.",14) == 0) {
+ CL_CurrentTimestamp(timestamp);
+ if (cl_autoConsoleDump->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; condump \"%s.txt\"",cl_autoScreenshotTime->integer, timestamp) );
+ }
+ if (cl_autoScreenshotJPEG->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshotJPEG \"%s\"",cl_autoScreenshotTime->integer, timestamp ) );
+ }
+ if (cl_autoScreenshot->integer) {
+ Cbuf_ExecuteText( EXEC_INSERT, va( "wait %d; screenshot \"%s\"",cl_autoScreenshotTime->integer+1, timestamp ) );
+ }
+ }
+ }
Com_Printf( "%s", VMA(1) );
return 0;
case CG_ERROR:
Index: code/client/cl_main.c
===================================================================
--- code/client/cl_main.c (revision 263)
+++ code/client/cl_main.c (working copy)
@@ -55,6 +55,13 @@
cvar_t *cl_timedemo;
cvar_t *cl_avidemo;
cvar_t *cl_forceavidemo;
+cvar_t *cl_autoRecordDemo;
+cvar_t *cl_autoDemoName;
+cvar_t *cl_hideDemoMessage;
+cvar_t *cl_autoScreenshot;
+cvar_t *cl_autoScreenshotJPEG;
+cvar_t *cl_autoConsoleDump;
+cvar_t *cl_autoScreenshotTime;
cvar_t *cl_freelook;
cvar_t *cl_sensitivity;
@@ -292,6 +299,36 @@
, a, b, c, d );
}
+void CL_CurrentTimestamp(char *fileName) {
+ //Build the name:
+ qtime_t now;
+ char *nowString;
+ char *p;
+ char mapName[ MAX_QPATH ];
+ char serverName[ MAX_OSPATH ];
+
+ Com_RealTime( &now );
+ nowString = va( "%04d%02d%02d-%02d%02d%02d",
+ 1900 + now.tm_year,
+ 1 + now.tm_mon,
+ now.tm_mday,
+ now.tm_hour,
+ now.tm_min,
+ now.tm_sec );
+
+ Q_strncpyz( serverName, cls.servername, MAX_OSPATH );
+ // Replace the ":" in the address as it is not a valid
+ // file name character
+ p = strstr( serverName, ":" );
+ if( p ) {
+ *p = '.';
+ }
+
+ Q_strncpyz( mapName, COM_SkipPath( cl.mapname ), sizeof( cl.mapname ) );
+ COM_StripExtension(mapName, mapName, sizeof(mapName));
+
+ Com_sprintf (fileName, MAX_OSPATH, "%s-%s-%s-%s",Cvar_VariableString("name"),nowString, serverName, mapName);
+}
/*
====================
CL_Record_f
@@ -339,16 +376,23 @@
Q_strncpyz( demoName, s, sizeof( demoName ) );
Com_sprintf (name, sizeof(name), "demos/%s.dm_%d", demoName, PROTOCOL_VERSION );
} else {
- int number;
+ if (cl_autoDemoName->integer) {
+ int number;
- // scan for a free demo name
- for ( number = 0 ; number <= 9999 ; number++ ) {
- CL_DemoFilename( number, demoName );
+ CL_CurrentTimestamp(demoName);
Com_sprintf (name, sizeof(name), "demos/%s.dm_%d", demoName, PROTOCOL_VERSION );
+ } else {
+ int number;
- len = FS_ReadFile( name, NULL );
- if ( len <= 0 ) {
- break; // file doesn't exist
+ // scan for a free demo name
+ for ( number = 0 ; number <= 9999 ; number++ ) {
+ CL_DemoFilename( number, demoName );
+ Com_sprintf (name, sizeof(name), "demos/%s.dm_%d", demoName, PROTOCOL_VERSION );
+
+ len = FS_ReadFile( name, NULL );
+ if ( len <= 0 ) {
+ break; // file doesn't exist
+ }
}
}
}
@@ -2141,6 +2185,20 @@
}
}
+ if( cl_autoRecordDemo->integer ) {
+ if( cls.state == CA_ACTIVE && !clc.demorecording && !clc.demoplaying ) {
+ // If not recording a demo, and we should be, start one
+ char timestamp[MAX_OSPATH];
+ CL_CurrentTimestamp(timestamp);
+
+ Cbuf_ExecuteText( EXEC_NOW, va( "record %s", timestamp) );
+ }
+ else if( cls.state != CA_ACTIVE && clc.demorecording ) {
+ // Recording, but not CA_ACTIVE, so stop recording
+ CL_StopRecord_f( );
+ }
+ }
+
// save the msec before checking pause
cls.realFrametime = msec;
@@ -2454,6 +2512,14 @@
cl_activeAction = Cvar_Get( "activeAction", "", CVAR_TEMP );
cl_timedemo = Cvar_Get ("timedemo", "0", 0);
+ cl_autoRecordDemo = Cvar_Get ("cl_autoRecordDemo", "0", CVAR_ARCHIVE);
+ cl_autoDemoName = Cvar_Get ("cl_autoDemoName", "0", CVAR_ARCHIVE);
+ cl_hideDemoMessage = Cvar_Get ("cl_hideDemoMessage", "0", CVAR_ARCHIVE);
+ cl_autoScreenshot = Cvar_Get ("cl_autoScreenshot", "0", CVAR_ARCHIVE);
+ cl_autoScreenshotJPEG = Cvar_Get ("cl_autoScreenshotJPEG", "0", CVAR_ARCHIVE);
+ cl_autoScreenshotTime = Cvar_Get ("cl_autoScreenshotTime", "220", CVAR_ARCHIVE);
+ cl_autoConsoleDump = Cvar_Get ("cl_autoConsoleDump", "0", CVAR_ARCHIVE);
+
cl_avidemo = Cvar_Get ("cl_avidemo", "0", 0);
cl_forceavidemo = Cvar_Get ("cl_forceavidemo", "0", 0);
Index: code/client/cl_parse.c
===================================================================
--- code/client/cl_parse.c (revision 263)
+++ code/client/cl_parse.c (working copy)
@@ -469,6 +469,10 @@
// parse serverId and other cvars
CL_SystemInfoChanged();
+ // stop recording now so the demo won't have an unnecessary level load at the end.
+ if(cl_autoRecordDemo->integer && clc.demorecording)
+ CL_StopRecord_f();
+
// reinitialize the filesystem if the game directory has changed
FS_ConditionalRestart( clc.checksumFeed );
Index: code/client/cl_scrn.c
===================================================================
--- code/client/cl_scrn.c (revision 263)
+++ code/client/cl_scrn.c (working copy)
@@ -490,7 +490,7 @@
break;
case CA_ACTIVE:
CL_CGameRendering( stereoFrame );
- SCR_DrawDemoRecording();
+ if (!cl_hideDemoMessage->integer)SCR_DrawDemoRecording();
break;
}
}
Index: code/client/client.h
===================================================================
--- code/client/client.h (revision 263)
+++ code/client/client.h (working copy)
@@ -353,6 +353,13 @@
extern cvar_t *cl_allowDownload;
extern cvar_t *cl_conXOffset;
extern cvar_t *cl_inGameVideo;
+extern cvar_t *cl_autoRecordDemo;
+extern cvar_t *cl_autoDemoName;
+extern cvar_t *cl_hideDemoMessage;
+extern cvar_t *cl_autoScreenshot;
+extern cvar_t *cl_autoScreenshotJPEG;
+extern cvar_t *cl_autoScreenshotTime;
+extern cvar_t *cl_autoConsoleDump;
#ifdef USE_MUMBLE
extern cvar_t *cl_useMumble;
@@ -392,8 +399,8 @@
void CL_InitRef( void );
qboolean CL_CDKeyValidate( const char *key, const char *checksum );
int CL_ServerStatus( char *serverAddress, char *serverStatusString, int maxLen );
+void CL_CurrentTimestamp(char *fileName);
-
//
// cl_input
//