[Ajutor] Advanced bans

Categoria cu cereri de pluginuri si nu numai.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Forum rules
Accesează link-ul pentru a putea vedea regulile forumului

Daca doriti sa vi se modifice un plugin, va rugam postati aici .
Post Reply
User avatar
marvel_team
Membru, skill +1
Membru, skill +1
Posts: 117
Joined: 23 Mar 2016, 11:08
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: MARVEL.RANGFORT.RO
SteamID: brick_bazuka001
Fond eXtream: 0
Location: Iasi
Has thanked: 1 time
Contact:

22 Apr 2018, 16:32

Salut ,am si eu plugin-ul de Advanced Bans si cand incerc sa banez pe cineva pe oricine imi spune asa :
[MARVEL] Clientul nu a fost autorizat de server.Nu poate fi banat
Stie cineva care este problema ? :| Ma poate ajuta cineva ? Multumesc.
Am sa las sursa mai jos :
| Afiseaza codul
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <regex>

#define PLUGIN_NAME	"Advanced Bans"
#define PLUGIN_VERSION	"0.8.1"
#define PLUGIN_AUTHOR	"Exolent"

#pragma semicolon 1



// ===============================================
// CUSTOMIZATION STARTS HERE
// ===============================================


// uncomment the line below if you want this plugin to
// load old bans from the banned.cfg and listip.cfg files
//#define KEEP_DEFAULT_BANS


// uncomment the line below if you want the history to be in one file
//#define HISTORY_ONE_FILE


// if you must have a maximum amount of bans to be compatible with AMXX versions before 1.8.0
// change this number to your maximum amount
// if you would rather have unlimited (requires AMXX 1.8.0 or higher) then set it to 0
#define MAX_BANS 0


// if you want to use SQL for your server, then uncomment the line below
//#define USING_SQL


// ===============================================
// CUSTOMIZATION ENDS HERE
// ===============================================



#if defined USING_SQL
#include <sqlx>

#define TABLE_NAME		"advanced_bans"
#define KEY_NAME		"name"
#define KEY_STEAMID		"steamid"
#define KEY_BANLENGTH		"banlength"
#define KEY_UNBANTIME		"unbantime"
#define KEY_REASON		"reason"
#define KEY_ADMIN_NAME		"admin_name"
#define KEY_ADMIN_STEAMID	"admin_steamid"

#define RELOAD_BANS_INTERVAL	60.0
#endif

#define REGEX_IP_PATTERN "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
#define REGEX_STEAMID_PATTERN "^^STEAM_0:(0|1):\d+$"

new Regex:g_IP_pattern;
new Regex:g_SteamID_pattern;
new g_regex_return;

/*bool:IsValidIP(const ip[])
{
	return regex_match_c(ip, g_IP_pattern, g_regex_return) > 0;
}*/

#define IsValidIP(%1) (regex_match_c(%1, g_IP_pattern, g_regex_return) > 0)

/*bool:IsValidAuthid(const authid[])
{
	return regex_match_c(authid, g_SteamID_pattern, g_regex_return) > 0;
}*/

#define IsValidAuthid(%1) (regex_match_c(%1, g_SteamID_pattern, g_regex_return) > 0)


enum // for name displaying
{
	ACTIVITY_NONE, // nothing is shown
	ACTIVITY_HIDE, // admin name is hidden
	ACTIVITY_SHOW  // admin name is shown
};
new const g_admin_activity[] =
{
	ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
	ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
	ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
	ACTIVITY_SHOW, // amx_show_activity 3 = show name to admins but hide it from normal users
	ACTIVITY_SHOW, // amx_show_activity 4 = show name to admins but show nothing to normal users
	ACTIVITY_HIDE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};
new const g_normal_activity[] =
{
	ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
	ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
	ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
	ACTIVITY_HIDE, // amx_show_activity 3 = show name to admins but hide it from normal users
	ACTIVITY_NONE, // amx_show_activity 4 = show name to admins but show nothing to normal users
	ACTIVITY_NONE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};


#if MAX_BANS <= 0
enum _:BannedData
{
	bd_name[32],
	bd_steamid[35],
	bd_banlength,
	bd_unbantime[32],
	bd_reason[128],
	bd_admin_name[64],
	bd_admin_steamid[35]
};

new Trie:g_trie;
new Array:g_array;
#else
new g_names[MAX_BANS][32];
new g_steamids[MAX_BANS][35];
new g_banlengths[MAX_BANS];
new g_unbantimes[MAX_BANS][32];
new g_reasons[MAX_BANS][128];
new g_admin_names[MAX_BANS][64];
new g_admin_steamids[MAX_BANS][35];
#endif
new g_total_bans;

#if !defined USING_SQL
new g_ban_file[64];
#else
new Handle:g_sql_tuple;
new bool:g_loading_bans = true;
#endif

new ab_website;
new ab_immunity;
new ab_bandelay;
new ab_unbancheck;

new amx_show_activity;

#if MAX_BANS <= 0
new Array:g_maxban_times;
new Array:g_maxban_flags;
#else
#define MAX_BANLIMITS	30
new g_maxban_times[MAX_BANLIMITS];
new g_maxban_flags[MAX_BANLIMITS];
#endif
new g_total_maxban_times;

new g_unban_entity;

new g_max_clients;

new g_msgid_SayText;

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_cvar("advanced_bans", PLUGIN_VERSION, FCVAR_SPONLY);
	
	register_dictionary("advanced_bans.txt");
	
	register_concmd("amx_ban", "CmdBan", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
	register_concmd("amx_banip", "CmdBanIp", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
	register_concmd("amx_addban", "CmdAddBan", ADMIN_BAN, "<name> <authid or ip> <time in minutes> <reason>");
	register_concmd("amx_unban", "CmdUnban", ADMIN_BAN, "<authid or ip>");
	register_concmd("amx_banlist", "CmdBanList", ADMIN_BAN, "[start] -- shows everyone who is banned");
	register_srvcmd("amx_addbanlimit", "CmdAddBanLimit", -1, "<flag> <time in minutes>");
	
	ab_website = register_cvar("ab_website", "");
	ab_immunity = register_cvar("ab_immunity", "1");
	ab_bandelay = register_cvar("ab_bandelay", "1.0");
	ab_unbancheck = register_cvar("ab_unbancheck", "5.0");
	
	amx_show_activity = register_cvar("amx_show_activity", "2");
	
	#if MAX_BANS <= 0
	g_trie = TrieCreate();
	g_array = ArrayCreate(BannedData);
	#endif
	
	#if !defined MAX_BANLIMITS
	g_maxban_times = ArrayCreate(1);
	g_maxban_flags = ArrayCreate(1);
	#endif
	
	#if !defined USING_SQL
	get_datadir(g_ban_file, sizeof(g_ban_file) - 1);
	add(g_ban_file, sizeof(g_ban_file) - 1, "/advanced_bans.txt");
	
	LoadBans();
	#else
	g_sql_tuple = SQL_MakeStdTuple();
	PrepareTable();
	#endif
	
	new error[2];
	g_IP_pattern = regex_compile(REGEX_IP_PATTERN, g_regex_return, error, sizeof(error) - 1);
	g_SteamID_pattern = regex_compile(REGEX_STEAMID_PATTERN, g_regex_return, error, sizeof(error) - 1);
	
	g_max_clients = get_maxplayers();
	
	g_msgid_SayText = get_user_msgid("SayText");
}

#if defined USING_SQL
PrepareTable()
{
	new query[128];
	formatex(query, sizeof(query) - 1,\
		"CREATE TABLE IF NOT EXISTS `%s` (`%s` varchar(32) NOT NULL, `%s` varchar(35) NOT NULL, `%s` int(10) NOT NULL, `%s` varchar(32) NOT NULL, `%s` varchar(128) NOT NULL, `%s` varchar(64) NOT NULL, `%s` varchar(35) NOT NULL);",\
		TABLE_NAME, KEY_NAME, KEY_STEAMID, KEY_BANLENGTH, KEY_UNBANTIME, KEY_REASON, KEY_ADMIN_NAME, KEY_ADMIN_STEAMID
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryCreateTable", query);
}

public QueryCreateTable(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		LoadBans();
	}
}
#endif

public plugin_cfg()
{
	CreateUnbanEntity();
}

public CreateUnbanEntity()
{
	static failtimes;
	
	g_unban_entity = create_entity("info_target");
	
	if( !is_valid_ent(g_unban_entity) )
	{
		++failtimes;
		
		log_amx("[ERROR] Failed to create unban entity (%i/10)", failtimes);
		
		if( failtimes < 10 )
		{
			set_task(1.0, "CreateUnbanEntity");
		}
		else
		{
			log_amx("[ERROR] Could not create unban entity!");
		}
		
		return;
	}
	
	entity_set_string(g_unban_entity, EV_SZ_classname, "unban_entity");
	entity_set_float(g_unban_entity, EV_FL_nextthink, get_gametime() + 1.0);
	
	register_think("unban_entity", "FwdThink");
}

public client_authorized(client)
{
	static authid[35];
	get_user_authid(client, authid, sizeof(authid) - 1);
	
	static ip[35];
	get_user_ip(client, ip, sizeof(ip) - 1, 1);
	
	#if MAX_BANS > 0
	static banned_authid[35], bool:is_ip;
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(banned_authid, sizeof(banned_authid) - 1, g_steamids);
		
		is_ip = bool:(containi(banned_authid, ".") != -1);
		
		if( is_ip && equal(ip, banned_authid) || !is_ip && equal(authid, banned_authid) )
		{
			static name[32], reason[128], unbantime[32], admin_name[32], admin_steamid[64];
			copy(name, sizeof(name) - 1, g_names);
			copy(reason, sizeof(reason) - 1, g_reasons);
			new banlength = g_banlengths;
			copy(unbantime, sizeof(unbantime) - 1, g_unbantimes);
			copy(admin_name, sizeof(admin_name) - 1, g_admin_names);
			copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids);
			
			PrintBanInformation(client, name, banned_authid, reason, banlength, unbantime, admin_name, admin_steamid, true, true);
			
			set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", client);
			break;
		}
	}
	#else
	static array_pos;
	
	if( TrieGetCell(g_trie, authid, array_pos) || TrieGetCell(g_trie, ip, array_pos) )
	{
		static data[BannedData];
		ArrayGetArray(g_array, array_pos, data);
		
		PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, true);
		
		set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", client);
	}
	#endif
}

public CmdBan(client, level, cid)
{
	if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;
	
	static arg[128];
	read_argv(1, arg, sizeof(arg) - 1);
	
	new target = cmd_target(client, arg, GetTargetFlags(client));
	if( !target ) return PLUGIN_HANDLED;
	
	static target_authid[35];
	get_user_authid(target, target_authid, sizeof(target_authid) - 1);
	
	if( !IsValidAuthid(target_authid) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_NOT_AUTHORIZED");
		return PLUGIN_HANDLED;
	}
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_authid) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_ALREADY_BANNED_STEAMID");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_authid, g_steamids, 1) )
		{
			console_print(client, "[MARVEL] %L", client, "AB_ALREADY_BANNED_STEAMID");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	read_argv(2, arg, sizeof(arg) - 1);
	
	new length = str_to_num(arg);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[64];
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	read_argv(3, arg, sizeof(arg) - 1);
	
	static admin_name[64], target_name[32];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_name(target, target_name, sizeof(target_name) - 1);
	
	static admin_authid[35];
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_authid, arg, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(target, target_name, target_authid, arg, length, unban_time, admin_name, admin_authid, true, true);
	PrintBanInformation(client, target_name, target_authid, arg, length, unban_time, admin_name, admin_authid, false, false);
	
	set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", target);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[CSGO Remake] $name^x01 :^x04  banned %s. Reason: %s. Ban Length: %s", target_name, arg, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_authid, arg, unban_time);
	
	return PLUGIN_HANDLED;
}

public CmdBanIp(client, level, cid)
{
	if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;
	
	static arg[128];
	read_argv(1, arg, sizeof(arg) - 1);
	
	new target = cmd_target(client, arg, GetTargetFlags(client));
	if( !target ) return PLUGIN_HANDLED;
	
	static target_ip[35];
	get_user_ip(target, target_ip, sizeof(target_ip) - 1, 1);
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_ip) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_ALREADY_BANNED_IP");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_ip, g_steamids, 1) )
		{
			console_print(client, "[MARVEL] %L", client, "AB_ALREADY_BANNED_IP");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	read_argv(2, arg, sizeof(arg) - 1);
	
	new length = str_to_num(arg);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[32];
	
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	read_argv(3, arg, sizeof(arg) - 1);
	
	static admin_name[64], target_name[32];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_name(target, target_name, sizeof(target_name) - 1);
	
	static admin_authid[35];
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_ip, arg, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(target, target_name, target_ip, arg, length, unban_time, admin_name, admin_authid, true, true);
	PrintBanInformation(client, target_name, target_ip, arg, length, unban_time, admin_name, admin_authid, false, false);
	
	set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", target);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[CSGO Remake] $name^x01 :^x04  banned %s. Reason: %s. Ban Length: %s", target_name, arg, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_ip, arg, unban_time);
	
	return PLUGIN_HANDLED;
}

public CmdAddBan(client, level, cid)
{
	if( !cmd_access(client, level, cid, 5) ) return PLUGIN_HANDLED;
	
	static target_name[32], target_authid[35], bantime[10], reason[128];
	read_argv(1, target_name, sizeof(target_name) - 1);
	read_argv(2, target_authid, sizeof(target_authid) - 1);
	read_argv(3, bantime, sizeof(bantime) - 1);
	read_argv(4, reason, sizeof(reason) - 1);
	
	new bool:is_ip = bool:(containi(target_authid, ".") != -1);
	
	if( !is_ip && !IsValidAuthid(target_authid) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_INVALID_STEAMID");
		console_print(client, "[MARVEL] %L", client, "AB_VALID_STEAMID_FORMAT");
		
		return PLUGIN_HANDLED;
	}
	else if( is_ip )
	{
		new pos = contain(target_authid, ":");
		if( pos > 0 )
		{
			target_authid[pos] = 0;
		}
		
		if( !IsValidIP(target_authid) )
		{
			console_print(client, "[MARVEL] %L", client, "AB_INVALID_IP");
			
			return PLUGIN_HANDLED;
		}
	}
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_authid) )
	{
		console_print(client, "[MARVEL] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_authid, g_steamids, 1) )
		{
			console_print(client, "[MARVEL] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	new length = str_to_num(bantime);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[MARVEL] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	if( is_user_connected(find_player(is_ip ? "d" : "c", target_authid)) )
	{
		client_cmd(client, "amx_ban ^"%s^" %i ^"%s^"", target_authid, length, reason);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[32];
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	static admin_name[64], admin_authid[35];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_authid, reason, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(client, target_name, target_authid, reason, length, unban_time, "", "", false, false);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[CSGO Remake] $name^x01 :^x04  banned %s %s. Reason: %s. Ban Length: %s", is_ip ? "IP" : "SteamID", target_authid, reason, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_authid, reason, unban_time);
	
	return PLUGIN_HANDLED;
}

public CmdUnban(client, level, cid)
{
	if( !cmd_access(client, level, cid, 2) ) return PLUGIN_HANDLED;
	
	static arg[35];
	read_argv(1, arg, sizeof(arg) - 1);
	
	#if MAX_BANS > 0
	static banned_authid[35];
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(banned_authid, sizeof(banned_authid) - 1, g_steamids[i]);
		
		if( equal(arg, banned_authid) )
		{
			static admin_name[64];
			get_user_name(client, admin_name, sizeof(admin_name) - 1);
			
			static name[32], reason[128];
			copy(name, sizeof(name) - 1, g_names[i]);
			copy(reason, sizeof(reason) - 1, g_reasons[i]);
			
			PrintActivity(admin_name, "^x04[CSGO Remake] $name^x01 :^x04  unbanned %s^x01 [%s] [Ban Reason: %s]", name, arg, reason);
			
			static authid[35];
			get_user_authid(client, authid, sizeof(authid) - 1);
			
			Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^"", admin_name, authid, name, arg, reason);
			
			RemoveBan(i);
			
			return PLUGIN_HANDLED;
		}
	}
	#else
	if( TrieKeyExists(g_trie, arg) )
	{
		static array_pos;
		TrieGetCell(g_trie, arg, array_pos);
		
		static data[BannedData];
		ArrayGetArray(g_array, array_pos, data);
		
		static unban_name[32];
		get_user_name(client, unban_name, sizeof(unban_name) - 1);
		
		PrintActivity(unban_name, "^x04[CSGO Remake] $name^x01 :^x04  unbanned %s^x01 [%s] [Ban Reason: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);
		
		static admin_name[64];
		get_user_name(client, admin_name, sizeof(admin_name) - 1);
		
		static authid[35];
		get_user_authid(client, authid, sizeof(authid) - 1);
		
		Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^"", admin_name, authid, data[bd_name], data[bd_steamid], data[bd_reason]);
		
		RemoveBan(array_pos, data[bd_steamid]);
		
		return PLUGIN_HANDLED;
	}
	#endif
	
	console_print(client, "[MARVEL] %L", client, "AB_NOT_IN_BAN_LIST", arg);
	
	return PLUGIN_HANDLED;
}

public CmdBanList(client, level, cid)
{
	if( !cmd_access(client, level, cid, 1) ) return PLUGIN_HANDLED;
	
	if( !g_total_bans )
	{
		console_print(client, "[MARVEL] %L", client, "AB_NO_BANS");
		return PLUGIN_HANDLED;
	}
	
	static start;
	
	if( read_argc() > 1 )
	{
		static arg[5];
		read_argv(1, arg, sizeof(arg) - 1);
		
		start = min(str_to_num(arg), g_total_bans) - 1;
	}
	else
	{
		start = 0;
	}
	
	new last = min(start + 10, g_total_bans);
	
	if( client == 0 )
	{
		server_cmd("echo ^"%L^"", client, "AB_BAN_LIST_NUM", start + 1, last);
	}
	else
	{
		client_cmd(client, "echo ^"%L^"", client, "AB_BAN_LIST_NUM", start + 1, last);
	}
	
	for( new i = start; i < last; i++ )
	{
		#if MAX_BANS <= 0
		static data[BannedData];
		ArrayGetArray(g_array, i, data);
		
		PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, false);
		#else
		static name[32], steamid[35], reason[128], banlength, unbantime[32], admin_name[32], admin_steamid[35];
		
		copy(name, sizeof(name) - 1, g_names[i]);
		copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
		copy(reason, sizeof(reason) - 1, g_reasons[i]);
		banlength = g_banlengths[i];
		copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
		copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
		copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);
		
		PrintBanInformation(client, name, steamid, reason, banlength, unbantime, admin_name, admin_steamid, true, false);
		#endif
	}
	
	if( ++last < g_total_bans )
	{
		if( client == 0 )
		{
			server_cmd("echo ^"%L^"", client, "AB_BAN_LIST_NEXT", last);
		}
		else
		{
			client_cmd(client, "echo ^"%L^"", client, "AB_BAN_LIST_NEXT", last);
		}
	}
	
	return PLUGIN_HANDLED;
}

public CmdAddBanLimit()
{
	if( read_argc() != 3 )
	{
		log_amx("amx_addbanlimit was used with incorrect parameters!");
		log_amx("Usage: amx_addbanlimit <flags> <time in minutes>");
		return PLUGIN_HANDLED;
	}
	
	static arg[16];
	
	read_argv(1, arg, sizeof(arg) - 1);
	new flags = read_flags(arg);
	
	read_argv(2, arg, sizeof(arg) - 1);
	new minutes = str_to_num(arg);
	
	#if !defined MAX_BANLIMITS
	ArrayPushCell(g_maxban_flags, flags);
	ArrayPushCell(g_maxban_times, minutes);
	#else
	if( g_total_maxban_times >= MAX_BANLIMITS )
	{
		static notified;
		if( !notified )
		{
			log_amx("The amx_addbanlimit has reached its maximum!");
			notified = 1;
		}
		return PLUGIN_HANDLED;
	}
	
	g_maxban_flags[g_total_maxban_times] = flags;
	g_maxban_times[g_total_maxban_times] = minutes;
	#endif
	g_total_maxban_times++;
	
	return PLUGIN_HANDLED;
}

public FwdThink(entity)
{
	if( entity != g_unban_entity ) return;
	
	#if defined USING_SQL
	if( g_total_bans > 0 && !g_loading_bans )
	#else
	if( g_total_bans > 0 )
	#endif
	{
		static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
		format_time(_hours, sizeof(_hours) - 1, "%H");
		format_time(_minutes, sizeof(_minutes) - 1, "%M");
		format_time(_seconds, sizeof(_seconds) - 1, "%S");
		format_time(_month, sizeof(_month) - 1, "%m");
		format_time(_day, sizeof(_day) - 1, "%d");
		format_time(_year, sizeof(_year) - 1, "%Y");
		
		// c = current
		// u = unban
		
		new c_hours = str_to_num(_hours);
		new c_minutes = str_to_num(_minutes);
		new c_seconds = str_to_num(_seconds);
		new c_month = str_to_num(_month);
		new c_day = str_to_num(_day);
		new c_year = str_to_num(_year);
		
		static unban_time[32];
		static u_hours, u_minutes, u_seconds, u_month, u_day, u_year;
		
		for( new i = 0; i < g_total_bans; i++ )
		{
			#if MAX_BANS <= 0
			static data[BannedData];
			ArrayGetArray(g_array, i, data);
			
			if( data[bd_banlength] == 0 ) continue;
			#else
			if( g_banlengths[i] == 0 ) continue;
			#endif
			
			#if MAX_BANS <= 0
			copy(unban_time, sizeof(unban_time) - 1, data[bd_unbantime]);
			#else
			copy(unban_time, sizeof(unban_time) - 1, g_unbantimes[i]);
			#endif
			replace_all(unban_time, sizeof(unban_time) - 1, ":", " ");
			replace_all(unban_time, sizeof(unban_time) - 1, "/", " ");
			
			parse(unban_time,\
				_hours, sizeof(_hours) - 1,\
				_minutes, sizeof(_minutes) - 1,\
				_seconds, sizeof(_seconds) - 1,\
				_month, sizeof(_month) - 1,\
				_day, sizeof(_day) - 1,\
				_year, sizeof(_year) - 1
				);
			
			u_hours = str_to_num(_hours);
			u_minutes = str_to_num(_minutes);
			u_seconds = str_to_num(_seconds);
			u_month = str_to_num(_month);
			u_day = str_to_num(_day);
			u_year = str_to_num(_year);
			
			if( u_year < c_year
			|| u_year == c_year && u_month < c_month
			|| u_year == c_year && u_month == c_month && u_day < c_day
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours < c_hours
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes < c_minutes
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes == c_minutes && u_seconds <= c_seconds )
			{
				#if MAX_BANS <= 0
				Log("Ban time is up for: %s [%s]", data[bd_name], data[bd_steamid]);
				
				Print("^x04[CSGO Remake]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);
				
				RemoveBan(i, data[bd_steamid]);
				#else
				Log("Ban time is up for: %s [%s]", g_names[i], g_steamids[i]);
				
				Print("^x04[CSGO Remake]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]", g_names[i], g_steamids[i], g_reasons[i]);
				
				RemoveBan(i);
				#endif
				
				i--; // current pos was replaced with another ban, so we need to check it again.
			}
		}
	}
	
	entity_set_float(g_unban_entity, EV_FL_nextthink, get_gametime() + get_pcvar_float(ab_unbancheck));
}

public TaskDisconnectPlayer(client)
{
	server_cmd("kick #%i ^"You are banned from this server. Check your console^"", get_user_userid(client));
}

AddBan(const target_name[], const target_steamid[], const reason[], const length, const unban_time[], const admin_name[], const admin_steamid[])
{
	#if MAX_BANS > 0
	if( g_total_bans == MAX_BANS )
	{
		log_amx("Ban list is full! (%i)", g_total_bans);
		return;
	}
	#endif
	
	#if defined USING_SQL
	static target_name2[32], reason2[128], admin_name2[32];
	MakeStringSQLSafe(target_name, target_name2, sizeof(target_name2) - 1);
	MakeStringSQLSafe(reason, reason2, sizeof(reason2) - 1);
	MakeStringSQLSafe(admin_name, admin_name2, sizeof(admin_name2) - 1);
	
	static query[512];
	formatex(query, sizeof(query) - 1,\
		"INSERT INTO `%s` (`%s`, `%s`, `%s`, `%s`, `%s`, `%s`, `%s`) VALUES ('%s', '%s', '%i', '%s', '%s', '%s', '%s');",\
		TABLE_NAME, KEY_NAME, KEY_STEAMID, KEY_BANLENGTH, KEY_UNBANTIME, KEY_REASON, KEY_ADMIN_NAME, KEY_ADMIN_STEAMID,\
		target_name2, target_steamid, length, unban_time, reason2, admin_name2, admin_steamid
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryAddBan", query);
	#else
	new f = fopen(g_ban_file, "a+");
	
	fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
		target_steamid,\
		target_name,\
		length,\
		unban_time,\
		reason,\
		admin_name,\
		admin_steamid
		);
	
	fclose(f);
	#endif
	
	#if MAX_BANS <= 0
	static data[BannedData];
	copy(data[bd_name], sizeof(data[bd_name]) - 1, target_name);
	copy(data[bd_steamid], sizeof(data[bd_steamid]) - 1, target_steamid);
	data[bd_banlength] = length;
	copy(data[bd_unbantime], sizeof(data[bd_unbantime]) - 1, unban_time);
	copy(data[bd_reason], sizeof(data[bd_reason]) - 1, reason);
	copy(data[bd_admin_name], sizeof(data[bd_admin_name]) - 1, admin_name);
	copy(data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1, admin_steamid);
	
	TrieSetCell(g_trie, target_steamid, g_total_bans);
	ArrayPushArray(g_array, data);
	#else
	copy(g_names[g_total_bans], sizeof(g_names[]) - 1, target_name);
	copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, target_steamid);
	g_banlengths[g_total_bans] = length;
	copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unban_time);
	copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
	copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
	copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
	#endif
	
	g_total_bans++;
	
	#if MAX_BANS > 0
	if( g_total_bans == MAX_BANS )
	{
		log_amx("Ban list is full! (%i)", g_total_bans);
	}
	#endif
}

#if defined USING_SQL
public QueryAddBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		// Yay, ban was added! We can all rejoice!
	}
}

public QueryDeleteBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		// Yay, ban was deleted! We can all rejoice!
	}
}

public QueryLoadBans(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		if( SQL_NumResults(query) )
		{
			#if MAX_BANS <= 0
			static data[BannedData];
			while( SQL_MoreResults(query) )
			#else
			while( SQL_MoreResults(query) && g_total_bans < MAX_BANS )
			#endif
			{
				#if MAX_BANS <= 0
				SQL_ReadResult(query, 0, data[bd_name], sizeof(data[bd_name]) - 1);
				SQL_ReadResult(query, 1, data[bd_steamid], sizeof(data[bd_steamid]) - 1);
				data[bd_banlength] = SQL_ReadResult(query, 2);
				SQL_ReadResult(query, 3, data[bd_unbantime], sizeof(data[bd_unbantime]) - 1);
				SQL_ReadResult(query, 4, data[bd_reason], sizeof(data[bd_reason]) - 1);
				SQL_ReadResult(query, 5, data[bd_admin_name], sizeof(data[bd_admin_name]) - 1);
				SQL_ReadResult(query, 6, data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1);
				
				ArrayPushArray(g_array, data);
				TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
				#else
				SQL_ReadResult(query, 0, g_names[g_total_bans], sizeof(g_names[]) - 1);
				SQL_ReadResult(query, 1, g_steamids[g_total_bans], sizeof(g_steamids[]) - 1);
				g_banlengths[g_total_bans] = SQL_ReadResult(query, 2);
				SQL_ReadResult(query, 3, g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1);
				SQL_ReadResult(query, 4, g_reasons[g_total_bans], sizeof(g_reasons[]) - 1);
				SQL_ReadResult(query, 5, g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1);
				SQL_ReadResult(query, 6, g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1);
				#endif
				
				g_total_bans++;
				
				SQL_NextRow(query);
			}
		}
		
		set_task(RELOAD_BANS_INTERVAL, "LoadBans");
		
		g_loading_bans = false;
	}
}
#endif

#if MAX_BANS > 0
RemoveBan(remove)
{
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"DELETE FROM `%s` WHERE `%s` = '%s';",\
		TABLE_NAME, KEY_STEAMID, g_steamids[remove]
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
	#endif
	
	for( new i = remove; i < g_total_bans; i++ )
	{
		if( (i + 1) == g_total_bans )
		{
			copy(g_names[i], sizeof(g_names[]) - 1, "");
			copy(g_steamids[i], sizeof(g_steamids[]) - 1, "");
			g_banlengths[i] = 0;
			copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, "");
			copy(g_reasons[i], sizeof(g_reasons[]) - 1, "");
			copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, "");
			copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, "");
		}
		else
		{
			copy(g_names[i], sizeof(g_names[]) - 1, g_names[i + 1]);
			copy(g_steamids[i], sizeof(g_steamids[]) - 1, g_steamids[i + 1]);
			g_banlengths[i] = g_banlengths[i + 1];
			copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, g_unbantimes[i + 1]);
			copy(g_reasons[i], sizeof(g_reasons[]) - 1, g_reasons[i + 1]);
			copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, g_admin_names[i + 1]);
			copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, g_admin_steamids[i + 1]);
		}
	}
	
	g_total_bans--;
	
	#if !defined USING_SQL
	new f = fopen(g_ban_file, "wt");
	
	static name[32], steamid[35], banlength, unbantime[32], reason[128], admin_name[32], admin_steamid[35];
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(name, sizeof(name) - 1, g_names[i]);
		copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
		banlength = g_banlengths[i];
		copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
		copy(reason, sizeof(reason) - 1, g_reasons[i]);
		copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
		copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);
		
		fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
			steamid,\
			name,\
			banlength,\
			unbantime,\
			reason,\
			admin_name,\
			admin_steamid
			);
	}
	
	fclose(f);
	#endif
}
#else
RemoveBan(pos, const authid[])
{
	TrieDeleteKey(g_trie, authid);
	ArrayDeleteItem(g_array, pos);
	
	g_total_bans--;
	
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"DELETE FROM `%s` WHERE `%s` = '%s';",\
		TABLE_NAME, KEY_STEAMID, authid
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
	
	new data[BannedData];
	for( new i = 0; i < g_total_bans; i++ )
	{
		ArrayGetArray(g_array, i, data);
		TrieSetCell(g_trie, data[bd_steamid], i);
	}
	#else
	new f = fopen(g_ban_file, "wt");
	
	new data[BannedData];
	for( new i = 0; i < g_total_bans; i++ )
	{
		ArrayGetArray(g_array, i, data);
		TrieSetCell(g_trie, data[bd_steamid], i);
		
		fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
			data[bd_steamid],\
			data[bd_name],\
			data[bd_banlength],\
			data[bd_unbantime],\
			data[bd_reason],\
			data[bd_admin_name],\
			data[bd_admin_steamid]
			);
	}
	
	fclose(f);
	#endif
}
#endif

#if defined KEEP_DEFAULT_BANS
LoadOldBans(filename[])
{
	if( file_exists(filename) )
	{
		new f = fopen(filename, "rt");
		
		static data[96];
		static command[10], minutes[10], steamid[35], length, unban_time[32];
		
		while( !feof(f) )
		{
			fgets(f, data, sizeof(data) - 1);
			if( !data[0] ) continue;
			
			parse(data, command, sizeof(command) - 1, minutes, sizeof(minutes) - 1, steamid, sizeof(steamid) - 1);
			if( filename[0] == 'b' && !equali(command, "banid") || filename[0] == 'l' && !equali(command, "addip") ) continue;
			
			length = str_to_num(minutes);
			GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
			
			AddBan("", steamid, "", length, unban_time, "", "");
		}
		
		fclose(f);
		
		static filename2[32];
		
		// copy current
		copy(filename2, sizeof(filename2) - 1, filename);
		
		// cut off at the "."
		// banned.cfg = banned
		// listip.cfg = listip
		filename2[containi(filename2, ".")] = 0;
		
		// add 2.cfg
		// banned = banned2.cfg
		// listip = listip2.cfg
		add(filename2, sizeof(filename2) - 1, "2.cfg");
		
		// rename file so that it isnt loaded again
		while( !rename_file(filename, filename2, 1) ) { }
	}
}
#endif

public LoadBans()
{
	if( g_total_bans )
	{
		#if MAX_BANS <= 0
		TrieClear(g_trie);
		ArrayClear(g_array);
		#endif
		
		g_total_bans = 0;
	}
	
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"SELECT * FROM `%s`;",\
		TABLE_NAME
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryLoadBans", query);
	
	g_loading_bans = true;
	#else
	if( file_exists(g_ban_file) )
	{
		new f = fopen(g_ban_file, "rt");
		
		static filedata[512], length[10];
		
		#if MAX_BANS <= 0
		static data[BannedData];
		while( !feof(f) )
		#else
		while( !feof(f) && g_total_bans < MAX_BANS )
		#endif
		{
			fgets(f, filedata, sizeof(filedata) - 1);
			
			if( !filedata[0] ) continue;
			
			#if MAX_BANS <= 0
			parse(filedata,\
				data[bd_steamid], sizeof(data[bd_steamid]) - 1,\
				data[bd_name], sizeof(data[bd_name]) - 1,\
				length, sizeof(length) - 1,\
				data[bd_unbantime], sizeof(data[bd_unbantime]) - 1,\
				data[bd_reason], sizeof(data[bd_reason]) - 1,\
				data[bd_admin_name], sizeof(data[bd_admin_name]) - 1,\
				data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1
				);
			
			data[bd_banlength] = str_to_num(length);
			
			ArrayPushArray(g_array, data);
			TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
			#else
			static steamid[35], name[32], unbantime[32], reason[128], admin_name[32], admin_steamid[35];
			
			parse(filedata,\
				steamid, sizeof(steamid) - 1,\
				name, sizeof(name) - 1,\
				length, sizeof(length) - 1,\
				unbantime, sizeof(unbantime) - 1,\
				reason, sizeof(reason) - 1,\
				admin_name, sizeof(admin_name) - 1,\
				admin_steamid, sizeof(admin_steamid) - 1
				);
			
			copy(g_names[g_total_bans], sizeof(g_names[]) - 1, name);
			copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, steamid);
			g_banlengths[g_total_bans] = str_to_num(length);
			copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unbantime);
			copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
			copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
			copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
			#endif
			
			g_total_bans++;
		}
		
		fclose(f);
	}
	#endif
	
	// load these after, so when they are added to the file with AddBan(), they aren't loaded again from above.
	
	#if defined KEEP_DEFAULT_BANS
	LoadOldBans("banned.cfg");
	LoadOldBans("listip.cfg");
	#endif
}

#if defined USING_SQL
MakeStringSQLSafe(const input[], output[], len)
{
	copy(output, len, input);
	replace_all(output, len, "'", "*");
	replace_all(output, len, "^"", "*");
	replace_all(output, len, "`", "*");
}
#endif

GetBanTime(const bantime, length[], len)
{
	new minutes = bantime;
	new hours = 0;
	new days = 0;
	
	while( minutes >= 60 )
	{
		minutes -= 60;
		hours++;
	}
	
	while( hours >= 24 )
	{
		hours -= 24;
		days++;
	}
	
	new bool:add_before;
	if( minutes )
	{
		formatex(length, len, "%i minute%s", minutes, minutes == 1 ? "" : "s");
		
		add_before = true;
	}
	if( hours )
	{
		if( add_before )
		{
			format(length, len, "%i hour%s, %s", hours, hours == 1 ? "" : "s", length);
		}
		else
		{
			formatex(length, len, "%i hour%s", hours, hours == 1 ? "" : "s");
			
			add_before = true;
		}
	}
	if( days )
	{
		if( add_before )
		{
			format(length, len, "%i day%s, %s", days, days == 1 ? "" : "s", length);
		}
		else
		{
			formatex(length, len, "%i day%s", days, days == 1 ? "" : "s");
			
			add_before = true;
		}
	}
	if( !add_before )
	{
		// minutes, hours, and days = 0
		// assume permanent ban
		copy(length, len, "Permanent Ban");
	}
}

GenerateUnbanTime(const bantime, unban_time[], len)
{
	static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
	format_time(_hours, sizeof(_hours) - 1, "%H");
	format_time(_minutes, sizeof(_minutes) - 1, "%M");
	format_time(_seconds, sizeof(_seconds) - 1, "%S");
	format_time(_month, sizeof(_month) - 1, "%m");
	format_time(_day, sizeof(_day) - 1, "%d");
	format_time(_year, sizeof(_year) - 1, "%Y");
	
	new hours = str_to_num(_hours);
	new minutes = str_to_num(_minutes);
	new seconds = str_to_num(_seconds);
	new month = str_to_num(_month);
	new day = str_to_num(_day);
	new year = str_to_num(_year);
	
	minutes += bantime;
	
	while( minutes >= 60 )
	{
		minutes -= 60;
		hours++;
	}
	
	while( hours >= 24 )
	{
		hours -= 24;
		day++;
	}
	
	new max_days = GetDaysInMonth(month, year);
	while( day > max_days )
	{
		day -= max_days;
		month++;
	}
	
	while( month > 12 )
	{
		month -= 12;
		year++;
	}
	
	formatex(unban_time, len, "%i:%02i:%02i %i/%i/%i", hours, minutes, seconds, month, day, year);
}

GetDaysInMonth(month, year=0)
{
	switch( month )
	{
		case 1:		return 31; // january
		case 2:		return ((year % 4) == 0) ? 29 : 28; // february
		case 3:		return 31; // march
		case 4:		return 30; // april
		case 5:		return 31; // may
		case 6:		return 30; // june
		case 7:		return 31; // july
		case 8:		return 31; // august
		case 9:		return 30; // september
		case 10:	return 31; // october
		case 11:	return 30; // november
		case 12:	return 31; // december
	}
	
	return 30;
}

GetTargetFlags(client)
{
	static const flags_no_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS);
	static const flags_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS|CMDTARGET_OBEY_IMMUNITY);
	
	switch( get_pcvar_num(ab_immunity) )
	{
		case 1: return flags_immunity;
		case 2: return access(client, ADMIN_IMMUNITY) ? flags_no_immunity : flags_immunity;
	}
	
	return flags_no_immunity;
}

GetMaxBanTime(client)
{
	if( !g_total_maxban_times ) return 0;
	
	new flags = get_user_flags(client);
	
	for( new i = 0; i < g_total_maxban_times; i++ )
	{
		#if !defined MAX_BANLIMITS
		if( flags & ArrayGetCell(g_maxban_flags, i) )
		{
			return ArrayGetCell(g_maxban_times, i);
		}
		#else
		if( flags & g_maxban_flags[i] )
		{
			return g_maxban_times[i];
		}
		#endif
	}
	
	return 0;
}

PrintBanInformation(client, const target_name[], const target_authid[], const reason[], const length, const unban_time[], const admin_name[], const admin_authid[], bool:show_admin, bool:show_website)
{
	static website[64], ban_length[64];
	if( client == 0 )
	{
		server_print("************************************************");
		server_print("%L", client, "AB_BAN_INFORMATION");
		server_print("%L: %s", client, "AB_NAME", target_name);
		server_print("%L: %s", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
		server_print("%L: %s", client, "AB_REASON", reason);
		if( length > 0 )
		{
			GetBanTime(length, ban_length, sizeof(ban_length) - 1);
			server_print("%L: %s", client, "AB_BAN_LENGTH", ban_length);
		}
		server_print("%L: %s", client, "AB_UNBAN_TIME", unban_time);
		if( show_admin )
		{
			server_print("%L: %s", client, "AB_ADMIN_NAME", admin_name);
			server_print("%L: %s", client, "AB_ADMIN_STEAMID", admin_authid);
		}
		if( show_website )
		{
			get_pcvar_string(ab_website, website, sizeof(website) - 1);
			if( website[0] )
			{
				server_print("");
				server_print("%L", client, "AB_WEBSITE");
				server_print("%s", website);
			}
		}
		server_print("************************************************");
	}
	else
	{
		client_cmd(client, "echo ^"************************************************^"");
		client_cmd(client, "echo ^"%L^"", client, "AB_BAN_INFORMATION");
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_NAME", target_name);
		client_cmd(client, "echo ^"%L: %s^"", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_REASON", reason);
		if( length > 0 )
		{
			GetBanTime(length, ban_length, sizeof(ban_length) - 1);
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_BAN_LENGTH", ban_length);
		}
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_UNBAN_TIME", unban_time);
		if( show_admin )
		{
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_NAME", admin_name);
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_STEAMID", admin_authid);
		}
		if( show_website )
		{
			get_pcvar_string(ab_website, website, sizeof(website) - 1);
			if( website[0] )
			{
				client_cmd(client, "echo ^"^"");
				client_cmd(client, "echo ^"%L^"", client, "AB_WEBSITE");
				client_cmd(client, "echo ^"%s^"", website);
			}
		}
		client_cmd(client, "echo ^"************************************************^"");
	}
}

PrintActivity(const admin_name[], const message_fmt[], any:...)
{
	if( !get_playersnum() ) return;
	
	new activity = get_pcvar_num(amx_show_activity);
	if( !(0 <= activity <= 5) )
	{
		set_pcvar_num(amx_show_activity, (activity = 2));
	}
	
	static message[192], temp[192];
	vformat(message, sizeof(message) - 1, message_fmt, 3);
	
	for( new client = 1; client <= g_max_clients; client++ )
	{
		if( !is_user_connected(client) ) continue;
		
		switch( is_user_admin(client) ? g_admin_activity[activity] : g_normal_activity[activity] )
		{
			case ACTIVITY_NONE:
			{
				
			}
			case ACTIVITY_HIDE:
			{
				copy(temp, sizeof(temp) - 1, message);
				replace(temp, sizeof(temp) - 1, "$name", "ADMIN");
				
				message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
				write_byte(client);
				write_string(temp);
				message_end();
			}
			case ACTIVITY_SHOW:
			{
				copy(temp, sizeof(temp) - 1, message);
				replace(temp, sizeof(temp) - 1, "$name", admin_name);
				
				message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
				write_byte(client);
				write_string(temp);
				message_end();
			}
		}
	}
}

Print(const message_fmt[], any:...)
{
	if( !get_playersnum() ) return;
	
	static message[192];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	for( new client = 1; client <= g_max_clients; client++ )
	{
		if( !is_user_connected(client) ) continue;
		
		message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
		write_byte(client);
		write_string(message);
		message_end();
	}
}

Log(const message_fmt[], any:...)
{
	static message[256];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	static filename[96];
	#if defined HISTORY_ONE_FILE
	if( !filename[0] )
	{
		get_basedir(filename, sizeof(filename) - 1);
		add(filename, sizeof(filename) - 1, "/logs/ban_history.log");
	}
	#else
	static dir[64];
	if( !dir[0] )
	{
		get_basedir(dir, sizeof(dir) - 1);
		add(dir, sizeof(dir) - 1, "/logs");
	}
	
	format_time(filename, sizeof(filename) - 1, "%m%d%Y");
	format(filename, sizeof(filename) - 1, "%s/BAN_HISTORY_%s.log", dir, filename);
	#endif
	
	log_amx("%s", message);
	log_to_file(filename, "%s", message);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
RoyalServer 2
User avatar
Laurentiu P.
Fost moderator
Fost moderator
Posts: 2549
Joined: 10 Jul 2013, 21:26
Detinator Steam: Da
Reputatie: Fost super moderator
Fond eXtream: 100
Has thanked: 26 times
Been thanked: 62 times
Contact:

22 Apr 2018, 20:33

Nu executi corect comanda sau nu are avces la comanda sau are imunitate... numai stiu exact cum e la pluginu asta. Din cate stiu la ban pe ip/steamid trebuia trecute intre ghilimele "123.456.masa.tasu"
no...
User avatar
Jucks
Membru, skill +3
Membru, skill +3
Posts: 1141
Joined: 20 May 2016, 16:28
Detinator Steam: Da
Fond eXtream: 0
Contact:

23 Apr 2018, 07:54

:up:
aceeasi problema o am si eu cateodata
Detinator : # Go.Tried.Ro #
User avatar
marvel_team
Membru, skill +1
Membru, skill +1
Posts: 117
Joined: 23 Mar 2016, 11:08
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: MARVEL.RANGFORT.RO
SteamID: brick_bazuka001
Fond eXtream: 0
Location: Iasi
Has thanked: 1 time
Contact:

23 Apr 2018, 09:33

Am incercat sa dau ban la un jucator normal fara grad ... si am incercat normal pe nume :
amx_ban ... si nu merge :|
User avatar
faKe91
Fost moderator
Fost moderator
Posts: 1064
Joined: 07 Oct 2014, 18:49
Detinator Steam: Da
CS Status: I <3 Heavy Metal
SteamID: dogseatmypancreas
Reputatie: Fost moderator ajutator
Fost Membru Club eXtreamCS (doua luni)
Fond eXtream: 0
Location: Republica Moldova, Chișinău
Has thanked: 9 times
Been thanked: 12 times

23 Apr 2018, 11:08

Posteaza dproto.cfg sau reunion.cfg. Foloseste bbcode

Code: Select all

[Sursa=][/Sursa]
User avatar
Xeno985
Membru, skill +1
Membru, skill +1
Posts: 206
Joined: 05 Jul 2017, 22:07
Detinator Steam: Da
CS Status: Disponibil, doar cand sunt acasa.
Detinator server CS: Nu
SteamID: 512916512916
Reputatie: Membru Club eXtreamCS (28 Jan - 28 Feb)
Fond eXtream: 0
Location: 127.0.0.1
Discord: nvF4B8A
Has thanked: 12 times
Been thanked: 4 times
Contact:

23 Apr 2018, 11:20

Si eu am patit asta si este o chestie legata de admincmd si advanced bans:

Advanced bans:
| Afiseaza codul
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <regex>

#define PLUGIN_NAME	"Advanced Bans"
#define PLUGIN_VERSION	"0.8.1"
#define PLUGIN_AUTHOR	"Exolent"

#pragma semicolon 1



// ===============================================
// CUSTOMIZATION STARTS HERE
// ===============================================


// uncomment the line below if you want this plugin to
// load old bans from the banned.cfg and listip.cfg files
//#define KEEP_DEFAULT_BANS


// uncomment the line below if you want the history to be in one file
//#define HISTORY_ONE_FILE


// if you must have a maximum amount of bans to be compatible with AMXX versions before 1.8.0
// change this number to your maximum amount
// if you would rather have unlimited (requires AMXX 1.8.0 or higher) then set it to 0
#define MAX_BANS 0


// if you want to use SQL for your server, then uncomment the line below
//#define USING_SQL


// ===============================================
// CUSTOMIZATION ENDS HERE
// ===============================================



#if defined USING_SQL
#include <sqlx>

#define TABLE_NAME		"advanced_bans"
#define KEY_NAME		"name"
#define KEY_STEAMID		"steamid"
#define KEY_BANLENGTH		"banlength"
#define KEY_UNBANTIME		"unbantime"
#define KEY_REASON		"reason"
#define KEY_ADMIN_NAME		"admin_name"
#define KEY_ADMIN_STEAMID	"admin_steamid"

#define RELOAD_BANS_INTERVAL	60.0
#endif

#define REGEX_IP_PATTERN "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
#define REGEX_STEAMID_PATTERN "^^STEAM_0:(0|1):\d+$"

new Regex:g_IP_pattern;
new Regex:g_SteamID_pattern;
new g_regex_return;

/*bool:IsValidIP(const ip[])
{
	return regex_match_c(ip, g_IP_pattern, g_regex_return) > 0;
}*/

#define IsValidIP(%1) (regex_match_c(%1, g_IP_pattern, g_regex_return) > 0)

/*bool:IsValidAuthid(const authid[])
{
	return regex_match_c(authid, g_SteamID_pattern, g_regex_return) > 0;
}*/

#define IsValidAuthid(%1) (regex_match_c(%1, g_SteamID_pattern, g_regex_return) > 0)


enum // for name displaying
{
	ACTIVITY_NONE, // nothing is shown
	ACTIVITY_HIDE, // admin name is hidden
	ACTIVITY_SHOW  // admin name is shown
};
new const g_admin_activity[] =
{
	ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
	ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
	ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
	ACTIVITY_SHOW, // amx_show_activity 3 = show name to admins but hide it from normal users
	ACTIVITY_SHOW, // amx_show_activity 4 = show name to admins but show nothing to normal users
	ACTIVITY_HIDE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};
new const g_normal_activity[] =
{
	ACTIVITY_NONE, // amx_show_activity 0 = show nothing to everyone
	ACTIVITY_HIDE, // amx_show_activity 1 = hide admin name from everyone
	ACTIVITY_SHOW, // amx_show_activity 2 = show admin name to everyone
	ACTIVITY_HIDE, // amx_show_activity 3 = show name to admins but hide it from normal users
	ACTIVITY_NONE, // amx_show_activity 4 = show name to admins but show nothing to normal users
	ACTIVITY_NONE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};


#if MAX_BANS <= 0
enum _:BannedData
{
	bd_name[32],
	bd_steamid[35],
	bd_banlength,
	bd_unbantime[32],
	bd_reason[128],
	bd_admin_name[64],
	bd_admin_steamid[35]
};

new Trie:g_trie;
new Array:g_array;
#else
new g_names[MAX_BANS][32];
new g_steamids[MAX_BANS][35];
new g_banlengths[MAX_BANS];
new g_unbantimes[MAX_BANS][32];
new g_reasons[MAX_BANS][128];
new g_admin_names[MAX_BANS][64];
new g_admin_steamids[MAX_BANS][35];
#endif
new g_total_bans;

#if !defined USING_SQL
new g_ban_file[64];
#else
new Handle:g_sql_tuple;
new bool:g_loading_bans = true;
#endif

new ab_website;
new ab_immunity;
new ab_bandelay;
new ab_unbancheck;

new amx_show_activity;

#if MAX_BANS <= 0
new Array:g_maxban_times;
new Array:g_maxban_flags;
#else
#define MAX_BANLIMITS	30
new g_maxban_times[MAX_BANLIMITS];
new g_maxban_flags[MAX_BANLIMITS];
#endif
new g_total_maxban_times;

new g_unban_entity;

new g_max_clients;

new g_msgid_SayText;

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_cvar("advanced_bans", PLUGIN_VERSION, FCVAR_SPONLY);
	
	register_dictionary("advanced_bans.txt");
	
	register_concmd("amx_ban", "CmdBanIp", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
	register_concmd("amx_banip", "CmdBanIp", ADMIN_BAN, "<nick, #userid, authid> <time in minutes> <reason>");
	register_concmd("amx_addban", "CmdAddBan", ADMIN_BAN, "<name> <authid or ip> <time in minutes> <reason>");
	register_concmd("amx_unban", "CmdUnban", ADMIN_BAN, "<authid or ip>");
	register_concmd("amx_banlist", "CmdBanList", ADMIN_BAN, "[start] -- shows everyone who is banned");
	register_srvcmd("amx_addbanlimit", "CmdAddBanLimit", -1, "<flag> <time in minutes>");
	
	ab_website = register_cvar("ab_website", "www.godspower.ro/forum");
	ab_immunity = register_cvar("ab_immunity", "1");
	ab_bandelay = register_cvar("ab_bandelay", "1.0");
	ab_unbancheck = register_cvar("ab_unbancheck", "5.0");
	
	amx_show_activity = register_cvar("amx_show_activity", "2");
	
	#if MAX_BANS <= 0
	g_trie = TrieCreate();
	g_array = ArrayCreate(BannedData);
	#endif
	
	#if !defined MAX_BANLIMITS
	g_maxban_times = ArrayCreate(1);
	g_maxban_flags = ArrayCreate(1);
	#endif
	
	#if !defined USING_SQL
	get_datadir(g_ban_file, sizeof(g_ban_file) - 1);
	add(g_ban_file, sizeof(g_ban_file) - 1, "/advanced_bans.txt");
	
	LoadBans();
	#else
	g_sql_tuple = SQL_MakeStdTuple();
	PrepareTable();
	#endif
	
	new error[2];
	g_IP_pattern = regex_compile(REGEX_IP_PATTERN, g_regex_return, error, sizeof(error) - 1);
	g_SteamID_pattern = regex_compile(REGEX_STEAMID_PATTERN, g_regex_return, error, sizeof(error) - 1);
	
	g_max_clients = get_maxplayers();
	
	g_msgid_SayText = get_user_msgid("SayText");
}

#if defined USING_SQL
PrepareTable()
{
	new query[128];
	formatex(query, sizeof(query) - 1,\
		"CREATE TABLE IF NOT EXISTS `%s` (`%s` varchar(32) NOT NULL, `%s` varchar(35) NOT NULL, `%s` int(10) NOT NULL, `%s` varchar(32) NOT NULL, `%s` varchar(128) NOT NULL, `%s` varchar(64) NOT NULL, `%s` varchar(35) NOT NULL);",\
		TABLE_NAME, KEY_NAME, KEY_STEAMID, KEY_BANLENGTH, KEY_UNBANTIME, KEY_REASON, KEY_ADMIN_NAME, KEY_ADMIN_STEAMID
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryCreateTable", query);
}

public QueryCreateTable(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		LoadBans();
	}
}
#endif

public plugin_cfg()
{
	CreateUnbanEntity();
}

public CreateUnbanEntity()
{
	static failtimes;
	
	g_unban_entity = create_entity("info_target");
	
	if( !is_valid_ent(g_unban_entity) )
	{
		++failtimes;
		
		log_amx("[ERROR] Failed to create unban entity (%i/10)", failtimes);
		
		if( failtimes < 10 )
		{
			set_task(1.0, "CreateUnbanEntity");
		}
		else
		{
			log_amx("[ERROR] Could not create unban entity!");
		}
		
		return;
	}
	
	entity_set_string(g_unban_entity, EV_SZ_classname, "unban_entity");
	entity_set_float(g_unban_entity, EV_FL_nextthink, get_gametime() + 1.0);
	
	register_think("unban_entity", "FwdThink");
}

public client_authorized(client)
{
	static authid[35];
	get_user_authid(client, authid, sizeof(authid) - 1);
	
	static ip[35];
	get_user_ip(client, ip, sizeof(ip) - 1, 1);
	
	#if MAX_BANS > 0
	static banned_authid[35], bool:is_ip;
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(banned_authid, sizeof(banned_authid) - 1, g_steamids);
		
		is_ip = bool:(containi(banned_authid, ".") != -1);
		
		if( is_ip && equal(ip, banned_authid) || !is_ip && equal(authid, banned_authid) )
		{
			static name[32], reason[128], unbantime[32], admin_name[32], admin_steamid[64];
			copy(name, sizeof(name) - 1, g_names);
			copy(reason, sizeof(reason) - 1, g_reasons);
			new banlength = g_banlengths;
			copy(unbantime, sizeof(unbantime) - 1, g_unbantimes);
			copy(admin_name, sizeof(admin_name) - 1, g_admin_names);
			copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids);
			
			PrintBanInformation(client, name, banned_authid, reason, banlength, unbantime, admin_name, admin_steamid, true, true);
			
			set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", client);
			break;
		}
	}
	#else
	static array_pos;
	
	if( TrieGetCell(g_trie, authid, array_pos) || TrieGetCell(g_trie, ip, array_pos) )
	{
		static data[BannedData];
		ArrayGetArray(g_array, array_pos, data);
		
		PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, true);
		
		set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", client);
	}
	#endif
}

/*public CmdBan(client, level, cid)
{
	if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;
	
	static arg[128];
	read_argv(1, arg, sizeof(arg) - 1);
	
	new target = cmd_target(client, arg, GetTargetFlags(client));
	if( !target ) return PLUGIN_HANDLED;
	
	static target_authid[35];
	get_user_authid(target, target_authid, sizeof(target_authid) - 1);
	
	if( !IsValidAuthid(target_authid) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_NOT_AUTHORIZED");
		return PLUGIN_HANDLED;
	}
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_authid) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_ALREADY_BANNED_STEAMID");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_authid, g_steamids, 1) )
		{
			console_print(client, "[AdvancedBans] %L", client, "AB_ALREADY_BANNED_STEAMID");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	read_argv(2, arg, sizeof(arg) - 1);
	
	new length = str_to_num(arg);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[64];
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	read_argv(3, arg, sizeof(arg) - 1);
	
	static admin_name[64], target_name[32];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_name(target, target_name, sizeof(target_name) - 1);
	
	static admin_authid[35];
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_authid, arg, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(target, target_name, target_authid, arg, length, unban_time, admin_name, admin_authid, true, true);
	PrintBanInformation(client, target_name, target_authid, arg, length, unban_time, admin_name, admin_authid, false, false);
	
	set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", target);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[AdvancedBans] $name^x01 :^x03  banned %s. Reason: %s. Ban Length: %s", target_name, arg, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_authid, arg, unban_time);
	
	return PLUGIN_HANDLED;
}
*/
public CmdBanIp(client, level, cid)
{
	if( !cmd_access(client, level, cid, 4) ) return PLUGIN_HANDLED;
	
	static arg[128];
	read_argv(1, arg, sizeof(arg) - 1);
	
	new target = cmd_target(client, arg, GetTargetFlags(client));
	if( !target ) return PLUGIN_HANDLED;
	
	static target_ip[35];
	get_user_ip(target, target_ip, sizeof(target_ip) - 1, 1);
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_ip) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_ALREADY_BANNED_IP");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_ip, g_steamids, 1) )
		{
			console_print(client, "[AdvancedBans] %L", client, "AB_ALREADY_BANNED_IP");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	read_argv(2, arg, sizeof(arg) - 1);
	
	new length = str_to_num(arg);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[32];
	
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	read_argv(3, arg, sizeof(arg) - 1);
	
	static admin_name[64], target_name[32];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_name(target, target_name, sizeof(target_name) - 1);
	
	static admin_authid[35];
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_ip, arg, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(target, target_name, target_ip, arg, length, unban_time, admin_name, admin_authid, true, true);
	PrintBanInformation(client, target_name, target_ip, arg, length, unban_time, admin_name, admin_authid, false, false);
	
	set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer", target);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[AdvancedBans] $name^x01 :^x03  banned %s. Reason: %s. Ban Length: %s", target_name, arg, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_ip, arg, unban_time);
	
	return PLUGIN_HANDLED;
}

public CmdAddBan(client, level, cid)
{
	if( !cmd_access(client, level, cid, 5) ) return PLUGIN_HANDLED;
	
	static target_name[32], target_authid[35], bantime[10], reason[128];
	read_argv(1, target_name, sizeof(target_name) - 1);
	read_argv(2, target_authid, sizeof(target_authid) - 1);
	read_argv(3, bantime, sizeof(bantime) - 1);
	read_argv(4, reason, sizeof(reason) - 1);
	
	new bool:is_ip = bool:(containi(target_authid, ".") != -1);
	
	if( !is_ip && !IsValidAuthid(target_authid) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_INVALID_STEAMID");
		console_print(client, "[AdvancedBans] %L", client, "AB_VALID_STEAMID_FORMAT");
		
		return PLUGIN_HANDLED;
	}
	else if( is_ip )
	{
		new pos = contain(target_authid, ":");
		if( pos > 0 )
		{
			target_authid[pos] = 0;
		}
		
		if( !IsValidIP(target_authid) )
		{
			console_print(client, "[AdvancedBans] %L", client, "AB_INVALID_IP");
			
			return PLUGIN_HANDLED;
		}
	}
	
	#if MAX_BANS <= 0
	if( TrieKeyExists(g_trie, target_authid) )
	{
		console_print(client, "[AdvancedBans] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
		return PLUGIN_HANDLED;
	}
	#else
	for( new i = 0; i < g_total_bans; i++ )
	{
		if( !strcmp(target_authid, g_steamids, 1) )
		{
			console_print(client, "[AdvancedBans] %L", client, is_ip ? "AB_ALREADY_BANNED_IP" : "AB_ALREADY_BANNED_STEAMID");
			return PLUGIN_HANDLED;
		}
	}
	#endif
	
	new length = str_to_num(bantime);
	new maxlength = GetMaxBanTime(client);
	
	if( maxlength && (!length || length > maxlength) )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_MAX_BAN_TIME", maxlength);
		return PLUGIN_HANDLED;
	}
	
	if( is_user_connected(find_player(is_ip ? "d" : "c", target_authid)) )
	{
		client_cmd(client, "amx_ban ^"%s^" %i ^"%s^"", target_authid, length, reason);
		return PLUGIN_HANDLED;
	}
	
	static unban_time[32];
	if( length == 0 )
	{
		formatex(unban_time, sizeof(unban_time) - 1, "%L", client, "AB_PERMANENT_BAN");
	}
	else
	{
		GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
	}
	
	static admin_name[64], admin_authid[35];
	get_user_name(client, admin_name, sizeof(admin_name) - 1);
	get_user_authid(client, admin_authid, sizeof(admin_authid) - 1);
	
	AddBan(target_name, target_authid, reason, length, unban_time, admin_name, admin_authid);
	
	PrintBanInformation(client, target_name, target_authid, reason, length, unban_time, "", "", false, false);
	
	GetBanTime(length, unban_time, sizeof(unban_time) - 1);
	
	PrintActivity(admin_name, "^x04[AdvancedBans] $name^x01 :^x03  banned %s %s. Reason: %s. Ban Length: %s", is_ip ? "IP" : "SteamID", target_authid, reason, unban_time);
	
	Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s", admin_name, admin_authid, target_name, target_authid, reason, unban_time);
	
	return PLUGIN_HANDLED;
}

public CmdUnban(client, level, cid)
{
	if( !cmd_access(client, level, cid, 2) ) return PLUGIN_HANDLED;
	
	static arg[35];
	read_argv(1, arg, sizeof(arg) - 1);
	
	#if MAX_BANS > 0
	static banned_authid[35];
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(banned_authid, sizeof(banned_authid) - 1, g_steamids[i]);
		
		if( equal(arg, banned_authid) )
		{
			static admin_name[64];
			get_user_name(client, admin_name, sizeof(admin_name) - 1);
			
			static name[32], reason[128];
			copy(name, sizeof(name) - 1, g_names[i]);
			copy(reason, sizeof(reason) - 1, g_reasons[i]);
			
			PrintActivity(admin_name, "^x04[AdvancedBans] $name^x01 :^x03  unbanned %s^x01 [%s] [Ban Reason: %s]", name, arg, reason);
			
			static authid[35];
			get_user_authid(client, authid, sizeof(authid) - 1);
			
			Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^"", admin_name, authid, name, arg, reason);
			
			RemoveBan(i);
			
			return PLUGIN_HANDLED;
		}
	}
	#else
	if( TrieKeyExists(g_trie, arg) )
	{
		static array_pos;
		TrieGetCell(g_trie, arg, array_pos);
		
		static data[BannedData];
		ArrayGetArray(g_array, array_pos, data);
		
		static unban_name[32];
		get_user_name(client, unban_name, sizeof(unban_name) - 1);
		
		PrintActivity(unban_name, "^x04[AdvancedBans] $name^x01 :^x03  unbanned %s^x01 [%s] [Ban Reason: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);
		
		static admin_name[64];
		get_user_name(client, admin_name, sizeof(admin_name) - 1);
		
		static authid[35];
		get_user_authid(client, authid, sizeof(authid) - 1);
		
		Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^"", admin_name, authid, data[bd_name], data[bd_steamid], data[bd_reason]);
		
		RemoveBan(array_pos, data[bd_steamid]);
		
		return PLUGIN_HANDLED;
	}
	#endif
	
	console_print(client, "[AdvancedBans] %L", client, "AB_NOT_IN_BAN_LIST", arg);
	
	return PLUGIN_HANDLED;
}

public CmdBanList(client, level, cid)
{
	if( !cmd_access(client, level, cid, 1) ) return PLUGIN_HANDLED;
	
	if( !g_total_bans )
	{
		console_print(client, "[AdvancedBans] %L", client, "AB_NO_BANS");
		return PLUGIN_HANDLED;
	}
	
	static start;
	
	if( read_argc() > 1 )
	{
		static arg[5];
		read_argv(1, arg, sizeof(arg) - 1);
		
		start = min(str_to_num(arg), g_total_bans) - 1;
	}
	else
	{
		start = 0;
	}
	
	new last = min(start + 10, g_total_bans);
	
	if( client == 0 )
	{
		server_cmd("echo ^"%L^"", client, "AB_BAN_LIST_NUM", start + 1, last);
	}
	else
	{
		client_cmd(client, "echo ^"%L^"", client, "AB_BAN_LIST_NUM", start + 1, last);
	}
	
	for( new i = start; i < last; i++ )
	{
		#if MAX_BANS <= 0
		static data[BannedData];
		ArrayGetArray(g_array, i, data);
		
		PrintBanInformation(client, data[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], true, false);
		#else
		static name[32], steamid[35], reason[128], banlength, unbantime[32], admin_name[32], admin_steamid[35];
		
		copy(name, sizeof(name) - 1, g_names[i]);
		copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
		copy(reason, sizeof(reason) - 1, g_reasons[i]);
		banlength = g_banlengths[i];
		copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
		copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
		copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);
		
		PrintBanInformation(client, name, steamid, reason, banlength, unbantime, admin_name, admin_steamid, true, false);
		#endif
	}
	
	if( ++last < g_total_bans )
	{
		if( client == 0 )
		{
			server_cmd("echo ^"%L^"", client, "AB_BAN_LIST_NEXT", last);
		}
		else
		{
			client_cmd(client, "echo ^"%L^"", client, "AB_BAN_LIST_NEXT", last);
		}
	}
	
	return PLUGIN_HANDLED;
}

public CmdAddBanLimit()
{
	if( read_argc() != 3 )
	{
		log_amx("amx_addbanlimit was used with incorrect parameters!");
		log_amx("Usage: amx_addbanlimit <flags> <time in minutes>");
		return PLUGIN_HANDLED;
	}
	
	static arg[16];
	
	read_argv(1, arg, sizeof(arg) - 1);
	new flags = read_flags(arg);
	
	read_argv(2, arg, sizeof(arg) - 1);
	new minutes = str_to_num(arg);
	
	#if !defined MAX_BANLIMITS
	ArrayPushCell(g_maxban_flags, flags);
	ArrayPushCell(g_maxban_times, minutes);
	#else
	if( g_total_maxban_times >= MAX_BANLIMITS )
	{
		static notified;
		if( !notified )
		{
			log_amx("The amx_addbanlimit has reached its maximum!");
			notified = 1;
		}
		return PLUGIN_HANDLED;
	}
	
	g_maxban_flags[g_total_maxban_times] = flags;
	g_maxban_times[g_total_maxban_times] = minutes;
	#endif
	g_total_maxban_times++;
	
	return PLUGIN_HANDLED;
}

public FwdThink(entity)
{
	if( entity != g_unban_entity ) return;
	
	#if defined USING_SQL
	if( g_total_bans > 0 && !g_loading_bans )
	#else
	if( g_total_bans > 0 )
	#endif
	{
		static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
		format_time(_hours, sizeof(_hours) - 1, "%H");
		format_time(_minutes, sizeof(_minutes) - 1, "%M");
		format_time(_seconds, sizeof(_seconds) - 1, "%S");
		format_time(_month, sizeof(_month) - 1, "%m");
		format_time(_day, sizeof(_day) - 1, "%d");
		format_time(_year, sizeof(_year) - 1, "%Y");
		
		// c = current
		// u = unban
		
		new c_hours = str_to_num(_hours);
		new c_minutes = str_to_num(_minutes);
		new c_seconds = str_to_num(_seconds);
		new c_month = str_to_num(_month);
		new c_day = str_to_num(_day);
		new c_year = str_to_num(_year);
		
		static unban_time[32];
		static u_hours, u_minutes, u_seconds, u_month, u_day, u_year;
		
		for( new i = 0; i < g_total_bans; i++ )
		{
			#if MAX_BANS <= 0
			static data[BannedData];
			ArrayGetArray(g_array, i, data);
			
			if( data[bd_banlength] == 0 ) continue;
			#else
			if( g_banlengths[i] == 0 ) continue;
			#endif
			
			#if MAX_BANS <= 0
			copy(unban_time, sizeof(unban_time) - 1, data[bd_unbantime]);
			#else
			copy(unban_time, sizeof(unban_time) - 1, g_unbantimes[i]);
			#endif
			replace_all(unban_time, sizeof(unban_time) - 1, ":", " ");
			replace_all(unban_time, sizeof(unban_time) - 1, "/", " ");
			
			parse(unban_time,\
				_hours, sizeof(_hours) - 1,\
				_minutes, sizeof(_minutes) - 1,\
				_seconds, sizeof(_seconds) - 1,\
				_month, sizeof(_month) - 1,\
				_day, sizeof(_day) - 1,\
				_year, sizeof(_year) - 1
				);
			
			u_hours = str_to_num(_hours);
			u_minutes = str_to_num(_minutes);
			u_seconds = str_to_num(_seconds);
			u_month = str_to_num(_month);
			u_day = str_to_num(_day);
			u_year = str_to_num(_year);
			
			if( u_year < c_year
			|| u_year == c_year && u_month < c_month
			|| u_year == c_year && u_month == c_month && u_day < c_day
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours < c_hours
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes < c_minutes
			|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes == c_minutes && u_seconds <= c_seconds )
			{
				#if MAX_BANS <= 0
				Log("Ban time is up for: %s [%s]", data[bd_name], data[bd_steamid]);
				
				Print("^x04[AdvancedBans]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]", data[bd_name], data[bd_steamid], data[bd_reason]);
				
				RemoveBan(i, data[bd_steamid]);
				#else
				Log("Ban time is up for: %s [%s]", g_names[i], g_steamids[i]);
				
				Print("^x04[AdvancedBans]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]", g_names[i], g_steamids[i], g_reasons[i]);
				
				RemoveBan(i);
				#endif
				
				i--; // current pos was replaced with another ban, so we need to check it again.
			}
		}
	}
	
	entity_set_float(g_unban_entity, EV_FL_nextthink, get_gametime() + get_pcvar_float(ab_unbancheck));
}

public TaskDisconnectPlayer(client)
{
	server_cmd("kick #%i ^"You are banned from this server. Check your console^"", get_user_userid(client));
}

AddBan(const target_name[], const target_steamid[], const reason[], const length, const unban_time[], const admin_name[], const admin_steamid[])
{
	#if MAX_BANS > 0
	if( g_total_bans == MAX_BANS )
	{
		log_amx("Ban list is full! (%i)", g_total_bans);
		return;
	}
	#endif
	
	#if defined USING_SQL
	static target_name2[32], reason2[128], admin_name2[32];
	MakeStringSQLSafe(target_name, target_name2, sizeof(target_name2) - 1);
	MakeStringSQLSafe(reason, reason2, sizeof(reason2) - 1);
	MakeStringSQLSafe(admin_name, admin_name2, sizeof(admin_name2) - 1);
	
	static query[512];
	formatex(query, sizeof(query) - 1,\
		"INSERT INTO `%s` (`%s`, `%s`, `%s`, `%s`, `%s`, `%s`, `%s`) VALUES ('%s', '%s', '%i', '%s', '%s', '%s', '%s');",\
		TABLE_NAME, KEY_NAME, KEY_STEAMID, KEY_BANLENGTH, KEY_UNBANTIME, KEY_REASON, KEY_ADMIN_NAME, KEY_ADMIN_STEAMID,\
		target_name2, target_steamid, length, unban_time, reason2, admin_name2, admin_steamid
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryAddBan", query);
	#else
	new f = fopen(g_ban_file, "a+");
	
	fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
		target_steamid,\
		target_name,\
		length,\
		unban_time,\
		reason,\
		admin_name,\
		admin_steamid
		);
	
	fclose(f);
	#endif
	
	#if MAX_BANS <= 0
	static data[BannedData];
	copy(data[bd_name], sizeof(data[bd_name]) - 1, target_name);
	copy(data[bd_steamid], sizeof(data[bd_steamid]) - 1, target_steamid);
	data[bd_banlength] = length;
	copy(data[bd_unbantime], sizeof(data[bd_unbantime]) - 1, unban_time);
	copy(data[bd_reason], sizeof(data[bd_reason]) - 1, reason);
	copy(data[bd_admin_name], sizeof(data[bd_admin_name]) - 1, admin_name);
	copy(data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1, admin_steamid);
	
	TrieSetCell(g_trie, target_steamid, g_total_bans);
	ArrayPushArray(g_array, data);
	#else
	copy(g_names[g_total_bans], sizeof(g_names[]) - 1, target_name);
	copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, target_steamid);
	g_banlengths[g_total_bans] = length;
	copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unban_time);
	copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
	copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
	copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
	#endif
	
	g_total_bans++;
	
	#if MAX_BANS > 0
	if( g_total_bans == MAX_BANS )
	{
		log_amx("Ban list is full! (%i)", g_total_bans);
	}
	#endif
}

#if defined USING_SQL
public QueryAddBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		// Yay, ban was added! We can all rejoice!
	}
}

public QueryDeleteBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		// Yay, ban was deleted! We can all rejoice!
	}
}

public QueryLoadBans(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
{
	if( failstate == TQUERY_CONNECT_FAILED )
	{
		set_fail_state("Could not connect to database.");
	}
	else if( failstate == TQUERY_QUERY_FAILED )
	{
		set_fail_state("Query failed.");
	}
	else if( errcode )
	{
		log_amx("Error on query: %s", error);
	}
	else
	{
		if( SQL_NumResults(query) )
		{
			#if MAX_BANS <= 0
			static data[BannedData];
			while( SQL_MoreResults(query) )
			#else
			while( SQL_MoreResults(query) && g_total_bans < MAX_BANS )
			#endif
			{
				#if MAX_BANS <= 0
				SQL_ReadResult(query, 0, data[bd_name], sizeof(data[bd_name]) - 1);
				SQL_ReadResult(query, 1, data[bd_steamid], sizeof(data[bd_steamid]) - 1);
				data[bd_banlength] = SQL_ReadResult(query, 2);
				SQL_ReadResult(query, 3, data[bd_unbantime], sizeof(data[bd_unbantime]) - 1);
				SQL_ReadResult(query, 4, data[bd_reason], sizeof(data[bd_reason]) - 1);
				SQL_ReadResult(query, 5, data[bd_admin_name], sizeof(data[bd_admin_name]) - 1);
				SQL_ReadResult(query, 6, data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1);
				
				ArrayPushArray(g_array, data);
				TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
				#else
				SQL_ReadResult(query, 0, g_names[g_total_bans], sizeof(g_names[]) - 1);
				SQL_ReadResult(query, 1, g_steamids[g_total_bans], sizeof(g_steamids[]) - 1);
				g_banlengths[g_total_bans] = SQL_ReadResult(query, 2);
				SQL_ReadResult(query, 3, g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1);
				SQL_ReadResult(query, 4, g_reasons[g_total_bans], sizeof(g_reasons[]) - 1);
				SQL_ReadResult(query, 5, g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1);
				SQL_ReadResult(query, 6, g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1);
				#endif
				
				g_total_bans++;
				
				SQL_NextRow(query);
			}
		}
		
		set_task(RELOAD_BANS_INTERVAL, "LoadBans");
		
		g_loading_bans = false;
	}
}
#endif

#if MAX_BANS > 0
RemoveBan(remove)
{
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"DELETE FROM `%s` WHERE `%s` = '%s';",\
		TABLE_NAME, KEY_STEAMID, g_steamids[remove]
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
	#endif
	
	for( new i = remove; i < g_total_bans; i++ )
	{
		if( (i + 1) == g_total_bans )
		{
			copy(g_names[i], sizeof(g_names[]) - 1, "");
			copy(g_steamids[i], sizeof(g_steamids[]) - 1, "");
			g_banlengths[i] = 0;
			copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, "");
			copy(g_reasons[i], sizeof(g_reasons[]) - 1, "");
			copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, "");
			copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, "");
		}
		else
		{
			copy(g_names[i], sizeof(g_names[]) - 1, g_names[i + 1]);
			copy(g_steamids[i], sizeof(g_steamids[]) - 1, g_steamids[i + 1]);
			g_banlengths[i] = g_banlengths[i + 1];
			copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1, g_unbantimes[i + 1]);
			copy(g_reasons[i], sizeof(g_reasons[]) - 1, g_reasons[i + 1]);
			copy(g_admin_names[i], sizeof(g_admin_names[]) - 1, g_admin_names[i + 1]);
			copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1, g_admin_steamids[i + 1]);
		}
	}
	
	g_total_bans--;
	
	#if !defined USING_SQL
	new f = fopen(g_ban_file, "wt");
	
	static name[32], steamid[35], banlength, unbantime[32], reason[128], admin_name[32], admin_steamid[35];
	for( new i = 0; i < g_total_bans; i++ )
	{
		copy(name, sizeof(name) - 1, g_names[i]);
		copy(steamid, sizeof(steamid) - 1, g_steamids[i]);
		banlength = g_banlengths[i];
		copy(unbantime, sizeof(unbantime) - 1, g_unbantimes[i]);
		copy(reason, sizeof(reason) - 1, g_reasons[i]);
		copy(admin_name, sizeof(admin_name) - 1, g_admin_names[i]);
		copy(admin_steamid, sizeof(admin_steamid) - 1, g_admin_steamids[i]);
		
		fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
			steamid,\
			name,\
			banlength,\
			unbantime,\
			reason,\
			admin_name,\
			admin_steamid
			);
	}
	
	fclose(f);
	#endif
}
#else
RemoveBan(pos, const authid[])
{
	TrieDeleteKey(g_trie, authid);
	ArrayDeleteItem(g_array, pos);
	
	g_total_bans--;
	
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"DELETE FROM `%s` WHERE `%s` = '%s';",\
		TABLE_NAME, KEY_STEAMID, authid
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
	
	new data[BannedData];
	for( new i = 0; i < g_total_bans; i++ )
	{
		ArrayGetArray(g_array, i, data);
		TrieSetCell(g_trie, data[bd_steamid], i);
	}
	#else
	new f = fopen(g_ban_file, "wt");
	
	new data[BannedData];
	for( new i = 0; i < g_total_bans; i++ )
	{
		ArrayGetArray(g_array, i, data);
		TrieSetCell(g_trie, data[bd_steamid], i);
		
		fprintf(f, "^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
			data[bd_steamid],\
			data[bd_name],\
			data[bd_banlength],\
			data[bd_unbantime],\
			data[bd_reason],\
			data[bd_admin_name],\
			data[bd_admin_steamid]
			);
	}
	
	fclose(f);
	#endif
}
#endif

#if defined KEEP_DEFAULT_BANS
LoadOldBans(filename[])
{
	if( file_exists(filename) )
	{
		new f = fopen(filename, "rt");
		
		static data[96];
		static command[10], minutes[10], steamid[35], length, unban_time[32];
		
		while( !feof(f) )
		{
			fgets(f, data, sizeof(data) - 1);
			if( !data[0] ) continue;
			
			parse(data, command, sizeof(command) - 1, minutes, sizeof(minutes) - 1, steamid, sizeof(steamid) - 1);
			if( filename[0] == 'b' && !equali(command, "banid") || filename[0] == 'l' && !equali(command, "addip") ) continue;
			
			length = str_to_num(minutes);
			GenerateUnbanTime(length, unban_time, sizeof(unban_time) - 1);
			
			AddBan("", steamid, "", length, unban_time, "", "");
		}
		
		fclose(f);
		
		static filename2[32];
		
		// copy current
		copy(filename2, sizeof(filename2) - 1, filename);
		
		// cut off at the "."
		// banned.cfg = banned
		// listip.cfg = listip
		filename2[containi(filename2, ".")] = 0;
		
		// add 2.cfg
		// banned = banned2.cfg
		// listip = listip2.cfg
		add(filename2, sizeof(filename2) - 1, "2.cfg");
		
		// rename file so that it isnt loaded again
		while( !rename_file(filename, filename2, 1) ) { }
	}
}
#endif

public LoadBans()
{
	if( g_total_bans )
	{
		#if MAX_BANS <= 0
		TrieClear(g_trie);
		ArrayClear(g_array);
		#endif
		
		g_total_bans = 0;
	}
	
	#if defined USING_SQL
	static query[128];
	formatex(query, sizeof(query) - 1,\
		"SELECT * FROM `%s`;",\
		TABLE_NAME
		);
	
	SQL_ThreadQuery(g_sql_tuple, "QueryLoadBans", query);
	
	g_loading_bans = true;
	#else
	if( file_exists(g_ban_file) )
	{
		new f = fopen(g_ban_file, "rt");
		
		static filedata[512], length[10];
		
		#if MAX_BANS <= 0
		static data[BannedData];
		while( !feof(f) )
		#else
		while( !feof(f) && g_total_bans < MAX_BANS )
		#endif
		{
			fgets(f, filedata, sizeof(filedata) - 1);
			
			if( !filedata[0] ) continue;
			
			#if MAX_BANS <= 0
			parse(filedata,\
				data[bd_steamid], sizeof(data[bd_steamid]) - 1,\
				data[bd_name], sizeof(data[bd_name]) - 1,\
				length, sizeof(length) - 1,\
				data[bd_unbantime], sizeof(data[bd_unbantime]) - 1,\
				data[bd_reason], sizeof(data[bd_reason]) - 1,\
				data[bd_admin_name], sizeof(data[bd_admin_name]) - 1,\
				data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1
				);
			
			data[bd_banlength] = str_to_num(length);
			
			ArrayPushArray(g_array, data);
			TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
			#else
			static steamid[35], name[32], unbantime[32], reason[128], admin_name[32], admin_steamid[35];
			
			parse(filedata,\
				steamid, sizeof(steamid) - 1,\
				name, sizeof(name) - 1,\
				length, sizeof(length) - 1,\
				unbantime, sizeof(unbantime) - 1,\
				reason, sizeof(reason) - 1,\
				admin_name, sizeof(admin_name) - 1,\
				admin_steamid, sizeof(admin_steamid) - 1
				);
			
			copy(g_names[g_total_bans], sizeof(g_names[]) - 1, name);
			copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1, steamid);
			g_banlengths[g_total_bans] = str_to_num(length);
			copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1, unbantime);
			copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1, reason);
			copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1, admin_name);
			copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1, admin_steamid);
			#endif
			
			g_total_bans++;
		}
		
		fclose(f);
	}
	#endif
	
	// load these after, so when they are added to the file with AddBan(), they aren't loaded again from above.
	
	#if defined KEEP_DEFAULT_BANS
	LoadOldBans("banned.cfg");
	LoadOldBans("listip.cfg");
	#endif
}

#if defined USING_SQL
MakeStringSQLSafe(const input[], output[], len)
{
	copy(output, len, input);
	replace_all(output, len, "'", "*");
	replace_all(output, len, "^"", "*");
	replace_all(output, len, "`", "*");
}
#endif

GetBanTime(const bantime, length[], len)
{
	new minutes = bantime;
	new hours = 0;
	new days = 0;
	
	while( minutes >= 60 )
	{
		minutes -= 60;
		hours++;
	}
	
	while( hours >= 24 )
	{
		hours -= 24;
		days++;
	}
	
	new bool:add_before;
	if( minutes )
	{
		formatex(length, len, "%i minute%s", minutes, minutes == 1 ? "" : "s");
		
		add_before = true;
	}
	if( hours )
	{
		if( add_before )
		{
			format(length, len, "%i hour%s, %s", hours, hours == 1 ? "" : "s", length);
		}
		else
		{
			formatex(length, len, "%i hour%s", hours, hours == 1 ? "" : "s");
			
			add_before = true;
		}
	}
	if( days )
	{
		if( add_before )
		{
			format(length, len, "%i day%s, %s", days, days == 1 ? "" : "s", length);
		}
		else
		{
			formatex(length, len, "%i day%s", days, days == 1 ? "" : "s");
			
			add_before = true;
		}
	}
	if( !add_before )
	{
		// minutes, hours, and days = 0
		// assume permanent ban
		copy(length, len, "Permanent Ban");
	}
}

GenerateUnbanTime(const bantime, unban_time[], len)
{
	static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
	format_time(_hours, sizeof(_hours) - 1, "%H");
	format_time(_minutes, sizeof(_minutes) - 1, "%M");
	format_time(_seconds, sizeof(_seconds) - 1, "%S");
	format_time(_month, sizeof(_month) - 1, "%m");
	format_time(_day, sizeof(_day) - 1, "%d");
	format_time(_year, sizeof(_year) - 1, "%Y");
	
	new hours = str_to_num(_hours);
	new minutes = str_to_num(_minutes);
	new seconds = str_to_num(_seconds);
	new month = str_to_num(_month);
	new day = str_to_num(_day);
	new year = str_to_num(_year);
	
	minutes += bantime;
	
	while( minutes >= 60 )
	{
		minutes -= 60;
		hours++;
	}
	
	while( hours >= 24 )
	{
		hours -= 24;
		day++;
	}
	
	new max_days = GetDaysInMonth(month, year);
	while( day > max_days )
	{
		day -= max_days;
		month++;
	}
	
	while( month > 12 )
	{
		month -= 12;
		year++;
	}
	
	formatex(unban_time, len, "%i:%02i:%02i %i/%i/%i", hours, minutes, seconds, month, day, year);
}

GetDaysInMonth(month, year=0)
{
	switch( month )
	{
		case 1:		return 31; // january
		case 2:		return ((year % 4) == 0) ? 29 : 28; // february
		case 3:		return 31; // march
		case 4:		return 30; // april
		case 5:		return 31; // may
		case 6:		return 30; // june
		case 7:		return 31; // july
		case 8:		return 31; // august
		case 9:		return 30; // september
		case 10:	return 31; // october
		case 11:	return 30; // november
		case 12:	return 31; // december
	}
	
	return 30;
}

GetTargetFlags(client)
{
	static const flags_no_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS);
	static const flags_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS|CMDTARGET_OBEY_IMMUNITY);
	
	switch( get_pcvar_num(ab_immunity) )
	{
		case 1: return flags_immunity;
		case 2: return access(client, ADMIN_IMMUNITY) ? flags_no_immunity : flags_immunity;
	}
	
	return flags_no_immunity;
}

GetMaxBanTime(client)
{
	if( !g_total_maxban_times ) return 0;
	
	new flags = get_user_flags(client);
	
	for( new i = 0; i < g_total_maxban_times; i++ )
	{
		#if !defined MAX_BANLIMITS
		if( flags & ArrayGetCell(g_maxban_flags, i) )
		{
			return ArrayGetCell(g_maxban_times, i);
		}
		#else
		if( flags & g_maxban_flags[i] )
		{
			return g_maxban_times[i];
		}
		#endif
	}
	
	return 0;
}

PrintBanInformation(client, const target_name[], const target_authid[], const reason[], const length, const unban_time[], const admin_name[], const admin_authid[], bool:show_admin, bool:show_website)
{
	static website[64], ban_length[64];
	if( client == 0 )
	{
		server_print("************************************************");
		server_print("%L", client, "AB_BAN_INFORMATION");
		server_print("%L: %s", client, "AB_NAME", target_name);
		server_print("%L: %s", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
		server_print("%L: %s", client, "AB_REASON", reason);
		if( length > 0 )
		{
			GetBanTime(length, ban_length, sizeof(ban_length) - 1);
			server_print("%L: %s", client, "AB_BAN_LENGTH", ban_length);
		}
		server_print("%L: %s", client, "AB_UNBAN_TIME", unban_time);
		if( show_admin )
		{
			server_print("%L: %s", client, "AB_ADMIN_NAME", admin_name);
			server_print("%L: %s", client, "AB_ADMIN_STEAMID", admin_authid);
		}
		if( show_website )
		{
			get_pcvar_string(ab_website, website, sizeof(website) - 1);
			if( website[0] )
			{
				server_print("");
				server_print("%L", client, "AB_WEBSITE");
				server_print("%s", website);
			}
		}
		server_print("************************************************");
	}
	else
	{
		client_cmd(client, "echo ^"************************************************^"");
		client_cmd(client, "echo ^"%L^"", client, "AB_BAN_INFORMATION");
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_NAME", target_name);
		client_cmd(client, "echo ^"%L: %s^"", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_REASON", reason);
		if( length > 0 )
		{
			GetBanTime(length, ban_length, sizeof(ban_length) - 1);
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_BAN_LENGTH", ban_length);
		}
		client_cmd(client, "echo ^"%L: %s^"", client, "AB_UNBAN_TIME", unban_time);
		if( show_admin )
		{
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_NAME", admin_name);
			client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_STEAMID", admin_authid);
		}
		if( show_website )
		{
			get_pcvar_string(ab_website, website, sizeof(website) - 1);
			if( website[0] )
			{
				client_cmd(client, "echo ^"^"");
				client_cmd(client, "echo ^"%L^"", client, "AB_WEBSITE");
				client_cmd(client, "echo ^"%s^"", website);
			}
		}
		client_cmd(client, "echo ^"************************************************^"");
	}
}

PrintActivity(const admin_name[], const message_fmt[], any:...)
{
	if( !get_playersnum() ) return;
	
	new activity = get_pcvar_num(amx_show_activity);
	if( !(0 <= activity <= 5) )
	{
		set_pcvar_num(amx_show_activity, (activity = 2));
	}
	
	static message[192], temp[192];
	vformat(message, sizeof(message) - 1, message_fmt, 3);
	
	for( new client = 1; client <= g_max_clients; client++ )
	{
		if( !is_user_connected(client) ) continue;
		
		switch( is_user_admin(client) ? g_admin_activity[activity] : g_normal_activity[activity] )
		{
			case ACTIVITY_NONE:
			{
				
			}
			case ACTIVITY_HIDE:
			{
				copy(temp, sizeof(temp) - 1, message);
				replace(temp, sizeof(temp) - 1, "$name", "ADMIN");
				
				message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
				write_byte(client);
				write_string(temp);
				message_end();
			}
			case ACTIVITY_SHOW:
			{
				copy(temp, sizeof(temp) - 1, message);
				replace(temp, sizeof(temp) - 1, "$name", admin_name);
				
				message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
				write_byte(client);
				write_string(temp);
				message_end();
			}
		}
	}
}

Print(const message_fmt[], any:...)
{
	if( !get_playersnum() ) return;
	
	static message[192];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	for( new client = 1; client <= g_max_clients; client++ )
	{
		if( !is_user_connected(client) ) continue;
		
		message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
		write_byte(client);
		write_string(message);
		message_end();
	}
}

Log(const message_fmt[], any:...)
{
	static message[256];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	static filename[96];
	#if defined HISTORY_ONE_FILE
	if( !filename[0] )
	{
		get_basedir(filename, sizeof(filename) - 1);
		add(filename, sizeof(filename) - 1, "/logs/ban_history.log");
	}
	#else
	static dir[64];
	if( !dir[0] )
	{
		get_basedir(dir, sizeof(dir) - 1);
		add(dir, sizeof(dir) - 1, "/logs");
	}
	
	format_time(filename, sizeof(filename) - 1, "%m%d%Y");
	format(filename, sizeof(filename) - 1, "%s/BAN_HISTORY_%s.log", dir, filename);
	#endif
	
	log_amx("%s", message);
	log_to_file(filename, "%s", message);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/


Si inlocuieste admincmd cu asta:
| Afiseaza codul
#include <amxmodx>
#include <amxmisc>

// This is not a dynamic array because it would be bad for 24/7 map servers.
#define OLD_CONNECTION_QUEUE 10

new g_pauseCon
new Float:g_pausAble
new bool:g_Paused
new bool:g_PauseAllowed = false
new g_addCvar[] = "amx_cvar add %s"

new pausable;
new rcon_password;

// Old connection queue
new g_Names[OLD_CONNECTION_QUEUE][32];
new g_SteamIDs[OLD_CONNECTION_QUEUE][32];
new g_IPs[OLD_CONNECTION_QUEUE][32];
new g_Access[OLD_CONNECTION_QUEUE];
new g_Tracker;
new g_Size;

stock InsertInfo(id)
{
	
	// Scan to see if this entry is the last entry in the list
	// If it is, then update the name and access
	// If it is not, then insert it again.

	if (g_Size > 0)
	{
		new ip[32]
		new auth[32];

		get_user_authid(id, auth, charsmax(auth));
		get_user_ip(id, ip, charsmax(ip), 1/*no port*/);

		new last = 0;
		
		if (g_Size < sizeof(g_SteamIDs))
		{
			last = g_Size - 1;
		}
		else
		{
			last = g_Tracker - 1;
			
			if (last < 0)
			{
				last = g_Size - 1;
			}
		}
		
		if (equal(auth, g_SteamIDs[last]) &&
			equal(ip, g_IPs[last])) // need to check ip too, or all the nosteams will while it doesn't work with their illegitimate server
		{
			get_user_name(id, g_Names[last], charsmax(g_Names[]));
			g_Access[last] = get_user_flags(id);
			
			return;
		}
	}
	
	// Need to insert the entry
	
	new target = 0;  // the slot to save the info at

	// Queue is not yet full
	if (g_Size < sizeof(g_SteamIDs))
	{
		target = g_Size;
		
		++g_Size;
		
	}
	else
	{
		target = g_Tracker;
		
		++g_Tracker;
		// If we reached the end of the array, then move to the front
		if (g_Tracker == sizeof(g_SteamIDs))
		{
			g_Tracker = 0;
		}
	}
	
	get_user_authid(id, g_SteamIDs[target], charsmax(g_SteamIDs[]));
	get_user_name(id, g_Names[target], charsmax(g_Names[]));
	get_user_ip(id, g_IPs[target], charsmax(g_IPs[]), 1/*no port*/);
	
	g_Access[target] = get_user_flags(id);

}
stock GetInfo(i, name[], namesize, auth[], authsize, ip[], ipsize, &access)
{
	if (i >= g_Size)
	{
		abort(AMX_ERR_NATIVE, "GetInfo: Out of bounds (%d:%d)", i, g_Size);
	}
	
	new target = (g_Tracker + i) % sizeof(g_SteamIDs);
	
	copy(name, namesize, g_Names[target]);
	copy(auth, authsize, g_SteamIDs[target]);
	copy(ip,   ipsize,   g_IPs[target]);
	access = g_Access[target];
	
}
public client_disconnect(id)
{
	if (!is_user_bot(id))
	{
		InsertInfo(id);
	}
}

public plugin_init()
{
	register_plugin("Admin Commands", AMXX_VERSION_STR, "AMXX Dev Team")

	register_dictionary("admincmd.txt")
	register_dictionary("common.txt")
	register_dictionary("adminhelp.txt")
	
	
	register_concmd("amx_kick", "cmdKick", ADMIN_KICK, "<name or #userid> [reason]")
	/*register_concmd("amx_ban", "cmdBan", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
	register_concmd("amx_banip", "cmdBanIP", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
	register_concmd("amx_addban", "cmdAddBan", ADMIN_BAN, "<^"authid^" or ip> <minutes> [reason]")
	register_concmd("amx_unban", "cmdUnban", ADMIN_BAN, "<^"authid^" or ip>")*/
	register_concmd("amx_slay", "cmdSlay", ADMIN_SLAY, "<name or #userid>")
	register_concmd("amx_slap", "cmdSlap", ADMIN_SLAY, "<name or #userid> [power]")
	register_concmd("amx_leave", "cmdLeave", ADMIN_KICK, "<tag> [tag] [tag] [tag]")
	register_concmd("amx_pause", "cmdPause", ADMIN_CVAR, "- pause or unpause the game")
	register_concmd("amx_who", "cmdWho", ADMIN_ADMIN, "- displays who is on server")
	register_concmd("amx_cvar", "cmdCvar", ADMIN_CVAR, "<cvar> [value]")
	register_concmd("amx_plugins", "cmdPlugins", ADMIN_ADMIN)
	register_concmd("amx_modules", "cmdModules", ADMIN_ADMIN)
	register_concmd("amx_map", "cmdMap", ADMIN_MAP, "<mapname>")
	register_concmd("amx_cfg", "cmdCfg", ADMIN_CFG, "<filename>")
	register_concmd("amx_nick", "cmdNick", ADMIN_SLAY, "<name or #userid> <new nick>")
	register_concmd("amx_last", "cmdLast", ADMIN_BAN, "- list the last few disconnected clients info");
	register_clcmd("amx_rcon", "cmdRcon", ADMIN_RCON, "<command line>")
	register_clcmd("amx_showrcon", "cmdShowRcon", ADMIN_RCON, "<command line>")
	register_clcmd("pauseAck", "cmdLBack")


	rcon_password=get_cvar_pointer("rcon_password");
	pausable=get_cvar_pointer("pausable");
	
	
}

public plugin_cfg()
{
	// Cvars which can be changed only with rcon access
	server_cmd(g_addCvar, "rcon_password")
	server_cmd(g_addCvar, "amx_show_activity")
	server_cmd(g_addCvar, "amx_mode")
	server_cmd(g_addCvar, "amx_password_field")
	server_cmd(g_addCvar, "amx_default_access")
	server_cmd(g_addCvar, "amx_reserved_slots")
	server_cmd(g_addCvar, "amx_reservation")
	server_cmd(g_addCvar, "amx_sql_table");
	server_cmd(g_addCvar, "amx_sql_host");
	server_cmd(g_addCvar, "amx_sql_user");
	server_cmd(g_addCvar, "amx_sql_pass");
	server_cmd(g_addCvar, "amx_sql_db");
	server_cmd(g_addCvar, "amx_sql_type");

}

public cmdKick(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	read_argv(1, arg, 31)
	new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
	
	if (!player)
		return PLUGIN_HANDLED
	
	new authid[32], authid2[32], name2[32], name[32], userid2, reason[32]
	
	get_user_authid(id, authid, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	userid2 = get_user_userid(player)
	read_argv(2, reason, 31)
	remove_quotes(reason)
	
	log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, reason)

	show_activity_key("ADMIN_KICK_1", "ADMIN_KICK_2", name, name2);

	if (is_user_bot(player))
		server_cmd("kick #%d", userid2)
	else
	{
		if (reason[0])
			server_cmd("kick #%d ^"%s^"", userid2, reason)
		else
			server_cmd("kick #%d", userid2)
	}
	
	console_print(id, "[AMXX] Client ^"%s^" kicked", name2)
	
	return PLUGIN_HANDLED
}

/*public cmdUnban(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32], authid[32], name[32]
	
	read_argv(1, arg, 31)
	
	if (contain(arg, ".") != -1)
	{
		server_cmd("removeip ^"%s^";writeip", arg)
		console_print(id, "[AMXX] %L", id, "IP_REMOVED", arg)
	} else {
		server_cmd("removeid %s;writeid", arg)
		console_print(id, "[AMXX] %L", id, "AUTHID_REMOVED", arg)
	}

	get_user_name(id, name, 31)

	show_activity_key("ADMIN_UNBAN_1", "ADMIN_UNBAN_2", name, arg);

	get_user_authid(id, authid, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" unban ^"%s^"", name, get_user_userid(id), authid, arg)
	
	return PLUGIN_HANDLED
}
 
public cmdAddBan(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3, true)) // check for ADMIN_BAN access
	{
		if (get_user_flags(id) & level) // Getting here means they didn't input enough args
		{
			return PLUGIN_HANDLED;
		}
		if (!cmd_access(id, ADMIN_RCON, cid, 3)) // If somehow they have ADMIN_RCON without ADMIN_BAN, continue
		{
			return PLUGIN_HANDLED;
		}
	}

	new arg[32], authid[32], name[32], minutes[32], reason[32]
	
	read_argv(1, arg, 31)
	read_argv(2, minutes, 31)
	read_argv(3, reason, 31)
	
	
	if (!(get_user_flags(id) & ADMIN_RCON))
	{
		new bool:canban = false;
		new bool:isip = false;
		// Limited access to this command
		if (equali(arg, "STEAM_ID_PENDING") ||
			equali(arg, "STEAM_ID_LAN") ||
			equali(arg, "HLTV") ||
			equali(arg, "4294967295") ||
			equali(arg, "VALVE_ID_LAN") ||
			equali(arg, "VALVE_ID_PENDING"))
		{
			// Hopefully we never get here, so ML shouldn't be needed
			console_print(id, "Cannot ban %s", arg);
			return PLUGIN_HANDLED;
		}
		
		if (contain(arg, ".") != -1)
		{
			isip = true;
		}
		
		// Scan the disconnection queue
		if (isip)
		{
			new IP[32];
			new Name[32];
			new dummy[1];
			new Access;
			for (new i = 0; i < g_Size; i++)
			{
				GetInfo(i, Name, charsmax(Name), dummy, 0, IP, charsmax(IP), Access);
				
				if (equal(IP, arg))
				{
					if (Access & ADMIN_IMMUNITY)
					{
						console_print(id, "[AMXX] %s : %L", IP, id, "CLIENT_IMM", Name);
						
						return PLUGIN_HANDLED;
					}
					// User did not have immunity
					canban = true;
				}
			}
		}
		else
		{
			new Auth[32];
			new Name[32];
			new dummy[1];
			new Access;
			for (new i = 0; i < g_Size; i++)
			{
				GetInfo(i, Name, charsmax(Name), Auth, charsmax(Auth), dummy, 0, Access);
				
				if (equal(Auth, arg))
				{
					if (Access & ADMIN_IMMUNITY)
					{
						console_print(id, "[AMXX] %s : %L", Auth, id, "CLIENT_IMM", Name);
						
						return PLUGIN_HANDLED;
					}
					// User did not have immunity
					canban = true;
				}
			}
		}
		
		if (!canban)
		{
			console_print(id, "[AMXX] You may only ban recently disconnected clients.  Use ^"amx_last^" to view.");
			
			return PLUGIN_HANDLED;
		}
		
	}
	
	// User has access to ban their target
	if (contain(arg, ".") != -1)
	{
		server_cmd("addip ^"%s^" ^"%s^";wait;writeip", minutes, arg)
		console_print(id, "[AMXX] Ip ^"%s^" added to ban list", arg)
	} else {
		server_cmd("banid %s %s;wait;writeid", minutes, arg)
		console_print(id, "[AMXX] Authid ^"%s^" added to ban list", arg)
	}

	get_user_name(id, name, 31)

	show_activity_key("ADMIN_ADDBAN_1", "ADMIN_ADDBAN_2", name, arg);

	get_user_authid(id, authid, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, arg, minutes, reason)

	return PLUGIN_HANDLED
}

public cmdBan(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED

	new target[32], minutes[8], reason[64]
	
	read_argv(1, target, 31)
	read_argv(2, minutes, 7)
	read_argv(3, reason, 63)
	
	new player = cmd_target(id, target, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS | CMDTARGET_ALLOW_SELF)
	
	if (!player)
		return PLUGIN_HANDLED

	new authid[32], name2[32], authid2[32], name[32]
	new userid2 = get_user_userid(player)

	get_user_authid(player, authid2, 31)
	get_user_authid(id, authid, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	
	log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)
	
	new temp[64], banned[16], nNum = str_to_num(minutes)
	if (nNum)
		format(temp, 63, "%L", player, "FOR_MIN", minutes)
	else
		format(temp, 63, "%L", player, "PERM")

	format(banned, 15, "%L", player, "BANNED")

	if (reason[0])
		server_cmd("kick #%d ^"%s (%s %s)^";wait;banid %s %s;wait;writeid", userid2, reason, banned, temp, minutes, authid2)
	else
		server_cmd("kick #%d ^"%s %s^";wait;banid %s %s;wait;writeid", userid2, banned, temp, minutes, authid2)

	
	// Display the message to all clients

	new msg[256];
	new len;
	new maxpl = get_maxplayers();
	for (new i = 1; i <= maxpl; i++)
	{
		if (is_user_connected(i) && !is_user_bot(i))
		{
			len = formatex(msg, charsmax(msg), "%L", i, "BAN");
			len += formatex(msg[len], charsmax(msg) - len, " %s ", name2);
			if (nNum)
			{
				len += formatex(msg[len], charsmax(msg) - len, "%L", i, "FOR_MIN", minutes);
			}
			else
			{
				len += formatex(msg[len], charsmax(msg) - len, "%L", i, "PERM");
			}
			if (strlen(reason) > 0)
			{
				formatex(msg[len], charsmax(msg) - len, " (%L: %s)", i, "REASON", reason);
			}
			show_activity_id(i, id, name, msg);
		}
	}
	
	console_print(id, "[AMXX] %L", id, "CLIENT_BANNED", name2)
	
	return PLUGIN_HANDLED
}

public cmdBanIP(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED
	
	new target[32], minutes[8], reason[64]
	
	read_argv(1, target, 31)
	read_argv(2, minutes, 7)
	read_argv(3, reason, 63)
	
	new player = cmd_target(id, target, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS | CMDTARGET_ALLOW_SELF)
	
	if (!player)
	{
		// why is this here?
		// no idea
		// player = cmd_target(id, target, 9);
		return PLUGIN_HANDLED
	}
	
	new authid[32], name2[32], authid2[32], name[32]
	new userid2 = get_user_userid(player)
	
	get_user_authid(player, authid2, 31)
	get_user_authid(id, authid, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	
	log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)

	new temp[64], banned[16], nNum = str_to_num(minutes)
	if (nNum)
		format(temp, 63, "%L", player, "FOR_MIN", minutes)
	else
		format(temp, 63, "%L", player, "PERM")
	format(banned, 15, "%L", player, "BANNED")

	new address[32]
	get_user_ip(player, address, 31, 1)

	if (reason[0])
		server_cmd("kick #%d ^"%s (%s %s)^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, reason, banned, temp, minutes, address)
	else
		server_cmd("kick #%d ^"%s %s^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, banned, temp, minutes, address)

	// Display the message to all clients

	new msg[256];
	new len;
	new maxpl = get_maxplayers();
	for (new i = 1; i <= maxpl; i++)
	{
		if (is_user_connected(i) && !is_user_bot(i))
		{
			len = formatex(msg, charsmax(msg), "%L", i, "BAN");
			len += formatex(msg[len], charsmax(msg) - len, " %s ", name2);
			if (nNum)
			{
				formatex(msg[len], charsmax(msg) - len, "%L", i, "FOR_MIN", minutes);
			}
			else
			{
				formatex(msg[len], charsmax(msg) - len, "%L", i, "PERM");
			}
			if (strlen(reason) > 0)
			{
				formatex(msg[len], charsmax(msg) - len, " (%L: %s)", i, "REASON", reason);
			}
			show_activity_id(i, id, name, msg);
		}
	}

	console_print(id, "[AMXX] %L", id, "CLIENT_BANNED", name2)
	
	return PLUGIN_HANDLED
}
*/
public cmdSlay(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32]
	
	read_argv(1, arg, 31)
	
	new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF | CMDTARGET_ONLY_ALIVE)
	
	if (!player)
		return PLUGIN_HANDLED
	
	user_kill(player)
	
	new authid[32], name2[32], authid2[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" slay ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, name2, get_user_userid(player), authid2)

	show_activity_key("ADMIN_SLAY_1", "ADMIN_SLAY_2", name, name2);

	console_print(id, "[AMXX] %L", id, "CLIENT_SLAYED", name2)
	
	return PLUGIN_HANDLED
}

public cmdSlap(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	
	read_argv(1, arg, 31)
	new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF | CMDTARGET_ONLY_ALIVE)
	
	if (!player)
		return PLUGIN_HANDLED

	new spower[32], authid[32], name2[32], authid2[32], name[32]
	
	read_argv(2, spower, 31)
	
	new damage = str_to_num(spower)
	
	user_slap(player, damage)
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, damage, name2, get_user_userid(player), authid2)

	show_activity_key("ADMIN_SLAP_1", "ADMIN_SLAP_2", name, name2, damage);

	console_print(id, "[AMXX] %L", id, "CLIENT_SLAPED", name2, damage)
	
	return PLUGIN_HANDLED
}

public chMap(map[])
{
	server_cmd("changelevel %s", map)
}

public cmdMap(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	new arglen = read_argv(1, arg, 31)
	
	if (!is_map_valid(arg))
	{
		console_print(id, "[AMXX] %L", id, "MAP_NOT_FOUND")
		return PLUGIN_HANDLED
	}

	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	show_activity_key("ADMIN_MAP_1", "ADMIN_MAP_2", name, arg);
	
	log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^"", name, get_user_userid(id), authid, arg)
	
	new _modName[10]
	get_modname(_modName, 9)
	
	if (!equal(_modName, "zp"))
	{
		message_begin(MSG_ALL, SVC_INTERMISSION)
		message_end()
	}
	
	set_task(2.0, "chMap", 0, arg, arglen + 1)
	
	return PLUGIN_HANDLED
}

stock bool:onlyRcon(const name[])
{
	new pentru=get_cvar_pointer(name);
	if (pentru && get_pcvar_flags(pentru) & FCVAR_PROTECTED)
	{
		return true;
	}
	return false;
}

public cmdCvar(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32], arg2[64]
	
	read_argv(1, arg, 31)
	read_argv(2, arg2, 63)
	
	new pointer;
	
	if (equal(arg, "add") && (get_user_flags(id) & ADMIN_RCON))
	{
		if ((pointer=get_cvar_pointer(arg2))!=0)
		{
			new flags=get_pcvar_flags(pointer);
			
			if (!(flags & FCVAR_PROTECTED))
			{
				set_pcvar_flags(pointer,flags | FCVAR_PROTECTED);
			}
		}
		return PLUGIN_HANDLED
	}
	
	if ((pointer=get_cvar_pointer(arg))==0)
	{
		console_print(id, "[AMXX] %L", id, "UNKNOWN_CVAR", arg)
		return PLUGIN_HANDLED
	}
	
	if (onlyRcon(arg) && !(get_user_flags(id) & ADMIN_RCON))
	{
		// Exception for the new onlyRcon rules:
		//   sv_password is allowed to be modified by ADMIN_PASSWORD
		if (!(equali(arg,"sv_password") && (get_user_flags(id) & ADMIN_PASSWORD)))
		{
			console_print(id, "[AMXX] %L", id, "CVAR_NO_ACC")
			return PLUGIN_HANDLED
		}
	}
	
	if (read_argc() < 3)
	{
		get_pcvar_string(pointer, arg2, 63)
		console_print(id, "[AMXX] %L", id, "CVAR_IS", arg, arg2)
		return PLUGIN_HANDLED
	}

	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" set cvar (name ^"%s^") (value ^"%s^")", name, get_user_userid(id), authid, arg, arg2)
	set_cvar_string(arg, arg2)
	
	
	// Display the message to all clients

	new cvar_val[64];
	new maxpl = get_maxplayers();
	for (new i = 1; i <= maxpl; i++)
	{
		if (is_user_connected(i) && !is_user_bot(i))
		{
			if (get_pcvar_flags(pointer) & FCVAR_PROTECTED || equali(arg, "rcon_password"))
			{
				formatex(cvar_val, charsmax(cvar_val), "*** %L ***", i, "PROTECTED");
			}
			else
			{
				copy(cvar_val, charsmax(cvar_val), arg2);
			}
			show_activity_id(i, id, name, "%L", i, "SET_CVAR_TO", "", arg, cvar_val);
		}
	}

	console_print(id, "[AMXX] %L", id, "CVAR_CHANGED", arg, arg2)
	
	return PLUGIN_HANDLED
}

public cmdPlugins(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		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 name[32], version[32], author[32], filename[32], status[32]
	new lName[32], lVersion[32], lAuthor[32], lFile[32], lStatus[32]

	format(lName, 31, "%L", id, "NAME")
	format(lVersion, 31, "%L", id, "VERSION")
	format(lAuthor, 31, "%L", id, "AUTHOR")
	format(lFile, 31, "%L", id, "FILE")
	format(lStatus, 31, "%L", id, "STATUS")

	new StartPLID=0;
	new EndPLID;

	new Temp[96]

	new num = get_pluginsnum()
	
	if (read_argc() > 1)
	{
		read_argv(1,Temp,sizeof(Temp)-1);
		StartPLID=str_to_num(Temp)-1; // zero-based
	}

	EndPLID=min(StartPLID + 10, num);
	
	new running = 0
	
	console_print(id, "----- %L -----", id, "LOADED_PLUGINS")
	console_print(id, "%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s", lName, lVersion, lAuthor, lFile, lStatus)

	new i=StartPLID;
	while (i <EndPLID)
	{
		get_plugin(i++, filename, 31, name, 31, version, 31, author, 31, status, 31)
		console_print(id, "%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s", name, version, author, filename, status)
		
		if (status[0]=='d' || status[0]=='r') // "debug" or "running"
			running++
	}
	console_print(id, "%L", id, "PLUGINS_RUN", EndPLID-StartPLID, running)
	console_print(id, "----- %L -----",id,"HELP_ENTRIES",StartPLID + 1,EndPLID,num);
	
	if (EndPLID < num)
	{
		formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_MORE", EndPLID + 1);
		replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
		console_print(id,"%s",Temp);
	}
	else
	{
		formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_BEGIN");
		replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
		console_print(id,"%s",Temp);
	}

	return PLUGIN_HANDLED
}

public cmdModules(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED

	new name[32], version[32], author[32], status, sStatus[16]
	new lName[32], lVersion[32], lAuthor[32], lStatus[32];

	format(lName, 31, "%L", id, "NAME")
	format(lVersion, 31, "%L", id, "VERSION")
	format(lAuthor, 31, "%L", id, "AUTHOR")
	format(lStatus, charsmax(lStatus), "%L", id, "STATUS")

	new num = get_modulesnum()
	
	console_print(id, "%L:", id, "LOADED_MODULES")
	console_print(id, "%-23.22s %-11.10s %-20.19s %-11.10s", lName, lVersion, lAuthor, lStatus)
	
	for (new i = 0; i < num; i++)
	{
		get_module(i, name, 31, author, 31, version, 31, status)
		
		switch (status)
		{
			case module_loaded: copy(sStatus, 15, "running")
			default: 
			{
				copy(sStatus, 15, "bad load");
				copy(name, charsmax(name), "unknown");
				copy(author, charsmax(author), "unknown");
				copy(version, charsmax(version), "unknown");
			}
		}
		
		console_print(id, "%-23.22s %-11.10s %-20.19s %-11.10s", name, version, author, sStatus)
	}
	console_print(id, "%L", id, "NUM_MODULES", num)

	return PLUGIN_HANDLED
}

public cmdCfg(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[128]
	read_argv(1, arg, 127)
	
	if (!file_exists(arg))
	{
		console_print(id, "[AMXX] %L", id, "FILE_NOT_FOUND", arg)
		return PLUGIN_HANDLED
	}
	
	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" execute cfg (file ^"%s^")", name, get_user_userid(id), authid, arg)
	
	console_print(id, "[AMXX] Executing file ^"%s^"", arg)
	server_cmd("exec %s", arg)

	show_activity_key("ADMIN_CONF_1", "ADMIN_CONF_2", name, arg);

	return PLUGIN_HANDLED
}

public cmdLBack()
{
	if (!g_PauseAllowed)
		return PLUGIN_CONTINUE	

	new paused[25]
	
	format(paused, 24, "%L", g_pauseCon, g_Paused ? "UNPAUSED" : "PAUSED")
	set_cvar_float("pausable", g_pausAble)
	console_print(g_pauseCon, "[AMXX] Server %s", paused)
	g_PauseAllowed = false
	
	if (g_Paused)
		g_Paused = false
	else 
		g_Paused = true
	
	return PLUGIN_HANDLED
}

public cmdPause(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED 
	
	new authid[32], name[32], slayer = id
	
	get_user_authid(id, authid, 31) 
	get_user_name(id, name, 31) 
	if (pausable!=0)
	{
		g_pausAble = get_pcvar_float(pausable)
	}
	
	if (!slayer)
		slayer = find_player("h") 
	
	if (!slayer)
	{ 
		console_print(id, "[AMXX] %L", id, "UNABLE_PAUSE") 
		return PLUGIN_HANDLED
	}

	set_cvar_float("pausable", 1.0)
	g_PauseAllowed = true
	client_cmd(slayer, "pause;pauseAck")
	
	log_amx("Cmd: ^"%s<%d><%s><>^" %s server", name, get_user_userid(id), authid, g_Paused ? "unpause" : "pause")
	
	console_print(id, "[AMXX] %L", id, g_Paused ? "UNPAUSING" : "PAUSING")

	// Display the message to all clients

	new maxpl = get_maxplayers();
	for (new i = 1; i <= maxpl; i++)
	{
		if (is_user_connected(i) && !is_user_bot(i))
		{
			show_activity_id(i, id, name, "%L server", i, g_Paused ? "UNPAUSE" : "PAUSE");
		}
	}

	g_pauseCon = id
	
	return PLUGIN_HANDLED
} 

public cmdShowRcon(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
		
	new password[64]
	
	get_pcvar_string(rcon_password, password, 63)
	
	if (!password[0])
	{
		cmdRcon(id, level, cid)
	} else {
		new args[128]
		
		read_args(args, 127)
		client_cmd(id, "rcon_password %s", password)
		client_cmd(id, "rcon %s", args)
	}
	
	return PLUGIN_HANDLED
}

public cmdRcon(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[128], authid[32], name[32]
	
	read_args(arg, 127)
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")", name, get_user_userid(id), authid, arg)
	
	console_print(id, "[AMXX] %L", id, "COM_SENT_SERVER", arg)
	server_cmd("%s", arg)
	
	return PLUGIN_HANDLED
}

public cmdWho(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED

	new players[32], inum, cl_on_server[64], authid[32], name[32], flags, sflags[32]
	new lImm[16], lRes[16], lAccess[16], lYes[16], lNo[16]
	
	format(lImm, 15, "%L", id, "IMMU")
	format(lRes, 15, "%L", id, "RESERV")
	format(lAccess, 15, "%L", id, "ACCESS")
	format(lYes, 15, "%L", id, "YES")
	format(lNo, 15, "%L", id, "NO")
	
	get_players(players, inum)
	format(cl_on_server, 63, "%L", id, "CLIENTS_ON_SERVER")
	console_print(id, "^n%s:^n #  %-16.15s %-20s %-8s %-4.3s %-4.3s %s", cl_on_server, "nick", "authid", "userid", lImm, lRes, lAccess)
	
	for (new a = 0; a < inum; ++a)
	{
		get_user_authid(players[a], authid, 31)
		get_user_name(players[a], name, 31)
		flags = get_user_flags(players[a])
		get_flags(flags, sflags, 31)
		console_print(id, "%2d  %-16.15s %-20s %-8d %-6.5s %-6.5s %s", players[a], name, authid, 
		get_user_userid(players[a]), (flags&ADMIN_IMMUNITY) ? lYes : lNo, (flags&ADMIN_RESERVATION) ? lYes : lNo, sflags)
	}
	
	console_print(id, "%L", id, "TOTAL_NUM", inum)
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" ask for players list", name, get_user_userid(id), authid) 
	
	return PLUGIN_HANDLED
}

hasTag(name[], tags[4][32], tagsNum)
{
	for (new a = 0; a < tagsNum; ++a)
		if (contain(name, tags[a]) != -1)
			return a
	return -1
}

public cmdLeave(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new argnum = read_argc()
	new ltags[4][32]
	new ltagsnum = 0
	
	for (new a = 1; a < 5; ++a)
	{
		if (a < argnum)
			read_argv(a, ltags[ltagsnum++], 31)
		else
			ltags[ltagsnum++][0] = 0
	}
	
	new nick[32], ires, pnum = get_maxplayers() + 1, count = 0, lReason[128]
	
	for (new b = 1; b < pnum; ++b)
	{
		if (!is_user_connected(b) && !is_user_connecting(b)) continue

		get_user_name(b, nick, 31)
		ires = hasTag(nick, ltags, ltagsnum)
		
		if (ires != -1)
		{
			console_print(id, "[AMXX] %L", id, "SKIP_MATCH", nick, ltags[ires])
			continue
		}
		
		if (get_user_flags(b) & ADMIN_IMMUNITY)
		{
			console_print(id, "[AMXX] %L", id, "SKIP_IMM", nick)
			continue
		}
		
		console_print(id, "[AMXX] %L", id, "KICK_PL", nick)
		
		if (is_user_bot(b))
			server_cmd("kick #%d", get_user_userid(b))
		else
		{
			format(lReason, 127, "%L", b, "YOU_DROPPED")
			server_cmd("kick #%d ^"%s^"", get_user_userid(b), lReason)
		}
		count++
	}
	
	console_print(id, "[AMXX] %L", id, "KICKED_CLIENTS", count)
	
	new authid[32], name[32]

	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	log_amx("Kick: ^"%s<%d><%s><>^" leave some group (tag1 ^"%s^") (tag2 ^"%s^") (tag3 ^"%s^") (tag4 ^"%s^")", name, get_user_userid(id), authid, ltags[0], ltags[1], ltags[2], ltags[3])

	show_activity_key("ADMIN_LEAVE_1", "ADMIN_LEAVE_2", name, ltags[0], ltags[1], ltags[2], ltags[3]);

	return PLUGIN_HANDLED
}

public cmdNick(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED

	new arg1[32], arg2[32], authid[32], name[32], authid2[32], name2[32]

	read_argv(1, arg1, 31)
	read_argv(2, arg2, 31)

	new player = cmd_target(id, arg1, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
	
	if (!player)
		return PLUGIN_HANDLED

	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)

	client_cmd(player, "name ^"%s^"", arg2)

	log_amx("Cmd: ^"%s<%d><%s><>^" change nick to ^"%s^" ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, arg2, name2, get_user_userid(player), authid2)

	show_activity_key("ADMIN_NICK_1", "ADMIN_NICK_2", name, name2, arg2);

	console_print(id, "[AMXX] %L", id, "CHANGED_NICK", name2, arg2)

	return PLUGIN_HANDLED
}

public cmdLast(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
	{
		return PLUGIN_HANDLED;
	}
	
	new name[32];
	new authid[32];
	new ip[32];
	new flags[32];
	new access;
	
	
	// This alignment is a bit weird (it should grow if the name is larger)
	// but otherwise for the more common shorter name, it'll wrap in server console
	// Steam client display is all skewed anyway because of the non fixed font.
	console_print(id, "%19s %20s %15s %s", "name", "authid", "ip", "access");
	
	for (new i = 0; i < g_Size; i++)
	{
		GetInfo(i, name, charsmax(name), authid, charsmax(authid), ip, charsmax(ip), access);
		
		get_flags(access, flags, charsmax(flags));
		
		console_print(id, "%19s %20s %15s %s", name, authid, ip, flags);
	}
	
	console_print(id, "%d old connections saved.", g_Size);
	
	return PLUGIN_HANDLED;
}
👉 Panel Counter-Strike: Click. 👈
👉💎 Shop: Click. 💎👈
👉💻 Filme: Click. 💻👈
👉📧 Contact: Steam 📧👈
Post Reply

Return to “Cereri”

  • Information