#include <amxmodx>
#include <fakemeta>
#include <amxmisc>
#define IMMUNITY_FLAG ADMIN_IMMUNITY
#define ACCESS_FLAG ADMIN_BAN
#define TID 9982
new const g_iTimes[] = {5, 10, 20, 30};
new g_iMenuPage[33], g_aMenuPlayers[33][32], g_iUserTime[33], g_iGagged[33], dbSteam[64][32], dbGag[64], db_slot_i;
public plugin_init()
{
register_plugin("AmxGag", "1.0", "AndrewZ / DUKKHAZ0R");
register_forward(FM_Voice_SetClientListening, "fwdVoiceSetClientListening");
register_clcmd("amx_gagmenu", "show_gag_main_menu");
register_clcmd("say", "hook_say");
register_clcmd("say_team", "hook_say");
register_menu("gag_players_menu", 1023, "handler_gag_players_menu");
register_menu("gag_time_menu", -1, "handler_gag_time_menu");
}
public client_putinserver(id) load_gag(id);
public client_disconnect(id)
{
save_gag(id);
_remove_user_gag(id);
}
_remove_user_gag(id)
{
g_iUserTime[id] = g_iTimes[0];
g_iGagged[id] = 0;
if(task_exists(TID + id)) remove_task(TID + id);
}
public fwdVoiceSetClientListening(receiver, sender, listen)
{
if(receiver != sender)
{
if(g_iGagged[sender])
{
engfunc( EngFunc_SetClientListening, receiver, sender, 0 )
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public hook_say(id)
{
if(g_iGagged[id]) {
ChatColor(id, "^4[ProKillers]^1 Le lett tiltva számodra a chat.");
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE
}
public show_gag_main_menu(id, page)
{
if(~get_user_flags(id) & ACCESS_FLAG) return 1;
if(page < 0) return 1;
new players[ 32 ], num
get_players( players, num, "ch" )
new i = min( page * 7, num )
new start = i - ( i % 7 )
new end = min( start + 7, num )
page = start / 7
g_iMenuPage[ id ] = page
g_aMenuPlayers[ id ] = players
new menu[ 512 ]
new len = formatex( menu, 511, "\yJátékos némítása\R%d/%d^n^n", page + 1, ( ( num - 1 ) / 7 ) + 1 )
new keys = MENU_KEY_0 + MENU_KEY_8
new item
for( i = start; i < end; i ++ )
{
new name[ 32 ]
new g_id = players[ i ]
get_user_name( g_id, name, 31 )
if( id == g_id )
len += formatex( menu[ len ], 511 - len, "\d%d. \d%s^n", ++ item, name )
else
{
if( get_user_flags( g_id ) & IMMUNITY_FLAG )
len += formatex( menu[ len ], 511 - len, "\r%d. \w%s \r*^n", ++ item, name )
else
{
keys |= ( 1 << item )
if( g_iGagged[ g_id ] )
len += formatex( menu[ len ], 511 - len, "\r%d. \w%s \r[Némítva]^n", ++ item, name )
else
len += formatex( menu[ len ], 511 - len, "\r%d. \w%s^n", ++ item, name )
}
}
}
len += formatex( menu[ len ], 511 - len, "^n\r8. \wIdő: \y%d perc^n", g_iUserTime[ id ] )
if( end < num )
{
keys |= MENU_KEY_9
formatex( menu[ len ], 511 - len, "^n\r9. \wKövetkező^n0. %s", page ? "Vissza" : "Kilépés" )
}
else formatex( menu[ len ], 511 - len, "^n\r0. \w%s", page ? "Vissza" : "Kilépés" )
show_menu( id, keys, menu, -1, "gag_players_menu" )
return PLUGIN_HANDLED
}
public handler_gag_players_menu(id, key)
{
switch(key)
{
case 0..6:
{
new g_id = g_aMenuPlayers[ id ][ g_iMenuPage[ id ] * 7 + key ]
if( is_user_connected( g_id ) )
{
if( !( get_user_flags( g_id ) & IMMUNITY_FLAG ) )
{
new name[ 32 ]; get_user_name( id, name, 31 )
new g_name[ 32 ]; get_user_name( g_id, g_name, 31 )
if( !g_iGagged[ g_id ] )
{
new time = g_iUserTime[ id ]
g_iGagged[ g_id ] = 1
ChatColor(0,"^4[ProKillers]^4 %s ^1lenémította^3 %s^1-t ^3%d^1 percre.", name, g_name, time )
set_task( float( time ) * 60.0, "task_ungag", g_id + TID )
}
else
{
_remove_user_gag( g_id )
ChatColor(0, "^4[ProKillers]^4 %s ^1levette a némítást ^3%s^1-ról.", name, g_name )
}
}
else ChatColor(id, "^4[ProKillers]^1 Ezt a játékost nem lehet némítani." )
}
else ChatColor(id, "^4[ProKillers]^1 A játékos lecsatlakozott a szerverről." )
show_gag_main_menu( id, 0 )
}
case 7: show_gag_time_menu( id )
case 8: show_gag_main_menu( id, ++g_iMenuPage[ id ] )
case 9: show_gag_main_menu( id, --g_iMenuPage[ id ] )
}
}
public task_ungag( task_id )
{
new id = task_id - TID
_remove_user_gag( id )
new name[ 32 ]; get_user_name( id, name, 31 )
ChatColor(0, "^4[ProKillers]^3 %s^1-nak lejárt a némítása.", name )
}
public show_gag_time_menu( id )
{
new menu[ 256 ], len, keys = MENU_KEY_0
len = formatex( menu, charsmax( menu ), "\yIdő kiválasztása a némításhoz^n\w" )
new item
for( new i; i < sizeof g_iTimes; i ++ )
{
keys |= ( 1 << item )
len += formatex( menu[ len ], charsmax( menu ) - len, "^n%d. %d perc", ++ item, g_iTimes[ i ] )
}
len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n0. Kilépés" )
show_menu( id, keys, menu, _, "gag_time_menu" )
}
public handler_gag_time_menu( id, key )
{
switch( key )
{
case 0..4:
{
g_iUserTime[ id ] = g_iTimes[ key ]
show_gag_main_menu( id, 0 )
}
}
}
save_gag(id)
{
new g_steamid[32]
get_user_authid(id, g_steamid, charsmax(g_steamid))
if (dbSteam[id][0] && !equal(g_steamid, dbSteam[id]))
{
if (db_slot_i >= sizeof dbSteam)
db_slot_i = get_maxplayers()+1
copy(dbSteam[db_slot_i], charsmax(dbSteam[]), dbSteam[id])
dbGag[db_slot_i] = dbGag[id]
db_slot_i++
}
copy(dbSteam[id], charsmax(dbSteam[]), g_steamid)
dbGag[id] = g_iGagged[id]
}
load_gag(id)
{
new g_steamid[32]
get_user_authid(id, g_steamid, charsmax(g_steamid))
static i
for (i = 0; i < sizeof dbSteam; i++)
{
if (equal(g_steamid, dbSteam[i]))
{
g_iGagged[id] = dbGag[i]
return;
}
}
}
stock ChatColor(const id, const szMessage[], any:...) {
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);
if(!IdMsg) IdMsg = get_user_msgid("SayText");
if(id) {
if(!is_user_connected(id)) return;
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");
for(new i; i < pnum; i++) {
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
}