Код:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Key & Say Guardian"
#define VERSION "1.3b"
#define AUTHOR "AndrewZ / noskill"
#define TID_NAMEPUNISH 1000
#define TID_SAYMENU 2000
#define TID_NAMEMENU 3000
#define MAX_SPAM_MSGS 10
new BLOCKED_MESSAGES[ 128 ][ 192 ],
BLOCKED_NAMES[ 128 ][ 32 ],
BLOCKED_KEYS[ 128 ][ 12 ]
new bool:g_saykey_used[ 33 ], bool:g_namekey_used[ 33 ]
new g_spam_messages[ 33 ][ MAX_SPAM_MSGS + 1 ][ 192 ],
g_spam_count[ 33 ],
g_namemenu_displayed[ 33 ],
g_cheatkey_warns[ 33 ]
new pcv_immunity_flag, pcv_immunity_steam,
pcv_sayguard_mode, pcv_sayguard_repeat, pcv_sayguard_repeat_len,
pcv_nameguard_mode, pcv_nameguard_newname,
pcv_keyguard_enable, pcv_keyguard_warns, pcv_keyguard_bantime, pcv_keyguard_punish
new g_configs_dir[ 64 ], g_maxplayers, g_bindkeys_line
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR )
register_event( "ResetHUD", "event_resethud", "b" )
register_clcmd( "KSGkey", "cheatkey_punish" )
register_clcmd( "say", "hook_say" )
register_clcmd( "say_team", "hook_say" )
pcv_immunity_flag = register_cvar( "ksg_immunity_flag", "d" )
pcv_immunity_steam = register_cvar( "ksg_immunity_steam", "1" )
pcv_sayguard_mode = register_cvar( "ksg_sayguard_mode", "2" )
pcv_sayguard_repeat = register_cvar( "ksg_sayguard_repeat", "1" )
pcv_sayguard_repeat_len = register_cvar( "ksg_sayguard_repeat_len", "13" )
pcv_nameguard_mode = register_cvar( "ksg_nameguard_mode", "2" )
pcv_nameguard_newname = register_cvar( "ksg_nameguard_newname", "[ProStrike] Player" )
pcv_keyguard_enable = register_cvar( "ksg_keyguard_enable", "2" )
pcv_keyguard_warns = register_cvar( "ksg_keyguard_warns", "0" )
pcv_keyguard_bantime = register_cvar( "ksg_keyguard_bantime", "1" )
pcv_keyguard_punish = register_cvar( "ksg_keyguard_punish", "amx_ban %userid% %bantime% %reason%" )
register_cvar( "ksg_version", VERSION, FCVAR_SPONLY | FCVAR_SERVER )
set_cvar_string( "ksg_version", VERSION )
register_dictionary( "ksg.txt" )
register_menu( "show_sayguard_menu", -1, "handler_sayguard_menu" )
register_menu( "show_nameguard_menu", -1, "handler_nameguard_menu" )
g_maxplayers = get_maxplayers()
set_task( 5.0, "task_bind_keys", _, _, _, "b" )
set_task( 1.0, "task_plugin_init" )
}
public plugin_cfg()
{
get_configsdir( g_configs_dir, 64 )
server_cmd( "exec %s/ksg/ksg_config.cfg", g_configs_dir )
}
public task_plugin_init()
{
new temp[ 64 ]; format( temp, 63, "%s/ksg/ksg_messages.ini", g_configs_dir )
if( file_exists( temp ) )
{
new line, textsize, text[ 128 ], i
while( read_file( temp, line, text, 255, textsize ) )
{
BLOCKED_MESSAGES[ i ++ ] = text
line ++
}
}
format( temp, 63, "%s/ksg/ksg_names.ini", g_configs_dir )
if( file_exists( temp ) )
{
new line, textsize, text[ 32 ], i
while( read_file( temp, line, text, 255, textsize ) )
{
BLOCKED_NAMES[ i ++ ] = text
line ++
}
}
format( temp, 63, "%s/ksg/ksg_keys.ini", g_configs_dir )
if( file_exists( temp ) )
{
new textsize, text[ 12 ], i
while( read_file( temp, g_bindkeys_line, text, 255, textsize ) )
{
BLOCKED_KEYS[ i ++ ] = text
g_bindkeys_line ++
}
}
}
public task_bind_keys()
{
for( new id = 1; id <= g_maxplayers; id ++ )
{
if( is_user_connected( id ) )
{
if( !is_user_steam( id ) )
{
if( !get_client_status( id ) )
bind_keys( id )
}
}
}
}
public bind_keys( id )
{
for( new i; i < g_bindkeys_line; i ++ )
{
if( !equali( BLOCKED_KEYS[ i ], " " ) )
client_cmd( id, "bind ^"%s^" ^"KSGkey %s^"", BLOCKED_KEYS[ i ], BLOCKED_KEYS[ i ] )
}
}
public client_connect( id )
{
g_namekey_used[ id ] = false
g_saykey_used[ id ] = false
g_namemenu_displayed[ id ] = 0
g_spam_count[ id ] = 0
g_cheatkey_warns[ id ] = 0
}
public event_resethud( id )
{
if( get_pcvar_num( pcv_nameguard_mode ) )
{
if( is_user_alive( id ) )
{
if( !get_client_status( id ) )
set_task( 5.0, "name_punish", id + TID_NAMEPUNISH )
}
}
}
public hook_say( id )
{
new sayguard_mode = get_pcvar_num( pcv_sayguard_mode )
new sayguard_repeat = get_pcvar_num( pcv_sayguard_repeat )
if( sayguard_mode || sayguard_repeat )
{
if( !get_client_status( id ) )
{
new said[ 192 ]
read_args( said, 191 )
remove_quotes( said )
if( sayguard_mode )
{
for( new i; i < sizeof( BLOCKED_MESSAGES ); i ++ )
{
if( containi( said, BLOCKED_MESSAGES[ i ] ) != -1 )
{
switch( sayguard_mode )
{
case 1: return PLUGIN_HANDLED
case 2:
{
if( is_user_steam( id ) )
{
set_task( 0.1, "say_punish_menu", id + TID_SAYMENU, said, 192 )
return PLUGIN_HANDLED
}
else return PLUGIN_HANDLED
}
}
}
}
}
if( sayguard_repeat )
{
if( strlen( said ) > get_pcvar_num( pcv_sayguard_repeat_len ) )
{
for( new i; i <= MAX_SPAM_MSGS; i ++ )
{
if( equal( g_spam_messages[ id ][ i ], said ) )
{
new file[ 256 ], log[ 128 ], name[ 32 ], authid[ 35 ], ip[ 23 ]
get_user_name( id, name, 31 ); get_user_authid( id, authid, 34 ); get_user_ip( id, ip, 22, 1 )
format( log, 127, "%s: %s (AuthID:[%s], IP:[%s])", name, said , authid, ip )
format( file, 255, "%s/ksg/logs/ksg_repeat_messages.txt", g_configs_dir )
log_to_file( file, log )
return PLUGIN_HANDLED
}
}
if( g_spam_count[ id ] == MAX_SPAM_MSGS )
g_spam_count[ id ] = 0
g_spam_count[ id ] ++
g_spam_messages[ id ][ g_spam_count[ id ] ] = said
}
}
}
}
return PLUGIN_CONTINUE
}
public say_punish_menu( said[], id )
{
id -= TID_SAYMENU
new menu[ 512 ], len, keys = MENU_KEY_1 + MENU_KEY_2
len = formatex( menu, charsmax( menu ), "\rKey&Say Guardian v%s", VERSION )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\y%L", id, "KSG_SPAM_DTCTD" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\d^"%s^"", said )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\y%L", id, "KSG_SPAM_DTCTD2" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r1.\w %L", id, "KSG_SPAM_YES" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r2.\w %L", id, "KSG_SPAM_NO" )
if( !g_saykey_used[ id ] )
{
len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r3.\w %L", id, "KSG_SPAM_KEY" )
keys += MENU_KEY_3
}
show_menu( id, keys, menu, _, "show_sayguard_menu" )
}
public handler_sayguard_menu( id, key )
{
key ++
switch( key )
{
case 1: restore_config( id )
case 2: client_cmd( id, "disconnect" )
case 3:
{
g_saykey_used[ id ] = true
client_printcolor( id, "^4[^3ProStrike^4] %L", id, "KSG_SPAM_RULES" )
}
}
}
public name_punish( id )
{
id -= TID_NAMEPUNISH
new nameguard_mode = get_pcvar_num( pcv_nameguard_mode )
if( nameguard_mode )
{
new name[ 32 ]; get_user_name( id, name, 31 )
new userid = get_user_userid( id )
for( new i = 0; i < sizeof( BLOCKED_NAMES ); i ++ )
{
if( containi( name, BLOCKED_NAMES[ i ] ) != -1 )
{
switch( nameguard_mode )
{
case 1: server_cmd( "kick #%d ^"[ProStrike] %L^"", userid, LANG_SERVER, "KSG_NAME_DTCTD" )
case 2:
{
if( g_namekey_used[ id ] )
server_cmd( "kick #%d ^"[ProStrike] %L^"", userid, LANG_SERVER, "KSG_NAME_DTCTD" )
else
{
if( g_namemenu_displayed[ id ] < 2 )
set_task( 0.1, "name_punish_menu", id + TID_NAMEMENU, name, 32 )
else
server_cmd( "kick #%d ^"[ProStrike] %L^"", userid, LANG_SERVER, "KSG_NAME_DTCTD" )
}
}
case 3:
{
new nameguard_mode[ 64 ]
get_pcvar_string( pcv_nameguard_newname, nameguard_mode, 63 )
set_user_info( id, "name", nameguard_mode )
}
}
}
}
}
}
public name_punish_menu( name[], id )
{
id -= TID_NAMEMENU
new menu[ 512 ], len, keys = MENU_KEY_1 + MENU_KEY_2
len = formatex( menu, charsmax( menu ), "\rKey&Say Guardian v%s", VERSION )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\y%L", id, "KSG_NAME_DTCTD" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\d^"%s^"", name )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\y%L", id, "KSG_NAME_DTCTD2" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r1.\w %L", id, "KSG_NAME_YES" )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r2.\w %L", id, "KSG_NAME_NO" )
if( !g_namekey_used[ id ] )
{
len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r3.\w %L", id, "KSG_NAME_KEY" )
keys += MENU_KEY_3
}
show_menu( id, keys, menu, _, "show_nameguard_menu" )
g_namemenu_displayed[ id ] ++
}
public handler_nameguard_menu( id, key )
{
key ++
switch( key )
{
case 1:
{
new nameguard_mode[ 64 ]; get_pcvar_string( pcv_nameguard_newname, nameguard_mode, 63 )
set_user_info( id, "name", nameguard_mode )
}
case 2: client_cmd( id, "disconnect" )
case 3:
{
g_namekey_used[ id ] = true
client_printcolor( id, "^4[^3ProStrike^4] %L", id, "KSG_NAME_RULES" )
}
}
}
public cheatkey_punish( id )
{
new keyguard = get_pcvar_num( pcv_keyguard_enable )
if( keyguard )
{
if( !get_client_status( id ) )
{
new key[ 8 ]; read_args( key, 7 )
new name[ 32 ]; get_user_name( id, name, 31 )
new ip[ 16 ]; get_user_ip( id, ip, 15, 1 )
new steamid[ 35 ]; get_user_authid( id, steamid, 34 )
new punish[ 256 ]; get_pcvar_string( pcv_keyguard_punish, punish, 255 )
new bantime[ 16 ]; get_pcvar_string( pcv_keyguard_bantime, bantime, 15 )
new userid = get_user_userid( id )
switch( keyguard )
{
case 1:
{
for( new i = 1; i <= g_maxplayers; i ++ )
{
if( is_user_connected( i ) && is_user_admin( i ) )
client_printcolor( i, "^^4[^3ProStrike^4] %L", i, "KSG_CHEATKEY_USE", name, key )
}
}
case 2:
{
for( new i = 1; i <= g_maxplayers; i ++ )
{
if( is_user_connected( i ) && is_user_admin( i ) )
client_printcolor( i, "^^4[^3ProStrike^4] %L", i, "KSG_CHEATKEY_USE", name, key )
}
g_cheatkey_warns[ id ] ++
if( g_cheatkey_warns[ id ] > get_pcvar_num( pcv_keyguard_warns ) )
{
new name_temp[ 36 ], reason_temp[ 128 ], userid_temp[ 37 ]
format( name_temp, charsmax( name_temp ), "^"%s^"", name )
replace_all( punish, charsmax( punish ), "%username%", name )
format( reason_temp, charsmax( reason_temp ), "^"[ProStrike] %L^"", LANG_SERVER, "KSG_CHEATKEY_DTCTD" )
replace_all( punish, charsmax( punish ), "%reason%", reason_temp )
format( userid_temp, charsmax( userid_temp ), "#%d", userid )
replace_all( punish, charsmax( punish ), "%userid%", userid_temp )
replace_all( punish, charsmax( punish ), "%userip%", ip )
replace_all( punish, charsmax( punish ), "%steamid%", steamid )
replace_all( punish, charsmax( punish ), "%bantime%", bantime )
server_cmd( punish )
return PLUGIN_HANDLED
}
client_printcolor( id, "^4[^3ProStrike^4] %L", id, "KSG_CHEATKEY_WARN" )
}
}
}
}
return PLUGIN_HANDLED
}
public restore_config( id )
{
client_cmd( id, "unbindall" )
client_cmd( id, "bind ^"TAB^" ^"+showscores^"" )
client_cmd( id, "bind ^"ENTER^" ^"+attack^"" )
client_cmd( id, "bind ^"ESCAPE^" ^"escape^"" )
client_cmd( id, "bind ^"SPACE^" ^"+jump^"" )
client_cmd( id, "bind ^"'^" ^"+moveup^"" )
client_cmd( id, "bind ^"+^" ^"sizeup^"" )
client_cmd( id, "bind ^",^" ^"buyammo1^"" )
client_cmd( id, "bind ^"-^" ^"sizedown^"" )
client_cmd( id, "bind ^".^" ^"buyammo2^"" )
client_cmd( id, "bind ^"/^" ^"+movedown^"" )
client_cmd( id, "bind ^"0^" ^"slot10^"" )
client_cmd( id, "bind ^"1^" ^"slot1^"" )
client_cmd( id, "bind ^"2^" ^"slot2^"" )
client_cmd( id, "bind ^"3^" ^"slot3^"" )
client_cmd( id, "bind ^"4^" ^"slot4^"" )
client_cmd( id, "bind ^"5^" ^"slot5^"" )
client_cmd( id, "bind ^"6^" ^"slot6^"" )
client_cmd( id, "bind ^"7^" ^"slot7^"" )
client_cmd( id, "bind ^"8^" ^"slot8^"" )
client_cmd( id, "bind ^"9^" ^"slot9^"" )
client_cmd( id, "bind ^";^" ^"+mlook^"" )
client_cmd( id, "bind ^"=^" ^"sizeup^"" )
client_cmd( id, "bind ^"a^" ^"+moveleft^"" )
client_cmd( id, "bind ^"b^" ^"buy^"" )
client_cmd( id, "bind ^"c^" ^"radio3^"" )
client_cmd( id, "bind ^"d^" ^"+moveright^"" )
client_cmd( id, "bind ^"e^" ^"+use^"" )
client_cmd( id, "bind ^"f^" ^"impulse 100^"" )
client_cmd( id, "bind ^"g^" ^"drop^"" )
client_cmd( id, "bind ^"h^" ^"+commandmenu^"" )
client_cmd( id, "bind ^"i^" ^"showbriefing^"" )
client_cmd( id, "bind ^"j^" ^"cheer^"" )
client_cmd( id, "bind ^"k^" ^"+voicerecord^"" )
client_cmd( id, "bind ^"m^" ^"chooseteam^"" )
client_cmd( id, "bind ^"n^" ^"nightvision^"" )
client_cmd( id, "bind ^"o^" ^"buyequip^"" )
client_cmd( id, "bind ^"q^" ^"lastinv^"" )
client_cmd( id, "bind ^"r^" ^"+reload^"" )
client_cmd( id, "bind ^"s^" ^"+back^"" )
client_cmd( id, "bind ^"t^" ^"impulse 201^"" )
client_cmd( id, "bind ^"u^" ^"messagemode2^"" )
client_cmd( id, "bind ^"w^" ^"+forward^"" )
client_cmd( id, "bind ^"x^" ^"radio2^"" )
client_cmd( id, "bind ^"y^" ^"messagemode^"" )
client_cmd( id, "bind ^"z^" ^"radio1^"" )
client_cmd( id, "bind ^"[^" ^"invprev^"" )
client_cmd( id, "bind ^"]^" ^"invnext^"" )
client_cmd( id, "bind ^"`^" ^"toggleconsole^"" )
client_cmd( id, "bind ^"~^" ^"toggleconsole^"" )
client_cmd( id, "bind ^"UPARROW^" ^"+forward^"" )
client_cmd( id, "bind ^"DOWNARROW^" ^"+back^"" )
client_cmd( id, "bind ^"LEFTARROW^" ^"+left^"" )
client_cmd( id, "bind ^"RIGHTARROW^" ^"+right^"" )
client_cmd( id, "bind ^"ALT^" ^"+strafe^"" )
client_cmd( id, "bind ^"CTRL^" ^"+duck^"" )
client_cmd( id, "bind ^"SHIFT^" ^"+speed^"" )
client_cmd( id, "bind ^"F1^" ^"autobuy^"" )
client_cmd( id, "bind ^"F2^" ^"rebuy^"" )
client_cmd( id, "bind ^"F5^" ^"snapshot^"" )
client_cmd( id, "bind ^"F6^" ^"save quick^"" )
client_cmd( id, "bind ^"F7^" ^"load quick^"" )
client_cmd( id, "bind ^"F10^" ^"quit prompt^"" )
client_cmd( id, "bind ^"INS^" ^"+klook^"" )
client_cmd( id, "bind ^"PGDN^" ^"+lookdown^"" )
client_cmd( id, "bind ^"PGUP^" ^"+lookup^"" )
client_cmd( id, "bind ^"END^" ^"centerview^"" )
client_cmd( id, "bind ^"MWHEELDOWN^" ^"invnext^"" )
client_cmd( id, "bind ^"MWHEELUP^" ^"invprev^"" )
client_cmd( id, "bind ^"MOUSE1^" ^"+attack^"" )
client_cmd( id, "bind ^"MOUSE2^" ^"+attack2^"" )
client_cmd( id, "bind ^"PAUSE^" ^"pause^"" )
bind_keys( id )
}
stock get_client_status( id )
{
if( is_user_bot( id ) ) return 1
else if( is_user_hltv( id ) ) return 2
new flags[ 23 ]; get_pcvar_string( pcv_immunity_flag, flags, charsmax( flags ) )
if( get_user_flags( id ) & read_flags( flags ) ) return 3
return 0
}
stock bool:is_user_steam( id ) // ty, Sh0oter
{
if( get_pcvar_num( pcv_immunity_steam ) )
{
static dp_pointer
if( dp_pointer || ( dp_pointer = get_cvar_pointer( "dp_r_id_provider" ) ) )
{
server_cmd( "dp_clientinfo %d", id )
server_exec()
return ( get_pcvar_num( dp_pointer ) == 2 ) ? true : false
}
return false
}
return true
}
stock client_printcolor( const id, const input[], any:... )
{
new count = 1, players[ 32 ]
static msg[ 191 ]
vformat( msg, 190, input, 3 )
replace_all( msg, 190, "!g", "^4" ) // Green Color
replace_all( msg, 190, "!n", "^1" ) // Default Color
replace_all( msg, 190, "!t", "^3" ) // Team Color
if( id ) players[ 0 ] = id; else get_players( players, count, "ch" )
{
for( new i = 0; i < count; i ++ )
{
if( is_user_connected( players[ i ] ) )
{
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, players[ i ] )
write_byte( players[ i ] )
write_string( msg )
message_end()
}
}
}
}