#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < engine >
#include < nvault >
#include < CC_ColorChat >
#pragma semicolon 1
#define PLUGIN "Special Admin Gag"
#define VERSION "1.1x"
#define COMMAND_ACCESS ADMIN_KICK
#define MAX_PLAYERS 33
enum
{
INFO_NAME,
INFO_IP,
INFO_AUTHID
};
new const bars[ ] = "/";
new command[ ][ ] =
{
"/gag",
"/ungag"
};
new Caccess[ ] =
{
COMMAND_ACCESS,
COMMAND_ACCESS
};
new const gGagTag[ ] = "Gag# ";
new const gGagFileName[ ] = "gag_words.ini";
new const gLogFileName[ ] = "GagLog.log";
new const gGagThinkerClassname[ ] = "GagThinker_";
new const gGagVaultName[ ] = "GaggedPlayers";
new const gGaggedSound[ ] = "misc/gag_dat.wav";
new const gUnGaggedSound[ ] = "misc/gag_scos.wav";
new const gHalfLifeGaggedSounds[ ][ ] =
{
"barney/youtalkmuch.wav",
"scientist/stopasking.wav",
"scientist/shutup.wav",
"scientist/shutup2.wav",
"hgrunt/silence!.wav"
};
new PlayerGagged[ MAX_PLAYERS ];
new PlayerGagTime[ MAX_PLAYERS ];
new JoinTime[ MAX_PLAYERS ];
new szName[ 33 ], g_reason[ 32 ], g_admin[ 32 ];
new g_Words[ 562 ][ 32 ], g_Count;
new szOldName[ MAX_PLAYERS ][ 40 ];
new gCvarSwearGagTime;
new gCvarGagMinuteLimit;
new gCvarGagMinuteInSeconds;
new gCvarAdminGag;
new gCvarTagName;
new gCvarWords;
new gCvarTag;
new gMaxPlayers;
new gVault;
public plugin_init( )
{
register_plugin( PLUGIN, PLUGIN, "Cristi .C & eVoLuTiOn" );
register_concmd( "amx_gag", "CommandGag", -1, "< nume > < minute > < motiv >" );
register_concmd( "amx_ungag", "CommandUngag", -1, "< nume > < motiv >" );
register_clcmd( "say", "CheckGag" );
register_clcmd( "say_team", "CheckGag" );
register_clcmd( "say_team @", "CheckGag" );
register_clcmd( "say", "command_chat" );
register_clcmd( "say_team", "command_chat" );
GagThinker( );
register_think( gGagThinkerClassname, "Forward_GagThinker" );
gCvarSwearGagTime = register_cvar( "amx_autogag_time", "7" );
gCvarGagMinuteLimit = register_cvar( "amx_gag_minute_limit", "30" );
gCvarGagMinuteInSeconds = register_cvar( "amx_gag_minute_in_seconds", "60" );
gCvarTagName = register_cvar( "amx_gag_tagname", "0" );
gCvarAdminGag = register_cvar( "amx_admingag", "1" );
gCvarWords = register_cvar( "amx_maxwords", "200" );
gCvarTag = register_cvar( "amx_gagtag", "| AMXX |" );
gMaxPlayers = get_maxplayers( );
}
public plugin_precache( )
{
for( new i = 0; i < sizeof( gHalfLifeGaggedSounds ); i++ )
{
precache_sound( gHalfLifeGaggedSounds[ i ] );
}
precache_sound( gGaggedSound );
precache_sound( gUnGaggedSound );
}
public plugin_cfg( )
{
static szConfigDir[ 64 ], iFile[ 64 ];
get_localinfo( "amxx_configsdir", szConfigDir, 63 );
formatex( iFile, charsmax( iFile ), "%s/%s", szConfigDir, gGagFileName );
if( !file_exists( iFile ) )
{
write_file( iFile, "# Pune aici cuvintele jignitoare sau reclamele", -1 );
log_to_file( gLogFileName, "Fisierul < %s > nu exista ! Creez unul nou acum...", iFile );
}
new szBuffer[ 128 ];
new szFile = fopen( iFile, "rt" );
while( !feof( szFile ) )
{
fgets( szFile, szBuffer, charsmax( szBuffer ) );
if( szBuffer[ 0 ] == '#' )
{
continue;
}
parse( szBuffer, g_Words[ g_Count ], sizeof g_Words[ ] - 1 );
g_Count++;
if( g_Count >= get_pcvar_num( gCvarWords ) )
{
break;
}
}
fclose( szFile );
}
public client_putinserver( id )
{
if( is_user_connected( id ) )
{
JoinTime[ id ] = get_systime( );
}
}
public client_disconnect( id )
{
if( PlayerGagged[ id ] == 1 )
{
ColorChat( 0, NORMAL, "^4%s^1 Jucatorul cu gag^3 %s ^1(^4 %s^1 |^3 %s^1 ), s-a deconectat !", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( id, INFO_IP ), GetInfo( id, INFO_AUTHID ) );
log_to_file( gLogFileName, "[EXIT] Jucatorul cu gag <%s><%s><%s>, s-a deconectat !", GetInfo( id, INFO_NAME ), GetInfo( id, INFO_IP ), GetInfo( id, INFO_AUTHID ) );
}
JoinTime[ id ] = 0;
SaveGag( id );
}
public client_connect( id )
{
LoadGag( id );
}
public command_chat( index )
{
static szArg[ 192 ], command2[ 192 ];
read_args( szArg, charsmax( szArg ) );
if( !szArg[ 0 ] )
return PLUGIN_CONTINUE;
remove_quotes( szArg[ 0 ] );
for( new x; x < sizeof( command ); x++ )
{
if( equal( szArg, command[ x ], strlen( command[ x ] ) ) )
{
if( get_user_flags( index ) & Caccess[ x ] )
{
replace( szArg, charsmax( szArg ), bars, "" );
formatex( command2, charsmax( command2 ), "amx_%s", szArg );
client_cmd( index, command2 );
}
break;
}
}
return PLUGIN_CONTINUE;
}
public CheckGag( id )
{
new szSaid[ 300 ];
read_args( szSaid, charsmax( szSaid ) );
remove_quotes( szSaid );
if( !UTIL_IsValidMessage( szSaid ) )
{
return PLUGIN_HANDLED;
}
if( PlayerGagged[ id ] == 1 )
{
PlayerGagged[ id ] = 1;
//ColorChat( id, NORMAL, "^4%s^1 Ai primit Gag pentru limbaj vulgar, asteapta^3 %d^1 minut(e) !", get_tag( ), PlayerGagTime[ id ] );
//ColorChat( id, NORMAL, "^4%s^1 Ai primit gag de la adminul: ^3%s^x01. Au mai ramas << ^4%d ^1>> minut(e) !", get_tag( ), g_admin, PlayerGagTime[ id ], PlayerGagTime[ id ] == 1 ? "" : "s" );
ColorChat( id, NORMAL, "^4%s^1 Ai primit gag de la adminul: ^3%s^x01. Au mai ramas << ^4%d ^1>> minut(e) !", get_tag( ), g_admin, PlayerGagTime[ id ] );
ColorChat( id, NORMAL, "^4%s^1 Motivul Gagului: ^3%s", get_tag( ), g_reason );
client_cmd( id, "speak ^"%s^"", gHalfLifeGaggedSounds[ random_num( 0, charsmax( gHalfLifeGaggedSounds ) ) ] );
return PLUGIN_HANDLED;
}
else
{
for( new i = 0; i < get_pcvar_num( gCvarWords ); i++ )
{
if( containi( szSaid, g_Words[ i ] ) != -1 )
{
if( get_pcvar_num( gCvarAdminGag ) == 0 )
{
if( is_user_admin( id ) )
{
return 1;
}
}
get_user_name( id, szName, sizeof( szName ) -1 );
if( get_pcvar_num( gCvarTagName ) == 1 )
{
client_cmd( id, "name ^"%s %s^"", gGagTag, szName );
}
szOldName[ id ] = szName;
PlayerGagged[ id ] = 1;
PlayerGagTime[ id ] = get_pcvar_num ( gCvarSwearGagTime );
set_speak( id, SPEAK_MUTED );
ColorChat( 0, NORMAL, "^4%s^3 %s^1 (^4 %s^1 )^1 a primit^3 AutoGag^1 pentru^4 limbaj^1 sau^3 reclama^1 !", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( id, INFO_IP ) );
//ColorChat( id, NORMAL, "^4%s^1 Ai primit AutoGag pentru injuratura sau reclama ! Timpul expira in(tr-un):^3 %d^1 minut(e) !", get_tag( ), PlayerGagTime[ id ] );
//ColorChat( id, NORMAL, "^4%s^1 Nu mai poti folosi urmatoarele comenzi:^3 say^1,^4 say_team^1,^3 voice speak^1,^4 say_team@", get_tag( ) );
ColorChat( id, NORMAL, "^4%s^1 Ai primit auto - gag pentru limbaj ^3vulgar^1, sau ^4reclama^1.", get_tag( ) );
ColorChat( id, NORMAL, "^4%s^1 Au mai ramas <^3 %d^1 > minut(e)", get_tag( ), PlayerGagTime[ id ] );
//ColorChat( id, NORMAL, "^4%s^1 Au mai ramas <^3 %d^1 > minut(e)", get_tag( ), PlayerGagTime[ id ][ id ], PlayerGagTime[ id ] == 1 ? "" : "s" );
log_to_file( gLogFileName, "[AUTOGAG] <%s><%s><%s> a luat AutoGag pentru ca a injurat sau a facut reclama !", GetInfo( id, INFO_NAME ), GetInfo( id, INFO_IP ), GetInfo( id, INFO_AUTHID ) );
client_cmd( id, "speak ^"%s^"", gGaggedSound );
return PLUGIN_HANDLED;
}
}
}
return PLUGIN_CONTINUE;
}
public CommandGag( id/*, level, cid*/ )
{
if( !HasUserAccess( id ) ) // !cmd_access( id, level, cid, 4 )
{
client_cmd( id, "echo %s Nu ai acces la aceasta comanda !", get_tag( ) );
return 1;
}
new szArg[ 32 ], szMinutes[ 32 ];
read_argv( 1, szArg, charsmax( szArg ) );
new reason[ 32 ];
read_argv( 3, reason, sizeof reason - 1 );
copy( g_reason, 31, reason );
copy( g_admin, 31, GetInfo( id, INFO_NAME ) );
remove_quotes( reason );
new iPlayer = cmd_target( id, szArg, ( CMDTARGET_NO_BOTS ) );
if( !iPlayer )
{
client_cmd( id, "echo %s Jucatorul specificat nu a fost gasit !", get_tag( ) );
return 1;
}
if( get_pcvar_num( gCvarAdminGag ) == 0 )
{
if( is_user_admin( iPlayer ) )
{
client_cmd( id, "echo %s Nu poti da gag la Admini !", get_tag( ) );
return 1;
}
}
read_argv( 2, szMinutes, charsmax( szMinutes ) );
new iMinutes = str_to_num( szMinutes );
if( iMinutes > get_pcvar_num( gCvarGagMinuteLimit ) )
{
console_print( id, "%s Ai setat %d minute, iar limita maxima de minute este %d ! Setare automata pe %d.", get_tag( ), iMinutes, get_pcvar_float ( gCvarGagMinuteLimit ), get_pcvar_float ( gCvarGagMinuteLimit ) );
iMinutes = get_pcvar_num( gCvarGagMinuteLimit ) ;
}
get_user_name( iPlayer, szName, sizeof( szName ) -1 );
szOldName[ iPlayer ] = szName;
if( PlayerGagged[ iPlayer ] == 1 )
{
client_cmd( id, "echo %s Jucatorul %s are deja Gag !", get_tag( ), GetInfo( iPlayer, INFO_NAME ) );
return 1;
}
if( get_pcvar_num( gCvarTagName ) == 1 )
{
client_cmd( iPlayer, "name ^"%s %s^"", gGagTag, szName );
}
PlayerGagged[ iPlayer ] = 1;
PlayerGagTime[ iPlayer ] = iMinutes;
set_speak( iPlayer, SPEAK_MUTED );
/*
ColorChat( 0, NORMAL, "^4%s^1 ADMIN^3 %s:^1 ii sparge tastatura lu'^4 %s^1 (^3 %s^1 ) pentru^4 %d^1 minut(e). Motiv: (^3 %s ^1)", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), GetInfo( iPlayer, INFO_IP ), iMinutes, reason );
ColorChat( iPlayer, NORMAL, "^4%s^1 Ai primit gag de la adminul^3 %s^1 pe motivul:^4 %s", get_tag( ), GetInfo( id, INFO_NAME ), reason );
ColorChat( iPlayer, NORMAL, "^4%s^1 Nu mai poti folosi urmatoarele comenzi:^3 say^1,^4 say_team^1,^3 voice speak^1,^4 say_team@", get_tag( ) );
*/
ColorChat( 0, NORMAL, "^4%s^1 ^3%s^1: ii sparge tastatura lu'^4 %s^1 pentru^1 [ ^3%d ^1] minut(e). Motiv: ^1( ^4%s ^1)", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), iMinutes, reason );
log_to_file( gLogFileName, "[GAG] %s i-a dat gag lui < %s >< %s >< %s > pentru < %d > minut(e)", GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), GetInfo( iPlayer, INFO_IP ), GetInfo( iPlayer, INFO_AUTHID ), iMinutes );
client_cmd( iPlayer, "speak ^"%s^"", gGaggedSound );
return PLUGIN_HANDLED;
}
public CommandUngag( id/*, level, cid*/ )
{
if( !HasUserAccess( id ) ) // !cmd_access( id, level, cid, 4 )
{
client_cmd( id, "echo %s Nu ai acces la aceasta comanda !", get_tag( ) );
return 1;
}
new szArg[ 32 ];
read_argv( 1, szArg, charsmax( szArg ) );
new reason[ 32 ];
read_argv( 2, reason, sizeof reason - 1 );
remove_quotes( reason );
new iPlayer = cmd_target( id, szArg, ( CMDTARGET_NO_BOTS ) );
if( !iPlayer )
{
client_cmd( id, "echo %s Jucatorul specificat nu a fost gasit !", get_tag( ) );
return 1;
}
if( PlayerGagged[ iPlayer ] == 0 )
{
console_print( id, "%s Jucatorul %s nu are Gag !", get_tag( ), GetInfo( iPlayer, INFO_NAME ) );
return 1;
}
if( get_pcvar_num( gCvarTagName ) == 1 )
{
client_cmd( iPlayer, "name ^"%s^"", szOldName[ iPlayer ] );
}
PlayerGagged[ iPlayer ] = 0;
PlayerGagTime[ iPlayer ] = 0;
set_speak( iPlayer, SPEAK_NORMAL );
/*
ColorChat( 0, NORMAL, "^4%s^1 ADMIN^3 %s:^1 ii reface tastatura lu'^4 %s ^1(^3 %s^1 |^4 %s^1 ). Motiv [^3 %s ^1]", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), GetInfo( iPlayer, INFO_IP ), GetInfo( iPlayer, INFO_AUTHID ), reason );
ColorChat( iPlayer, NORMAL, "^4%s^1 Ai primit ungag de la adminul:^3 %s^1 pe motivul:^4 %s^1, ai grija la limbaj data viitoare !", get_tag( ), GetInfo( id, INFO_NAME ), reason );
*/
ColorChat( 0, NORMAL, "^4%s^1 ^3%s^1: ii reface tastatura lu'^4 %s^1. Motiv [ ^3%s ^1]", get_tag( ), GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), reason );
log_to_file( gLogFileName, "[UNGAG] < %s > i-a dat ungag lui < %s >< %s >< %s >", GetInfo( id, INFO_NAME ), GetInfo( iPlayer, INFO_NAME ), GetInfo( iPlayer, INFO_IP ), GetInfo( iPlayer, INFO_AUTHID ) );
client_cmd( iPlayer, "speak ^"%s^"", gUnGaggedSound );
return PLUGIN_HANDLED;
}
public Forward_GagThinker( iEntity )
{
if( pev_valid( iEntity ) )
{
set_pev( iEntity, pev_nextthink, get_gametime( ) + 1.0 );
for( new id = 1; id <= gMaxPlayers; id++ )
{
if( is_user_connected( id )
&& ! is_user_bot( id )
&& PlayerGagged[ id ] == 1
&& PlayerGagTime[ id ] > 0
&& ( ( get_systime( ) - JoinTime[ id ] ) >= get_pcvar_num( gCvarGagMinuteInSeconds ) ) )
{
JoinTime[ id ] = get_systime( );
PlayerGagTime[ id ] -= 1;
if( PlayerGagTime[ id ] <= 0 )
{
PlayerGagTime[ id ] = 0;
PlayerGagged[ id ] = 0;
set_speak( id, SPEAK_NORMAL );
ColorChat( id, NORMAL, "^4%s^1 Ai primit^3 UnGag^1, ai grija la limbaj data viitoare !", get_tag( ) );
log_to_file( gLogFileName, "[AUTOUNGAG] < %s > a primit AutoUnGag !", GetInfo( id, INFO_NAME ) );
client_cmd( id, "speak ^"%s^"", gUnGaggedSound );
client_cmd( id, "name ^"%s^"", szOldName[ id ] );
}
}
}
}
}
stock SaveGag( id )
{
gVault = nvault_open( gGagVaultName );
new szIp[ 40 ], szVaultKey[ 64 ], szVaultData[ 64 ];
get_user_ip( id, szIp, charsmax( szIp ) );
formatex( szVaultKey, charsmax( szVaultKey ), "%s - Gag", szIp );
formatex( szVaultData, charsmax( szVaultData ), "%i # %i", PlayerGagged[ id ], PlayerGagTime[ id ] );
nvault_set( gVault, szVaultKey, szVaultData );
nvault_close( gVault );
}
stock LoadGag( id )
{
gVault = nvault_open( gGagVaultName );
new szIp[ 40 ], szVaultKey[ 64 ], szVaultData[ 64 ];
get_user_ip( id, szIp, charsmax( szIp ) );
formatex( szVaultKey, charsmax( szVaultKey ), "%s - Gag", szIp );
formatex( szVaultData, charsmax( szVaultData ), "%i # %i", PlayerGagged[ id ], PlayerGagTime[ id ] );
nvault_get( gVault, szVaultKey, szVaultData, charsmax( szVaultData ) );
replace_all( szVaultData, charsmax( szVaultData ), "#", " " );
new iGagOn[ 32 ], iGagTime [ 32 ];
parse( szVaultData, iGagOn, charsmax( iGagOn ), iGagTime, charsmax( iGagTime ) );
PlayerGagged[ id ] = str_to_num( iGagOn );
PlayerGagTime[ id ] = clamp( str_to_num( iGagTime ), 0, get_pcvar_num( gCvarGagMinuteLimit ) );
nvault_close( gVault );
}
stock GagThinker( )
{
new iEntity = create_entity( "info_target" );
if( !pev_valid( iEntity ) )
{
return PLUGIN_HANDLED;
}
set_pev( iEntity, pev_classname, gGagThinkerClassname );
set_pev( iEntity, pev_nextthink, get_gametime( ) + 1.0 );
return PLUGIN_HANDLED;
}
stock get_tag( )
{
new szTag [ 32 ];
get_pcvar_string( gCvarTag, szTag, sizeof( szTag ) -1 );
return szTag;
}
stock GetInfo( id, const iInfo )
{
new szInfoToReturn[ 64 ];
switch( iInfo )
{
case INFO_NAME:
{
new szName[ 32 ];
get_user_name( id, szName, sizeof( szName ) -1 );
copy( szInfoToReturn, sizeof( szInfoToReturn ) -1, szName );
}
case INFO_IP:
{
new szIp[ 32 ];
get_user_ip( id, szIp, sizeof( szIp ) -1, 1 );
copy( szInfoToReturn, sizeof( szInfoToReturn ) -1, szIp );
}
case INFO_AUTHID:
{
new szAuthId[ 35 ];
get_user_authid( id, szAuthId, sizeof( szAuthId ) -1 );
copy( szInfoToReturn, sizeof( szInfoToReturn ) -1, szAuthId );
}
}
return szInfoToReturn;
}
stock bool:UTIL_IsValidMessage( const szSaid[ ] )
{
new iLen = strlen( szSaid );
if( !iLen )
{
return false;
}
for( new i = 0; i < iLen; i++ )
{
if( szSaid[ i ] != ' ' )
{
return true;
}
}
return false;
}
stock bool:HasUserAccess( id )
{
if( get_user_flags( id ) & COMMAND_ACCESS )
return true;
return false;
}