Raised This Month: $12 Target: $400
 3% 

custom amx_who


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
T30D0Rv2
New Member
Join Date: Jun 2021
Old 06-10-2021 , 11:23   custom amx_who
Reply With Quote #1

Hi, I recently started using an admin plugin named Elite Admin System, but I would like it to have a custom amx_who that would only show online admins, not all players.

Current amx_who:

Name SteamID Ip Flags Rank
playername steamid ip userflags userrank
playername2 steamid2 ip2 userflags2 userrank2

Wanted amx_who:

==========[SLXD]==========
=>Rank1<=
playername
=>Rank2<=
=>Rank3<=
playername2
etc
==========[SLXD]==========

EliteAdminSystem_Commands.sma:

Code:
#include < amxmodx >
#include < amxmisc >
#include < cromchat >
#include < unixtime >
#include < hamsandwich >
#include < fakemeta >
#include < engine >
#include < fun >
#include < cstrike >
#include < eas_core >
#include < eas_ranks >

#define PLUGIN_AUTHOR "DoNii"
#define PLUGIN_NAME "Elite Admin System Commands"

new const szVersion[ ] = "6.7.2";

#if defined client_disconnected
#define client_disconnect client_disconnected
#endif

enum
{
	CHAT = 0,
	CONSOLE,
	LOG
}

enum
{
	TEAM_UNASSIGNED = 0,
	TEAM_T,
	TEAM_CT,
	TEAM_SPEC
}

enum _:PlayerBan
{
	Player_Name[ MAX_NAME_LENGTH ],
	Player_SteamId[ MAX_AUTHID_LENGTH ],
	Player_IP[ MAX_IP_LENGTH ],
	Player_BanExpire[ MAX_DATE_LENGTH ],
	Player_BanReason[ MAX_REASON_LENGTH ],
	Player_BannedBy[ MAX_NAME_LENGTH ]
}

enum _:PlayerGag
{
	Player_Name[ MAX_NAME_LENGTH ],
	Player_SteamId[ MAX_AUTHID_LENGTH ],
	Player_IP[ MAX_IP_LENGTH ],
	Player_GagExpire[ MAX_DATE_LENGTH ],
	Player_GagReason[ MAX_REASON_LENGTH ],
	Player_GagFlags[ 5 ],
	Player_GaggedBy[ MAX_NAME_LENGTH ]
}

enum _:PlayerData
{
	Player_Name[ MAX_NAME_LENGTH ],
	Player_SteamID[ MAX_AUTHID_LENGTH ],
	Player_Password[ MAX_PASSWORD_LENGTH ],
	Player_AccessFlags[ MAX_FLAGS_LENGTH ],
	Player_Prefix[ 32 ],
	Player_Model_T[ 32 ],
	Player_Model_CT[ 32 ],
	Player_Expire_Date[ MAX_DATE_LENGTH ],
	Player_FlagsExpire[ MAX_FLAGS_LENGTH ],
	Player_Immunity,
	bool:Player_Suspended,
	bool:Player_Expired,
	bool:Player_KeepPrivileges
}

enum _:Cvars
{
	Cvar_Name[ 32 ],
	Cvar_Flag
}

enum ( += 54321 )
{
	TASK_KICK_MENU,
	TASK_BAN_MENU,
	TASK_GAG_CHECK
}

enum _:FileConfig
{
	BANS_FILE[ 64 ],
	GAGS_FILE[ 64 ],
	CVARS_FILE[ 64 ],
	LOGS_FILE[ 64 ],
	USERS_FILE[ 64 ],
	SYSTEM_PREFIX[ 32 ],
	BANNED_CONNECT_LOG,
	RANKS_ENABLED,
	KICK_FLAG,
	BAN_FLAG,
	ADD_BAN_FLAG,
	UNBAN_FLAG,
	SLAY_FLAG,
	SLAP_FLAG,
	CVAR_FLAG,
	PLUGINS_FLAG,
	MAP_FLAG,
	NICK_FLAG,
	RCON_FLAG,
	VOTE_FLAG,
	SHOW_RCON_FLAG,
	MODULES_FLAG,
	FREEZE_FLAG,
	SCREENSHOT_FLAG,
	WARN_FLAG,
	NOCLIP_FLAG,
	GODMODE_FLAG,
	COMMANDS_MENU_FLAG,
	GAG_FLAG,
	UNGAG_FLAG,
	SAY_FLAG,
	TEAM_FLAG,
	IMMUNITY_FLAG,
	PSAY_FLAG,
	LAST_FLAG,
	WHO_FLAG,
	ADD_GAG_FLAG,
	CHAT_FLAG,
	VOTEMAP_FLAG,
	DISCONNECT_INFO_SECONDS_EXPIRE,
	Float:FREQUENCY_UPDATE_ALL_FILES,
	Float:VOTE_TIME,
	Float:VOTE_MAP_TIME
}

enum _:PlayerDisconnectData
{
	Player_DisconnectName[ MAX_NAME_LENGTH ],
	Player_DisconnectSteamID[ MAX_AUTHID_LENGTH ],
	Player_DisconnectIP[ MAX_IP_LENGTH ],
	Player_DisconnectFlags[ MAX_FLAGS_LENGTH ],
	Player_DisconnectRank[ 32 ],
	Player_DataExpireDate[ MAX_DATE_LENGTH ]
}

enum _:BanMsg
{
	BAN_ID,
	BAN_MINUTES,
	BAN_REASON[ MAX_REASON_LENGTH ]
}

enum _:AddBanMsg
{
	ADDBAN_ID,
	ADDBAN_NAME[ MAX_NAME_LENGTH ],
	ADDBAN_STEAMID[ MAX_AUTHID_LENGTH ],
	ADDBAN_IP[ MAX_IP_LENGTH ],
	ADDBAN_MINUTES
}

enum _:AddGagMsg
{
	ADDGAG_ID,
	ADDGAG_NAME[ MAX_NAME_LENGTH ],
	ADDGAG_STEAMID[ MAX_AUTHID_LENGTH ],
	ADDGAG_IP[ MAX_IP_LENGTH ],
	ADDGAG_MINUTES,
	ADDGAG_FLAGS[ 5 ]
}

enum _:SlayMsg
{
	SLAY_ID,
	SLAY_REASON[ MAX_REASON_LENGTH ]
}

enum _:SlapMsg
{
	SLAP_ID,
	SLAP_VALUE,
	SLAP_REASON[ MAX_REASON_LENGTH ]
}

enum _:GagMsg
{
	GAG_ID,
	GAG_MINUTES,
	GAG_FLAGS[ 5 ],
	GAG_REASON[ MAX_REASON_LENGTH ]
}

enum
{
	METHOD_NONE = 0,
	METHOD_CHAT,
	METHOD_LOG,
	METHOD_BOTH
}

new g_iConfig[ FileConfig ];

new Array:g_aBans, Array:g_aGags, Array:g_aMaps, Array:g_aDisconnectInfo, Array:g_aCvars;
new Trie:g_tDatabase;

new g_iKick[ MAX_PLAYERS + 1 ], g_iBan[ MAX_PLAYERS + 1 ][ BanMsg ], g_iGag[ MAX_PLAYERS + 1 ][ GagMsg ], g_iAddBan[ MAX_PLAYERS + 1 ][ AddBanMsg ], g_iAddGag[ MAX_PLAYERS + 1 ][ AddGagMsg ],
g_iSlay[ MAX_PLAYERS + 1 ][ SlayMsg ], g_iSlap[ MAX_PLAYERS + 1 ][ SlapMsg ], g_iTeamSwitch[ MAX_PLAYERS + 1 ], g_szTeamSwitch[ MAX_PLAYERS + 1 ][ 20 ], g_szConfigsDir[ 128 ], g_szMapsFile[ 32 ],
g_szName[ MAX_PLAYERS + 1 ][ MAX_NAME_LENGTH ], g_szAuthId[ MAX_PLAYERS + 1 ][ MAX_AUTHID_LENGTH ], g_szIp[ MAX_PLAYERS + 1 ][ MAX_IP_LENGTH ], g_iVoteOption[ MAX_PLAYERS + 1 ], g_szVoteOptions[ 3 ][ 32 ],
g_iVoteMenu[ MAX_PLAYERS + 1 ], g_szVoteQuestion[ 32 ], g_szVoteMapOptions[ 3 ][ 32 ], g_iVoteMapOption[ MAX_PLAYERS + 1 ], g_iVoteMapMenu[ MAX_PLAYERS + 1 ], g_iVoteMapTriggeredId, g_szVoteMapTriggeredSteamId[ MAX_AUTHID_LENGTH ],
g_szVoteMapFinalOption[ 32 ];

new Float:fAngles[ MAX_PLAYERS + 1 ][ 3 ], Float:g_fLastOpened[ MAX_PLAYERS + 1 ];

new bool:g_bFrozen[ MAX_PLAYERS + 1 ], bool:g_bVoting, bool:g_bMapVoting;

new g_pRconPassword, g_iFwThink, g_iInfoChangedFwd;

new g_szHudColors[ ][ ][ ] =
{
	{ "Red", 255, 0, 0 },
	{ "Green", 0, 255, 0 },
	{ "Blue", 0, 0, 255 },
	{ "Purple", 128, 0, 128 },
	{ "Orange", 255, 128, 0 }
}

public plugin_precache( )
{
	get_configsdir( g_szConfigsDir, charsmax( g_szConfigsDir ) );

	register_dictionary( "elite_admin_system.txt" );

	g_aGags = ArrayCreate( PlayerGag );
	g_aBans = ArrayCreate( PlayerBan );
	g_aDisconnectInfo = ArrayCreate( PlayerDisconnectData );
	g_aMaps = ArrayCreate( 32 );
	g_aCvars = ArrayCreate( Cvars );
	
	g_tDatabase = TrieCreate( );
	
	get_cvar_string( "mapcyclefile", g_szMapsFile, charsmax( g_szMapsFile ) );
	
	ReadConfig( );
	ReadBans( );
	ReadGags( );
	ReadUsers( );
	ReadMaps( );
	ReadCvars( );
}

public plugin_init( )
{
	register_plugin( PLUGIN_NAME, szVersion, PLUGIN_AUTHOR );
	
	new szPrefix[ 32 ];
	formatex( szPrefix, charsmax( szPrefix ), "&x04%s", g_iConfig[ SYSTEM_PREFIX ] );
	CC_SetPrefix( szPrefix );
	
	set_task( g_iConfig[ FREQUENCY_UPDATE_ALL_FILES ], "UpdateAllFiles", .flags="b" );

	register_cvar( "eas_version", szVersion, FCVAR_SERVER | FCVAR_SPONLY | FCVAR_UNLOGGED );
	
	register_clcmd( "say", "OnSay" );
	register_clcmd( "say_team", "OnSay" );
	
	g_pRconPassword = get_cvar_pointer( "rcon_password" );
	
	RegisterHam( Ham_Killed, "player", "@Ham_Killed_Post", 1 );
	
	register_message( get_user_msgid( "SayText" ), "Msg_SayText" );
	
	/////////////////// MessageMode Commands //////////////////////
	
	register_clcmd( "kickReason", "OnKickPlayer" );
	
	register_clcmd( "banPlayerMinutes", "OnBanPlayerMinutes" );
	register_clcmd( "banPlayerReason", "OnBanPlayerReason" );
	
	register_clcmd( "gagPlayerMinutes", "OnGagPlayerMinutes" );
	register_clcmd( "gagPlayerFlags", "OnGagPlayerFlags" );
	register_clcmd( "gagPlayerReason", "OnGagPlayerReason" );
	
	register_clcmd( "addbanPlayerName", "OnAddbanPlayerName" );
	register_clcmd( "addbanPlayerSteamID", "OnAddbanPlayerSteamID" );
	register_clcmd( "addbanPlayerIP", "OnAddbanPlayerIP" );
	register_clcmd( "addbanPlayerMinutes", "OnAddbanPlayerMinutes" );
	register_clcmd( "addbanPlayerReason", "OnAddbanPlayerReason" );
	
	register_clcmd( "addgagPlayerName", "OnAddGagPlayerName" );
	register_clcmd( "addgagPlayerSteamID", "OnAddGagPlayerSteamID" );
	register_clcmd( "addgagPlayerIP", "OnAddGagPlayerIP" );
	register_clcmd( "addgagPlayerMinutes", "OnAddGagPlayerMinutes" );
	register_clcmd( "addgagPlayerFlags", "OnAddGagPlayerFlags" );
	register_clcmd( "addgagPlayerReason", "OnAddGagPlayerReason" );
	
	register_clcmd( "slayPlayerReason", "OnSlayPlayerReason" );
	
	register_clcmd( "slapPlayerValue", "OnSlapPlayerValue" );
	register_clcmd( "slapPlayerReason", "OnSlapPlayerReason" );
	
	//////////////////// Console Commands ////////////////////
	
	register_concmd( "amx_kick", "@Kick" );
	register_concmd( "amx_ban", "@Ban" );
	register_concmd( "amx_addban", "@AddBan" );
	register_concmd( "amx_unban", "@Unban" );
	register_concmd( "amx_slay", "@Slay" );
	register_concmd( "amx_slap", "@Slap" );
	register_concmd( "amx_cvar", "@Cvar" );
	register_concmd( "amx_plugins", "@Plugins" );
	register_concmd( "amx_map", "@Map" );
	register_concmd( "amx_nick", "@Nick" );
	register_concmd( "amx_rcon", "@Rcon" );
	register_concmd( "amx_showrcon", "@ShowRcon" );
	register_concmd( "amx_modules", "@Modules" );
	register_concmd( "amx_freeze", "@Freeze" );
	register_concmd( "amx_ss", "@Screenshot" );
	register_concmd( "amx_help", "@Help" );
	register_concmd( "amx_noclip", "@Noclip" );
	register_concmd( "amx_godmode", "@Godmode" );
	register_concmd( "amx_warn", "@Warn" );
	register_concmd( "amx_gag", "@Gag" );
	register_concmd( "amx_ungag", "@UnGag" );
	register_concmd( "amx_say", "@AdminSay" );
	register_concmd( "amx_team", "@Team" );
	register_concmd( "amx_psay", "@Psay" );
	register_concmd( "amx_last", "@Last" );
	register_concmd( "amx_who", "@Who" );
	register_concmd( "amx_addgag", "@AddGag" );
	register_concmd( "amx_chat", "@AdminChat" );
	register_concmd( "amx_exgag", "@ExtendGag" );
	register_concmd( "amx_regag", "@ReduceGag" );
	register_concmd( "amx_tsay", "@Tsay" );
	register_concmd( "amx_vote", "@Vote" );
	register_concmd( "amx_votemap", "@VoteMap" );

	//////////////////////////////////////////////////////////
}

public plugin_end( )
{
	ArrayDestroy( g_aBans );
	ArrayDestroy( g_aDisconnectInfo );
	ArrayDestroy( g_aGags );
	ArrayDestroy( g_aMaps );
	ArrayDestroy( g_aCvars );
	
	TrieDestroy( g_tDatabase );
}

//////////////////////////////////////////////////////////// TASKS ///////////////////////////////////////////////////////////////////////////////////////////

public UpdateAllFiles( )
{
	ReadUsers( );
	CheckGagExpire( );
	ReadBans( );
	ReadGags( );
}

public CheckGagExpire( )
{
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		if( IsGagged( iTempId ) && get_speak( iTempId ) == SPEAK_MUTED )
		{
			new eData[ PlayerGag ];
			for( new i; i < ArraySize( g_aGags ); i++ )
			{
				ArrayGetArray( g_aGags, i, eData );
				
				if( equali( g_szAuthId[ iTempId ], eData[ Player_SteamId ] ) || equali( g_szIp[ iTempId ], eData[ Player_IP ] ) && HasDatePassed( eData[ Player_GagExpire ] ) )
				{
					set_speak( iTempId, SPEAK_NORMAL );
					break;
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}

public OnMapChange( const szMap[ ] )
{
	server_cmd( "changelevel %s", szMap );
}

public ReOpenKickMenu( id )
{
	id -= TASK_KICK_MENU;

	KickMenu( id );
}

public ReOpenBanMenu( id )
{
	id -= TASK_BAN_MENU;
	
	BanMenu( id );
}

////////////////////////////////////////////////////////// END OF TASKS //////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

@Ham_Killed_Post( iVictim )
{
	g_bFrozen[ iVictim ] = false;
}

public client_disconnect( id )
{
	CacheInfo( id );
	CleanVars( id );
}

public client_connect( id )
{
	CleanVars( id );
}

public client_authorized( id )
{
	get_user_authid( id, g_szAuthId[ id ], charsmax( g_szAuthId[ ] ) );
	get_user_name( id, g_szName[ id ], charsmax( g_szName[ ] ) );
	get_user_ip( id, g_szIp[ id ], charsmax( g_szIp[ ] ), 1 );

	CheckGagged( id );
	CheckBanned( id );
} 

public client_putinserver( id )
{
	get_user_authid( id, g_szAuthId[ id ], charsmax( g_szAuthId[ ] ) );
	get_user_name( id, g_szName[ id ], charsmax( g_szName[ ] ) );
	get_user_ip( id, g_szIp[ id ], charsmax( g_szIp[ ] ), 1 );

	CheckGagged( id );
	CheckBanned( id );
}

public Msg_SayText( msg_id, msg_dest, msg_entity ) 
{
	new szArg2[ 32 ];
	get_msg_arg_string( 2, szArg2, charsmax( szArg2 ) );
	
	if( equal( szArg2, "#Cstrike_Name_Change" ) )
	{
		g_iInfoChangedFwd = register_forward( FM_ClientUserInfoChanged , "ClientUserInfoChanged", 1 );
	}
}

public ClientUserInfoChanged( id )
{
	if( is_user_connected( id ) )
	{
		get_user_name( id, g_szName[ id ], charsmax( g_szName[ ] ) );
		unregister_forward( FM_ClientUserInfoChanged, g_iInfoChangedFwd );
	}
}

public OnSay( id )
{
	if( IsGagged( id ) )
	{
		new eData[ PlayerGag ];
		for( new i; i < ArraySize( g_aGags ); i++ )
		{
			ArrayGetArray( g_aGags, i, eData );
			
			if( ( equali( g_szAuthId[ id ], eData[ Player_SteamId ] ) || equali( g_szIp[ id ], eData[ Player_IP ] ) ) && ( containi( eData[ Player_GagFlags ], "s" ) != -1 ) )
			{
				if( equali( eData[ Player_GagExpire ], "never" ) )
				{
					CC_SendMessage( id, "%L", id, "GAG_EXPIRES_NEVER" );
					return PLUGIN_HANDLED;
				}
				
				else if( ! HasDatePassed( eData[ Player_GagExpire ] ) )
				{
					CC_SendMessage( id, "%L", id, "GAG_EXPIRES_IN", ( parse_time( eData[ Player_GagExpire ], "%m/%d/%Y %H:%M:%S" ) - get_systime( ) ) );
					return PLUGIN_HANDLED;
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}

public fw_PlayerPreThink( id )
{
	if( is_user_alive( id ) && g_bFrozen[ id ] )
	{
		set_pev( id, pev_v_angle, fAngles[ id ] );
		set_pev( id, pev_fixangle, 1 );
	}
}

////////////////////////////////////////////////////////// END OF EVENTS ///////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////// MessageMode ///////////////////////////////////////////////////////////////////////////////////////////

public OnAddbanPlayerName( id )
{
	new szName[ MAX_NAME_LENGTH ];
	read_args( szName, charsmax( szName ) );
	
	trim( szName );
	remove_quotes( szName );
	
	if( ! szName[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "al", szName );

	if( iPlayer )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
			arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
			
			return PLUGIN_HANDLED;
		}
		g_iAddBan[ id ][ ADDBAN_ID ] = iPlayer;
	}
	
	else
	{
		g_iAddBan[ id ][ ADDBAN_ID ] = 0;
	}
	
	copy( g_iAddBan[ id ][ ADDBAN_NAME ], charsmax( g_iAddBan[ ] ), szName );
	client_cmd( id, "messagemode addbanPlayerSteamID" );
	
	return PLUGIN_HANDLED;
}

public OnAddbanPlayerSteamID( id )
{
	new szSteamId[ MAX_AUTHID_LENGTH ];
	read_args( szSteamId, charsmax( szSteamId ) );

	trim( szSteamId );
	remove_quotes( szSteamId );
	
	if( ! szSteamId[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	if( ! g_iAddBan[ id ][ ADDBAN_ID ] )
	{
		new iPlayer = find_player( "cl", szSteamId );
		
		if( iPlayer )
		{
			new iImmunityLevel = GetImmunityLevel( id );
			new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
			
			if( iImmunityLevel < iImmunityLevelTarget )
			{
				CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
				arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
				
				return PLUGIN_HANDLED;
			}
			g_iAddBan[ id ][ ADDBAN_ID ] = iPlayer;
		}
		
		else
		{
			g_iAddBan[ id ][ ADDBAN_ID ] = 0;
		}
	}
	
	copy( g_iAddBan[ id ][ ADDBAN_STEAMID ], charsmax( g_iAddBan[ ] ), szSteamId );
	client_cmd( id, "messagemode addbanPlayerIP" );
	
	return PLUGIN_HANDLED;
}

public OnAddbanPlayerIP( id )
{
	new szIP[ MAX_IP_LENGTH ];
	read_args( szIP, charsmax( szIP ) );
	
	trim( szIP );
	remove_quotes( szIP );
	
	if( ! szIP[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	if( ! g_iAddBan[ id ][ ADDBAN_ID ] )
	{
		new iPlayer = find_player( "dl", szIP );
		
		if( iPlayer )
		{
			new iImmunityLevel = GetImmunityLevel( id );
			new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
			
			if( iImmunityLevel < iImmunityLevelTarget )
			{
				CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
				arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
				
				return PLUGIN_HANDLED;
			}
			g_iAddBan[ id ][ ADDBAN_ID ] = iPlayer;
		}
		
		else
		{
			g_iAddBan[ id ][ ADDBAN_ID ] = 0;
		}
	}
	
	copy( g_iAddBan[ id ][ ADDBAN_IP ], charsmax( g_iAddBan[ ] ), szIP );
	client_cmd( id, "messagemode addbanPlayerMinutes" );
	
	return PLUGIN_HANDLED;
}

public OnAddbanPlayerMinutes( id )
{
	new szMinutes[ 8 ];
	read_args( szMinutes, charsmax( szMinutes ) );
	
	trim( szMinutes );
	remove_quotes( szMinutes );
	
	new iMinutes = str_to_num( szMinutes );
	if( ! is_str_num( szMinutes ) || iMinutes < 0 )
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_VALUE" );
		arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	
	g_iAddBan[ id ][ ADDBAN_MINUTES ] = iMinutes;
	client_cmd( id, "messagemode addbanPlayerReason" );
	
	return PLUGIN_HANDLED;
}

public OnAddbanPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ], iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iAddBan[ id ][ ADDBAN_ID ];
	
	if( is_user_connected( iPlayer ) )
	{
		if( ( equali( g_szAuthId[ iPlayer ], g_iAddBan[ id ][ ADDBAN_STEAMID ] ) || equali( g_szIp[ iPlayer ], g_iAddBan[ id ][ ADDBAN_IP ] ) ) ) // is it the same guy?
		{
			if( ( get_user_flags( iPlayer ) & g_iConfig[ IMMUNITY_FLAG ] ) || GetImmunityLevel( iPlayer ) >= GetImmunityLevel( id ) )
			{
				return PLUGIN_HANDLED;
			}
		}
		
		else
		{
			iPlayer = 0;
		}
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = g_iAddBan[ id ][ ADDBAN_MINUTES ];
	get_players( iPlayers, iNum, "ch" );
	
	if( iMinutes == 0 )
	{
		for( new i; i < iNum; i++ )
		{
			iTempId = iPlayers[ i ];
			
			if( get_user_flags( iTempId ) & ADMIN_KICK )
			{
				CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], g_iAddBan[ id ][ ADDBAN_NAME ], g_iAddBan[ id ][ ADDBAN_STEAMID ], g_iAddBan[ id ][ ADDBAN_IP ], szReason );
			}
		}
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_iAddBan[ id ][ ADDBAN_NAME ], g_iAddBan[ id ][ ADDBAN_STEAMID ], g_iAddBan[ id ][ ADDBAN_IP ], szReason );
		copy( szExpireDate, charsmax( szExpireDate ), "never" );	
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		for( new i; i < iNum; i++ )
		{
			iTempId = iPlayers[ i ];
			
			if( get_user_flags( iTempId ) & ADMIN_KICK )
			{
				CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST", g_szName[ id ], g_iAddBan[ id ][ ADDBAN_NAME ], g_iAddBan[ id ][ ADDBAN_STEAMID ], g_iAddBan[ id ][ ADDBAN_IP ], iMinutes, szReason );
			}
		}
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST", g_szName[ id ], g_szAuthId[ id ], g_iAddBan[ id ][ ADDBAN_NAME ], g_iAddBan[ id ][ ADDBAN_STEAMID ], g_iAddBan[ id ][ ADDBAN_IP ], iMinutes, szExpireDate, szReason );
	}
	
	trim( szExpireDate );
	trim( szReason );
	
	new eData[ PlayerBan ];
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_iAddBan[ id ][ ADDBAN_NAME ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_iAddBan[ id ][ ADDBAN_STEAMID ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_iAddBan[ id ][ ADDBAN_IP ] );
	copy( eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ), szExpireDate );
	copy( eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), szReason );
	copy( eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aBans, eData );
	AddBan( g_iAddBan[ id ][ ADDBAN_NAME ], g_iAddBan[ id ][ ADDBAN_STEAMID ], g_iAddBan[ id ][ ADDBAN_IP ], szExpireDate, szReason, g_szName[ id ] );
	
	arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
	
	if( is_user_connected( iPlayer ) )
	{
		ScreenShot( iPlayer );
		
		if( ! HasDatePassed( szExpireDate ) || equali( szExpireDate, "never" ) )
		{
			if( equali( szExpireDate, "never" ) )
			{
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE_NEVER" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			
			else
			{
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE", szExpireDate );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			server_cmd( "kick #%d %L", get_user_userid( iPlayer ), id, "CHECK_CONSOLE_INFO" );
		}
	}
	
	if( is_user_connected( id ) ) // checking to see if he's still connected (maybe he banned himself)
	{
		AddBanMenu( id );
	}
	
	return PLUGIN_HANDLED;
}

public OnAddGagPlayerName( id )
{
	new szName[ MAX_NAME_LENGTH ];
	read_args( szName, charsmax( szName ) );
	
	trim( szName );
	remove_quotes( szName );
	
	if( ! szName[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "al", szName );

	if( iPlayer )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
			arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
			
			return PLUGIN_HANDLED;
		}
		g_iAddGag[ id ][ ADDGAG_ID ] = iPlayer;
	}
	
	else
	{
		g_iAddGag[ id ][ ADDGAG_ID ] = 0;
	}
	
	if( IsGagged( iPlayer ) )
	{
		send_message( id, CHAT, false, "%L", id, "PLAYER_ALREADY_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	copy( g_iAddGag[ id ][ ADDGAG_NAME ], charsmax( g_iAddGag[ ] ), szName );
	client_cmd( id, "messagemode addgagPlayerSteamID" );
	
	return PLUGIN_HANDLED;
}

public OnAddGagPlayerSteamID( id )
{
	new szSteamId[ MAX_AUTHID_LENGTH ];
	read_args( szSteamId, charsmax( szSteamId ) );

	trim( szSteamId );
	remove_quotes( szSteamId );
	
	if( ! szSteamId[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "cl", szSteamId );
	
	if( iPlayer )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
			arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
			
			return PLUGIN_HANDLED;
		}
		g_iAddGag[ id ][ ADDGAG_ID ] = iPlayer;
	}
	
	else
	{
		g_iAddGag[ id ][ ADDGAG_ID ] = 0;
	}
	
	if( IsGagged( iPlayer ) )
	{
		send_message( id, CHAT, false, "%L", id, "PLAYER_ALREADY_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	copy( g_iAddGag[ id ][ ADDGAG_STEAMID ], charsmax( g_iAddGag[ ] ), szSteamId );
	client_cmd( id, "messagemode addgagPlayerIP" );
	
	return PLUGIN_HANDLED;
}

public OnAddGagPlayerIP( id )
{
	new szIP[ MAX_IP_LENGTH ];
	read_args( szIP, charsmax( szIP ) );
	
	trim( szIP );
	remove_quotes( szIP );
	
	if( ! szIP[ 0 ] )
	{
		CC_SendMessage( id, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "dl", szIP );
	
	if( iPlayer )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
			arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
			
			return PLUGIN_HANDLED;
		}
		g_iAddGag[ id ][ ADDGAG_ID ] = iPlayer;
	}
	
	else
	{
		g_iAddGag[ id ][ ADDGAG_ID ] = 0;
	}
	
	if( IsGagged( iPlayer ) )
	{
		send_message( id, CHAT, false, "%L", id, "PLAYER_ALREADY_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	copy( g_iAddGag[ id ][ ADDGAG_IP ], charsmax( g_iAddGag[ ] ), szIP );
	client_cmd( id, "messagemode addgagPlayerMinutes" );
	
	return PLUGIN_HANDLED;
}

public OnAddGagPlayerMinutes( id )
{
	new szMinutes[ 8 ];
	read_args( szMinutes, charsmax( szMinutes ) );
	
	trim( szMinutes );
	remove_quotes( szMinutes );
	
	new iMinutes = str_to_num( szMinutes );
	if( ! is_str_num( szMinutes ) || iMinutes < 0 )
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_VALUE" );
		arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	
	g_iAddGag[ id ][ ADDGAG_MINUTES ] = iMinutes;
	client_cmd( id, "messagemode addgagPlayerFlags" );
	
	return PLUGIN_HANDLED;
}

public OnAddGagPlayerFlags( id )
{
	new szFlags[ 5 ];
	read_args( szFlags, charsmax( szFlags ) );
	
	trim( szFlags );
	remove_quotes( szFlags );
	
	if( equali( szFlags, "sv" ) || equali( szFlags, "vs" ) || equali( szFlags, "s" ) || equali( szFlags, "v" ) )
	{
		copy( g_iAddGag[ id ][ ADDGAG_FLAGS ], charsmax( g_iAddGag[ ] ), szFlags );
		client_cmd( id, "messagemode addgagPlayerReason" );
	}
	
	else
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_FLAGS" );
		arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

public OnAddGagPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iAddGag[ id ][ ADDGAG_ID ];
	
	if( is_user_connected( iPlayer ) )
	{
		if( ( equali( g_szAuthId[ iPlayer ], g_iAddGag[ id ][ ADDGAG_STEAMID ] ) || equali( g_szIp[ iPlayer ], g_iAddGag[ id ][ ADDGAG_IP ] ) ) ) // is it the same guy?
		{
			if( ( get_user_flags( iPlayer ) & g_iConfig[ IMMUNITY_FLAG ] ) || GetImmunityLevel( iPlayer ) >= GetImmunityLevel( id ) )
			{
				return PLUGIN_HANDLED;
			}
		}
		
		else
		{
			iPlayer = 0;
		}
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = g_iAddGag[ id ][ ADDGAG_MINUTES ];
	
	if( iMinutes == 0 )
	{
		CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], g_iAddGag[ id ][ ADDGAG_NAME ], g_iAddGag[ id ][ ADDGAG_STEAMID ], g_iAddGag[ id ][ ADDGAG_IP ], g_iAddGag[ id ][ ADDGAG_FLAGS ], szReason );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_iAddGag[ id ][ ADDGAG_NAME ], g_iAddGag[ id ][ ADDGAG_STEAMID ], g_iAddGag[ id ][ ADDGAG_IP ], g_iAddGag[ id ][ ADDGAG_FLAGS ], szReason );
		
		copy( szExpireDate, charsmax( szExpireDate ), "never" );	
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST", g_szName[ id ], g_iAddGag[ id ][ ADDGAG_NAME ], g_iAddGag[ id ][ ADDGAG_STEAMID ], g_iAddGag[ id ][ ADDGAG_IP ], iMinutes );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST", g_szName[ id ], g_szAuthId[ id ], g_iAddGag[ id ][ ADDGAG_NAME ], g_iAddGag[ id ][ ADDGAG_STEAMID ], g_iAddGag[ id ][ ADDGAG_IP ], iMinutes, szExpireDate, g_iAddGag[ id ][ ADDGAG_FLAGS ], szReason );
	}

	trim( szReason );
	trim( szExpireDate );
	
	new eData[ PlayerGag ];
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_iAddGag[ id ][ ADDGAG_NAME ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_iAddGag[ id ][ ADDGAG_STEAMID ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_iAddGag[ id ][ ADDGAG_IP ] );
	copy( eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), g_iAddGag[ id ][ ADDGAG_FLAGS ] );
	copy( eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), szReason );
	copy( eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), szExpireDate );
	copy( eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aGags, eData );
	AddGag( g_iAddGag[ id ][ ADDGAG_NAME ], g_iAddGag[ id ][ ADDGAG_STEAMID ], g_iAddGag[ id ][ ADDGAG_IP ], szReason, g_iAddGag[ id ][ ADDGAG_FLAGS ], szExpireDate, g_szName[ id ] );
	
	if( is_user_connected( iPlayer ) )
	{
		if( get_user_flags( iPlayer ) & g_iConfig[ IMMUNITY_FLAG ] )
		{
			return PLUGIN_HANDLED;
		}

		else
		{
			if( equali( g_szAuthId[ iPlayer ], eData[ Player_SteamId ] ) || equali( g_szIp[ iPlayer ], eData[ Player_IP ] ) )
			{
				if( ! HasDatePassed( eData[ Player_GagExpire ] ) )
				{
					set_speak( iPlayer, SPEAK_MUTED );
				}
			}
		}
	}
	
	if( is_user_connected( id ) )
	{
		AddGagMenu( id );
	}
	
	arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
	return PLUGIN_HANDLED;
}

public OnKickPlayer( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iKick[ id ];
	
	server_cmd( "kick #%d ^"%s^"", get_user_userid( iPlayer ), szReason );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "KICKED", g_szName[ id ], g_szName[ iPlayer ], szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_KICKED", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
	
	g_iKick[ id ] = 0;
	
	if( is_user_connected( id ) )
	{
		set_task( 0.1, "ReOpenKickMenu", id + TASK_KICK_MENU ); // needs a delay to update players 
	}
	
	return PLUGIN_HANDLED;
}

public OnGagPlayerMinutes( id )
{
	new szMinutes[ 8 ];
	read_args( szMinutes, charsmax( szMinutes ) );
	
	trim( szMinutes );
	remove_quotes( szMinutes );
	
	new iMinutes = str_to_num( szMinutes );
	if( ! is_str_num( szMinutes ) || iMinutes < 0 )
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_VALUE" );
		arrayset( g_iGag[ id ], 0, sizeof( g_iGag[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	
	g_iGag[ id ][ GAG_MINUTES ] = iMinutes;
	client_cmd( id, "messagemode gagPlayerFlags" );
	
	return PLUGIN_HANDLED;
}

public OnGagPlayerFlags( id )
{
	new szFlags[ 5 ];
	read_args( szFlags, charsmax( szFlags ) );
	
	trim( szFlags );
	remove_quotes( szFlags );
	
	if( equali( szFlags, "sv" ) || equali( szFlags, "vs" ) || equali( szFlags, "s" ) || equali( szFlags, "v" ) )
	{
		copy( g_iGag[ id ][ GAG_FLAGS ], charsmax( g_iGag[ ] ), szFlags );
		client_cmd( id, "messagemode gagPlayerReason" );
	}
	
	else
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_FLAGS" );
		arrayset( g_iGag[ id ], 0, sizeof( g_iGag[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	return PLUGIN_HANDLED;
}

public OnGagPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iGag[ id ][ GAG_ID ];
	
	new szFlags[ 5 ];
	copy( szFlags, charsmax( szFlags ), g_iGag[ id ][ GAG_FLAGS ] );
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = g_iGag[ id ][ GAG_MINUTES ];
	
	if( iMinutes == 0 )
	{
		CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], szFlags, szReason );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szFlags );
		
		copy( szExpireDate, charsmax( szExpireDate ), "never" );
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		if( iMinutes == 1 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_SINGULAR", g_szName[ id ], g_szName[ iPlayer ], szReason, szFlags );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_SINGULAR", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate, szFlags, iMinutes );
		}
		
		else
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_PLURAL", g_szName[ id ], g_szName[ iPlayer ], iMinutes, szReason, szFlags );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_PLURAL", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate, szFlags, iMinutes );
		}
	}
	
	new eData[ PlayerGag ];	
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
	copy( eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), szExpireDate );
	copy( eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), szReason );
	copy( eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), szFlags );
	copy( eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aGags, eData );
	
	if( containi( szFlags, "v" ) != -1 && is_user_connected( iPlayer ) )
	{
		set_speak( iPlayer, SPEAK_MUTED );
	}
	
	GagPlayer( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szFlags, szExpireDate, g_szName[ id ] );	
	arrayset( g_iGag[ id ], 0, sizeof( g_iGag[ ] ) );
	
	if( is_user_connected( id ) )
	{
		GagMenu( id );
	}
	return PLUGIN_HANDLED;
}

public OnBanPlayerMinutes( id )
{
	new szMinutes[ 8 ];
	read_args( szMinutes, charsmax( szMinutes ) );
	
	trim( szMinutes );
	remove_quotes( szMinutes );
	
	new iMinutes = str_to_num( szMinutes );
	
	if( ! is_str_num( szMinutes ) || iMinutes < 0 )
	{
		send_message( id, CHAT, false, "%L", id, "INVALID_VALUE" );
		arrayset( g_iBan[ id ], 0, sizeof( g_iBan[ ] ) );
		
		return PLUGIN_HANDLED;
	}
	
	g_iBan[ id ][ BAN_MINUTES ] = iMinutes;
	client_cmd( id, "messagemode banPlayerReason" );
	
	return PLUGIN_HANDLED;
}

public OnBanPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iBan[ id ][ BAN_ID ], szExpireDate[ MAX_DATE_LENGTH ], iMinutes = g_iBan[ id ][ BAN_MINUTES ];
	
	if( iMinutes == 0 )
	{
		CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], szReason );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
		
		copy( szExpireDate, charsmax( szExpireDate ), "never" );
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		if( iMinutes == 1 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_SINGULAR", g_szName[ id ], g_szName[ iPlayer ], szReason );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_SINGULAR", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate );
		}
		
		else
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_PLURAL", g_szName[ id ], g_szName[ iPlayer ], iMinutes, szReason );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_PLURAL", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes, szReason, szExpireDate );
		}
	}
	
	trim( szExpireDate );
	trim( szReason );
	
	new eData[ PlayerBan ];	
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
	copy( eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ), szExpireDate );
	copy( eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), szReason );
	copy( eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aBans, eData );
	BanPlayer( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szExpireDate, szReason, g_szName[ id ] );
	
	arrayset( g_iBan[ id ], 0, sizeof( g_iBan[ ] ) );
	
	if( is_user_connected( iPlayer ) )
	{
		ScreenShot( iPlayer );
		
		if( ! HasDatePassed( szExpireDate ) || equali( szExpireDate, "never" ) )
		{
			if( equali( szExpireDate, "never" ) )
			{				
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE_NEVER" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			
			else
			{
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE", szExpireDate );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			server_cmd( "kick #%d %L", get_user_userid( iPlayer ), id, "CHECK_CONSOLE_INFO" );
		}
		
		if( is_user_connected( id ) )
		{
			set_task( 0.1, "ReOpenBanMenu", id + TASK_BAN_MENU ); // needs a delay to update players 
		}
	}
	return PLUGIN_HANDLED;
}

public OnSlapPlayerValue( id )
{
	new szValue[ 6 ];
	read_args( szValue, charsmax( szValue ) );
	
	trim( szValue );
	remove_quotes( szValue );
	
	new iValue = str_to_num( szValue );
	
	if( ! is_str_num( szValue ) )
	{
		send_message( id, CHAT, true, "%L", id, "INVALID_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( g_iSlap[ id ][ SLAP_ID ] ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAP_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	g_iSlap[ id ][ SLAP_VALUE ] = iValue;
	client_cmd( id, "messagemode slapPlayerReason" );
	
	return PLUGIN_HANDLED;
}

public OnSlapPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iValue = g_iSlap[ id ][ SLAP_VALUE ], iPlayer = g_iSlap[ id ][ SLAP_ID ];
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAP_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	user_slap( iPlayer, iValue );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "SLAP", g_szName[ id ], g_szName[ iPlayer ], iValue, szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_SLAP", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iValue, szReason );
	
	arrayset( g_iSlap[ id ], 0, sizeof( g_iSlap[ ] ) );

	SlapMenu( id );

	return PLUGIN_HANDLED;
}

public OnSlayPlayerReason( id )
{
	new szReason[ MAX_REASON_LENGTH ];
	read_args( szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	new iPlayer = g_iSlay[ id ][ SLAY_ID ];
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAY_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	user_kill( iPlayer );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "SLAY", g_szName[ id ], g_szName[ iPlayer ], szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_SLAY", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
	
	arrayset( g_iSlay[ id ], 0, sizeof( g_iSlay[ ] ) );

	SlayMenu( id );

	return PLUGIN_HANDLED;
}

///////////////////////////////////////////////////////////////////// END OF MESSAGEMODE /////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////// COMMANDS MENU /////////////////////////////////////////////////////////////////////////////////////////////////////////
@CommandsMenu( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ COMMANDS_MENU_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	if( ( get_gametime( ) - g_fLastOpened[ id ] ) <= 2.0 )
	{
	    send_message( id, CONSOLE, true, "%L", id, "STOP_FLOOD" );
	    return PLUGIN_HANDLED;
	}
	
	g_fLastOpened[ id ] = get_gametime( );
	
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "\rElite Admin System Menu^n\wVersion: \r%s", szVersion );
	
	new iMenu = menu_create( szMenuTitle, "@CommandsMenu_Handler" );
	
	new szMenuItem[ 64 ];
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "KICK_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "BAN_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "ADDBAN_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "ADDGAG_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "GAG_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "UNBAN_MENU" );
	menu_additem( iMenu, szMenuItem );

	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "UNGAG_MENU" );
	menu_additem( iMenu, szMenuItem );

	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "SLAY_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "SLAP_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "TEAM_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "MAP_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	formatex( szMenuItem, charsmax( szMenuItem ), "%L", id, "FREEZE_MENU" );
	menu_additem( iMenu, szMenuItem );
	
	menu_display( id, iMenu, 0 );
	return PLUGIN_HANDLED;
}

KickMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "KICK_MENU" );
	new iMenu = menu_create( szMenuTitle, "@KickMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "h" );
	
	for( new i; i < iNum; i++ )
	{	
		iTempId = iPlayers[ i ];
		
		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

BanMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "BAN_MENU" );
	new iMenu = menu_create( szMenuTitle, "@BanMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

AddBanMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "ADDBAN_MENU" );
	new iMenu = menu_create( szMenuTitle, "@AddBanMenu" );
	
	new szAddNewBan[ 20 ];
	formatex( szAddNewBan, charsmax( szAddNewBan ), "%L", id, "ADD_NEW_BAN" );
	
	menu_additem( iMenu, szAddNewBan );
	
	menu_display( id, iMenu, 0 );
}

AddGagMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "ADDGAG_MENU" );
	new iMenu = menu_create( szMenuTitle, "@AddGagMenu" );
	
	new szAddNewGag[ 20 ];
	formatex( szAddNewGag, charsmax( szAddNewGag ), "%L", id, "ADD_NEW_GAG" );
	
	menu_additem( iMenu, szAddNewGag );
	menu_display( id, iMenu, 0 );
}

GagMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "GAG_MENU" );
	new iMenu = menu_create( szMenuTitle, "@GagMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		if( IsGagged( iTempId ) )
		{
			continue;
		}

		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

UnBanMenu( id )
{
	new szItemName[ 192 ], szInfo[ 128 ], szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "UNBAN_MENU" );
	new iMenu = menu_create( szMenuTitle, "@UnbanMenu" );
	
	menu_setprop( iMenu, MPROP_PERPAGE, 6 );
	
	new eData[ PlayerBan ], bool:bBansFound;
	for( new i; i < ArraySize( g_aBans ); i++ )
	{			
		ArrayGetArray( g_aBans, i, eData );
		
		formatex( szItemName, charsmax( szItemName ), "\r%s \w| \y%s \w| \d%s", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
		formatex( szInfo, charsmax( szInfo ), "^"%s^" ^"%s^" ^"%s^"", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
		
		menu_additem( iMenu, szItemName, szInfo );
		
		bBansFound = true;
	}
	
	if( ! bBansFound )
	{
		CC_SendMessage( id, "%L", id, "NO_BANS_FOUND" );
		return PLUGIN_HANDLED;
	}
	menu_display( id, iMenu, 0 );
	return PLUGIN_HANDLED;
}

UnGagMenu( id )
{
	new szItemName[ 192 ], szInfo[ 128 ], szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "UNGAG_MENU" );
	new iMenu = menu_create( szMenuTitle, "@UnGagMenu" );
	
        menu_setprop( iMenu, MPROP_PERPAGE, 6 );

	new eData[ PlayerGag ], bool:bGagsFound;
	for( new i; i < ArraySize( g_aGags ); i++ )
	{			
		ArrayGetArray( g_aGags, i, eData );
		
		formatex( szItemName, charsmax( szItemName ), "\r%s \w| \y%s \w| \d%s", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
		formatex( szInfo, charsmax( szInfo ), "^"%s^" ^"%s^" ^"%s^"", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
		
		menu_additem( iMenu, szItemName, szInfo );
		
		bGagsFound = true;
	}
	
	if( ! bGagsFound )
	{
		CC_SendMessage( id, "%L", id, "NO_GAGS_FOUND" );
		return PLUGIN_HANDLED;
	}
	menu_display( id, iMenu, 0 );
	return PLUGIN_HANDLED;
}

SlayMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "SLAY_MENU" );
	new iMenu = menu_create( szMenuTitle, "@SlayMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "ach" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

SlapMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "SLAP_MENU" );
	new iMenu = menu_create( szMenuTitle, "@SlapMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "ach" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

TeamMenu( id )
{
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szName[ MAX_NAME_LENGTH + 12 ], szSwitch[ 64 ], szPlayerTeam[ 20 ], szId[ 3 ], iCount, bool:bSwitchAdded;
	get_players( iPlayers, iNum, "ch" );
	
	if( g_iTeamSwitch[ id ] == TEAM_UNASSIGNED )
	{
		get_user_team( id ) == TEAM_T ? ( g_iTeamSwitch[ id ] = TEAM_CT ) : ( g_iTeamSwitch[ id ] = TEAM_T );
		GetTeamName( g_iTeamSwitch[ id ], g_szTeamSwitch[ id ], charsmax( g_szTeamSwitch[ ] ) );
	}
	
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "TEAM_MENU" );
	new iMenu = menu_create( szMenuTitle, "@TeamMenu" );
	
	formatex( szSwitch, charsmax( szSwitch ), "%L: \r%s", id, "CURRENT_SWITCH_TEAM", g_szTeamSwitch[ id ] );

	if( iNum > 6 ) // more than 6 players, if we want switch to always be 7th we have to stop adding items and add the switch
	{
		for( new i; i < iNum; i++ )
		{
			iTempId = iPlayers[ i ];
			
			if( iCount == 6 && ! bSwitchAdded )
			{
				menu_additem( iMenu, szSwitch, "switch" );
				bSwitchAdded = true;
			}
			
			get_user_name( iTempId, szName, charsmax( szName ) ); // leaving this just to be sure, incase someone has 32 chars name, we have to add [CT] [T] [SPECTATOR]
			get_user_team( iTempId, szPlayerTeam, charsmax( szPlayerTeam ) );
			
			num_to_str( iTempId, szId, charsmax( szId ) );
			
			if( ! equali( szPlayerTeam, g_szTeamSwitch[ id ] ) )
			{
				format( szName, charsmax( szName ), "%s \y[%s]", szName, szPlayerTeam );
			}
			
			else
			{
				format( szName, charsmax( szName ), "\d%s [%s]", szName, szPlayerTeam );
			}
			menu_additem( iMenu, szName, szId );
			iCount++;
		}
	}

	else
	{
		if( iNum == 6 ) // if theres 6 players no need to add blanks
		{
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				get_user_name( iTempId, szName, charsmax( szName ) );
				get_user_team( iTempId, szPlayerTeam, charsmax( szPlayerTeam ) );
				
				num_to_str( iTempId, szId, charsmax( szId ) );

				if( ! equali( szPlayerTeam, g_szTeamSwitch[ id ] ) )
				{
					format( szName, charsmax( szName ), "%s \y[%s]", szName, szPlayerTeam );
				}
				
				else
				{
					format( szName, charsmax( szName ), "\d%s [%s]", szName, szPlayerTeam );
				}
				menu_additem( iMenu, szName, szId );
			}
			menu_additem( iMenu, szSwitch, "switch" );
		}
		
		else // need to add blanks
		{
			for( new i; i < iNum; i++ ) // add all players to the list
			{
				iTempId = iPlayers[ i ];
				
				get_user_name( iTempId, szName, charsmax( szName ) );
				get_user_team( iTempId, szPlayerTeam, charsmax( szPlayerTeam ) );
				
				num_to_str( iTempId, szId, charsmax( szId ) );
				
				if( ! equali( szPlayerTeam, g_szTeamSwitch[ id ] ) )
				{
					format( szName, charsmax( szName ), "%s \y[%s]", szName, szPlayerTeam );
				}
				
				else
				{
					format( szName, charsmax( szName ), "\d%s [%s]", szName, szPlayerTeam );
				}
				menu_additem( iMenu, szName, szId );
			}
			new iCalculateBlanks = 6 - iNum; // calculate how many blanks we need
			for( new i = 1; i <= iCalculateBlanks; i++ )
			{
				menu_addblank( iMenu, 0 ); // add the blanks
			}
			menu_additem( iMenu, szSwitch, "switch" ); // add switch
		}
	}
	menu_display( id, iMenu, 0 );
}	

MapMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "MAP_MENU" );
	new iMenu = menu_create( szMenuTitle, "@MapMenu" );
	
	new szMapName[ MAX_MAP_NAME_LENGTH ];
	for( new i; i < ArraySize( g_aMaps ); i++ )
	{
		ArrayGetString( g_aMaps, i, szMapName, charsmax( szMapName ) );

		menu_additem( iMenu, szMapName, szMapName );
	}
	menu_display( id, iMenu, 0 );
}			

FreezeMenu( id )
{
	new szMenuTitle[ 64 ];
	formatex( szMenuTitle, charsmax( szMenuTitle ), "%L", id, "FREEZE_MENU" );
	new iMenu = menu_create( szMenuTitle, "@FreezeMenu" );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szId[ 3 ];
	get_players( iPlayers, iNum, "ach" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		num_to_str( iTempId, szId, charsmax( szId ) );
		menu_additem( iMenu, g_szName[ iTempId ], szId );
	}
	menu_display( id, iMenu, 0 );
}

@CommandsMenu_Handler( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	switch( iItem )
	{	
	case 0:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ KICK_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			KickMenu( id );
		}
		
	case 1:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ BAN_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			BanMenu( id );
		}
		
	case 2:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ ADD_BAN_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			AddBanMenu( id );
		}
		
	case 3:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ ADD_GAG_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			AddGagMenu( id );
		}
		
	case 4:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ GAG_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			GagMenu( id );
		}
		
	case 5:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ UNBAN_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			UnBanMenu( id );
		}
		
	case 6:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ UNGAG_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			UnGagMenu( id );
		}	
		
	case 7:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ SLAY_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			SlayMenu( id );
		}
		
	case 8:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ SLAP_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			SlapMenu( id );
		}
		
	case 9:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ TEAM_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			TeamMenu( id );
		}
		
	case 10:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ MAP_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			
			MapMenu( id );
		}
		
	case 11:
		{
			if( ~ get_user_flags( id ) & g_iConfig[ FREEZE_FLAG ] )
			{
				send_message( id, CHAT, true, "%L", id, "NO_ACCESS_MENU" );
				menu_destroy( iMenu );
				
				return PLUGIN_HANDLED;
			}
			FreezeMenu( id );
		}
	}
	menu_destroy( iMenu );
	return PLUGIN_HANDLED;
}

GetTeamName( iTeam, szOutput[ ], iSize )
{
	switch( iTeam )
	{
	case TEAM_T:
		{
			copy( szOutput, iSize, "TERRORIST" );
		}

	case TEAM_CT:
		{
			copy( szOutput, iSize, "CT" );
		}

	case TEAM_SPEC:
		{
			copy( szOutput, iSize, "SPECTATOR" );
		}
	}
}
///////////////////////////////////////////////////////////////////// END OF COMMANDS MENU /////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////// COMMAND MENUS /////////////////////////////////////////////////////////////////////////////////////////////////////////

@MapMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szMap[ MAX_MAP_NAME_LENGTH ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szMap, charsmax( szMap ), _, _, iCallback );
	menu_destroy( iMenu );
	
	if( ! is_map_valid( szMap ) )
	{
		CC_SendMessage( id, "%L", id, "MAP_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	new szModName[ 10 ];
	get_modname( szModName, charsmax( szModName ) );
	
	if( ! equali( szModName, "zp" ) )
	{
		message_begin( MSG_ALL, SVC_INTERMISSION );
		message_end( );
	}
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "MAP_CHANGE", g_szName[ id ], szMap );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_MAP_CHANGE", g_szName[ id ], g_szAuthId[ id ], szMap );
	
	set_task( 2.0, "OnMapChange", _, szMap, ( strlen( szMap ) + 1 ) );
	return PLUGIN_HANDLED;
}

@SlapMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAP_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	g_iSlap[ id ][ SLAP_ID ] = iPlayer;	
	client_cmd( id, "messagemode slapPlayerValue" );
	
	return PLUGIN_HANDLED;
}

@TeamMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		g_iTeamSwitch[ id ] = 0;
		arrayset( g_szTeamSwitch[ id ], 0, sizeof( g_szTeamSwitch[ ] ) );
		
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}

	new iAccess, szInfo[ 10 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szInfo, charsmax( szInfo ), _, _, iCallback );
	menu_destroy( iMenu );
	
	if( equali( szInfo, "switch" ) )
	{
		// if it's TEAM_SPEC (3), reset back to TEAM_T (1), otherwise increase by 1 (TEAM_T becomes TEAM_CT, TEAM_CT becomes TEAM_SPEC)
		switch( g_iTeamSwitch[ id ] )
		{
		case TEAM_T:
			{
				g_iTeamSwitch[ id ] = TEAM_CT;
			}
			
		case TEAM_CT:
			{
				g_iTeamSwitch[ id ] = TEAM_SPEC;
			}
			
		case TEAM_SPEC:
			{
				g_iTeamSwitch[ id ] = TEAM_T;
			}
		}
		
		GetTeamName( g_iTeamSwitch[ id ], g_szTeamSwitch[ id ], charsmax( g_szTeamSwitch[ ] ) );
		TeamMenu( id );
		
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = str_to_num( szInfo );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}

	new szTeam[ 20 ];
	get_user_team( iPlayer, szTeam, charsmax( szTeam ) );
	
	if( equali( szTeam, g_szTeamSwitch[ id ] ) ) // same team, reopen menu
	{
		TeamMenu( id );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );

	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	new szTeamFinal[ 20 ];
	if( equali( g_szTeamSwitch[ id ], "TERRORIST" ) )
	{
		eas_set_user_team( iPlayer, 1 );
		copy( szTeamFinal, charsmax( szTeamFinal ), "Terrorist" );
	}
	
	else if( equali( g_szTeamSwitch[ id ], "CT" ) )
	{
		eas_set_user_team( iPlayer, 2 );
		copy( szTeamFinal, charsmax( szTeamFinal ), "Counter-Terrorist" );
	}
	
	else if( equali( g_szTeamSwitch[ id ], "SPECTATOR" ) )
	{
		eas_set_user_team( iPlayer, 3 );
		copy( szTeamFinal, charsmax( szTeamFinal ), "Spectator" );
	}
	
	CC_SendMatched( 0, iPlayer, "%L", LANG_PLAYER, "TEAM_CHANGE", g_szName[ id ], g_szName[ iPlayer ], szTeamFinal );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_TEAM_CHANGE", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szTeamFinal );
	
	TeamMenu( id );
	return PLUGIN_HANDLED;
}

@FreezeMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "FREEZE_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	new iValue = g_bFrozen[ iPlayer ] ? 0 : 1;
	FreezePlayer( iPlayer, iValue );
	
	switch( iValue )
	{
	case 0:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "FREEZE_UNSET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "FREEZE_UNSET", g_szName[ id ], g_szName[ iPlayer ] );
		}
		
	case 1:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "FREEZE_SET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "FREEZE_SET", g_szName[ id ], g_szName[ iPlayer ] );
		}
	}
	
	FreezeMenu( id );
	return PLUGIN_HANDLED;
}

@SlayMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAY_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	g_iSlay[ id ][ SLAY_ID ] = iPlayer;
	client_cmd( id, "messagemode slayPlayerReason" );
	
	return PLUGIN_HANDLED;
}

@UnbanMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szInfo[ 128 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szInfo, charsmax( szInfo ), _, _, iCallback );
	menu_destroy( iMenu );
	
	parse( szInfo, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
	
	trim( szName );
	trim( szSteamId );
	trim( szIP );
	
	UnbanPlayer2( szName, szSteamId, szIP );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "UNBANNED", g_szName[ id ], szName, szSteamId, szIP );		
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_UNBANNED", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP );
	
	if( ArraySize( g_aBans ) )
	{
		UnBanMenu( id );
	}
	
	else
	{
		@CommandsMenu( id );
	}
	return PLUGIN_HANDLED;
}

@UnGagMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szInfo[ 128 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szInfo, charsmax( szInfo ), _, _, iCallback );
	menu_destroy( iMenu );
	
	parse( szInfo, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
	
	trim( szName );
	trim( szSteamId );
	trim( szIP );
	
	UnGagPlayer2( szName, szSteamId, szIP );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "UNGAGGED", g_szName[ id ], szName );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_UNGAGGED", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP );
	
	if( ArraySize( g_aGags ) )
	{
		UnGagMenu( id );
	}
	
	else
	{
		@CommandsMenu( id );
	}
	return PLUGIN_HANDLED;
}

@AddBanMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}

	switch( iItem )
	{
	case 0:
		{
			client_cmd( id, "messagemode addBanPlayerName" );
		}
	}
	menu_destroy( iMenu );
	return PLUGIN_HANDLED;
}

@AddGagMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	else if( iItem == 0 )
	{
		client_cmd( id, "messagemode addgagPlayerName" );
	}
	menu_destroy( iMenu );
	return PLUGIN_HANDLED;
}

@KickMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	g_iKick[ id ] = iPlayer;
	client_cmd( id, "messagemode kickReason" );

	return PLUGIN_HANDLED;
}

@BanMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}

	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	g_iBan[ id ][ BAN_ID ] = iPlayer;
	client_cmd( id, "messagemode banPlayerMinutes" );

	return PLUGIN_HANDLED;
}

@GagMenu( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	new iAccess, szId[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szId, charsmax( szId ), _, _, iCallback );
	menu_destroy( iMenu );
	
	new iPlayer = str_to_num( szId );
	
	if( ! is_user_connected( iPlayer ) )
	{
		CC_SendMessage( id, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( IsGagged( iPlayer ) )
	{
		send_message( id, CHAT, false, "%L", id, "PLAYER_ALREADY_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	new iImmunityLevel = GetImmunityLevel( id );
	new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
	
	if( iImmunityLevel < iImmunityLevelTarget )
	{
		CC_SendMessage( id, "%L", id, "CANT_PERFORM_IMMUNITY" );
		return PLUGIN_HANDLED;
	}
	
	g_iGag[ id ][ GAG_ID ] = iPlayer;
	client_cmd( id, "messagemode gagPlayerMinutes" );

	return PLUGIN_HANDLED;
}

///////////////////////////////////////////////////////////////////// END OF COMMAND MENUS /////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////// CONSOLE COMMANDS /////////////////////////////////////////////////////////////////////////////////////////////////////////////

@ExtendGag( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ GAG_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szMinutes[ 9 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szMinutes, charsmax( szMinutes ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_EXTEND_GAG_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	if( !IsGagged( iPlayer ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	new iMinutes = str_to_num( szMinutes );
	
	new eData[ PlayerGag ];
	for( new i; i < ArraySize( g_aGags ); i++ )
	{
		ArrayGetArray( g_aGags, i, eData );
		
		if( equali( szName, eData[ Player_Name ] ) )
		{
			AddMinutesToDate( eData[ Player_GagExpire ], iMinutes, eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ) );
			
			ArraySetArray( g_aGags, i, eData );
			UpdateGagExpireDate( eData[ Player_Name ], eData[ Player_GagExpire ] );
			
			break;
		}
	}
	
	send_message( id, LOG, true, "%L", id, "EXTENDED_GAG", g_szName[ id ], g_szAuthId[ id ], iMinutes, g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
	CC_SendMessage( 0, "%L", id, "EXTENDED_GAG", g_szName[ id ], g_szName[ iPlayer ], iMinutes );
	
	return PLUGIN_HANDLED;
}

@ReduceGag( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ GAG_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szMinutes[ 9 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szMinutes, charsmax( szMinutes ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_REDUCE_GAG_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	if( !IsGagged( iPlayer ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	new iMinutes = str_to_num( szMinutes );
	
	new eData[ PlayerGag ];
	for( new i; i < ArraySize( g_aGags ); i++ )
	{
		ArrayGetArray( g_aGags, i, eData );
		
		if( equali( szName, eData[ Player_Name ] ) )
		{
			RemoveMinutesFromDate( eData[ Player_GagExpire ], iMinutes, eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ) );
			
			ArraySetArray( g_aGags, i, eData );
			UpdateGagExpireDate( eData[ Player_Name ], eData[ Player_GagExpire ] );
			
			break;
		}
	}
	
	send_message( id, LOG, true, "%L", id, "LOG_REDUCED_GAG", g_szName[ id ], g_szAuthId[ id ], iMinutes, g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
	CC_SendMessage( 0, "%L", id, "REDUCED_GAG", g_szName[ id ], g_szName[ iPlayer ], iMinutes );
	
	return PLUGIN_HANDLED;
}

@Gag( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ GAG_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ], szMinutes[ 8 ], szFlags[ 5 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szMinutes, charsmax( szMinutes ) );
	read_argv( 3, szReason, charsmax( szReason ) );
	read_argv( 4, szFlags, charsmax( szFlags ) );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_GAG_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "bl", szName );
	
	if( ! iPlayer )
	{
		iPlayer = find_player( "cl", szName );
		
		if( ! iPlayer )
		{
			iPlayer = find_player( "dl", szName );
			
			if( ! iPlayer )
			{
				send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
				return PLUGIN_HANDLED;
			}
		}
	}
	
	if( ! szFlags[ 0 ] )
	{
		copy( szFlags, charsmax( szFlags ), "sv" );
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	if( IsGagged( iPlayer ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_ALREADY_GAGGED" );
		return PLUGIN_HANDLED;
	}
	
	if( ! equali( szFlags, "sv" ) && ! equali( szFlags, "vs" ) && ! equali( szFlags, "s" ) && ! equali( szFlags, "v" ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_FLAGS" );
		return PLUGIN_HANDLED;
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ]
	
	new iMinutes = str_to_num( szMinutes );
	
	if( iMinutes == 0 )
	{
		CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], szFlags, szReason );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szFlags );
		
		copy( szExpireDate, charsmax( szExpireDate ), "never" );
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		if( iMinutes == 1 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_SINGULAR", g_szName[ id ], g_szName[ iPlayer ], szReason, szFlags );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_SINGULAR", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate, szFlags, iMinutes );
		}
		
		else
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GAGGED_PLURAL", g_szName[ id ], g_szName[ iPlayer ], iMinutes, szReason, szFlags );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GAGGED_PLURAL", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate, szFlags, iMinutes );
		}
	}
	
	trim( szExpireDate );
	trim( szReason );
	
	new eData[ PlayerGag ];	
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
	copy( eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), szExpireDate );
	copy( eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), szReason );
	copy( eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), szFlags );
	copy( eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aGags, eData );
	
	if( ( szFlags[ 0 ] == 'v' || szFlags[ 1 ] == 'v' ) && is_user_connected( iPlayer ) )
	{
		set_speak( iPlayer, SPEAK_MUTED );
	}
	
	GagPlayer( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szFlags, szExpireDate, g_szName[ id ] );
	
	return PLUGIN_HANDLED;
}

@UnGag( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ UNGAG_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szIdentity[ MAX_AUTHID_LENGTH ];
	read_argv( 1, szIdentity, charsmax( szIdentity ) );
	
	if( read_argc( ) != 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_UNGAG_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new eData[ PlayerGag ], bool:bFoundPlayer;
	for( new i; i < ArraySize( g_aGags ); i++ )
	{
		ArrayGetArray( g_aGags, i, eData );
		
		if( equali( szIdentity, eData[ Player_Name ] ) || equali( szIdentity, eData[ Player_SteamId ] ) || equali( szIdentity, eData[ Player_IP ] ) )
		{
			UnGagPlayer( szIdentity );
			
			CC_SendMessage( 0, "%L", LANG_PLAYER, "UNGAGGED", g_szName[ id ], eData[ Player_Name ] );
			
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_UNGAGGED", g_szName[ id ], g_szAuthId[ id ], g_szIp[ id ], eData[ Player_Name ], eData[ Player_SteamID ], eData[ Player_IP ] );
			bFoundPlayer = true;
			
			break;
		}
	}
	
	if( ! bFoundPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
	}
	
	return PLUGIN_HANDLED;
}

@AdminSay( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ SAY_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szText[ MAX_TEXT_LENGTH ];
	read_args( szText, charsmax( szText ) );

	trim( szText );
	remove_quotes( szText );
	
	if( ! szText[ 0 ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	CC_SendMessage( 0, "&x00%L", LANG_PLAYER, "ADMIN_SAY", g_szName[ id ], szText );
	return PLUGIN_HANDLED;
}

@AdminChat( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ CHAT_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szText[ MAX_TEXT_LENGTH ];
	read_args( szText, charsmax( szText ) );

	trim( szText );
	remove_quotes( szText );
	
	if( ! szText[ 0 ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "EMPTY_STRING" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayers[ 32 ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		if( get_user_flags( iTempId ) & g_iConfig[ CHAT_FLAG ] )
		{
			CC_SendMatched( iTempId, id, "&x00%L", iTempId, "ADMIN_CHAT_SAY", g_szName[ id ], szText );
		}
	}
	return PLUGIN_HANDLED;
}

@Tsay( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ CHAT_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szColor[ 12 ], szText[ MAX_TEXT_LENGTH ], szPrivate[ 3 ], bool:bPrivate;
	read_argv( 1, szColor, charsmax( szColor ) );
	read_argv( 2, szText, charsmax( szText ) );
	read_argv( 3, szPrivate, charsmax( szPrivate ) );
	
	if( read_argc( ) < 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_TSAY_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iColor[ 3 ] = -1;
	if( ! szColor[ 0 ] )
	{
		iColor[ 0 ] = 0;
		iColor[ 1 ] = 255;
		iColor[ 2 ] = 0;
	}
	
	else
	{
		new bool:bColor;
		for( new i; i < sizeof g_szHudColors; i++ )
		{
			if( equali( szColor, g_szHudColors[ i ][ 0 ] ) )
			{
				iColor[ 0 ] = g_szHudColors[ i ][ 1 ][ 0 ];
				iColor[ 1 ] = g_szHudColors[ i ][ 1 ][ 1 ];
				iColor[ 2 ] = g_szHudColors[ i ][ 1 ][ 2 ];
				
				bColor = true;
				break;
			}
		}
		
		if( ! bColor )
		{
			iColor[ 0 ] = 0;
			iColor[ 1 ] = 255;
			iColor[ 2 ] = 0;
		}
	}
	
	if( ! szPrivate[ 0 ] || ! is_str_num( szPrivate ) || !( 0 <= str_to_num( szPrivate ) <= 1 ) )
	{
		bPrivate = false;
	}
	
	if( str_to_num( szPrivate ) == 1 )
	{
		bPrivate = true;
	}
	
	set_hudmessage( iColor[ 0 ], iColor[ 1 ], iColor[ 2 ], 0.02, 0.70, 0, 10.0, 10.0 );
	
	bPrivate ? show_hudmessage( 0, "%s", szText ) : show_hudmessage( 0, "%s: %s", g_szName[ id ], szText )
	
	send_message( 0, LOG, false, "%L", id, "TSAY_LOG", g_szName[ id ], g_szAuthId[ id ], g_szIp[ id ], szText ); 
	return PLUGIN_HANDLED;
}

@VoteMap( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ VOTEMAP_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	if( g_bMapVoting )
	{
		send_message( id, CONSOLE, true, "%L", id, "VOTE_ONGOING" );
		return PLUGIN_HANDLED;
	}
	
	new szMap1[ 32 ], szMap2[ 32 ], szMap3[ 32 ];
	read_argv( 1, szMap1, charsmax( szMap1 ) );
	read_argv( 2, szMap2, charsmax( szMap2 ) );
	read_argv( 3, szMap3, charsmax( szMap3 ) );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_VOTEMAP_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iEmpty;
	if( ! szMap1[ 0 ] )
	{
		iEmpty++;
	}
	
	if( ! szMap2[ 0 ] )
	{
		iEmpty++;
	}
	
	if( ! szMap3[ 0 ] )
	{
		iEmpty++;
	}
	
	if( iEmpty >= 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "VOTE_MISSING_ANSWERS" );
		return PLUGIN_HANDLED;
	}
	
	if( szMap1[ 0 ] && ! is_map_valid( szMap1 ) || szMap2[ 0 ] && ! is_map_valid( szMap2 ) || szMap3[ 0 ] && ! is_map_valid( szMap3 ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "VOTE_INVALID_MAP" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayers[ 32 ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	g_bMapVoting = true;
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		g_iVoteMapMenu[ iTempId ] = menu_create( "Vote next map", "OnVoteMapMenu_Handler" );
		
		if( szMap1[ 0 ] )
		{
			menu_additem( g_iVoteMapMenu[ iTempId ], szMap1, "0" );
			copy( g_szVoteMapOptions[ 0 ], charsmax( g_szVoteMapOptions[ ] ), szMap1 );
		}
		
		if( szMap2[ 0 ] )
		{
			menu_additem( g_iVoteMapMenu[ iTempId ], szMap2, "1" );
			copy( g_szVoteMapOptions[ 1 ], charsmax( g_szVoteMapOptions[ ] ), szMap2 );
		}
		
		if( szMap3[ 0 ] )
		{
			menu_additem( g_iVoteMapMenu[ iTempId ], szMap3, "2" );
			copy( g_szVoteMapOptions[ 2 ], charsmax( g_szVoteMapOptions[ ] ), szMap3 );
		}
		menu_display( iTempId, g_iVoteMapMenu[ iTempId ], 0 );
	}
	CC_SendMessage( 0, "%L", LANG_PLAYER, "VOTE_MAP_TRIGGER", g_szName[ id ] );
	
	g_iVoteMapTriggeredId = id;
	copy( g_szVoteMapTriggeredSteamId, charsmax( g_szVoteMapTriggeredSteamId ), g_szAuthId[ id ] );
	
	set_task( g_iConfig[ VOTE_MAP_TIME ], "OnVoteMapEnd" );
	return PLUGIN_HANDLED;
}

public OnVoteMapMenu_Handler( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT || ! g_bMapVoting )
	{
		g_iVoteMapOption[ id ] = 0;
		
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	new iAccess, szItem[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szItem, charsmax( szItem ), _, _, iCallback );
	menu_destroy( iMenu );
	
	g_iVoteMapOption[ id ] = str_to_num( szItem );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "PLAYER_VOTE", g_szName[ id ], iItem + 1 );
	
	return PLUGIN_HANDLED;
}

public OnVoteMapEnd( )
{
	g_bMapVoting = false;

	new iVotes[ 3 ], iPlayers[ 32 ], iNum, iTempId, i;
	get_players( iPlayers, iNum, "ch" );
	
	for( i = 0; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		iVotes[ g_iVoteMapOption[ iTempId ] ]++;
	}
	
	new iMax = 0, iFinal = 0;
	for( i = 0; i < 3; i++ )
	{
		if( iVotes[ i ] > iMax )
		{
			iMax = iVotes[ i ];
			iFinal = i;
		}
	}
	CC_SendMessage( 0, "%L", LANG_PLAYER, "VOTEMAP_RESULTS", g_szVoteMapOptions[ iFinal ] );
	
	new iKey, iItem;
	for( i = 0; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		g_iVoteMapOption[ iTempId ] = 0;
		
		if( get_user_menu( iTempId, iKey, iItem ) == g_iVoteMapMenu[ iTempId ] )
		{
			menu_destroy( g_iVoteMapMenu[ iTempId ] );
		}
		g_iVoteMapMenu[ iTempId ] = 0;
	}
	
	if( is_user_connected( g_iVoteMapTriggeredId ) ) // check to see whether the person who triggered vote is still connected
	{
		if( equal( g_szVoteMapTriggeredSteamId, g_szAuthId[ g_iVoteMapTriggeredId ] ) ) // check to see whether he's the same person, we don't want to ask random people about changing map
		{
			new szTitle[ 64 ];
			formatex( szTitle, charsmax( szTitle ), "Change map to %s", g_szVoteMapOptions[ iFinal ] );
			
			new iMenu = menu_create( szTitle, "ChangeMapHandler" );
			
			menu_additem( iMenu, "Yes" );
			menu_additem( iMenu, "No" );
			
			menu_display( g_iVoteMapTriggeredId, iMenu, 0 );
		}
	}
	
	copy( g_szVoteMapFinalOption, charsmax( g_szVoteMapFinalOption ), g_szVoteMapOptions[ iFinal ] );
	
	arrayset( g_szVoteMapOptions[ 0 ], 0, sizeof( g_szVoteMapOptions[ ] ) );
	arrayset( g_szVoteMapOptions[ 1 ], 0, sizeof( g_szVoteMapOptions[ ] ) );
	arrayset( g_szVoteMapOptions[ 2 ], 0, sizeof( g_szVoteMapOptions[ ] ) );
	
	return PLUGIN_HANDLED;
}

public ChangeMapHandler( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT )
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	
	switch( iItem )
	{
	case 0:
		{
			set_task( 2.0, "OnVoteMapChange" );
		}
		
	case 1:
		{
			arrayset( g_szVoteMapFinalOption, 0, sizeof( g_szVoteMapFinalOption[ ] ) );
		}
	}
	menu_destroy( iMenu );
	return PLUGIN_HANDLED;
}

public OnVoteMapChange( )
{
	new szModName[ 10 ];
	get_modname( szModName, charsmax( szModName ) );
	
	if( ! equali( szModName, "zp" ) )
	{
		message_begin( MSG_ALL, SVC_INTERMISSION );
		message_end( );
	}
	server_cmd( "changelevel %s", g_szVoteMapFinalOption );
	arrayset( g_szVoteMapFinalOption, 0, sizeof( g_szVoteMapFinalOption[ ] ) );
}

@Vote( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ VOTE_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	if( g_bVoting )
	{
		send_message( id, CONSOLE, true, "%L", id, "VOTE_ONGOING" );
		return PLUGIN_HANDLED;
	}
	
	new szQuestion[ 32 ], szOption1[ 32 ], szOption2[ 32 ], szOption3[ 32 ];
	read_argv( 1, szQuestion, charsmax( szQuestion ) );
	read_argv( 2, szOption1, charsmax( szOption1 ) );
	read_argv( 3, szOption2, charsmax( szOption2 ) );
	read_argv( 4, szOption3, charsmax( szOption3 ) );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_VOTE_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	if( ! szOption1[ 0 ] && ! szOption2[ 0 ] && ! szOption3[ 0 ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "VOTE_MISSING_ANSWERS" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayers[ 32 ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	copy( g_szVoteQuestion, charsmax( g_szVoteQuestion ), szQuestion );
	
	g_bVoting = true;
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		g_iVoteMenu[ iTempId ] = menu_create( szQuestion, "OnVoteMenu_Handler" );
		
		if( szOption1[ 0 ] )
		{
			menu_additem( g_iVoteMenu[ iTempId ], szOption1, "0" );
			copy( g_szVoteOptions[ 0 ], charsmax( g_szVoteOptions[ ] ), szOption1 );
		}
		
		if( szOption2[ 0 ] )
		{
			menu_additem( g_iVoteMenu[ iTempId ], szOption2, "1" );
			copy( g_szVoteOptions[ 1 ], charsmax( g_szVoteOptions[ ] ), szOption2 );
		}
		
		if( szOption3[ 0 ] )
		{
			menu_additem( g_iVoteMenu[ iTempId ], szOption3, "2" );
			copy( g_szVoteOptions[ 2 ], charsmax( g_szVoteOptions[ ] ), szOption3 );
		}
		menu_display( iTempId, g_iVoteMenu[ iTempId ], 0 );
	}
	set_task( g_iConfig[ VOTE_TIME ], "OnVoteEnd" );
	return PLUGIN_HANDLED;
}

public OnVoteMenu_Handler( id, iMenu, iItem )
{
	if( iItem == MENU_EXIT || ! g_bVoting )
	{
		g_iVoteOption[ id ] = 0;
		
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
	new iAccess, szItem[ 3 ], iCallback;
	menu_item_getinfo( iMenu, iItem, iAccess, szItem, charsmax( szItem ), _, _, iCallback );
	menu_destroy( iMenu );
	
	g_iVoteOption[ id ] = str_to_num( szItem );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "PLAYER_VOTE", g_szName[ id ], iItem + 1 );
	
	return PLUGIN_HANDLED;
}

public OnVoteEnd( )
{
	g_bVoting = false;

	new iVotes[ 3 ], iPlayers[ 32 ], iNum, iTempId, i;
	get_players( iPlayers, iNum, "ch" );
	
	for( i = 0; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		iVotes[ g_iVoteOption[ iTempId ] ]++;
	}
	
	new iMax = 0, iFinal = 0;
	for( i = 0; i < 3; i++ )
	{
		if( iVotes[ i ] > iMax )
		{
			iMax = iVotes[ i ];
			iFinal = i;
		}
	}
	CC_SendMessage( 0, "%L", LANG_PLAYER, "VOTE_RESULTS", g_szVoteOptions[ iFinal ], g_szVoteQuestion );
	
	new iKey, iItem;
	for( i = 0; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		g_iVoteOption[ iTempId ] = 0;
		
		if( get_user_menu( iTempId, iKey, iItem ) == g_iVoteMenu[ iTempId ] )
		{
			menu_destroy( g_iVoteMenu[ iTempId ] );
		}
		g_iVoteMenu[ iTempId ] = 0;
	}
	arrayset( g_szVoteOptions[ 0 ], 0, sizeof( g_szVoteOptions[ ] ) );
	arrayset( g_szVoteOptions[ 1 ], 0, sizeof( g_szVoteOptions[ ] ) );
	arrayset( g_szVoteOptions[ 2 ], 0, sizeof( g_szVoteOptions[ ] ) );
	arrayset( g_szVoteQuestion, 0, sizeof( g_szVoteQuestion ) );
}

@Warn( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ WARN_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szReason, charsmax( szReason ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_WARN_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "WARN_OTHERS", g_szName[ id ], g_szName[ iPlayer ], szReason );
	
	new iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	CC_SendMessage( iPlayer, "%L", iPlayer, "WARN_HIM", g_szName[ id ], szReason );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		if( iTempId != iPlayer )
		{
			CC_SendMessage( iTempId, "%L", iTempId, "WARN_OTHERS", g_szName[ id ], g_szName[ iPlayer ], szReason );
		}
	}
	
	return PLUGIN_HANDLED;
}

@Noclip( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ NOCLIP_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szValue[ 3 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szValue, charsmax( szValue ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_NOCLIP_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "NOCLIP_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iValue = str_to_num( szValue );
	
	if( iValue < 0 || iValue > 1 )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_NOCLIP_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	set_user_noclip( iPlayer, iValue );
	
	switch( iValue )
	{
	case 0:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "NOCLIP_UNSET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "NOCLIP_UNSET", g_szName[ id ], g_szName[ iPlayer ] );
		}
		
	case 1:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_NOCLIP_SET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "NOCLIP_SET", g_szName[ id ], g_szName[ iPlayer ] );
		}
	}
	
	return PLUGIN_HANDLED;
}

@Godmode( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ GODMODE_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szValue[ 3 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szValue, charsmax( szValue ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_GODMODE_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "GODMODE_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iValue = str_to_num( szValue );
	
	if( iValue < 0 || iValue > 1 )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_GODMODE_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	set_user_godmode( iPlayer, iValue );

	switch( iValue )
	{
	case 0:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GODMODE_UNSET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GODMODE_UNSET", g_szName[ id ], g_szName[ iPlayer ] );
		}
		
	case 1:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_GODMODE_SET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "GODMODE_SET", g_szName[ id ], g_szName[ iPlayer ] );
		}
	}
	
	return PLUGIN_HANDLED;
}

@Freeze( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ FREEZE_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szValue[ 3 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szValue, charsmax( szValue ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_FREEZE_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "FREEZE_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iValue = str_to_num( szValue );
	
	if( iValue < 0 || iValue > 1 )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_FREEZE_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	FreezePlayer( iPlayer, iValue );
	
	switch( iValue )
	{
	case 0:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "FREEZE_UNSET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "FREEZE_UNSET", g_szName[ id ], g_szName[ iPlayer ] );
		}
		
	case 1:
		{
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "FREEZE_SET", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			CC_SendMessage( 0, "%L", LANG_PLAYER, "FREEZE_SET", g_szName[ id ], g_szName[ iPlayer ] );
		}
	}
	
	return PLUGIN_HANDLED;
}

@Screenshot( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ SCREENSHOT_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	
	if( read_argc( ) != 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_SCREENSHOT_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	ScreenShot( iPlayer );
	
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_SCREENSHOT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
	CC_SendMessage( 0, "%L", LANG_PLAYER, "SCREENSHOT", g_szName[ id ], g_szName[ iPlayer ] );
	
	return PLUGIN_HANDLED;
}

@Help( id )
{
	new szArg1[ 8 ], iFlags = get_user_flags( id );
	new iStart = read_argv( 1, szArg1, 7 ) ? str_to_num( szArg1 ) : 1;
	new iHelpAmount = 10;
	
	// HACK: ADMIN_ADMIN is never set as a user's actual flags, so those types of commands never show
	if( iFlags > 0 && !( iFlags & ADMIN_USER ) )
	{
		iFlags |= ADMIN_ADMIN;
	}
	
	if( id == 0 && read_argc( ) == 3 )
	iHelpAmount = read_argv( 2, szArg1, 7 ) ? str_to_num( szArg1 ) : 10;

	if( --iStart < 0 )
	iStart = 0;

	new iClcmdNum = get_concmdsnum( iFlags, id );

	if( iStart >= iClcmdNum )
	iStart = iClcmdNum - 1;

	console_print( id, "^n----- %L -----", id, "HELP_COMS" );
	
	new szInfo[ 128 ], szCmd[ 32 ], eFlags;
	new iEnd = iStart + iHelpAmount // HELPAMOUNT

	if( iEnd > iClcmdNum )
	iEnd = iClcmdNum;

	for( new i = iStart; i < iEnd; i++ )
	{
		get_concmd( i, szCmd, charsmax( szCmd ), eFlags, szInfo, charsmax( szInfo ), iFlags, id );
		console_print( id, "%3d: %s %s", i + 1, szCmd, szInfo );
	}
	
	console_print( id, "----- %L -----", id, "HELP_ENTRIES", iStart + 1, iEnd, iClcmdNum );

	if( iEnd < iClcmdNum )
	console_print( id, "----- %L -----", id, "HELP_USE_MORE", iEnd + 1 );
	
	else
	console_print( id, "----- %L -----", id, "HELP_USE_BEGIN" );

	return PLUGIN_HANDLED;
}

@Plugins( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ PLUGINS_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	if( id == 0 ) // If server executes redirect this to "amxx plugins" for more in depth output
	{
		server_cmd( "amxx plugins" );
		server_exec( );
		
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szVersion[ 8 ], szAuthor[ MAX_NAME_LENGTH ], szFileName[ 64 ], szStatus[ 32 ];
	new iStartId, iEndId;

	new szTemp[ 128 ];

	new iNum = get_pluginsnum( );
	
	if( read_argc( ) > 1 )
	{
		read_argv( 1, szTemp, charsmax( szTemp ) );
		iStartId = str_to_num( szTemp ) - 1; // zero-based
	}

	iEndId = min( iStartId + 10, iNum );
	
	new iRunning;
	
	console_print( id, "%L", id, "CURRENTLY_LOADED" );
	
	new i = iStartId;
	
	while( i < iEndId )
	{
		get_plugin( i++, szFileName, charsmax( szFileName ), szName, charsmax( szName ), szVersion, charsmax( szVersion ), szAuthor, charsmax( szAuthor ), szStatus, charsmax( szStatus ) );
		console_print( id, "%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s", szName, szVersion, szAuthor, szFileName, szStatus );
		
		if( szStatus[ 0 ] == 'd' || szStatus[ 0 ] == 'r') // "debug" or "running"
		{
			iRunning++;
		}
	}
	console_print( id, "%d %L, %d %L", iEndId-iStartId, id, "PLUGINS", iRunning, id, "RUNNING" );
	console_print( id, "----- Entries %d - %d of %d -----", iStartId + 1, iEndId, iNum );
	
	if( iEndId < iNum )
	{
		formatex( szTemp, charsmax( szTemp ),"----- %L -----", id, "HELP_USE_MORE", iEndId + 1);
		replace_all( szTemp, charsmax( szTemp ), "amx_help", "amx_plugins" );
		console_print( id, "%s", szTemp );
	}
	
	else
	{
		formatex( szTemp, charsmax( szTemp ),"----- %L -----", id, "HELP_USE_BEGIN" );
		replace_all( szTemp, charsmax( szTemp ), "amx_help", "amx_plugins" );
		console_print( id, "%s", szTemp );
	}

	return PLUGIN_HANDLED;
}

@Modules( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ MODULES_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szVersion[ 8 ], szAuthor[ MAX_NAME_LENGTH ], iStatus, szStatus[ 16 ];
	
	new iNum = get_modulesnum( );
	
	console_print( id, "%L", id, "LOADED_MODULES" );
	
	for( new i; i < iNum; i++ )
	{
		get_module( i, szName, charsmax( szName ), szAuthor, charsmax( szAuthor ), szVersion, charsmax( szVersion ), iStatus )
		
		switch( iStatus )
		{
		case module_loaded:
			{
				new szRunning[ 15 ];
				formatex( szRunning, charsmax( szRunning ), "%L", id, "RUNNING" );
				copy( szStatus, charsmax( szStatus ), szRunning );
			}
			
		default:
			{
				new szTempString[ 64 ];
				
				formatex( szTempString, charsmax( szTempString ), "%L", id, "BAD_LOAD" );
				copy( szStatus, charsmax( szStatus ), szTempString );
				
				formatex( szTempString, charsmax( szTempString ), "%L", id, "UNKNOWN" );
				copy( szName, charsmax( szName ), szTempString );
				copy( szAuthor, charsmax( szAuthor ), szTempString );
				copy( szVersion, charsmax( szVersion ), szTempString );
			}
		}
		
		console_print( id, "%-23.22s %-11.10s %-20.19s %-11.10s", szName, szVersion, szAuthor, szStatus );
	}
	console_print( id, "%d %L", iNum, id, "MODULES" );
	return PLUGIN_HANDLED;
}

@Cvar( id )
{	
	new szCvar[ 32 ], szValue[ 64 ];
	read_argv( 1, szCvar, charsmax( szCvar ) );
	read_argv( 2, szValue, charsmax( szValue ) );
	
	new iPointer;
	if( equal( szCvar, "add" ) && ( get_user_flags( id ) & ADMIN_RCON ) )
	{
		if( ( iPointer = get_cvar_pointer( szValue ) ) != 0 )
		{			
			new iFlags = get_pcvar_flags( iPointer );
			if( !( iFlags & FCVAR_PROTECTED ) )
			{
				set_pcvar_flags( iPointer, iFlags | FCVAR_PROTECTED );
			}
		}
		return PLUGIN_HANDLED;
	}
	
	else if( equal( szCvar, "remove" ) && ( get_user_flags( id ) & ADMIN_RCON ) )
	{
		if( ( iPointer = get_cvar_pointer( szValue ) ) != 0 )
		{			
			new iFlags = get_pcvar_flags( iPointer );
			if( iFlags & FCVAR_PROTECTED )
			{
				set_pcvar_flags( iPointer, iFlags & ~FCVAR_PROTECTED );
			}
		}
		return PLUGIN_HANDLED;
	}
	
	new eData[ Cvars ], iCvarFlag = -1;
	for( new i; i < ArraySize( g_aCvars ); i++ )
	{
		ArrayGetArray( g_aCvars, i, eData );
		
		if( equali( eData[ Cvar_Name ], szCvar ) )
		{
			iCvarFlag = eData[ Cvar_Flag ];
			break;
		}
	}
	
	if( iCvarFlag == -1 )
	{
		if( ~get_user_flags( id ) & ADMIN_RCON )
		{
			send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
			return PLUGIN_HANDLED;
		}
	}
	
	else
	{
		if( ( ~get_user_flags( id ) & iCvarFlag ) && ( ~get_user_flags( id ) & ADMIN_RCON ) )
		{
			send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
			return PLUGIN_HANDLED;
		}
	}
	
	if( ( iPointer = get_cvar_pointer( szCvar ) ) == 0 )
	{
		console_print( id, "%L", id, "UNKNOWN_CVAR", szCvar );
		return PLUGIN_HANDLED;
	}
	
	if( read_argc( ) < 3 )
	{
		get_pcvar_string( iPointer, szValue, charsmax( szValue ) );
		console_print( id, "CVAR ^"%s^" %L ^"%s^"", szCvar, id, "IS", szValue );
		
		return PLUGIN_HANDLED;
	}

	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_CVAR_SET", g_szName[ id ], g_szAuthId[ id ], szCvar, szValue );
	set_cvar_string( szCvar, szValue );

	new iPlayers[ MAX_PLAYERS ], iNum, iTempId, szCvarValue[ 64 ];
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		if( get_pcvar_flags( iPointer ) & FCVAR_PROTECTED || equali( szCvar, "rcon_password" ) )
		{
			formatex( szCvarValue, charsmax( szCvarValue ), "*** %L ***", id, "PROTECTED" );
		}
		
		else
		{
			copy( szCvarValue, charsmax( szCvarValue ), szValue );
		}
		CC_SendMessage( iTempId, "%L", id, "CVAR_SET", g_szName[ id ], szCvar, szCvarValue );
	}
	console_print( id, "%L", id, "CVAR_SET_SUCCESS", szCvar, szValue );
	return PLUGIN_HANDLED;
}

@Rcon( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ RCON_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szCmd[ 128 ];
	read_args( szCmd, charsmax( szCmd ) );
	
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "RCON_SENT", g_szName[ id ], szCmd );
	
	console_print( id, "%L", id, "CMD_SENT_SERVER", szCmd );
	server_cmd( "%s", szCmd );
	
	return PLUGIN_HANDLED;
}

@ShowRcon( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ SHOW_RCON_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szRconPw[ 64 ];
	get_pcvar_string( g_pRconPassword, szRconPw, charsmax( szRconPw ) );
	
	if( ! szRconPw[ 0 ] )
	{
		@Rcon( id );
	}
	
	else
	{
		new szArgs[ 128 ];
		
		read_args( szArgs, charsmax( szArgs ) );
		client_cmd( id, "rcon_password %s", szRconPw );
		client_cmd( id, "rcon %s", szArgs );
	}
	
	return PLUGIN_HANDLED
}

@Kick( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ KICK_FLAG ] )
	{	
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szReason, charsmax( szReason ) );
	
	if( read_argc( ) < 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_KICK_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "bl", szName );
	
	if( ! iPlayer )
	{
		iPlayer = find_player( "cl", szName );
		
		if( ! iPlayer )
		{
			iPlayer = find_player( "dl", szName );
			
			if( ! iPlayer )
			{
				send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
				return PLUGIN_HANDLED;
			}
		}
	}

	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iUserIdUser;
	
	iUserIdUser = get_user_userid( iPlayer );
	
	server_cmd( "kick #%d ^"%s^"", iUserIdUser, szReason );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "KICKED", g_szName[ id ], g_szName[ iPlayer ], szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOGS_KICKED", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
	
	return PLUGIN_HANDLED;
}

@AddBan( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ ADD_BAN_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ], szMinutes[ 8 ], szReason[ MAX_REASON_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szSteamId, charsmax( szSteamId ) );
	read_argv( 3, szIP, charsmax( szIP ) );
	read_argv( 4, szMinutes, charsmax( szMinutes ) );
	read_argv( 5, szReason, charsmax( szReason ) );
	
	if( read_argc( ) < 5 || ( ! szName[ 0 ] && ! szSteamId[ 0 ] && ! szIP[ 0 ] ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_ADDBAN_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer;
	if( szSteamId[ 0 ] )
	{
		iPlayer = find_player( "cl", szSteamId );
		
		if( ! iPlayer )
		{
			if( szName[ 0 ] )
			{
				iPlayer = find_player( "al", szName );
				
				if( ! iPlayer )
				{
					if( szIP[ 0 ] )
					{
						iPlayer = find_player( "dl", szIP );
					}
				}
			}
		}
	}
	
	else if( szName[ 0 ] )
	{
		iPlayer = find_player( "al", szName );
		
		if( ! iPlayer )
		{
			if( szSteamId[ 0 ] )
			{
				iPlayer = find_player( "cl", szSteamId );
				
				if( ! iPlayer )
				{
					if( szIP[ 0 ] )
					{
						iPlayer = find_player( "dl", szIP );
					}
				}
			}
		}
	}
	
	else if( szIP[ 0 ] )
	{
		iPlayer = find_player( "dl", szIP );
		
		if( ! iPlayer )
		{
			if( szName[ 0 ] )
			{
				iPlayer = find_player( "al", szName );
				
				if( ! iPlayer )
				{
					if( szSteamId[ 0 ] )
					{
						iPlayer = find_player( "cl", szSteamId );
					}
				}
			}
		}
	}
	
	if( ! is_str_num( szMinutes ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = str_to_num( szMinutes ), iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	new eData[ PlayerBan ];	
	if( iPlayer )
	{
		if( id != 0 )
		{
			new iImmunityLevel = GetImmunityLevel( id );
			new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
			
			if( iImmunityLevel < iImmunityLevelTarget )
			{
				send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
				return PLUGIN_HANDLED;
			}
		}
		
		if( iMinutes == 0 )
		{
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				if( get_user_flags( iTempId ) & ADMIN_KICK )
				{
					CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
				}
			}
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
			copy( szExpireDate, charsmax( szExpireDate ), "never" );
		}
		
		else
		{
			get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
			
			AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
			
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				if( get_user_flags( iTempId ) & ADMIN_KICK )
				{
					CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST", g_szName[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes );
				}
			}
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes, szExpireDate, szReason );
		}
		
		trim( szExpireDate );
		trim( szReason );
		
		copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
		copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
		copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
		copy( eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ), szExpireDate );
		copy( eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), szReason );
		copy( eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ), g_szName[ id ] );
		
		ArrayPushArray( g_aBans, eData );
		AddBan( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szExpireDate, szReason, g_szName[ id ] );
		
		if( is_user_connected( iPlayer ) )
		{
			ScreenShot( iPlayer );
			
			if( ! HasDatePassed( szExpireDate ) || equali( szExpireDate, "never" ) )
			{
				if( equali( szExpireDate, "never" ) )
				{				
					send_message( iPlayer, CONSOLE, false, "^n************************************************" );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE_NEVER" );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
					send_message( iPlayer, CONSOLE, false, "************************************************" );
				}
				
				else
				{
					send_message( iPlayer, CONSOLE, false, "^n************************************************" );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE", szExpireDate );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
					send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
					send_message( iPlayer, CONSOLE, false, "************************************************" );
				}
				server_cmd( "kick #%d %L", get_user_userid( iPlayer ), id, "CHECK_CONSOLE_INFO" );
			}
		}
	}
	
	else
	{
		if( iMinutes == 0 )
		{
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				if( get_user_flags( iTempId ) & ADMIN_KICK )
				{
					CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], szName, szSteamId, szIP );
				}
			}
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP, szReason );
			copy( szExpireDate, charsmax( szExpireDate ), "never" );
		}
		
		else
		{
			get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
			
			AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
			
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				if( get_user_flags( iTempId ) & ADMIN_KICK )
				{
					CC_SendMessage( iTempId, "%L", iTempId, "ADDED_TO_BANLIST", g_szName[ id ], szName, szSteamId, szIP, iMinutes );
				}
			}
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_BANLIST", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP, iMinutes, szExpireDate, szReason );
		}
		
		trim( szExpireDate );
		trim( szReason );
		
		copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), szName );
		copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), szSteamId );
		copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), szIP );
		copy( eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ), szExpireDate );
		copy( eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), szReason );
		copy( eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ), g_szName[ id ] );
		
		ArrayPushArray( g_aBans, eData );
		AddBan( szName, szSteamId, szIP, szExpireDate, szReason, g_szName[ id ] );
	}
	return PLUGIN_HANDLED;
}

@AddGag( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ ADD_GAG_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ], szMinutes[ 8 ], szFlags[ 5 ], szReason[ MAX_REASON_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szSteamId, charsmax( szSteamId ) );
	read_argv( 3, szIP, charsmax( szIP ) );
	read_argv( 4, szMinutes, charsmax( szMinutes ) );
	read_argv( 5, szFlags, charsmax( szFlags ) );
	read_argv( 6, szReason, charsmax( szReason ) );
	
	if( read_argc( ) < 5 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_ADDGAG_USAGE" );
		return PLUGIN_HANDLED;
	}

	if( ! szFlags[ 0 ] )
	{
		copy( szFlags, charsmax( szFlags ), "sv" );
	}
	
	else
	{
		if( ! equali( szFlags, "sv" ) && ! equali( szFlags, "vs" ) && ! equali( szFlags, "s" ) && ! equali( szFlags, "v" ) )
		{
			send_message( id, CONSOLE, false, "%L", id, "INVALID_FLAGS" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iPlayer;
	if( szSteamId[ 0 ] )
	{
		iPlayer = find_player( "cl", szSteamId );
		
		if( ! iPlayer )
		{
			if( szName[ 0 ] )
			{
				iPlayer = find_player( "al", szName );
				
				if( ! iPlayer )
				{
					if( szIP[ 0 ] )
					{
						iPlayer = find_player( "dl", szIP );
					}
				}
			}
		}
	}
	
	else if( szName[ 0 ] )
	{
		iPlayer = find_player( "al", szName );
		
		if( ! iPlayer )
		{
			if( szSteamId[ 0 ] )
			{
				iPlayer = find_player( "cl", szSteamId );
				
				if( ! iPlayer )
				{
					if( szIP[ 0 ] )
					{
						iPlayer = find_player( "dl", szIP );
					}
				}
			}
		}
	}
	
	else if( szIP[ 0 ] )
	{
		iPlayer = find_player( "dl", szIP );
		
		if( ! iPlayer )
		{
			if( szName[ 0 ] )
			{
				iPlayer = find_player( "al", szName );
				
				if( ! iPlayer )
				{
					if( szSteamId[ 0 ] )
					{
						iPlayer = find_player( "cl", szSteamId );
					}
				}
			}
		}
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = str_to_num( szMinutes );
	
	new eData[ PlayerGag ];	
	if( iPlayer )
	{
		if( id != 0 )
		{
			new iImmunityLevel = GetImmunityLevel( id );
			new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
			
			if( iImmunityLevel < iImmunityLevelTarget )
			{
				send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
				return PLUGIN_HANDLED;
			}
		}
		
		if( iMinutes == 0 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ] );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szFlags, szReason );
			
			copy( szExpireDate, charsmax( szExpireDate ), "never" );
		}
		
		else
		{
			get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
			
			AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
			
			CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST", g_szName[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes, szExpireDate, szFlags, szReason );
		}
		
		trim( szReason );
		trim( szFlags );
		trim( szExpireDate );
		
		copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
		copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
		copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
		copy( eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), szReason );
		copy( eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), szFlags );
		copy( eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), szExpireDate );
		copy( eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ), g_szName[ id ] );
		
		ArrayPushArray( g_aGags, eData );
		AddGag( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szFlags, szExpireDate, g_szName[ id ] );
		
		if( get_user_flags( iPlayer ) & g_iConfig[ IMMUNITY_FLAG ] )
		{
			return PLUGIN_HANDLED;
		}

		else
		{
			if( equali( g_szAuthId[ iPlayer ], eData[ Player_SteamId ] ) || equali( g_szIp[ iPlayer ], eData[ Player_IP ] ) )
			{
				if( ! HasDatePassed( eData[ Player_GagExpire ] ) )
				{
					set_speak( iPlayer, SPEAK_MUTED );
				}
			}
		}
	}
	
	else
	{
		if( iMinutes == 0 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], szName, szSteamId, szIP );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST_PERMANENT", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP, szFlags, szReason );
			
			copy( szExpireDate, charsmax( szExpireDate ), "never" );
		}
		
		else
		{
			get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
			
			AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
			
			CC_SendMessage( 0, "%L", LANG_PLAYER, "ADDED_TO_GAGLIST", g_szName[ id ], szName, szSteamId, szIP, iMinutes );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_ADDED_TO_GAGLIST", g_szName[ id ], g_szAuthId[ id ], szName, szSteamId, szIP, iMinutes, szExpireDate, szFlags, szReason );
		}
		
		trim( szReason );
		trim( szFlags );
		trim( szExpireDate );
		
		copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), szName );
		copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), szSteamId );
		copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), szIP );
		copy( eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), szReason );
		copy( eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), szFlags );
		copy( eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), szExpireDate );
		copy( eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ), g_szName[ id ] );

		ArrayPushArray( g_aGags, eData );		
		AddGag( szName, szSteamId, szIP, szReason, szFlags, szExpireDate, g_szName[ id ] );
	}
	return PLUGIN_HANDLED;
}

@Psay( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ PSAY_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szMessage[ 192 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szMessage, charsmax( szMessage ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_PSAY_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	CC_SendMessage( id, "&x00%L", id, "PSAY_HIM", g_szName[ iPlayer ], szMessage );
	CC_SendMessage( iPlayer, "&x00%L", iPlayer, "PSAY_YOU", g_szName[ id ], szMessage );
	
	return PLUGIN_HANDLED;
}

@Who( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ WHO_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new iFlags, szFlags[ MAX_FLAGS_LENGTH ], szRank[ 32 ], iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	get_players( iPlayers, iNum );
	
	send_message( id, CONSOLE, false, "^nName    SteamID    IP    Flags    Rank" );
	
	for( new i; i < iNum; i++ )
	{
		iTempId = iPlayers[ i ];
		
		iFlags = get_user_flags( iTempId );
		get_flags( iFlags, szFlags, charsmax( szFlags ) );
		
		if( g_iConfig[ RANKS_ENABLED ] )
		{
			eas_get_player_rank( iTempId, szRank, charsmax( szRank ) );
			send_message( id, CONSOLE, false, "%s  %s  %s  %s  %s", g_szName[ iTempId ], g_szAuthId[ iTempId ], g_szIp[ iTempId ], szFlags, szRank );
		}
		
		else
		{
			send_message( id, CONSOLE, false, "%s  %s  %s  %s", g_szName[ iTempId ], g_szAuthId[ iTempId ], g_szIp[ iTempId ], szFlags );
		}
	}
	return PLUGIN_HANDLED;
}

@Last( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ LAST_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	send_message( id, CONSOLE, false, "%L      %L      %L      %L      %L", id, "NAME", id, "STEAM_ID", id, "IP", id, "FLAGS", id, "RANK" );
	
	FlushDisconnectedPlayers( );
	
	new eData[ PlayerDisconnectData ];
	for( new i; i < ArraySize( g_aDisconnectInfo ); i++ )
	{
		ArrayGetArray( g_aDisconnectInfo, i, eData );
		send_message( id, CONSOLE, false, "%s    %s    %s    %s    %s", eData[ Player_DisconnectName ], eData[ Player_DisconnectSteamID ], eData[ Player_DisconnectIP ], eData[ Player_DisconnectFlags ], eData[ Player_DisconnectRank ] );
	}
	return PLUGIN_HANDLED;
}

@Team( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ TEAM_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szName[ MAX_NAME_LENGTH ], szTeam[ 12 ], szRespawn[ 2 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szTeam, charsmax( szTeam ) );
	read_argv( 3, szRespawn, charsmax( szRespawn ) );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_TEAM_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iTeam, szTeamFinal[ 20 ];
	if( is_str_num( szTeam ) )
	{
		iTeam = str_to_num( szTeam );
		switch( iTeam )
		{
		case 1:
			{
				eas_set_user_team( iPlayer, 1 );
				copy( szTeamFinal, charsmax( szTeamFinal ), "Terrorist" );
			}
			
		case 2:
			{
				eas_set_user_team( iPlayer, 2 );
				copy( szTeamFinal, charsmax( szTeamFinal ), "Counter-Terrorist" );
			}
			
		case 3:
			{
				eas_set_user_team( iPlayer, 3 );
				copy( szTeamFinal, charsmax( szTeamFinal ), "Spectator" );
			}
			
		default:
			{
				send_message( id, CONSOLE, true, "%L", id, "INVALID_TEAM" );
				return PLUGIN_HANDLED;
			}
		}
	}
	
	else
	{
		if( equali( szTeam, "T" ) || equali( szTeam, "TERRORIST" ) )
		{
			iTeam = 1;
			eas_set_user_team( iPlayer, iTeam );
			
			copy( szTeamFinal, charsmax( szTeamFinal ), "Terrorist" );
		}
		
		else if( equali( szTeam, "CT" ) )
		{
			iTeam = 2;
			eas_set_user_team( iPlayer, iTeam );
			
			copy( szTeamFinal, charsmax( szTeamFinal ), "Counter-Terrorist" );
		}
		
		else if( equali( szTeam, "SPEC" ) || equali( szTeam, "SPECTATOR" ) )
		{
			iTeam = 3;
			eas_set_user_team( iPlayer, iTeam );
			
			copy( szTeamFinal, charsmax( szTeamFinal ), "Spectator" );
		}
		
		else
		{
			send_message( id, CONSOLE, true, "%L", id, "INVALID_TEAM" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iRespawn;    
	!szRespawn[ 0 ] ? ( iRespawn = 0 ) : ( iRespawn = str_to_num( szRespawn ) );
	
	!( 0 <= iRespawn <= 1 ) ? ( iRespawn = 0 ) : iRespawn;
	
	if( iRespawn == 1 )
	{
		ExecuteHamB( Ham_CS_RoundRespawn, iPlayer );
	}
	
	CC_SendMatched( 0, iPlayer, "%L", LANG_PLAYER, "TEAM_CHANGE", g_szName[ id ], g_szName[ iPlayer ], szTeamFinal );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_TEAM_CHANGE", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szTeamFinal );
	
	return PLUGIN_HANDLED;
}	

@Ban( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ BAN_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ], szMinutes[ 8 ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szMinutes, charsmax( szMinutes ) );
	read_argv( 3, szReason, charsmax( szReason ) );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_BAN_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "bl", szName );
	
	if( ! iPlayer )
	{
		iPlayer = find_player( "cl", szName );
		
		if( ! iPlayer )
		{
			iPlayer = find_player( "dl", szName );
			
			if( ! iPlayer )
			{
				send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
				return PLUGIN_HANDLED;
			}
		}
	}
	
	if( ! is_str_num( szMinutes ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "INVALID_VALUE" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	new szExpireDate[ MAX_DATE_LENGTH ], iMinutes = str_to_num( szMinutes );
	
	if( iMinutes == 0 )
	{
		CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_PERMANENT", g_szName[ id ], g_szName[ iPlayer ], szReason );
		send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_PERMANENT", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
		
		copy( szExpireDate, charsmax( szExpireDate ), "never" );
	}
	
	else
	{
		get_time( "%m/%d/%Y %H:%M:%S", szExpireDate, charsmax( szExpireDate ) );
		AddMinutesToDate( szExpireDate, iMinutes, szExpireDate, charsmax( szExpireDate ) );
		
		if( iMinutes == 1 )
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_SINGULAR", g_szName[ id ], g_szName[ iPlayer ], szReason, szExpireDate );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_SINGULAR", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason, szExpireDate );
		}
		
		else
		{
			CC_SendMessage( 0, "%L", LANG_PLAYER, "BANNED_PLURAL", g_szName[ id ], g_szName[ iPlayer ], iMinutes, szReason, szExpireDate );
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_BANNED_PLURAL", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iMinutes, szReason, szExpireDate );
		}
	}
	
	trim( szExpireDate );
	trim( szReason );
	
	new eData[ PlayerBan ];	
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ iPlayer ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ iPlayer ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ iPlayer ] );
	copy( eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ), szExpireDate );
	copy( eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), szReason );
	copy( eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ), g_szName[ id ] );
	
	ArrayPushArray( g_aBans, eData );
	BanPlayer( g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szExpireDate, szReason, g_szName[ id ] );
	
	if( is_user_connected( iPlayer ) )
	{
		ScreenShot( iPlayer );
		
		if( ! HasDatePassed( szExpireDate ) || equali( szExpireDate, "never" ) )
		{
			if( equali( szExpireDate, "never" ) )
			{				
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE_NEVER" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			
			else
			{
				send_message( iPlayer, CONSOLE, false, "^n************************************************" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BANNED" );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_EXPIRE", szExpireDate );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_REASON", szReason );
				send_message( iPlayer, CONSOLE, false, "%L", iPlayer, "BAN_INFO_BY", g_szName[ id ] );
				send_message( iPlayer, CONSOLE, false, "************************************************" );
			}
			server_cmd( "kick #%d %L", get_user_userid( iPlayer ), id, "CHECK_CONSOLE_INFO" );
		}
	}
	return PLUGIN_HANDLED;
}

@Unban( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ UNBAN_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}
	
	new szIdentity[ MAX_AUTHID_LENGTH ];
	read_argv( 1, szIdentity, charsmax( szIdentity ) );
	
	if( read_argc( ) != 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_UNBAN_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new eData[ PlayerBan ], bool:bPlayerFound, iPlayers[ MAX_PLAYERS ], iNum, iTempId;
	get_players( iPlayers, iNum, "ch" );
	
	for( new i; i < ArraySize( g_aBans ); i++ )
	{
		ArrayGetArray( g_aBans, i, eData );
		
		if( equali( szIdentity, eData[ Player_Name ] ) || equali( szIdentity, eData[ Player_SteamId ] ) || equali( szIdentity, eData[ Player_IP ] ) )
		{
			UnbanPlayer( szIdentity );
			
			for( new i; i < iNum; i++ )
			{
				iTempId = iPlayers[ i ];
				
				if( get_user_flags( iTempId ) & ADMIN_KICK )
				{
					CC_SendMessage( iTempId, "%L", iTempId, "UNBANNED", g_szName[ id ], eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
				}
				
				else
				{
					CC_SendMessage( iTempId, "%L", iTempId, "UNBANNED_NO_IP", g_szName[ id ], eData[ Player_Name ], eData[ Player_SteamId ] );
				}
			}
			
			send_message( 0, LOG, false, "%L", LANG_PLAYER, "UNBANNED", g_szName[ id ], g_szAuthId[ id ], eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
			bPlayerFound = true;
			
			break;
		}
	}
	if( ! bPlayerFound )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
	}
	return PLUGIN_HANDLED;
}

@Slay( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ SLAY_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ];
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	if( read_argc( ) < 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_SLAY_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "SLAY_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	user_kill( iPlayer );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "SLAY", g_szName[ id ], g_szName[ iPlayer ], szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_SLAY", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szReason );
	
	return PLUGIN_HANDLED;
}

@Slap( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ SLAP_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szName[ MAX_NAME_LENGTH ], szReason[ MAX_REASON_LENGTH ], szValue[ 6 ], iValue;
	read_argv( 1, szName, charsmax( szName ) );
	read_argv( 2, szValue, charsmax( szValue ) );
	read_argv( 3, szReason, charsmax( szReason ) );
	
	trim( szReason );
	remove_quotes( szReason );
	
	if( read_argc( ) < 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_SLAP_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	if( ! szValue[ 0 ] )
	{
		copy( szValue, charsmax( szValue ), "0" );
	}
	
	else
	{
		if( ! is_str_num( szValue ) )
		{
			send_message( id, CONSOLE, true, "%L", id, "INVALID_VALUE" );
			return PLUGIN_HANDLED;
		}
	}
	
	new iPlayer = cmd_target( id, szName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_user_alive( iPlayer ) )
	{
		send_message( id, CHAT, true, "%L", id, "SLAP_DEAD_PLAYER" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}
	
	iValue = str_to_num( szValue );
	
	user_slap( iPlayer, iValue );
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "SLAP", g_szName[ id ], g_szName[ iPlayer ], iValue, szReason );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_SLAP", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], iValue, szReason );
	
	return PLUGIN_HANDLED;
}

@Map( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ MAP_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szMap[ MAX_MAP_NAME_LENGTH ];
	new iMapLen = read_argv( 1, szMap, charsmax( szMap ) );
	
	if( read_argc( ) != 2 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_MAP_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	if( ! is_map_valid( szMap ) )
	{
		send_message( id, CONSOLE, true, "%L", id, "MAP_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}

	new szModName[ 10 ];
	get_modname( szModName, charsmax( szModName ) );
	
	if( ! equali( szModName, "zp" ) )
	{
		message_begin( MSG_ALL, SVC_INTERMISSION );
		message_end( );
	}
	
	CC_SendMessage( 0, "%L", LANG_PLAYER, "MAP_CHANGE", g_szName[ id ], szMap );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_MAP_CHANGE", g_szName[ id ], g_szAuthId[ id ], szMap );

	set_task( 2.0, "OnMapChange", _, szMap, iMapLen + 1 );
	
	return PLUGIN_HANDLED
}

@Nick( id )
{
	if( ~ get_user_flags( id ) & g_iConfig[ NICK_FLAG ] )
	{
		send_message( id, CONSOLE, true, "%L", id, "NO_ACCESS_COMMAND" );
		return PLUGIN_HANDLED;
	}

	new szCurrentName[ MAX_NAME_LENGTH ], szNewName[ MAX_NAME_LENGTH ];

	read_argv( 1, szCurrentName, charsmax( szCurrentName ) );
	read_argv( 2, szNewName, charsmax( szNewName ) );
	
	if( read_argc( ) != 3 )
	{
		send_message( id, CONSOLE, true, "%L", id, "AMX_NICK_USAGE" );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szCurrentName, CMDTARGET_ALLOW_SELF );
	
	if( ! iPlayer )
	{
		send_message( id, CONSOLE, true, "%L", id, "PLAYER_NOT_FOUND" );
		return PLUGIN_HANDLED;
	}
	
	if( id != 0 )
	{
		new iImmunityLevel = GetImmunityLevel( id );
		new iImmunityLevelTarget = GetImmunityLevel( iPlayer );
		
		if( iImmunityLevel < iImmunityLevelTarget )
		{
			send_message( id, CONSOLE, true, "%L", id, "CANT_PERFORM_IMMUNITY" );
			return PLUGIN_HANDLED;
		}
	}

	client_cmd( iPlayer, "name ^"%s^"", szNewName );

	CC_SendMessage( 0, "%L", LANG_PLAYER, "NICK_CHANGE", g_szName[ id ], g_szName[ iPlayer ], szNewName );
	send_message( 0, LOG, false, "%L", LANG_PLAYER, "LOG_NICK_CHANGE", g_szName[ id ], g_szAuthId[ id ], g_szName[ iPlayer ], g_szAuthId[ iPlayer ], g_szIp[ iPlayer ], szNewName );
	
	return PLUGIN_HANDLED;
}

///////////////////////////////////////////////////////////////////////////////// END OF CONSOLE COMMANDS /////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////// STOCKS AND PRIVATE FUNCTIONS ///////////////////////////////////////////////////////////////////////////////////////////////

CacheInfo( id )
{
	new eData[ PlayerDisconnectData ], eData2[ PlayerDisconnectData ]; 
	
	copy( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), g_szName[ id ] );
	copy( eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), g_szAuthId[ id ] );
	copy( eData[ Player_IP ], charsmax( eData[ Player_IP ] ), g_szIp[ id ] );
	
	new bool:bExists;
	for( new i; i < ArraySize( g_aDisconnectInfo ); i++ )
	{
		ArrayGetArray( g_aDisconnectInfo, i, eData2 );

		if( equali( eData[ Player_Name ], eData2[ Player_Name ] ) || equali( eData[ Player_SteamId ], eData2[ Player_SteamId ] ) || equali( eData[ Player_IP ], eData2[ Player_IP ] ) )
		{
			bExists = true;
			break;
		}
	}
	
	if( ! bExists )
	{
		get_flags( get_user_flags( id ), eData[ Player_DisconnectFlags ], charsmax( eData[ Player_DisconnectFlags ] ) );
		
		eas_get_player_rank( id, eData[ Player_DisconnectRank ], charsmax( eData[ Player_DisconnectRank ] ) );
		
		new szDate[ MAX_DATE_LENGTH ];
		get_time( "%m/%d/%Y %H:%M:%S", szDate, charsmax( szDate ) );
		
		AddSecondsToDate( szDate, g_iConfig[ DISCONNECT_INFO_SECONDS_EXPIRE ], eData[ Player_DataExpireDate ], charsmax( eData[ Player_DataExpireDate ] ) );
		
		ArrayPushArray( g_aDisconnectInfo, eData );
	}
	return PLUGIN_HANDLED;
}

FlushDisconnectedPlayers( )
{
	new eData[ PlayerDisconnectData ];
	for( new i; i < ArraySize( g_aDisconnectInfo ); i++ )
	{
		ArrayGetArray( g_aDisconnectInfo, i, eData );
		
		if( HasDatePassed( eData[ Player_DataExpireDate ] ) )
		{
			ArrayDeleteItem( g_aDisconnectInfo, i );
		}
	}
}

CleanVars( id )
{
	g_bFrozen[ id ] = false;
	
	g_fLastOpened[ id ] = 0.0;
	
	g_iKick[ id ] = 0;
	g_iTeamSwitch[ id ] = 0;
	
	arrayset( g_iBan[ id ], 0, sizeof( g_iBan[ ] ) );
	arrayset( g_iGag[ id ], 0, sizeof( g_iGag[ ] ) );
	arrayset( g_iAddBan[ id ], 0, sizeof( g_iAddBan[ ] ) );
	arrayset( g_iAddGag[ id ], 0, sizeof( g_iAddGag[ ] ) );
	arrayset( g_iSlay[ id ], 0, sizeof( g_iSlay[ ] ) );
	arrayset( g_iSlap[ id ], 0, sizeof( g_iSlap[ ] ) );
	arrayset( _:fAngles[ id ], _:0.0, sizeof( fAngles[ ] ) );
	arrayset( g_szTeamSwitch[ id ], 0, sizeof( g_szTeamSwitch[ ] ) );
	arrayset( g_szName[ id ], 0, sizeof( g_szName[ ] ) );
	arrayset( g_szAuthId[ id ], 0, sizeof( g_szAuthId[ ] ) );
	arrayset( g_szIp[ id ], 0, sizeof( g_szIp[ ] ) );
}

GetImmunityLevel( id )
{
	new eData[ PlayerData ], iImmunityLevel;
	if( TrieGetArray( g_tDatabase, g_szAuthId[ id ], eData, sizeof eData ) || TrieGetArray( g_tDatabase, g_szName[ id ], eData, sizeof eData ) )
	{
		iImmunityLevel = eData[ Player_Immunity ];
	}
	return iImmunityLevel;
}

AddBan( const szName[ ], const szSteamId[ ], const szIP[ ], const szExpireDate[ ], const szReason[ ], const szAdminName[ ] )
{
	new szFormat[ 192 ];
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ BANS_FILE ] );
	new iFilePointer = fopen( szFormat, "r+" );
	
	if( iFilePointer )
	{			
		new szByteVal[ 1 ];
		
		fseek( iFilePointer , -1 , SEEK_END );
		fread_raw( iFilePointer , szByteVal , sizeof( szByteVal ) , BLOCK_BYTE );
		fseek( iFilePointer , 0 , SEEK_END );
		
		fprintf( iFilePointer, "%s^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"", ( szByteVal[ 0 ] == 10 ) ? "" : "^n", szName, szSteamId, szIP, szExpireDate, szReason, szAdminName ); // add him to banlist
		fclose( iFilePointer );
	}
	return 1;
}

AddGag( const szName[ ], const szSteamId[ ], const szIP[ ], const szReason[ ], const szFlags[ ], const szExpireDate[ ], const szGaggedBy[ ] )
{
	new szFormat[ 192 ];
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	new iFilePointer = fopen( szFormat, "r+" );
	
	if( iFilePointer )
	{			
		new szByteVal[ 1 ];
		
		fseek( iFilePointer , -1 , SEEK_END );
		fread_raw( iFilePointer , szByteVal , sizeof( szByteVal ) , BLOCK_BYTE );
		fseek( iFilePointer , 0 , SEEK_END );
		
		fprintf( iFilePointer, "%s^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"", ( szByteVal[ 0 ] == 10 ) ? "" : "^n", szName, szSteamId, szIP, szReason, szFlags, szExpireDate, szGaggedBy ); // add him to gaglist
		fclose( iFilePointer );
	}
	return 1;
}

UnbanPlayer( const szIdentity[ ] )
{
	new const szTempFileName[ ] = "tempfile.ini";

	new szFormat[ 128 ], szData[ 128 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ];
	
	static szTempFilePath[ 256 ];
	formatex( szTempFilePath, charsmax( szTempFilePath ), "%s/%s", g_szConfigsDir, szTempFileName );
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ BANS_FILE ] );
	new iFilePointer = fopen( szFormat, "rt" );

	if( iFilePointer )
	{
		new iInputFilePointer = fopen( szTempFilePath, "wt" );
		
		if( iInputFilePointer )
		{
			while( fgets( iFilePointer, szData, charsmax( szData ) ) )
			{
				switch( szData[ 0 ] )
				{
				case EOS, '#', ';', '/', '\':
					{
						fprintf( iInputFilePointer, szData ); // write as it was before
					}

				default:
					{			
						parse( szData, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
						
						trim( szName );
						trim( szSteamId );
						trim( szIP );
						
						if( ! equali( szIdentity, szName ) && ! equali( szIdentity, szSteamId ) && ! equali( szIdentity, szIP ) ) // not the person we're looking for
						{
							fprintf( iInputFilePointer, szData ); // write as it was before
						}
						
						else
						{
							continue;
						}
					}
				}
			}
			fclose( iInputFilePointer );
			fclose( iFilePointer );

			delete_file( szFormat );
			rename_file( szTempFilePath, szFormat, 1 );
		}
	}
	return 0;
}

UnGagPlayer( const szIdentity[ ] )
{
	new const szTempFileName[ ] = "tempfile.ini";

	new szFormat[ 128 ], szData[ 192 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ];
	
	new szTempFilePath[ 64 ];
	formatex( szTempFilePath, charsmax( szTempFilePath ), "%s/%s", g_szConfigsDir, szTempFileName );
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	new iFilePointer = fopen( szFormat, "rt" );
	
	if( iFilePointer )
	{
		new iInputFilePointer = fopen( szTempFilePath, "wt" );
		
		if( iInputFilePointer )
		{
			while( fgets( iFilePointer, szData, charsmax( szData ) ) )
			{
				switch( szData[ 0 ] )
				{
				case EOS, '#', ';', '/', '\':
					{
						fprintf( iInputFilePointer, szData ); // write as it was before
					}

				default:
					{								
						parse( szData, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
						
						trim( szName );
						trim( szSteamId );
						trim( szIP );
						
						remove_quotes( szName );
						remove_quotes( szSteamId );
						remove_quotes( szIP );
						
						if( ! equali( szIdentity, szName ) && ! equali( szIdentity, szSteamId ) && ! equali( szIdentity, szIP ) ) // not the person we're looking for
						{
							fprintf( iInputFilePointer, szData ); // write as it was before
						}
					}
				}
			}
			fclose( iInputFilePointer );
			fclose( iFilePointer );

			delete_file( szFormat );
			rename_file( szTempFilePath, szFormat, 1 );
		}
	}
	return 0;
}

UnGagPlayer2( const szNamePlayer[ ], const szSteamIdPlayer[ ], const szIpPlayer[ ] )
{
	new const szTempFileName[ ] = "tempfile.ini";

	new szFormat[ 128 ], szData[ 192 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ];
	
	new szTempFilePath[ 64 ];
	formatex( szTempFilePath, charsmax( szTempFilePath ), "%s/%s", g_szConfigsDir, szTempFileName );
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	new iFilePointer = fopen( szFormat, "rt" );

	if( iFilePointer )
	{
		new iInputFilePointer = fopen( szTempFilePath, "wt" );
		
		if( iInputFilePointer )
		{
			while( fgets( iFilePointer, szData, charsmax( szData ) ) )
			{
				switch( szData[ 0 ] )
				{
				case EOS, '#', ';', '/', '\':
					{
						fprintf( iInputFilePointer, szData ); // write as it was before
					}

				default:
					{			
						parse( szData, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
						
						trim( szName );
						trim( szSteamId );
						trim( szIP );
						
						if( equali( szNamePlayer, szName ) && equali( szSteamIdPlayer, szSteamId ) && equali( szIpPlayer, szIP ) )
						{
							new eData[ PlayerGag ];
							for( new i; i < ArraySize( g_aGags ); i++ )
							{
								ArrayGetArray( g_aGags, i, eData );
								
								if( equali( eData[ Player_Name ], szName ) && equali( eData[ Player_SteamId ], szSteamIdPlayer ) && equali( eData[ Player_IP ], szIP ) )
								{
									ArrayDeleteItem( g_aGags, i );
									break;
								}
							}	
						}
						
						else
						{
							fprintf( iInputFilePointer, szData ); // write as it was before
						}
					}
				}
			}
			fclose( iInputFilePointer );
			fclose( iFilePointer );

			delete_file( szFormat );
			rename_file( szTempFilePath, szFormat, 1 );
		}
	}
	return 0;
}

UnbanPlayer2( const szNamePlayer[ ], const szSteamIdPlayer[ ], const szIpPlayer[ ] )
{
	new const szTempFileName[ ] = "tempfile.ini";

	new szFormat[ 128 ], szData[ 192 ], szName[ MAX_NAME_LENGTH ], szSteamId[ MAX_AUTHID_LENGTH ], szIP[ MAX_IP_LENGTH ];
	
	new szTempFilePath[ 64 ];
	formatex( szTempFilePath, charsmax( szTempFilePath ), "%s/%s", g_szConfigsDir, szTempFileName );
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ BANS_FILE ] );
	new iFilePointer = fopen( szFormat, "rt" );

	if( iFilePointer )
	{
		new iInputFilePointer = fopen( szTempFilePath, "wt" );
		
		if( iInputFilePointer )
		{
			while( fgets( iFilePointer, szData, charsmax( szData ) ) )
			{
				switch( szData[ 0 ] )
				{
				case EOS, '#', ';', '/', '\':
					{
						fprintf( iInputFilePointer, szData ); // write as it was before
					}

				default:
					{			
						parse( szData, szName, charsmax( szName ), szSteamId, charsmax( szSteamId ), szIP, charsmax( szIP ) );
						
						trim( szName );
						trim( szSteamId );
						trim( szIP );
						
						if( equali( szNamePlayer, szName ) && equali( szSteamIdPlayer, szSteamId ) && equali( szIpPlayer, szIP ) )
						{
							new eData[ PlayerBan ];
							for( new i; i < ArraySize( g_aBans ); i++ )
							{
								ArrayGetArray( g_aBans, i, eData );
								
								if( equali( eData[ Player_Name ], szName ) && equali( eData[ Player_SteamId ], szSteamIdPlayer ) && equali( eData[ Player_IP ], szIP ) )
								{
									ArrayDeleteItem( g_aBans, i );
									break;
								}
							}	
						}
						
						else
						{
							fprintf( iInputFilePointer, szData ); // write as it was before
						}
					}
				}
			}
			fclose( iInputFilePointer );
			fclose( iFilePointer );

			delete_file( szFormat );
			rename_file( szTempFilePath, szFormat, 1 );
		}
	}
	return 0;
}

BanPlayer( const szName[ ], const szSteamId[ ], const szIP[ ], const szExpireDate[ ], const szReason[ ], const szBannedBy[ ] )
{
	new szFormat[ 128 ];
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ BANS_FILE ] );
	
	new iFilePointer = fopen( szFormat, "r+" );
	
	if( iFilePointer )
	{			
		new szByteVal[ 1 ];
		
		fseek( iFilePointer , -1 , SEEK_END );
		fread_raw( iFilePointer , szByteVal , sizeof( szByteVal ) , BLOCK_BYTE );
		fseek( iFilePointer , 0 , SEEK_END );
		
		fprintf( iFilePointer, "%s^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"", ( szByteVal[ 0 ] == 10 ) ? "" : "^n", szName, szSteamId, szIP, szExpireDate, szReason, szBannedBy ); // add him to banlist
		fclose( iFilePointer );
	}
	return 1;
}

GagPlayer( const szName[ ], const szSteamId[ ], const szIP[ ], const szReason[ ], const szFlags[ ], const szExpireDate[ ], const szGaggedBy[ ] )
{
	new szFormat[ 128 ];
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	
	new iFilePointer = fopen( szFormat, "r+" );
	
	if( iFilePointer )
	{			
		new szByteVal[ 1 ];
		
		fseek( iFilePointer , -1 , SEEK_END );
		fread_raw( iFilePointer , szByteVal , sizeof( szByteVal ) , BLOCK_BYTE );
		fseek( iFilePointer , 0 , SEEK_END );
		
		fprintf( iFilePointer, "%s^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"", ( szByteVal[ 0 ] == 10 ) ? "" : "^n", szName, szSteamId, szIP, szReason, szFlags, szExpireDate, szGaggedBy ); // add him to gaglist
		fclose( iFilePointer );
	}
	return 1;
}

AddMinutesToDate( const szDate[ ], const iMinutes, szReturnDate[ ], const iSize )
{
	new const szFormatRule[ ] = "%m/%d/%Y %H:%M:%S";
	new const iSecondsInMinute = 60;
	
	new iCurrentTimeStamp = parse_time( szDate, szFormatRule );
	iCurrentTimeStamp = iCurrentTimeStamp + ( iMinutes * iSecondsInMinute );
	format_time( szReturnDate, iSize, szFormatRule, iCurrentTimeStamp );
}

AddSecondsToDate( const szDate[ ], const iSeconds, szReturnDate[ ], const iSize )
{
	new const szFormatRule[ ] = "%m/%d/%Y %H:%M:%S";
	
	new iCurrentTimeStamp = parse_time( szDate, szFormatRule );
	iCurrentTimeStamp = iCurrentTimeStamp + iSeconds;
	format_time( szReturnDate, iSize, szFormatRule, iCurrentTimeStamp );
}

RemoveMinutesFromDate( const szDate[ ], const iMinutes, szReturnDate[ ], const iSize )
{
	new const szFormatRule[ ] = "%m/%d/%Y %H:%M:%S";
	
	new iCurrentTimeStamp = parse_time( szDate, szFormatRule );
	iCurrentTimeStamp = iCurrentTimeStamp - iMinutes;
	format_time( szReturnDate, iSize, szFormatRule, iCurrentTimeStamp );
}

ReadBans( )
{
	ArrayClear( g_aBans );

	static szFile[ 128 ], szData[ 192 ];
	formatex( szFile, charsmax( szFile ), "%s/%s", g_szConfigsDir, g_iConfig[ BANS_FILE ] );
	
	new iFile = fopen( szFile, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szData, charsmax( szData ) ) )
		{
			trim( szData );
			
			switch( szData[ 0 ] )
			{
			case EOS, '#', ';', '/', '\':
				{
					continue;
				}

			default:
				{
					new eData[ PlayerBan ];
					if( parse( szData, eData[ Player_Name ], charsmax( eData[ Player_Name ] ), eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), eData[ Player_IP ], charsmax( eData[ Player_IP ] ), 
								eData[ Player_BanExpire ], charsmax( eData[ Player_BanExpire ] ),eData[ Player_BanReason ], charsmax( eData[ Player_BanReason ] ), eData[ Player_BannedBy ], charsmax( eData[ Player_BannedBy ] ) ) < 6 )
					{
						continue;
					}
					
					ArrayPushArray( g_aBans, eData );
				}
			}
		}
		fclose( iFile );
	}
	return PLUGIN_CONTINUE;
}

ReadGags( )
{
	ArrayClear( g_aGags );

	static szFile[ 128 ], szData[ 192 ];
	formatex( szFile, charsmax( szFile ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	
	new iFile = fopen( szFile, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szData, charsmax( szData ) ) )
		{
			trim( szData );
			
			switch( szData[ 0 ] )
			{
			case EOS, '#', ';', '/', '\':
				{
					continue;
				}

			default:
				{
					new eData[ PlayerGag ];
					if( parse( szData, eData[ Player_Name ], charsmax( eData[ Player_Name ] ), eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), eData[ Player_IP ], charsmax( eData[ Player_IP ] ),
								eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ) ) < 7 )
					{
						continue;
					}
					
					ArrayPushArray( g_aGags, eData );
				}
			}
		}
		fclose( iFile );
	}
	return PLUGIN_CONTINUE;
}

public CheckBanned( id )
{
	if( get_user_flags( id ) & g_iConfig[ IMMUNITY_FLAG ] )
	{
		return PLUGIN_HANDLED;
	}

	else
	{
		new eData[ PlayerBan ], iPlayers[ MAX_PLAYERS ], iNum, iTempId;
		get_players( iPlayers, iNum, "ch" );
		
		for( new i; i < ArraySize( g_aBans ); i++ )
		{
			ArrayGetArray( g_aBans, i, eData );
			
			if( equal( g_szAuthId[ id ], eData[ Player_SteamId ] ) || equal( g_szIp[ id ], eData[ Player_IP ] ) )
			{
				if( ! HasDatePassed( eData[ Player_BanExpire ] ) || equali( eData[ Player_BanExpire ], "never" ) )
				{
					if( equali( eData[ Player_BanExpire ], "never" ) )
					{
						send_message( id, CONSOLE, false, "************************************************" );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_BANNED" );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_EXPIRE_NEVER" );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_REASON", eData[ Player_BanReason ] );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_BY", eData[ Player_BannedBy ] );
						send_message( id, CONSOLE, false, "************************************************" );
					}
					
					else
					{
						send_message( id, CONSOLE, false, "************************************************" );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_BANNED" );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_EXPIRE", eData[ Player_BanExpire ] );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_REASON", eData[ Player_BanReason ] );
						send_message( id, CONSOLE, false, "%L", id, "BAN_INFO_BY", eData[ Player_BannedBy ] );
						send_message( id, CONSOLE, false, "************************************************" );
					}

					switch( g_iConfig[ BANNED_CONNECT_LOG ] )
					{
					case METHOD_CHAT:
						{
							for( new i; i < iNum; i++ )
							{
								iTempId = iPlayers[ i ];
								
								if( get_user_flags( iTempId ) & ADMIN_KICK )
								{
									CC_SendMessage( iTempId, "%L", iTempId, "BANNED_PLAYER_CONNECTED", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
								}
							}
						}
						
					case METHOD_LOG:
						{
							send_message( 0, LOG, false, "%L", LANG_PLAYER, "BANNED_PLAYER_CONNECTED", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
						}
						
					case METHOD_BOTH:
						{
							for( new i; i < iNum; i++ )
							{
								iTempId = iPlayers[ i ];
								
								if( get_user_flags( iTempId ) & ADMIN_KICK )
								{
									CC_SendMessage( iTempId, "%L", iTempId, "BANNED_PLAYER_CONNECTED", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
								}
							}
							send_message( 0, LOG, false, "%L", LANG_PLAYER, "BANNED_PLAYER_CONNECTED", eData[ Player_Name ], eData[ Player_SteamId ], eData[ Player_IP ] );
						}
					}
					server_cmd( "kick #%d %L", get_user_userid( id ), id, "CHECK_CONSOLE_INFO" );
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}

CheckGagged( id )
{
	if( get_user_flags( id ) & g_iConfig[ IMMUNITY_FLAG ] )
	{
		return PLUGIN_HANDLED;
	}

	else
	{
		new eData[ PlayerGag ];
		for( new i; i < ArraySize( g_aGags ); i++ )
		{
			ArrayGetArray( g_aGags, i, eData );
			
			if( equali( g_szAuthId[ id ], eData[ Player_SteamId ] ) || equali( g_szIp[ id ], eData[ Player_IP ] ) )
			{
				if( ! HasDatePassed( eData[ Player_GagExpire ] ) && is_user_connected( id ) )
				{
					set_speak( id, SPEAK_MUTED );
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}

ReadUsers( )
{
	TrieClear( g_tDatabase );

	new szFormat[ 64 ], szPlayerData[ 512 ], eData[ PlayerData ];
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ USERS_FILE ] );
	
	new iFile = fopen( szFormat, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szPlayerData, charsmax( szPlayerData ) ) )
		{
			trim( szPlayerData );
			
			switch( szPlayerData[ 0 ] )
			{
			case EOS, '#', '/', '\':
				{
					continue;
				}
				
			default:
				{
					new szImmunity[ 8 ], szKeepPrivileges[ 3 ];
					if( parse( szPlayerData, eData[ Player_Name ], charsmax( eData[ Player_Name ] ), eData[ Player_SteamID ], charsmax( eData[ Player_SteamID ] ), eData[ Player_Password ], charsmax( eData[ Player_Password ] ), eData[ Player_AccessFlags ], charsmax( eData[ Player_AccessFlags ] ),
								eData[ Player_Prefix ], charsmax( eData[ Player_Prefix ] ), eData[ Player_Model_T ], charsmax( eData[ Player_Model_T ] ), eData[ Player_Model_CT ], charsmax( eData[ Player_Model_CT ] ), szImmunity, charsmax( szImmunity ),
								eData[ Player_Expire_Date ], charsmax( eData[ Player_Expire_Date ] ), eData[ Player_FlagsExpire ], charsmax( eData[ Player_FlagsExpire ] ), szKeepPrivileges, charsmax( szKeepPrivileges ) ) < 11 )
					{
						continue;
					}
					
					if( szPlayerData[ 0 ] == ';' )
					{
						replace( eData[ Player_Name ], charsmax( eData[ Player_Name ] ), ";", "" );
					}
					
					new iImmunity = str_to_num( szImmunity );
					eData[ Player_Immunity ] = ( ! is_str_num( szImmunity ) || iImmunity < 0 ) ? 0 : iImmunity;
					
					new iKeepPrivileges = str_to_num( szKeepPrivileges );
					eData[ Player_KeepPrivileges ] = bool:( ( ! is_str_num( szKeepPrivileges ) || !( 0 <= iKeepPrivileges <= 1 ) ) ? 0 : iKeepPrivileges );
					
					if( eData[ Player_SteamID ][ 0 ] )
					{
						TrieSetArray( g_tDatabase, eData[ Player_SteamID ], eData, sizeof eData );
					}
					
					else if( eData[ Player_Name ][ 0 ] )
					{
						TrieSetArray( g_tDatabase, eData[ Player_Name ], eData, sizeof eData );
					}
					arrayset( eData, 0, sizeof( eData ) );
				}
			}
		}
		fclose( iFile );
	}
}

ReadMaps( )
{
	ArrayClear( g_aMaps );

	new szData[ MAX_MAP_NAME_LENGTH ];
	
	new iFile = fopen( g_szMapsFile, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szData, charsmax( szData ) ) )
		{
			trim( szData );
			
			switch( szData[ 0 ] )
			{
			case EOS, '#', '/', '\', ';':
				{
					continue;
				}
				
			default:
				{
					ArrayPushString( g_aMaps, szData );
				}
			}
		}
		fclose( iFile );
	}
}

bool:HasDatePassed( const szDate[ ] )
{
	return get_systime( ) >= parse_time( szDate, "%m/%d/%Y %H:%M:%S" );
}

ScreenShot( id )
{
	client_cmd( id, "snapshot" );
}

ReadConfig( )
{
	new szFile[ 128 ], szData[ 64 ];
	
	formatex( szFile, charsmax( szFile ), "%s/%s", g_szConfigsDir, g_szConfigFile );
	
	new iFile = fopen( szFile, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szData, charsmax( szData ) ) )
		{
			trim( szData );
			
			switch( szData[ 0 ] )
			{
			case EOS, '#', ';', '/', '\':
				{
					continue;
				}

			default:
				{
					new szKey[ 32 ], szValue[ 64 ];
					strtok( szData, szKey, charsmax( szKey ), szValue, charsmax( szValue ), '=' );
					
					trim( szKey );
					trim( szValue );
					
					remove_quotes( szKey );
					remove_quotes( szValue );
					
					if( ! szValue[ 0 ] || ! szKey[ 0 ] )
					{
						continue;
					}
					
					if( equali( szKey, "BANS_FILE" ) )
					{
						copy( g_iConfig[ BANS_FILE ], charsmax( g_iConfig[ BANS_FILE ] ), szValue );
					}
					
					else if( equali( szKey, "GAGS_FILE" ) )
					{
						copy( g_iConfig[ GAGS_FILE ], charsmax( g_iConfig[ GAGS_FILE ] ), szValue );
					}
					
					else if( equali( szKey, "CVARS_FILE" ) )
					{
						copy( g_iConfig[ CVARS_FILE ], charsmax( g_iConfig[ CVARS_FILE ] ), szValue );
					}
					
					else if( equali( szKey, "LOGS_FILE" ) )
					{
						copy( g_iConfig[ LOGS_FILE ], charsmax( g_iConfig[ LOGS_FILE ] ), szValue );
					}
					
					else if( equali( szKey, "USERS_FILE" ) )
					{
						copy( g_iConfig[ USERS_FILE ], charsmax( g_iConfig[ USERS_FILE ] ), szValue );
					}
					
					else if( equali( szKey, "SYSTEM_PREFIX" ) )
					{
						copy( g_iConfig[ SYSTEM_PREFIX ], charsmax( g_iConfig[ SYSTEM_PREFIX ] ), szValue );
					}
					
					else if( equali( szKey, "BANNED_CONNECT_LOG" ) )
					{
						g_iConfig[ BANNED_CONNECT_LOG ] = str_to_num( szValue );
					}
					
					else if( equali( szKey, "KICK_FLAG" ) )
					{
						g_iConfig[ KICK_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "BAN_FLAG" ) )
					{
						g_iConfig[ BAN_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "ADD_BAN_FLAG" ) )
					{
						g_iConfig[ ADD_BAN_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "ADD_GAG_FLAG" ) )
					{
						g_iConfig[ ADD_GAG_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "GAG_FLAG" ) )
					{
						g_iConfig[ GAG_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "UNBAN_FLAG" ) )
					{
						g_iConfig[ UNBAN_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "SLAY_FLAG" ) )
					{
						g_iConfig[ SLAY_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "SLAP_FLAG" ) )
					{
						g_iConfig[ SLAP_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "CVAR_FLAG" ) )
					{
						g_iConfig[ CVAR_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "PLUGINS_FLAG" ) )
					{
						g_iConfig[ PLUGINS_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "MAP_FLAG" ) )
					{
						g_iConfig[ MAP_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "NICK_FLAG" ) )
					{
						g_iConfig[ NICK_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "RCON_FLAG" ) )
					{
						g_iConfig[ RCON_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "SHOW_RCON_FLAG" ) )
					{
						g_iConfig[ SHOW_RCON_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "MODULES_FLAG" ) )
					{
						g_iConfig[ MODULES_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "CHAT_FLAG" ) )
					{
						g_iConfig[ CHAT_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "FREEZE_FLAG" ) )
					{
						g_iConfig[ FREEZE_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "SCREENSHOT_FLAG" ) )
					{
						g_iConfig[ SCREENSHOT_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "COMMANDS_MENU_FLAG" ) )
					{
						g_iConfig[ COMMANDS_MENU_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "UNGAG_FLAG" ) )
					{
						g_iConfig[ UNGAG_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "SAY_FLAG" ) )
					{
						g_iConfig[ SAY_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "TEAM_FLAG" ) )
					{
						g_iConfig[ TEAM_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "PSAY_FLAG" ) )
					{
						g_iConfig[ PSAY_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "LAST_FLAG" ) )
					{
						g_iConfig[ LAST_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "VOTEMAP_FLAG" ) )
					{
						g_iConfig[ VOTEMAP_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "VOTE_FLAG" ) )
					{
						g_iConfig[ VOTE_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "VOTE_TIME" ) )
					{
						g_iConfig[ VOTE_TIME ] = _:str_to_float( szValue );
					}
					
					else if( equali( szKey, "VOTE_MAP_TIME" ) )
					{
						g_iConfig[ VOTE_MAP_TIME ] = _:str_to_float( szValue );
					}
					
					else if( equali( szKey, "NOCLIP_FLAG" ) )
					{
						g_iConfig[ NOCLIP_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "WARN_FLAG" ) )
					{
						g_iConfig[ WARN_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "GODMODE_FLAG" ) )
					{
						g_iConfig[ GODMODE_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "WHO_FLAG" ) )
					{
						g_iConfig[ WHO_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "IMMUNITY_FLAG" ) )
					{
						g_iConfig[ IMMUNITY_FLAG ] = read_flags( szValue );
					}
					
					else if( equali( szKey, "FREQUENCY_UPDATE_ALL_FILES" ) )
					{
						g_iConfig[ FREQUENCY_UPDATE_ALL_FILES ] = _:str_to_float( szValue );
					}
					
					else if( equali( szKey, "DISCONNECT_INFO_SECONDS_EXPIRE" ) )
					{
						g_iConfig[ DISCONNECT_INFO_SECONDS_EXPIRE ] = str_to_num( szValue );
					}

					else if( equali( szKey, "RANKS_ENABLED" ) )
					{
						g_iConfig[ RANKS_ENABLED ] = str_to_num( szValue );
					}
					
					else if( equali( szKey, "CMDMENU_COMMANDS" ) )
					{
						while( szValue[ 0 ] != 0 && strtok( szValue, szKey, charsmax( szKey ), szValue, charsmax( szValue ), ',' ) )
						{
							trim( szKey );
							trim( szValue );
							
							register_concmd( szKey, "@CommandsMenu" );
						}
					}
				}
			}
		}
		fclose( iFile );
	}
}

eas_set_user_team( id, iTeam )
{
	if( is_user_alive( id ) )
	{
		ExecuteHamB( Ham_Killed, id, id, false );
	}
	cs_set_user_team( id, iTeam );
}

bool:IsGagged( id )
{
	new eData[ PlayerGag ], bool:bIsGagged;
	
	for( new i; i < ArraySize( g_aGags ); i++ )
	{
		ArrayGetArray( g_aGags, i, eData );
		
		if( equali( g_szAuthId[ id ], eData[ Player_SteamId ] ) || equali( g_szIp[ id ], eData[ Player_IP ] ) )
		{
			if( equali( eData[ Player_GagExpire ], "never" ) || !HasDatePassed( eData[ Player_GagExpire ] ) )
			{
				bIsGagged = true;
				break;
			}
		}
	}
	return bIsGagged;
}

FreezePlayer( id, iValue )
{
	new iFlags = pev( id , pev_flags )

	switch( iValue )
	{
	case 0:
		{
			if( iFlags & FL_FROZEN )
			{
				set_pev( id, pev_flags, iFlags & ~FL_FROZEN );
				
				g_bFrozen[ id ] = false;
				
				if( g_iFwThink )
				{
					unregister_forward( FM_PlayerPreThink , g_iFwThink );
				}
			}
		}

	case 1:
		{
			if( ~iFlags & FL_FROZEN )
			{
				set_pev( id, pev_flags, iFlags | FL_FROZEN );
				g_bFrozen[ id ] = true;
				pev( id, pev_v_angle, fAngles[ id ] );
				
				g_iFwThink = register_forward( FM_PlayerPreThink , "fw_PlayerPreThink" );
			}
		}
	}
}

ReadCvars( )
{
	new szFile[ 128 ], szData[ 64 ];
	formatex( szFile, charsmax( szFile ), "%s/%s", g_szConfigsDir, g_iConfig[ CVARS_FILE ] );
	
	new iFile = fopen( szFile, "rt" );
	
	if( iFile )
	{
		while( fgets( iFile, szData, charsmax( szData ) ) )
		{
			trim( szData );
			remove_quotes( szData );
			
			switch( szData[ 0 ] )
			{
			case EOS, '#', ';', '/', '\':
				{
					continue;
				}

			default:
				{
					new szKey[ 32 ], szValue[ 32 ];
					strtok( szData, szKey, charsmax( szKey ), szValue, charsmax( szValue ), '=' );
					
					trim( szKey );
					trim( szValue );
					
					remove_quotes( szKey );
					remove_quotes( szValue );
					
					if( ! szValue[ 0 ] || ! szKey[ 0 ] )
					{
						continue;
					}
					
					new eData[ Cvars ];
					
					copy( eData[ Cvar_Name ], charsmax( eData[ Cvar_Name ] ), szKey );
					eData[ Cvar_Flag ] = read_flags( szValue );
					
					ArrayPushArray( g_aCvars, eData );
				}
			}
		}
		fclose( iFile );
	}
}

UpdateGagExpireDate( szName[ ], szExpireDate[ ] )
{
	new const szTempFileName[ ] = "tempfile.ini";

	new szFormat[ 128 ], szData[ 192 ];
	
	new szTempFilePath[ 64 ];
	formatex( szTempFilePath, charsmax( szTempFilePath ), "%s/%s", g_szConfigsDir, szTempFileName );
	
	formatex( szFormat, charsmax( szFormat ), "%s/%s", g_szConfigsDir, g_iConfig[ GAGS_FILE ] );
	new iFilePointer = fopen( szFormat, "rt" );

	if( iFilePointer )
	{
		new iInputFilePointer = fopen( szTempFilePath, "wt" );
		
		if( iInputFilePointer )
		{
			while( fgets( iFilePointer, szData, charsmax( szData ) ) )
			{
				switch( szData[ 0 ] )
				{
				case EOS, '#', ';', '/', '\':
					{
						fprintf( iInputFilePointer, szData ); // write as it was before
					}

				default:
					{			
						new eData[ PlayerGag ];
						if( parse( szData, eData[ Player_Name ], charsmax( eData[ Player_Name ] ), eData[ Player_SteamId ], charsmax( eData[ Player_SteamId ] ), eData[ Player_IP ], charsmax( eData[ Player_IP ] ),
									eData[ Player_GagReason ], charsmax( eData[ Player_GagReason ] ), eData[ Player_GagFlags ], charsmax( eData[ Player_GagFlags ] ), eData[ Player_GagExpire ], charsmax( eData[ Player_GagExpire ] ), eData[ Player_GaggedBy ], charsmax( eData[ Player_GaggedBy ] ) ) < 7 )
						{
							continue;
						}

						if( equali( szName, eData[ Player_Name ] ) )
						{
							format( szData, charsmax( szData ), "^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"", szName, eData[ Player_SteamId ], eData[ Player_IP ], eData[ Player_GagReason ], eData[ Player_GagFlags ], szExpireDate, eData[ Player_GaggedBy ] );
							fprintf( iInputFilePointer, szData );
						}
						
						else
						{
							fprintf( iInputFilePointer, szData ); // write as it was before
						}
					}
				}
			}
			fclose( iInputFilePointer );
			fclose( iFilePointer );

			delete_file( szFormat );
			rename_file( szTempFilePath, szFormat, 1 );
		}
	}
	return 0;
}

send_message( const id, const iWhere, bool:bPrefix, const szInput[ ], any:... )
{
	new szMessage[ 192 ];
	vformat( szMessage, charsmax(szMessage), szInput, 5 );

	CC_RemoveColors( szMessage, charsmax( szMessage ), true );
	
	bPrefix ? format( szMessage, charsmax(szMessage), "%s %s", g_iConfig[ SYSTEM_PREFIX ], szMessage ) : format( szMessage, charsmax(szMessage), "%s", szMessage );
	
	switch( iWhere )
	{
	case CHAT:
		{
			client_print( id, print_chat, szMessage )
		}
		
	case CONSOLE:
		{
			client_print( id, print_console, szMessage )
		}
		
	case LOG:
		{
			new szDate[ MAX_DATE_LENGTH ], szNewLogsFile[ 256 ];
			get_time( "%m-%d-%Y", szDate, charsmax( szDate ) );
			
			formatex( szNewLogsFile, charsmax( szNewLogsFile ),	"%s_%s.ini", g_iConfig[ LOGS_FILE ], szDate );
			log_to_file( szNewLogsFile, szMessage );
		}
	}
}
//////////////////////////////////////////////////////////////////////////// END OF STOCKS AND PRIVATE FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////
Many thanks in advance!
T30D0Rv2 is offline
T30D0Rv2
New Member
Join Date: Jun 2021
Old 06-10-2021 , 12:16   Re: custom amx_who
Reply With Quote #2

If able, I would like to have this implemented as it would probably be easier.

Code:
#define MAX_GROUPS 12
new g_groupNames[MAX_GROUPS][] = {
"Fondator",
"Manager",
"Administrator",
"Super-Moderator",
"Moderator",
"Helper",
"VIP",
"Slot",
"Premium"
}

new players[32], inum, player, name[32], i, a
get_players(players, inum)
console_print(id, "============[SLXD]============")
for(i = 0; i < MAX_GROUPS; i++) {
console_print(id, "=>%s<=", g_groupNames[i])
for(a = 0; a < inum; ++a) {
player = players[a]
get_user_name(player, name, 31)
if(szRank == g_groupNames[i]) {
console_print(id, "%s", name)
}
}
}
console_print(id, "============[SLXD]============")
T30D0Rv2 is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 06-10-2021 , 22:16   Re: custom amx_who
Reply With Quote #3

Please don't copy and past such massive plugins, this is over 6000 lines long. If the plugin is available on the forums, you can simply link to it or if it's not on the forums or is a custom version, attach the .sma file.

So, what issues are you having implementing your code into the plugin? Since this is the scripting help section, you should post (attach) the code that you tried after testing it and telling us what issues you are having.
__________________

Last edited by fysiks; 06-10-2021 at 22:17.
fysiks is offline
T30D0Rv2
New Member
Join Date: Jun 2021
Old 06-11-2021 , 08:13   Re: custom amx_who
Reply With Quote #4

I've tried compiling the default code and it went out okay.

PHP Code:
@Whoid )
{
    if( ~ 
get_user_flagsid ) & g_iConfigWHO_FLAG ] )
    {
        
send_messageidCONSOLEtrue"%L"id"NO_ACCESS_COMMAND" );
        return 
PLUGIN_HANDLED;
    }
    
    new 
iFlagsszFlagsMAX_FLAGS_LENGTH ], szRank32 ], iPlayersMAX_PLAYERS ], iNumiTempId;
    
get_playersiPlayersiNum );
    
    
send_messageidCONSOLEfalse"^nName    SteamID    IP    Flags    Rank" );
    
    for( new 
iiNumi++ )
    {
        
iTempId iPlayers];
        
        
iFlags get_user_flagsiTempId );
        
get_flagsiFlagsszFlagscharsmaxszFlags ) );
        
        if( 
g_iConfigRANKS_ENABLED ] )
        {
            
eas_get_player_rankiTempIdszRankcharsmaxszRank ) );
            
send_messageidCONSOLEfalse"%s  %s  %s  %s  %s"g_szNameiTempId ], g_szAuthIdiTempId ], g_szIpiTempId ], szFlagsszRank );
        }
        
        else
        {
            
send_messageidCONSOLEfalse"%s  %s  %s  %s"g_szNameiTempId ], g_szAuthIdiTempId ], g_szIpiTempId ], szFlags );
        }
    }
    return 
PLUGIN_HANDLED;

But when I tried compiling my code it gave out errors.

PHP Code:
@Whoid )
{
    if( ~ 
get_user_flagsid ) & g_iConfigWHO_FLAG ] )
    {
        
send_messageidCONSOLEtrue"%L"id"NO_ACCESS_COMMAND" );
        return 
PLUGIN_HANDLED;
    }
    
#define MAX_GROUPS 12
        
new g_groupNames[MAX_GROUPS][] = {
        
"Fondator",
        
"Manager",
        
"Administrator",
        
"Super-Moderator",
        
"Moderator",
        
"Helper",
        
"VIP",
        
"Slot"
        
}
    new 
iFlagsszFlagsMAX_FLAGS_LENGTH ], szRank32 ], iPlayersMAX_PLAYERS ], iNumiTempId;
    
get_playersiPlayersiNum );

    
    
send_messageidCONSOLEfalse"^n=====[SLXD]=====" );
    
    for( new 
iiNumi++ )
    {
        
iTempId iPlayers];
        
        
iFlags get_user_flagsiTempId );
        
get_flagsiFlagsszFlagscharsmaxszFlags ) );
        
        if( 
g_iConfigRANKS_ENABLED ] )
        {
            
eas_get_player_rankiTempIdszRankcharsmaxszRank ) );
                        for(
0MAX_GROUPSi++) {
                            
send_messageidCONSOLEfalse"=>%s<="g_groupNames[i]);
                for(
0iNuma++) {
                    if(
szRank == g_groupNames[i]) {
                        
send_messageidCONSOLEfalse"%s"g_szNameiTempId ]);
                    }
                }
            }
            
send_messageidCONSOLEfalse"=====[SLXD]=====" );
        }
        
        else
        {
            
eas_get_player_rankiTempIdszRankcharsmaxszRank ) );
                        for(new 
0MAX_GROUPSi++) {
                            
send_messageidCONSOLEfalse"=>%s<="g_groupNames[i]);
                for(new 
0iNuma++) {
                    if(
szRank == g_groupNames[i]) {
                        
send_messageidCONSOLEfalse"%s"g_szNameiTempId ]);
                    }
                }
            }
            
send_messageidCONSOLEfalse"=====[SLXD]=====" );
        }
    }
    return 
PLUGIN_HANDLED;

plugin link here: click
T30D0Rv2 is offline
lexzor
Veteran Member
Join Date: Nov 2020
Old 06-11-2021 , 12:16   Re: custom amx_who
Reply With Quote #5

why don t u make a separate amx_who plugin? just make one and put it above eliteadminsystem.amxx in plugins.ini
lexzor is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 06-11-2021 , 18:36   Re: custom amx_who
Reply With Quote #6

untested
Attached Files
File Type: sma Get Plugin or Get Source (EliteAdminSystem_Commands.sma - 51 views - 170.4 KB)
__________________
edon1337 is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 03:59.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode