summaryrefslogtreecommitdiff
path: root/mod/src/game/g_svcmds.c
diff options
context:
space:
mode:
authorTim Angus <tim@ngus.net>2005-12-10 03:23:37 +0000
committerTim Angus <tim@ngus.net>2005-12-10 03:23:37 +0000
commitbf23ecf17f432cf8e47302ef7464612c17be9bbe (patch)
tree6e3d28ecaa038199d6ba63830e81f05270b199c3 /mod/src/game/g_svcmds.c
parent22f322884cf7715c01500ef0b4579b87b1cb1973 (diff)
* Move the game source from mod/src/ to src/
Diffstat (limited to 'mod/src/game/g_svcmds.c')
-rw-r--r--mod/src/game/g_svcmds.c581
1 files changed, 0 insertions, 581 deletions
diff --git a/mod/src/game/g_svcmds.c b/mod/src/game/g_svcmds.c
deleted file mode 100644
index efe76991..00000000
--- a/mod/src/game/g_svcmds.c
+++ /dev/null
@@ -1,581 +0,0 @@
-// Copyright (C) 1999-2000 Id Software, Inc.
-//
-
-/*
- * Portions Copyright (C) 2000-2001 Tim Angus
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the OSML - Open Source Modification License v1.0 as
- * described in the file COPYING which is distributed with this source
- * code.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-// this file holds commands that can be executed by the server console, but not remote clients
-
-#include "g_local.h"
-
-
-/*
-==============================================================================
-
-PACKET FILTERING
-
-
-You can add or remove addresses from the filter list with:
-
-addip <ip>
-removeip <ip>
-
-The ip address is specified in dot format, and you can use '*' to match any value
-so you can specify an entire class C network with "addip 192.246.40.*"
-
-Removeip will only remove an address specified exactly the same way. You cannot addip a subnet, then removeip a single host.
-
-listip
-Prints the current list of filters.
-
-g_filterban <0 or 1>
-
-If 1 (the default), then ip addresses matching the current list will be prohibited from entering the game. This is the default setting.
-
-If 0, then only addresses matching the list will be allowed. This lets you easily set up a private game, or a game that only allows players from your local network.
-
-TTimo NOTE: for persistence, bans are stored in g_banIPs cvar MAX_CVAR_VALUE_STRING
-The size of the cvar string buffer is limiting the banning to around 20 masks
-this could be improved by putting some g_banIPs2 g_banIps3 etc. maybe
-still, you should rely on PB for banning instead
-
-==============================================================================
-*/
-
-// extern vmCvar_t g_banIPs;
-// extern vmCvar_t g_filterBan;
-
-
-typedef struct ipFilter_s
-{
- unsigned mask;
- unsigned compare;
-} ipFilter_t;
-
-#define MAX_IPFILTERS 1024
-
-static ipFilter_t ipFilters[ MAX_IPFILTERS ];
-static int numIPFilters;
-
-/*
-=================
-StringToFilter
-=================
-*/
-static qboolean StringToFilter( char *s, ipFilter_t *f )
-{
- char num[ 128 ];
- int i, j;
- byte b[ 4 ];
- byte m[ 4 ];
-
- for( i = 0; i < 4; i++ )
- {
- b[ i ] = 0;
- m[ i ] = 0;
- }
-
- for( i = 0; i < 4; i++ )
- {
- if( *s < '0' || *s > '9' )
- {
- if( *s == '*' ) // 'match any'
- {
- //b[ i ] and m[ i ] to 0
- s++;
- if ( !*s )
- break;
-
- s++;
- continue;
- }
-
- G_Printf( "Bad filter address: %s\n", s );
- return qfalse;
- }
-
- j = 0;
- while( *s >= '0' && *s <= '9' )
- num[ j++ ] = *s++;
-
- num[ j ] = 0;
- b[ i ] = atoi( num );
-
- m[ i ] = 255;
-
- if( !*s )
- break;
-
- s++;
- }
-
- f->mask = *(unsigned *)m;
- f->compare = *(unsigned *)b;
-
- return qtrue;
-}
-
-/*
-=================
-UpdateIPBans
-=================
-*/
-static void UpdateIPBans( void )
-{
- byte b[ 4 ];
- byte m[ 4 ];
- int i, j;
- char iplist_final[ MAX_CVAR_VALUE_STRING ];
- char ip[ 64 ];
-
- *iplist_final = 0;
-
- for( i = 0 ; i < numIPFilters ; i++ )
- {
- if( ipFilters[ i ].compare == 0xffffffff )
- continue;
-
- *(unsigned *)b = ipFilters[ i ].compare;
- *(unsigned *)m = ipFilters[ i ].mask;
- *ip = 0;
-
- for( j = 0 ; j < 4 ; j++ )
- {
- if( m[ j ] != 255 )
- Q_strcat( ip, sizeof( ip ), "*" );
- else
- Q_strcat( ip, sizeof( ip ), va( "%i", b[ j ] ) );
-
- Q_strcat( ip, sizeof( ip ), ( j < 3 ) ? "." : " " );
- }
-
- if( strlen( iplist_final ) + strlen( ip ) < MAX_CVAR_VALUE_STRING )
- Q_strcat( iplist_final, sizeof( iplist_final ), ip );
- else
- {
- Com_Printf( "g_banIPs overflowed at MAX_CVAR_VALUE_STRING\n" );
- break;
- }
- }
-
- trap_Cvar_Set( "g_banIPs", iplist_final );
-}
-
-/*
-=================
-G_FilterPacket
-=================
-*/
-qboolean G_FilterPacket( char *from )
-{
- int i;
- unsigned in;
- byte m[ 4 ];
- char *p;
-
- i = 0;
- p = from;
- while( *p && i < 4 )
- {
- m[ i ] = 0;
- while( *p >= '0' && *p <= '9' )
- {
- m[ i ] = m[ i ] * 10 + ( *p - '0' );
- p++;
- }
-
- if( !*p || *p == ':' )
- break;
-
- i++, p++;
- }
-
- in = *(unsigned *)m;
-
- for( i = 0; i < numIPFilters; i++ )
- if( ( in & ipFilters[ i ].mask ) == ipFilters[ i ].compare )
- return g_filterBan.integer != 0;
-
- return g_filterBan.integer == 0;
-}
-
-/*
-=================
-AddIP
-=================
-*/
-static void AddIP( char *str )
-{
- int i;
-
- for( i = 0 ; i < numIPFilters ; i++ )
- if( ipFilters[ i ].compare == 0xffffffff )
- break; // free spot
-
- if( i == numIPFilters )
- {
- if( numIPFilters == MAX_IPFILTERS )
- {
- G_Printf( "IP filter list is full\n" );
- return;
- }
-
- numIPFilters++;
- }
-
- if( !StringToFilter( str, &ipFilters[ i ] ) )
- ipFilters[ i ].compare = 0xffffffffu;
-
- UpdateIPBans( );
-}
-
-/*
-=================
-G_ProcessIPBans
-=================
-*/
-void G_ProcessIPBans( void )
-{
- char *s, *t;
- char str[ MAX_CVAR_VALUE_STRING ];
-
- Q_strncpyz( str, g_banIPs.string, sizeof( str ) );
-
- for( t = s = g_banIPs.string; *t; /* */ )
- {
- s = strchr( s, ' ' );
-
- if( !s )
- break;
-
- while( *s == ' ' )
- *s++ = 0;
-
- if( *t )
- AddIP( t );
-
- t = s;
- }
-}
-
-
-/*
-=================
-Svcmd_AddIP_f
-=================
-*/
-void Svcmd_AddIP_f( void )
-{
- char str[ MAX_TOKEN_CHARS ];
-
- if( trap_Argc( ) < 2 )
- {
- G_Printf( "Usage: addip <ip-mask>\n" );
- return;
- }
-
- trap_Argv( 1, str, sizeof( str ) );
-
- AddIP( str );
-}
-
-/*
-=================
-Svcmd_RemoveIP_f
-=================
-*/
-void Svcmd_RemoveIP_f( void )
-{
- ipFilter_t f;
- int i;
- char str[ MAX_TOKEN_CHARS ];
-
- if( trap_Argc( ) < 2 )
- {
- G_Printf( "Usage: sv removeip <ip-mask>\n" );
- return;
- }
-
- trap_Argv( 1, str, sizeof( str ) );
-
- if( !StringToFilter( str, &f ) )
- return;
-
- for( i = 0; i < numIPFilters; i++ )
- {
- if( ipFilters[ i ].mask == f.mask &&
- ipFilters[ i ].compare == f.compare)
- {
- ipFilters[ i ].compare = 0xffffffffu;
- G_Printf ( "Removed.\n" );
-
- UpdateIPBans( );
- return;
- }
- }
-
- G_Printf ( "Didn't find %s.\n", str );
-}
-
-/*
-===================
-Svcmd_EntityList_f
-===================
-*/
-void Svcmd_EntityList_f( void )
-{
- int e;
- gentity_t *check;
-
- check = g_entities + 1;
-
- for( e = 1; e < level.num_entities; e++, check++ )
- {
- if( !check->inuse )
- continue;
-
- G_Printf( "%3i:", e );
-
- switch( check->s.eType )
- {
- case ET_GENERAL:
- G_Printf( "ET_GENERAL " );
- break;
- case ET_PLAYER:
- G_Printf( "ET_PLAYER " );
- break;
- case ET_ITEM:
- G_Printf( "ET_ITEM " );
- break;
- case ET_BUILDABLE:
- G_Printf( "ET_BUILDABLE " );
- break;
- case ET_MISSILE:
- G_Printf( "ET_MISSILE " );
- break;
- case ET_MOVER:
- G_Printf( "ET_MOVER " );
- break;
- case ET_BEAM:
- G_Printf( "ET_BEAM " );
- break;
- case ET_PORTAL:
- G_Printf( "ET_PORTAL " );
- break;
- case ET_SPEAKER:
- G_Printf( "ET_SPEAKER " );
- break;
- case ET_PUSH_TRIGGER:
- G_Printf( "ET_PUSH_TRIGGER " );
- break;
- case ET_TELEPORT_TRIGGER:
- G_Printf( "ET_TELEPORT_TRIGGER " );
- break;
- case ET_INVISIBLE:
- G_Printf( "ET_INVISIBLE " );
- break;
- case ET_GRAPPLE:
- G_Printf( "ET_GRAPPLE " );
- break;
- default:
- G_Printf( "%3i ", check->s.eType );
- break;
- }
-
- if( check->classname )
- G_Printf( "%s", check->classname );
-
- G_Printf( "\n" );
- }
-}
-
-gclient_t *ClientForString( const char *s )
-{
- gclient_t *cl;
- int i;
- int idnum;
-
- // numeric values are just slot numbers
- if( s[ 0 ] >= '0' && s[ 0 ] <= '9' )
- {
- idnum = atoi( s );
-
- if( idnum < 0 || idnum >= level.maxclients )
- {
- Com_Printf( "Bad client slot: %i\n", idnum );
- return NULL;
- }
-
- cl = &level.clients[ idnum ];
-
- if( cl->pers.connected == CON_DISCONNECTED )
- {
- G_Printf( "Client %i is not connected\n", idnum );
- return NULL;
- }
-
- return cl;
- }
-
- // check for a name match
- for( i = 0; i < level.maxclients; i++ )
- {
- cl = &level.clients[ i ];
- if( cl->pers.connected == CON_DISCONNECTED )
- continue;
-
- if( !Q_stricmp( cl->pers.netname, s ) )
- return cl;
- }
-
- G_Printf( "User %s is not on the server\n", s );
-
- return NULL;
-}
-
-/*
-===================
-Svcmd_ForceTeam_f
-
-forceteam <player> <team>
-===================
-*/
-void Svcmd_ForceTeam_f( void )
-{
- gclient_t *cl;
- char str[ MAX_TOKEN_CHARS ];
-
- // find the player
- trap_Argv( 1, str, sizeof( str ) );
- cl = ClientForString( str );
-
- if( !cl )
- return;
-
- // set the team
- trap_Argv( 2, str, sizeof( str ) );
- /*SetTeam( &g_entities[cl - level.clients], str );*/
- //FIXME: tremulise this
-}
-
-char *ConcatArgs( int start );
-
-/*
-=================
-ConsoleCommand
-
-=================
-*/
-qboolean ConsoleCommand( void )
-{
- char cmd[ MAX_TOKEN_CHARS ];
-
- trap_Argv( 0, cmd, sizeof( cmd ) );
-
- if( Q_stricmp( cmd, "entitylist" ) == 0 )
- {
- Svcmd_EntityList_f( );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "forceteam" ) == 0 )
- {
- Svcmd_ForceTeam_f( );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "game_memory" ) == 0 )
- {
- Svcmd_GameMem_f( );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "addip" ) == 0 )
- {
- Svcmd_AddIP_f( );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "removeip" ) == 0 )
- {
- Svcmd_RemoveIP_f( );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "listip" ) == 0 )
- {
- trap_SendConsoleCommand( EXEC_NOW, "g_banIPs\n" );
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "mapRotation" ) == 0 )
- {
- char *rotationName = ConcatArgs( 1 );
-
- if( !G_StartMapRotation( rotationName, qfalse ) )
- G_Printf( "Can't find map rotation %s\n", rotationName );
-
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "stopMapRotation" ) == 0 )
- {
- G_StopMapRotation( );
-
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "alienWin" ) == 0 )
- {
- int i;
- gentity_t *e;
-
- for( i = 1, e = g_entities + i; i < level.num_entities; i++, e++ )
- {
- if( e->s.modelindex == BA_H_SPAWN )
- G_Damage( e, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE );
- }
-
- return qtrue;
- }
-
- if( Q_stricmp( cmd, "humanWin" ) == 0 )
- {
- int i;
- gentity_t *e;
-
- for( i = 1, e = g_entities + i; i < level.num_entities; i++, e++ )
- {
- if( e->s.modelindex == BA_A_SPAWN )
- G_Damage( e, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE );
- }
-
- return qtrue;
- }
-
- if( g_dedicated.integer )
- {
- if( Q_stricmp( cmd, "say" ) == 0 )
- {
- G_SendCommandFromServer( -1, va( "print \"server: %s\n\"", ConcatArgs( 1 ) ) );
- return qtrue;
- }
-
- // everything else will also be printed as a say command
- G_SendCommandFromServer( -1, va( "print \"server: %s\n\"", ConcatArgs( 0 ) ) );
- return qtrue;
- }
-
- return qfalse;
-}
-