/* * PF_GameCmd * * Sends the server command to clients. * If ent is NULL the command will be sent to all connected clients */ static void PF_GameCmd( edict_t *ent, const char *cmd ) { int i; client_t *client; if( !cmd || !cmd[0] ) return; if( !ent ) { for( i = 0, client = svs.clients; i < sv_maxclients->integer; i++, client++ ) { if( client->state < CS_SPAWNED ) continue; SV_AddGameCommand( client, cmd ); } } else { i = NUM_FOR_EDICT( ent ); if( i < 1 || i > sv_maxclients->integer ) return; client = svs.clients + ( i - 1 ); if( client->state < CS_SPAWNED ) return; SV_AddGameCommand( client, cmd ); } }
/* * SV_Multiview_f */ static void SV_Multiview_f( client_t *client ) { qboolean mv; mv = ( atoi( Cmd_Argv( 1 ) ) != 0 ); if( client->mv == mv ) return; if( !client->tvclient ) return; // allow MV connections only for TV if( !ge->ClientMultiviewChanged( client->edict, mv ) ) return; if( mv ) { if( sv.num_mv_clients < sv_maxmvclients->integer ) { client->mv = qtrue; sv.num_mv_clients++; } else { SV_AddGameCommand( client, "pr \"Can't multiview: maximum number of allowed multiview clients reached.\"" ); return; } } else { assert( sv.num_mv_clients ); client->mv = qfalse; sv.num_mv_clients--; } }
/* * SV_MOTD_Get_f * * Comand to return MOTD */ void SV_MOTD_Get_f( client_t *client ) { int flag = ( Cmd_Argc() > 1 ? 1 : 0 ); if( sv_MOTD->integer && svs.motd && svs.motd[0] ) SV_AddGameCommand( client, va( "motd %d \"%s\n\"", flag, svs.motd ) ); }
/* * SV_DemoGet_f * * Responds to clients demoget request with: demoget "filename" * If nothing is found, responds with demoget without filename, so client knowns it wasn't found */ void SV_DemoGet_f( client_t *client ) { int num, numdemos; char message[MAX_STRING_CHARS]; char buffer[MAX_STRING_CHARS]; char *s, *p; size_t j, length, length_escaped, pos, pos_bak, msglen; if( client->state < CS_SPAWNED ) return; if( Cmd_Argc() != 2 ) return; Q_strncpyz( message, "demoget \"", sizeof( message ) ); Q_strncatz( message, SV_DEMO_DIR, sizeof( message ) ); msglen = strlen( message ); message[msglen++] = '/'; pos = pos_bak = msglen; numdemos = FS_GetFileList( SV_DEMO_DIR, APP_DEMO_EXTENSION_STR, NULL, 0, 0, 0 ); if( numdemos ) { if( Cmd_Argv( 1 )[0] == '.' ) num = numdemos - strlen( Cmd_Argv( 1 ) ); else num = atoi( Cmd_Argv( 1 ) ) - 1; clamp( num, 0, numdemos - 1 ); numdemos = FS_GetFileList( SV_DEMO_DIR, APP_DEMO_EXTENSION_STR, buffer, sizeof( buffer ), num, num+1 ); if( numdemos ) { s = buffer; length = strlen( buffer ); length_escaped = length; p = s; while( ( p = strchr( p, '\\' ) ) ) length_escaped++; if( msglen + length_escaped + 1 + 5 < sizeof( message ) ) { for( j = 0; j < length; j++ ) { assert( s[j] != '\\' ); if( s[j] == '"' ) message[pos++] = '\\'; message[pos++] = s[j]; } } } } if( pos == pos_bak ) return; message[pos++] = '"'; message[pos] = '\0'; SV_AddGameCommand( client, message ); }
void SV_DemoList_f( client_t *client ) { char message[MAX_STRING_CHARS]; char numpr[16]; char buffer[MAX_STRING_CHARS]; char *s, *p; size_t j, length, length_escaped, pos, extlen; int numdemos, i, start = -1, end, k; if( client->state < CS_SPAWNED ) return; if( Cmd_Argc() > 2 ) { SV_AddGameCommand( client, "pr \"Usage: demolist [starting position]\n\"" ); return; } if( Cmd_Argc() == 2 ) { start = atoi( Cmd_Argv( 1 ) ) - 1; if( start < 0 ) { SV_AddGameCommand( client, "pr \"Usage: demolist [starting position]\n\"" ); return; } } Q_strncpyz( message, "pr \"Available demos:\n----------------\n", sizeof( message ) ); numdemos = FS_GetFileList( SV_DEMO_DIR, APP_DEMO_EXTENSION_STR, NULL, 0, 0, 0 ); if( numdemos ) { if( start < 0 ) start = max( 0, numdemos - DEMOS_PER_VIEW ); else if( start > numdemos - 1 ) start = numdemos - 1; if( start > 0 ) Q_strncatz( message, "...\n", sizeof( message ) ); end = start + DEMOS_PER_VIEW; if( end > numdemos ) end = numdemos; extlen = strlen( APP_DEMO_EXTENSION_STR ); i = start; do { if( ( k = FS_GetFileList( SV_DEMO_DIR, APP_DEMO_EXTENSION_STR, buffer, sizeof( buffer ), i, end ) ) == 0 ) { i++; continue; } for( s = buffer; k > 0; k--, s += length+1, i++ ) { length = strlen( s ); length_escaped = length; p = s; while( ( p = strchr( p, '\\' ) ) ) length_escaped++; Q_snprintfz( numpr, sizeof( numpr ), "%i: ", i+1 ); if( strlen( message ) + strlen( numpr ) + length_escaped - extlen + 1 + 5 >= sizeof( message ) ) { Q_strncatz( message, "\"", sizeof( message ) ); SV_AddGameCommand( client, message ); Q_strncpyz( message, "pr \"", sizeof( message ) ); if( strlen( "demoget " ) + strlen( numpr ) + length_escaped - extlen + 1 + 5 >= sizeof( message ) ) continue; } Q_strncatz( message, numpr, sizeof( message ) ); pos = strlen( message ); for( j = 0; j < length - extlen; j++ ) { assert( s[j] != '\\' ); if( s[j] == '"' ) message[pos++] = '\\'; message[pos++] = s[j]; } message[pos++] = '\n'; message[pos] = '\0'; } } while( i < end ); if( end < numdemos ) Q_strncatz( message, "...\n", sizeof( message ) ); } else { Q_strncatz( message, "none\n", sizeof( message ) ); } Q_strncatz( message, "\"", sizeof( message ) ); SV_AddGameCommand( client, message ); }