|
|
|
@ -76,15 +76,16 @@ typedef struct entblacklist_s
@@ -76,15 +76,16 @@ typedef struct entblacklist_s
|
|
|
|
|
char pattern[32]; |
|
|
|
|
int limit; |
|
|
|
|
int behaviour; |
|
|
|
|
bool clear; |
|
|
|
|
} entblacklist_t; |
|
|
|
|
|
|
|
|
|
entblacklist_t *entblacklist; |
|
|
|
|
|
|
|
|
|
void Ent_AddToBlacklist_f( void ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() != 4 ) |
|
|
|
|
if( CMD_ARGC() < 4 ) |
|
|
|
|
{ |
|
|
|
|
ALERT( at_console, "Usage: mp_enttools_blacklist <pattern> <per minute limit> <behaviour (0 - block, 1 - kick, 2 - ban)>\n" ); |
|
|
|
|
ALERT( at_console, "Usage: mp_enttools_blacklist <pattern> <per minute limit> <behaviour (0 - block, 1 - kick, 2 - ban)> <clear>\n" ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
entblacklist_t *node = (entblacklist_t *)malloc( sizeof( entblacklist_t ) ); |
|
|
|
@ -94,6 +95,7 @@ void Ent_AddToBlacklist_f( void )
@@ -94,6 +95,7 @@ void Ent_AddToBlacklist_f( void )
|
|
|
|
|
node->pattern[32] = 0; |
|
|
|
|
node->limit = atoi( CMD_ARGV(2) ); |
|
|
|
|
node->behaviour = atoi( CMD_ARGV( 3 ) ); |
|
|
|
|
node->clear = !!atoi( CMD_ARGV( 4 ) ); |
|
|
|
|
entblacklist = node; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -149,7 +151,8 @@ bool Ent_CheckCreate( edict_t *player, const char *classname )
@@ -149,7 +151,8 @@ bool Ent_CheckCreate( edict_t *player, const char *classname )
|
|
|
|
|
if( !node->limit || ( p->gravgunmod_data.m_flEntScope + 1.0f / (float)node->limit > 1 ) ) |
|
|
|
|
{ |
|
|
|
|
// remove all created entities
|
|
|
|
|
Ent_RunGC( false, true, GGM_GetPlayerID( player ) ); |
|
|
|
|
if( node->clear ) |
|
|
|
|
Ent_RunGC( false, true, GGM_GetPlayerID( player ) ); |
|
|
|
|
|
|
|
|
|
if( node->behaviour == 2 ) |
|
|
|
|
{ |
|
|
|
@ -518,7 +521,7 @@ void Ent_Fire_f( edict_t *player )
@@ -518,7 +521,7 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
ent = g_engfuncs.pfnPEntityOfEntIndex( i ); |
|
|
|
|
if( !Ent_IsValidEdict( ent )) |
|
|
|
|
{ |
|
|
|
|
// Ent_ClientPrintf( player, "Got invalid entity\n" );
|
|
|
|
|
Ent_ClientPrintf( player, "Got invalid entity\n" ); |
|
|
|
|
if( single ) |
|
|
|
|
break; |
|
|
|
|
continue; |
|
|
|
@ -530,35 +533,101 @@ void Ent_Fire_f( edict_t *player )
@@ -530,35 +533,101 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
if( !Q_stricmpext( CMD_ARGV( 1 ), STRING( ent->v.targetname ) ) && !Q_stricmpext( CMD_ARGV( 1 ), STRING( ent->v.classname ) )) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
const char *cmd = CMD_ARGV( 2 ); |
|
|
|
|
|
|
|
|
|
if( !stricmp( cmd, "help" ) ) |
|
|
|
|
{ |
|
|
|
|
Ent_ClientPrintf( player, "Availiavle commands:\n" |
|
|
|
|
"Set fields:\n" |
|
|
|
|
" (Only set entity field, does not call any functions)\n" |
|
|
|
|
" health\n" |
|
|
|
|
" gravity\n" |
|
|
|
|
" movetype\n" |
|
|
|
|
" solid\n" |
|
|
|
|
" rendermode\n" |
|
|
|
|
" rendercolor (vector)\n" |
|
|
|
|
" renderfx\n" |
|
|
|
|
" renderamt\n" |
|
|
|
|
" hullmin (vector)\n" |
|
|
|
|
" hullmax (vector)\n" ); |
|
|
|
|
Ent_ClientPrintf( player, |
|
|
|
|
"Actions\n" |
|
|
|
|
" rename: set entity targetname\n" |
|
|
|
|
" settarget: set entity target (only targetnames)\n" |
|
|
|
|
" setmodel: set entity model\n" |
|
|
|
|
" set: set <key> <value> by server library\n" |
|
|
|
|
" See game FGD to get list.\n" |
|
|
|
|
" command takes two arguments\n"); |
|
|
|
|
Ent_ClientPrintf( player, |
|
|
|
|
" touch: touch entity by current player.\n" |
|
|
|
|
" use: use entity by current player.\n" |
|
|
|
|
" movehere: place entity in player fov.\n" |
|
|
|
|
" drop2floor: place entity to nearest floor surface\n" |
|
|
|
|
" moveup: move entity to 25 units up\n"); |
|
|
|
|
Ent_ClientPrintf( player, |
|
|
|
|
"Flags:\n" |
|
|
|
|
" (Set/clear specified flag bit, arg is bit number)\n" |
|
|
|
|
" setflag\n" |
|
|
|
|
" clearflag\n" |
|
|
|
|
" setspawnflag\n" |
|
|
|
|
" clearspawnflag\n" |
|
|
|
|
); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( !Ent_CheckFire( player, ent, CMD_ARGV( 2 ) ) ) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
Ent_ClientPrintf( player, "entity %i\n", i ); |
|
|
|
|
|
|
|
|
|
if( single && count > 0 ) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
count++; |
|
|
|
|
|
|
|
|
|
if( !stricmp( CMD_ARGV( 2 ), "health" ) ) |
|
|
|
|
if( !stricmp( cmd, "health" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.health = atoi( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "gravity" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "gravity" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.gravity = atof( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "movetype" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "movetype" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.movetype = atoi( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "solid" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "solid" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.solid = atoi( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "rename" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "rename" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.targetname = ALLOC_STRING( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "settarget" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "settarget" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.target = ALLOC_STRING( CMD_ARGV ( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "setmodel" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "setmodel" ) ) |
|
|
|
|
{ |
|
|
|
|
SET_MODEL( ent, CMD_ARGV( 3 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "set" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "set" ) ) |
|
|
|
|
{ |
|
|
|
|
char keyname[256]; |
|
|
|
|
char value[256]; |
|
|
|
|
KeyValueData pkvd; |
|
|
|
|
if( CMD_ARGC() != 5 ) |
|
|
|
|
return; |
|
|
|
|
continue; |
|
|
|
|
pkvd.szClassName = (char*)STRING( ent->v.classname ); |
|
|
|
|
strncpy( keyname, CMD_ARGV( 3 ), 256 ); |
|
|
|
|
strncpy( value, CMD_ARGV( 4 ), 256 ); |
|
|
|
@ -569,8 +638,9 @@ void Ent_Fire_f( edict_t *player )
@@ -569,8 +638,9 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
DispatchKeyValue( ent, &pkvd ); |
|
|
|
|
if( pkvd.fHandled ) |
|
|
|
|
Ent_ClientPrintf( player, "value set successfully!\n" ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "touch" ) ) |
|
|
|
|
if( !stricmp( cmd, "touch" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() == 4 ) |
|
|
|
|
{ |
|
|
|
@ -580,8 +650,9 @@ void Ent_Fire_f( edict_t *player )
@@ -580,8 +650,9 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
DispatchTouch( ent, player ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "use" ) ) |
|
|
|
|
if( !stricmp( cmd, "use" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() == 4 ) |
|
|
|
|
{ |
|
|
|
@ -591,12 +662,19 @@ void Ent_Fire_f( edict_t *player )
@@ -591,12 +662,19 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
DispatchUse( ent, player ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "movehere" ) ) |
|
|
|
|
if( !stricmp( cmd, "movehere" ) ) |
|
|
|
|
{ |
|
|
|
|
UTIL_SetOrigin( &ent->v, player->v.origin + Vector( 100 * cos( player->v.angles[1]/180*M_PI ), 100 * sin( player->v.angles[1]/180*M_PI), 25 ) ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "drop2floor" ) ) |
|
|
|
|
DROP_TO_FLOOR( ent ); |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "moveup" ) ) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "drop2floor" ) ) |
|
|
|
|
{ |
|
|
|
|
DROP_TO_FLOOR( ent ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if( !stricmp( cmd, "moveup" ) ) |
|
|
|
|
{ |
|
|
|
|
float dist = 25; |
|
|
|
|
|
|
|
|
@ -607,29 +685,32 @@ void Ent_Fire_f( edict_t *player )
@@ -607,29 +685,32 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
|
|
|
|
|
if( CMD_ARGC() >= 5 ) |
|
|
|
|
ent->v.origin = ent->v.origin + Vector( cos( player->v.angles[1]/180*M_PI ), sin( player->v.angles[1]/180*M_PI), 0 ) * atof( CMD_ARGV( 4 ) ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "becomeowner" ) ) |
|
|
|
|
if( !stricmp( cmd, "becomeowner" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() == 4 ) |
|
|
|
|
ent->v.owner = Ent_FindSingle( player, CMD_ARGV( 3 ) ); |
|
|
|
|
else |
|
|
|
|
ent->v.owner = player; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "becomeenemy" ) ) |
|
|
|
|
if( !stricmp( cmd, "becomeenemy" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() == 4 ) |
|
|
|
|
ent->v.enemy = Ent_FindSingle( player, CMD_ARGV( 3 ) ); |
|
|
|
|
else |
|
|
|
|
ent->v.enemy = player; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "becomeaiment" ) ) |
|
|
|
|
else if( !stricmp( cmd, "becomeaiment" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() == 4 ) |
|
|
|
|
ent->v.aiment= Ent_FindSingle( player, CMD_ARGV( 3 ) ); |
|
|
|
|
else |
|
|
|
|
ent->v.aiment = player; |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "hullmin" ) ) |
|
|
|
|
else if( !stricmp( cmd, "hullmin" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() != 6 ) |
|
|
|
|
return; |
|
|
|
@ -637,7 +718,7 @@ void Ent_Fire_f( edict_t *player )
@@ -637,7 +718,7 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
ent->v.mins[1] = atof( CMD_ARGV( 4 ) ); |
|
|
|
|
ent->v.mins[2] = atof( CMD_ARGV( 5 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "hullmax" ) ) |
|
|
|
|
else if( !stricmp( cmd, "hullmax" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() != 6 ) |
|
|
|
|
return; |
|
|
|
@ -645,7 +726,7 @@ void Ent_Fire_f( edict_t *player )
@@ -645,7 +726,7 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
ent->v.maxs[1] = atof( CMD_ARGV( 4 ) ); |
|
|
|
|
ent->v.maxs[2] = atof( CMD_ARGV( 5 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "rendercolor" ) ) |
|
|
|
|
else if( !stricmp( cmd, "rendercolor" ) ) |
|
|
|
|
{ |
|
|
|
|
if( CMD_ARGC() != 6 ) |
|
|
|
|
return; |
|
|
|
@ -653,90 +734,54 @@ void Ent_Fire_f( edict_t *player )
@@ -653,90 +734,54 @@ void Ent_Fire_f( edict_t *player )
|
|
|
|
|
ent->v.rendercolor[1] = atof( CMD_ARGV( 4 ) ); |
|
|
|
|
ent->v.rendercolor[2] = atof( CMD_ARGV( 5 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "renderamt" ) ) |
|
|
|
|
else if( !stricmp( cmd, "renderamt" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.renderamt = atof( CMD_ARGV( 3 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "renderfx" ) ) |
|
|
|
|
else if( !stricmp( cmd, "renderfx" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.renderfx = atoi( CMD_ARGV( 3 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "rendermode" ) ) |
|
|
|
|
else if( !stricmp( cmd, "rendermode" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.rendermode = atoi( CMD_ARGV( 3 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "angles" ) ) |
|
|
|
|
else if( !stricmp( cmd, "angles" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.angles[0] = atof( CMD_ARGV( 3 ) ); |
|
|
|
|
ent->v.angles[1] = atof( CMD_ARGV( 4 ) ); |
|
|
|
|
ent->v.angles[2] = atof( CMD_ARGV( 5 ) ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "setflag" ) ) |
|
|
|
|
else if( !stricmp( cmd, "setflag" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.flags |= 1U << atoi( CMD_ARGV ( 3 ) ); |
|
|
|
|
Ent_ClientPrintf( player, "flags set to 0x%x\n", ent->v.flags ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "clearflag" ) ) |
|
|
|
|
else if( !stricmp( cmd, "clearflag" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.flags &= ~( 1U << atoi( CMD_ARGV ( 3 ) ) ); |
|
|
|
|
Ent_ClientPrintf( player, "flags set to 0x%x\n", ent->v.flags ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "setspawnflag" ) ) |
|
|
|
|
else if( !stricmp( cmd, "setspawnflag" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.spawnflags |= 1U << atoi( CMD_ARGV ( 3 ) ); |
|
|
|
|
Ent_ClientPrintf( player, "spawnflags set to 0x%x\n", ent->v.spawnflags ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "clearspawnflag" ) ) |
|
|
|
|
else if( !stricmp( cmd, "clearspawnflag" ) ) |
|
|
|
|
{ |
|
|
|
|
ent->v.spawnflags &= ~( 1U << atoi( CMD_ARGV ( 3 ) ) ); |
|
|
|
|
Ent_ClientPrintf( player, "spawnflags set to 0x%x\n", ent->v.flags ); |
|
|
|
|
} |
|
|
|
|
else if( !stricmp( CMD_ARGV( 2 ), "help" ) ) |
|
|
|
|
{ |
|
|
|
|
Ent_ClientPrintf( player, "Availiavle commands:\n" |
|
|
|
|
"Set fields:\n" |
|
|
|
|
" (Only set entity field, does not call any functions)\n" |
|
|
|
|
" health\n" |
|
|
|
|
" gravity\n" |
|
|
|
|
" movetype\n" |
|
|
|
|
" solid\n" |
|
|
|
|
" rendermode\n" |
|
|
|
|
" rendercolor (vector)\n" |
|
|
|
|
" renderfx\n" |
|
|
|
|
" renderamt\n" |
|
|
|
|
" hullmin (vector)\n" |
|
|
|
|
" hullmax (vector)\n" |
|
|
|
|
"Actions\n" |
|
|
|
|
" rename: set entity targetname\n" |
|
|
|
|
" settarget: set entity target (only targetnames)\n" |
|
|
|
|
" setmodel: set entity model\n" |
|
|
|
|
" set: set <key> <value> by server library\n" |
|
|
|
|
" See game FGD to get list.\n" |
|
|
|
|
" command takes two arguments\n" |
|
|
|
|
" touch: touch entity by current player.\n" |
|
|
|
|
" use: use entity by current player.\n" |
|
|
|
|
" movehere: place entity in player fov.\n" |
|
|
|
|
" drop2floor: place entity to nearest floor surface\n" |
|
|
|
|
" moveup: move entity to 25 units up\n" |
|
|
|
|
"Flags:\n" |
|
|
|
|
" (Set/clear specified flag bit, arg is bit number)\n" |
|
|
|
|
" setflag\n" |
|
|
|
|
" clearflag\n" |
|
|
|
|
" setspawnflag\n" |
|
|
|
|
" clearspawnflag\n" |
|
|
|
|
); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
Ent_ClientPrintf( player, "Unknown command %s!\nUse \"ent_fire 0 help\" to list commands.\n", CMD_ARGV( 2 ) ); |
|
|
|
|
Ent_ClientPrintf( player, "Unknown command %s!\nUse \"ent_fire 0 help\" to list commands.\n", cmd ); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if( single ) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
=============== |
|
|
|
|
Ent_Create_f |
|
|
|
@ -855,8 +900,10 @@ void Ent_Create_f( edict_t *player )
@@ -855,8 +900,10 @@ void Ent_Create_f( edict_t *player )
|
|
|
|
|
CBaseEntity *entity = CBaseEntity::Instance( ent ); |
|
|
|
|
if( entity ) |
|
|
|
|
{ |
|
|
|
|
const char *plid = GGM_GetPlayerID( player ); |
|
|
|
|
entity->enttools_data.enttools = true; |
|
|
|
|
strcpy( entity->enttools_data.ownerid, GGM_GetPlayerID( player ) ); |
|
|
|
|
if( plid ); |
|
|
|
|
strcpy( entity->enttools_data.ownerid, plid ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
typedef struct ucmd_s |
|
|
|
@ -879,17 +926,21 @@ bool Ent_ProcessClientCommand( edict_t *player )
@@ -879,17 +926,21 @@ bool Ent_ProcessClientCommand( edict_t *player )
|
|
|
|
|
{ |
|
|
|
|
ucmd_t *u; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( !mp_enttools_enable.value ) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
CBaseEntity *pl = CBaseEntity::Instance( player ); |
|
|
|
|
|
|
|
|
|
if( !pl || !pl->IsPlayer() ) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
for( u = enttoolscmds; u->name; u++ ) |
|
|
|
|
{ |
|
|
|
|
if( !strcmp( CMD_ARGV( 0 ), u->name )) |
|
|
|
|
{ |
|
|
|
|
ALERT( at_console, "enttools->%s(): %s\n", u->name, CMD_ARGS() ); |
|
|
|
|
|
|
|
|
|
ALERT( at_logged, "\"%s<%i><%s><>\" performed: %s\n", STRING(player->v.netname), |
|
|
|
|
ALERT( at_logged, "\"%s<%i><%s><%s>\" performed: %s\n", STRING(player->v.netname), |
|
|
|
|
GETPLAYERUSERID(player), GETPLAYERAUTHID(player), g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( player ), "ip" ), CMD_ARGS() ); |
|
|
|
|
|
|
|
|
|
if( u->func ) u->func( player ); |
|
|
|
|