summaryrefslogtreecommitdiff
path: root/src/game/g_admin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/g_admin.c')
-rw-r--r--src/game/g_admin.c95
1 files changed, 89 insertions, 6 deletions
diff --git a/src/game/g_admin.c b/src/game/g_admin.c
index 3767c52a..99a9a08b 100644
--- a/src/game/g_admin.c
+++ b/src/game/g_admin.c
@@ -74,6 +74,11 @@ g_admin_cmd_t g_admin_cmds[ ] =
"display a list of all server admins and their levels",
"(^5name|start admin#^7)"
},
+
+ {"listlayouts", G_admin_listlayouts, "L",
+ "display a list of all available layouts for a map",
+ "(^5mapname^7)"
+ },
{"listplayers", G_admin_listplayers, "i",
"display a list of players, their client numbers and their levels",
@@ -84,6 +89,11 @@ g_admin_cmd_t g_admin_cmds[ ] =
"lock a team to prevent anyone from joining it",
"[^3a|h^7]"
},
+
+ {"map", G_admin_map, "M",
+ "load a map (and optionally force layout)",
+ "[^3mapname^7] (^5layout^7)"
+ },
{"mute", G_admin_mute, "m",
"mute a player",
@@ -121,8 +131,8 @@ g_admin_cmd_t g_admin_cmds[ ] =
},
{"restart", G_admin_restart, "r",
- "restart the current map",
- ""
+ "restart the current map (optionally using named layout)",
+ "(^5layout^7)"
},
{"setlevel", G_admin_setlevel, "s",
@@ -1875,6 +1885,33 @@ qboolean G_admin_putteam( gentity_t *ent, int skiparg )
return qtrue;
}
+qboolean G_admin_map( gentity_t *ent, int skiparg )
+{
+ char map[ MAX_QPATH ];
+ char layout[ MAX_QPATH ];
+
+ if( G_SayArgc() < 2 + skiparg )
+ {
+ ADMP( "^3!map: ^7usage: !map [map] (layout)\n" );
+ return qfalse;
+ }
+
+ G_SayArgv( skiparg + 1, map, sizeof( map ) );
+ G_SayArgv( skiparg + 2, layout, sizeof( layout ) );
+
+ if( !trap_FS_FOpenFile( va( "maps/%s.bsp", map ), NULL, FS_READ ) )
+ {
+ ADMP( va( "^3!map: ^7invalid map name '%s'\n", map ) );
+ return qfalse;
+ }
+ trap_Cvar_Set( "g_layouts", layout );
+ trap_SendConsoleCommand( EXEC_APPEND, va( "map %s", map ) );
+ AP( va( "print \"^3!map: ^7map '%s' started by %s %s\n\"", map,
+ ( ent ) ? ent->client->pers.netname : "console",
+ ( layout[ 0 ] ) ? va( "(forcing layout '%s')", layout ) : "" ) );
+ return qtrue;
+}
+
qboolean G_admin_mute( gentity_t *ent, int skiparg )
{
int pids[ MAX_CLIENTS ];
@@ -2011,6 +2048,50 @@ qboolean G_admin_listadmins( gentity_t *ent, int skiparg )
return qtrue;
}
+qboolean G_admin_listlayouts( gentity_t *ent, int skiparg )
+{
+ char list[ MAX_CVAR_VALUE_STRING ];
+ char map[ MAX_QPATH ];
+ int count = 0;
+ char *s;
+ char layout[ MAX_QPATH ] = { "" };
+ int i = 0;
+
+ if( G_SayArgc( ) == 2 + skiparg )
+ G_SayArgv( 1 +skiparg, map, sizeof( map ) );
+ else
+ trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) );
+
+ count = G_LayoutList( map, list, sizeof( list ) );
+ if( !count )
+ {
+ ADMP( va( "^3!listlayouts:^7 ^7no layouts found for map '%s'\n", map ) );
+ return qfalse;
+ }
+ ADMBP_begin( );
+ ADMBP( va( "^3!listlayouts:^7 %d layouts found for '%s':\n", count, map ) );
+ s = &list[ 0 ];
+ while( *s )
+ {
+ if( *s == ' ' )
+ {
+ ADMBP( va ( " %s\n", layout ) );
+ layout[ 0 ] = '\0';
+ i = 0;
+ }
+ else if( i < sizeof( layout ) - 2 )
+ {
+ layout[ i++ ] = *s;
+ layout[ i ] = '\0';
+ }
+ s++;
+ }
+ if( layout[ 0 ] )
+ ADMBP( va ( " %s\n", layout ) );
+ ADMBP_end( );
+ return qtrue;
+}
+
qboolean G_admin_listplayers( gentity_t *ent, int skiparg )
{
int i, j;
@@ -2539,12 +2620,14 @@ qboolean G_admin_rename( gentity_t *ent, int skiparg )
qboolean G_admin_restart( gentity_t *ent, int skiparg )
{
- char command[ MAX_ADMIN_CMD_LEN ];
+ char layout[ MAX_CVAR_VALUE_STRING ];
- G_SayArgv( skiparg, command, sizeof( command ) );
+ G_SayArgv( skiparg + 1, layout, sizeof( layout ) );
+ trap_Cvar_Set( "g_layouts", layout );
trap_SendConsoleCommand( EXEC_APPEND, "map_restart" );
- AP( va( "print \"^3!restart: ^7map restarted by %s\n\"",
- ( ent ) ? ent->client->pers.netname : "console" ) );
+ AP( va( "print \"^3!restart: ^7map restarted by %s %s\n\"",
+ ( ent ) ? ent->client->pers.netname : "console",
+ ( layout[ 0 ] ) ? va( "(forcing layout '%s')", layout ) : "" ) );
return qtrue;
}