Thread: custom amx_who
View Single Post
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