summaryrefslogtreecommitdiff
path: root/source/mvd_client.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2009-04-22 23:40:03 +0000
committerAndrey Nazarov <skuller@skuller.net>2009-04-22 23:40:03 +0000
commit275f310df767a57b8cf409acdcbd14c63cb90df9 (patch)
tree3b59e2751c32b2f15fcfabb1af8b03e702cd5230 /source/mvd_client.c
parent385ccd0e9a518933019a8c6f1fecad2ae660b766 (diff)
Don't execute ‘cl_beginmapcmd’, ‘cl_changemapcmd’ and ‘cl_disconnectcmd’ triggers when playing back demos.
Fixed automatic restart of sound subsystem after cvar change not working randomly. Don't crash in CL_Disconnect() on dedicated server exit. Added ‘sv_redirect_address’ variable. Fixed ‘\r’ char not stripped properly from filename when processing ‘\include’ directive in AC config files. Made AC config parser compliant with reference format as defined by R1Q2 implementation. Updated documentation.
Diffstat (limited to 'source/mvd_client.c')
-rw-r--r--source/mvd_client.c63
1 files changed, 52 insertions, 11 deletions
diff --git a/source/mvd_client.c b/source/mvd_client.c
index 7d9e314..64d491a 100644
--- a/source/mvd_client.c
+++ b/source/mvd_client.c
@@ -47,13 +47,17 @@ typedef enum {
typedef struct gtv_s {
list_t entry;
+ // common stuff
int id;
char name[MAX_MVD_NAME];
gtv_state_t state;
mvd_t *mvd;
- char *username, *password;
+ void (*drop)( struct gtv_s * );
+ void (*destroy)( struct gtv_s * );
+ void (*run)( struct gtv_s * );
// connection variables
+ char *username, *password;
netstream_t stream;
char address[MAX_QPATH];
byte *data;
@@ -66,9 +70,6 @@ typedef struct gtv_s {
#endif
unsigned last_rcvd;
unsigned last_sent;
- void (*drop)( struct gtv_s * );
- void (*destroy)( struct gtv_s * );
- void (*run)( struct gtv_s * );
unsigned retry_time;
unsigned retry_backoff;
@@ -130,6 +131,8 @@ static void MVD_Free( mvd_t *mvd ) {
FS_Write( &msglen, 2, mvd->demorecording );
FS_FCloseFile( mvd->demorecording );
mvd->demorecording = 0;
+ Z_Free( mvd->demoname );
+ mvd->demoname = NULL;
}
for( i = 0; i < mvd->maxclients; i++ ) {
@@ -1420,14 +1423,9 @@ void MVD_Spawn_f( void ) {
sv.state = ss_broadcast;
}
-static void MVD_ListChannels_f( void ) {
+static void list_generic( void ) {
mvd_t *mvd;
- if( LIST_EMPTY( &mvd_channel_list ) ) {
- Com_Printf( "No MVD channels.\n" );
- return;
- }
-
Com_Printf(
"id name map spc plr stat buf pckt address \n"
"-- ------------ -------- --- --- ---- --- ---- --------------\n" );
@@ -1442,6 +1440,48 @@ static void MVD_ListChannels_f( void ) {
}
}
+static void list_recordings( void ) {
+ mvd_t *mvd;
+ char buffer[8];
+ size_t bytes;
+
+ Com_Printf(
+ "id name map size name\n"
+ "-- ------------ -------- ---- --------------\n" );
+
+ LIST_FOR_EACH( mvd_t, mvd, &mvd_channel_list, entry ) {
+ if( mvd->demorecording ) {
+ bytes = FS_Tell( mvd->demorecording );
+ if( bytes == INVALID_LENGTH ) {
+ strcpy( buffer, "???" );
+ } else {
+ Q_FormatFileSize( buffer, bytes, sizeof( buffer ) );
+ }
+ } else {
+ strcpy( buffer, "-" );
+ }
+ Com_Printf( "%2d %-12.12s %-8.8s %-4s %s\n",
+ mvd->id, mvd->name, mvd->mapname,
+ buffer, mvd->demoname ? mvd->demoname : "-" );
+ }
+}
+
+static void MVD_ListChannels_f( void ) {
+ char *s;
+
+ if( LIST_EMPTY( &mvd_channel_list ) ) {
+ Com_Printf( "No MVD channels.\n" );
+ return;
+ }
+
+ s = Cmd_Argv( 1 );
+ if( *s == 'r' ) {
+ list_recordings();
+ } else {
+ list_generic();
+ }
+}
+
static void MVD_ListServers_f( void ) {
gtv_t *gtv;
unsigned ratio;
@@ -1501,7 +1541,7 @@ static void MVD_EmitGamestate( mvd_t *mvd ) {
mvd_player_t *player;
size_t length;
int flags, extra, portalbytes;
- byte portalbits[MAX_MAP_AREAS/8];
+ byte portalbits[MAX_MAP_PORTAL_BYTES];
// pack MVD stream flags into extra bits
extra = mvd->flags << SVCMD_BITS;
@@ -1631,6 +1671,7 @@ void MVD_StreamedRecord_f( void ) {
}
mvd->demorecording = f;
+ mvd->demoname = MVD_CopyString( buffer );
MVD_EmitGamestate( mvd );