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

Instead of a ban, add "VIP flag" to the hacker?!


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
iveto69
Member
Join Date: Aug 2018
Old 01-21-2023 , 14:38   Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #1

Hello,
Can someone please "rework" this ban system so that the end effect of a ban is to add certain VIP flags and flags to that player while he is on the server. Do not kick him at all at the time of banning/, and he should log in normally, but always while he is in the server and his ban lasts - the flag(s) should be added to him.
Otherwise, absolutely everything should remain the same as before: the ban time, the ban list, the expiration and the removal of the ban/flag itself...

Code:
#include <amxmodx>
#include <amxmisc>
#include <regex>

#define IP_PATTERN "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
#define STEAMID_PATTERN "STEAM_0:[01]:\d+"
#define TIME_PATTERN "([0|1]\d|2[0-3])(:([0-5]\d)){2}\s+(0[1-9]|[1|2][0-9]|3[0|1])\/(0[1-9]|1[0-2])\/(\d{4})"

#define IsValidIP(%1) (regex_match_c(%1,ip_pattern,ret)>0)
#define IsValidAUTHID(%1) (regex_match_c(%1,steamid_pattern,ret)>0)
#define IsValidTIME(%1) (regex_match_c(%1,time_pattern,ret)>0)

enum _:BanInfo
{
	bantype[8],
	target_authid[32],
	target_ip[16],
	target_name[64],
	bantime[32],
	unbantime[32],
	banner_authid[32],
	banner_ip[32],
	banner_name[64],
	reason[128]
};

new bool:MODE_ADDBAN,bool:MODE_QUERY_CONTINUE,bool:MODE_LOADBAN,bool:MODE_UNBAN;
new cvar_Flags,msgid,cvar_Contact,cvar_CheckInterval,cvar_vote_enable,cvar_vote_ratio,cvar_vote_delay,cvar_vote_time,cvar_vote_min,total,ids,TotalBans,Float:LastAuth;
new ub_banlistfile[256],Flags[26],player[32],LastQuery[33][64],LastQueryType[33][8],bool:handle_unban_menu_call[33],bool:handle_ban_menu_call[33];
new QueryPointer[33],QueryCount[33],auth_delay[33],STR_Menu_Ban_Duration[33][128],Float:Menu_Ban_Duration[33],Float:LastBanTime,Menu_Ban_Target[33];
new Menu_Ban_Players[33][32],Menu_Ban_Total[33],Menu_Ban_BanType[33],Menu_Ban_pos[33],Menu_Unban_pos[33],Float:Menu_Unban_Time[33],Votes_Players[33][33],Float:LastVoted[33];
new Regex:steamid_pattern,Regex:ip_pattern,Regex:time_pattern,ret,error[2];
new Array:banlist_array;

public plugin_init() 
{ 
	register_plugin("Ultimate Bans","1.9","Souvik");
	register_cvar("ultimatebans_version","1.9",FCVAR_SERVER);

	register_clcmd(	"amx_banmenu", 	"CmdBANMENU", 	ADMIN_BAN,	"(Shows Ban Menu)");
	register_clcmd(	"amx_unbanmenu","CmdUNBANMENU", ADMIN_BAN,	"(Shows Unban Menu)");

	register_concmd("amx_ban",	"CmdBAN",	ADMIN_BAN,	"<nick, #userid, authid, ip> <minutes> [reason] <bantype>");
	register_concmd("amx_addban",	"CmdADDBAN",	ADMIN_BAN,	"<nick, authid, ip> <minutes> [reason] <bantype>");
	register_concmd("amx_unban",	"CmdUNBAN",	ADMIN_BAN,	"<nick, authid, ip> <bantype>");
	register_concmd("amx_queryban",	"CmdQUERY",	ADMIN_BAN,	"<nick, authid, ip> <bantype>");
	register_concmd("amx_querynext","CmdQUERYNEXT",	ADMIN_BAN,	"(Shows the Next Page of QueryBan Result)");
	register_concmd("amx_queryback","CmdQUERYBACK",	ADMIN_BAN,	"(Shows the Previous Page of QueryBan Result)");
	register_concmd("amx_banlist",  "CmdBANLIST",	ADMIN_BAN,	"(Shows the List of All Banned Players)");
	
	register_srvcmd("amx_ban",	"CmdBAN",	-1,		"<nick, #userid, authid, ip> <minutes> [reason] <bantype>");
	register_srvcmd("amx_addban",	"CmdADDBAN",	-1,		"<nick, authid, ip> <minutes> [reason] <bantype>");
	register_srvcmd("amx_unban",	"CmdUNBAN",	-1,		"<nick, authid, ip> <bantype>");
	register_srvcmd("amx_queryban",	"CmdQUERY",	-1,		"<nick, authid, ip> <bantype>");
	register_srvcmd("amx_querynext","CmdQUERYNEXT",	-1,		"(Shows the Next Page of QueryBan Result)");
	register_srvcmd("amx_queryback","CmdQUERYBACK",	-1,		"(Shows the Previous Page of QueryBan Result)");
	register_srvcmd("amx_banlist",  "CmdBANLIST",	-1,		"(Shows the List of All Banned Players)");
	register_srvcmd("amx_reloadbans","CmdRELOAD",	-1,		"(Reloads the Bans without Restarting the Server)");
	register_srvcmd("amx_resetbans","CmdRESET",	-1,		"(Resets Bans - Clears Banlist )");
	
	steamid_pattern = regex_compile(STEAMID_PATTERN,ret,error,charsmax(error));
	ip_pattern = regex_compile(IP_PATTERN,ret,error,charsmax(error));
	time_pattern = regex_compile(TIME_PATTERN,ret,error,charsmax(error));
	cvar_CheckInterval = register_cvar("ub_checkinterval","60.0");
	cvar_Contact = register_cvar("ub_contact","N/A");
	cvar_Flags = register_cvar("ub_flags","a");
	cvar_vote_enable = register_cvar("ub_vote_enable","1");
	cvar_vote_ratio = register_cvar("ub_vote_ratio","0.40");
	cvar_vote_delay = register_cvar("ub_vote_delay","5.0");
	cvar_vote_time = register_cvar("ub_vote_time","60.0");
	cvar_vote_min = register_cvar("ub_vote_min","5");
	msgid = get_user_msgid("SayText");
	banlist_array = ArrayCreate(BanInfo);
	
	register_menucmd(register_menuid("Ban Menu"),1023,"Menu_Ban_Keys");
	register_menucmd(register_menuid("Unban Menu"),1023,"Menu_Unban_Keys");
	register_menucmd(register_menuid("Voteban Menu"),1023,"Menu_Vote_Keys")
	register_clcmd("UB_SetDuration","Menu_SetDuration",ADMIN_BAN,"<time> in Minute(s)");
	register_clcmd("UB_SetReason","Menu_SetReason",ADMIN_BAN,"<reason>");
	register_clcmd("say /voteban","CmdVOTEMENU");
	register_clcmd("say_team /voteban","CmdVOTEMENU");
	
	get_datadir(ub_banlistfile,charsmax(ub_banlistfile));
	add(ub_banlistfile,charsmax(ub_banlistfile),"/UB_Banlist.txt");
	if (!file_exists(ub_banlistfile))
	{
		server_print("[UltimateBans] Banlist File Missing. Creating File - %s",ub_banlistfile);
		new file = fopen(ub_banlistfile,"wt");fclose(file);
		CheckTimeUP();
	}
	else
		CmdLOAD();
}

public client_connect(id)
{
	for (new i=0;i<64;i++)
		LastQuery[id][i] = 0;
	for (new i=0;i<8;i++)
		LastQueryType[id][i] = 0;
	QueryPointer[id] = 1;
	Menu_Ban_Reset(id);
	Menu_Unban_pos[id] = 0;
	LastVoted[id] = 0.0;
}

public client_disconnect(id)
{
	auth_delay[id] = false;
	new ids;
	get_players(player,total);
	for(new i=0;i<total;i++)
	{
		ids = player[i];
		if (Votes_Players[id][ids])
			Votes_Players[id][ids] = 0;
	}
}

public client_authorized(id)
{
	static Float:handle_delay;
	if (MODE_LOADBAN)
		auth_delay[id] = true;
	else
	{
		if (get_gametime()<LastAuth+1.0)
		{
			handle_delay += 1.0;
			set_task(handle_delay,"OnConnect",id);
		}
		else
		{
			OnConnect(id);
			if (handle_delay>=2.0)
				handle_delay -= 2.0;
			else
				handle_delay = 0.0;
		}
		LastAuth = get_gametime();
	}
}

public OnConnect(id)
{
	static AuthID[32],IP[16],Name[64],Timeleft[64],DATA[BanInfo],func_buffer[256],Pos;
	get_user_authid(id,AuthID,charsmax(AuthID));
	get_user_ip(id,IP,charsmax(IP),1);
	get_user_name(id,Name,charsmax(Name));
	if (equali(Name,"<null>",6))
		server_cmd("kick #%d ^"Invalid NAME^"",get_user_userid(id));
	Pos = CheckBan(AuthID,"STEAMID");
	if (Pos==-2)
	{
		Pos = CheckBan(IP,"IP");
		if (Pos==-2)
		{
			Pos = CheckBan(Name,"NAME");
			if (Pos==-2)
				return PLUGIN_CONTINUE
		}
	}
	if (Pos==-1)
	{
		server_cmd("kick #%d ^"You are BANNED from this Server^"",get_user_userid(id));
		return PLUGIN_HANDLED
	}
	else
	{
		ArrayGetArray(banlist_array,Pos,DATA);
		static Hostname[64];
		get_user_name(0,Hostname,charsmax(Hostname));
		client_cmd(id,"echo [UltimateBans] -------------------------------");
		client_cmd(id,"echo [UltimateBans] --==|| BAN INFO ||==--");
		client_cmd(id,"echo [UltimateBans] -------------------------------");
		client_cmd(id,"echo [UltimateBans] Server - %s",Hostname);
		if (equali(DATA[unbantime],"<null>",6))
		{
			PrintBanInfo(DATA,id);
			set_task(0.5,"JoinKick",id,"<null>",6);
			return PLUGIN_HANDLED
		}
		if (get_ban_timeleft(DATA[unbantime],Timeleft,charsmax(Timeleft)))
		{
			PrintBanInfo(DATA,id,Timeleft);
			set_task(0.5,"JoinKick",id,Timeleft,charsmax(Timeleft));
		}
		else
		{
			if (!equali(DATA[target_name],"<null>",6))	
				formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_name]);	
			else
			{
				if ((equali(DATA[bantype],"STEAMID",7))&&(!equali(DATA[target_authid],"<null>",6)))
					formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_authid]);
				else
					formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_ip]);
			}
			ChatPrint(func_buffer);
			log_to_file("addons/amxmodx/logs/UB_Logs.log","<UNBAN> BANTIME Up/Elapsed for < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" , BanType:^"%s^" >",DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantype]);
			ArrayDeleteItem(banlist_array,Pos);
			TotalBans--;
			new file = fopen(ub_banlistfile,"wt");
			for(new i=0;i<TotalBans;i++)
			{
				ArrayGetArray(banlist_array,i,DATA);
				fprintf(file,"^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",DATA[bantype],DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantime],DATA[unbantime],DATA[banner_authid],DATA[banner_ip],DATA[banner_name],DATA[reason]);
			}
			fclose(file);
		}
		return PLUGIN_HANDLED
	}
	return PLUGIN_HANDLED
}

public client_infochanged(id)
{
	static oldName[64],newName[64];
	get_user_name(id,oldName,charsmax(oldName));
	get_user_info(id,"NAME",newName,charsmax(newName));
	if (!equal(oldName,newName))
	{
		if ((equali(newName,"<null>",6))||(CheckBan(newName,"NAME")!=-2))
		{
			set_user_info(id,"NAME",oldName);
			client_print(id,print_chat,"[UltimateBans] Invalid NAME");
		}
	}
}

public CmdBAN(id,level,cid) 
{
	if (!cmd_access(id,level,cid,2,false))
		return PLUGIN_HANDLED
	// ------==|| Input Data Handling ||==------
	new ARG_Target[64],ARG_Duration[32],ARG_BanType[8],ARG_Reason[128]
	static ARG_Count,ARG_STR[256],len;
	copy(ARG_Reason,charsmax(ARG_Reason),"<null>");
	ARG_Count = 0;
	read_args(ARG_STR,charsmax(ARG_STR));
	trim(ARG_STR);
	parse(ARG_STR,ARG_Target,charsmax(ARG_Target),ARG_Duration,charsmax(ARG_Duration),ARG_Reason,charsmax(ARG_Reason),ARG_BanType,charsmax(ARG_BanType));
	if (strlen(ARG_Target))
	{
		ARG_Count=1;
		trim(ARG_Target);
		if (equali(ARG_Target,"<null>",6))
		{
			bad_input(id);
			MODE_ADDBAN = false;
			return PLUGIN_HANDLED
		}
		if (strlen(ARG_Duration))
		{
			ARG_Count=2;
			trim(ARG_Duration);
			if (strlen(ARG_Reason))
			{
				ARG_Count=3;
				trim(ARG_Reason);
				if (strlen(ARG_BanType))
				{
					ARG_Count=4;
					trim(ARG_BanType);
				}
			}
			else
				copy(ARG_Reason,charsmax(ARG_Reason),"<null>")
		}		
	}
	if (ARG_Count<2)
	{
		if (id)
			client_cmd(id,"echo [UltimateBans] Insufficient Data/Arguments");
		else
			server_print("[UltimateBans] Insufficient Data/Arguments");
		MODE_ADDBAN = false
		return PLUGIN_HANDLED
	}
	// ------==|| Input Type Handling ||==------
	static tmpid,NUM_Target_Type,NUM_BanType;
	if ((ARG_STR[0]=='#')&&(!MODE_ADDBAN))
	{
		tmpid = str_to_num(ARG_Target[1]);
		NUM_Target_Type = 1;
	}
	else if (IsValidAUTHID(ARG_Target))
		NUM_Target_Type = 2;
	else if (IsValidIP(ARG_Target))
		NUM_Target_Type = 3;
	else 
		NUM_Target_Type = 4;
	if (ARG_Count==4)
	{
		if (equali(ARG_BanType,"AUTO",4))
			NUM_BanType = 1;
		else if (equali(ARG_BanType,"STEAMID",7))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
			NUM_BanType = 2;
		}
		else if (equali(ARG_BanType,"IP",2))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"IP");
			NUM_BanType = 3;
		}
		else if (equali(ARG_BanType,"NAME",4))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"NAME");
			NUM_BanType = 4;
		}
		else
		{
			bad_input(id);
			MODE_ADDBAN = false
			return PLUGIN_HANDLED
		}
	}
	else
		NUM_BanType = 1;
	// ------==|| Target ||==------
	static Target[33],ARG_TempTarget[64],Found,bool:MODE_RANGEBAN;
	MODE_RANGEBAN = false;
	Found = 0;
	get_players(player,total);
	if (!MODE_ADDBAN)
	{
		switch (NUM_Target_Type)
		{
			case 1:
			{
				for (new i=0;i<total;i++)
				{
					ids = player[i];
					if (get_user_userid(ids)!=tmpid)
						continue;
					Found = 1;
					get_user_authid(ids,ARG_TempTarget,charsmax(ARG_TempTarget));
					switch (NUM_BanType)
					{
						case 1:
						{
							if (IsValidAUTHID(ARG_TempTarget))
							{
								copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
								NUM_BanType = 2;
							}
							else
							{
								get_user_ip(ids,ARG_TempTarget,charsmax(ARG_TempTarget),1);
								copy(ARG_BanType,charsmax(ARG_BanType),"IP");
								NUM_BanType = 3;
							}
						}
						case 2:
						{
							if (IsValidAUTHID(ARG_TempTarget))
								continue;
							if (id)
								client_cmd(id,"echo [UltimateBans] AuthID Not Valid for Banning!!");
							else
								server_print("[UltimateBans] AuthID Not Valid for Banning!!");
							return PLUGIN_HANDLED
						}
					}
					Target[0] = ids;
					break;
				}
			}
			case 2:
			{
				for (new i=0;i<total;i++)
				{
					ids = player[i]
					get_user_authid(ids,ARG_TempTarget,charsmax(ARG_TempTarget))
					if (equali(ARG_TempTarget,ARG_Target))
						Target[Found++] = ids;
				}
				if ((Found)&&(NUM_BanType==1))
				{
					copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
					NUM_BanType = 2;
				}
			}
			case 3:
			{
				for (new i=0;i<total;i++)
				{
					ids = player[i]
					get_user_ip(ids,ARG_TempTarget,charsmax(ARG_TempTarget),1)
					new temp = CheckIP(ARG_Target,ARG_TempTarget);
					if (temp)
					{
						if (temp==2)
							MODE_RANGEBAN = true;
						Target[Found++] = ids;
					}
				}
				if ((Found)&&(NUM_BanType==1))
				{
					copy(ARG_BanType,charsmax(ARG_BanType),"IP");
					NUM_BanType = 3;
				}
			}
		}
		if (!Found)
		{
			for (new i=0;i<total;i++)
			{
				ids = player[i]		
				get_user_name(ids,ARG_TempTarget,charsmax(ARG_TempTarget));
				if (equali(ARG_Target,ARG_TempTarget,strlen(ARG_Target)))
					Target[Found++] = ids;		
			}
			if (Found)
			{
				if (Found>1)
				{
					if (NUM_BanType!=4)
					{
						if (id)
							client_cmd(id,"echo [UltimateBans] %i Players Found with Similar Names . . . Unable to Ban!!",Found);
						else
							server_print("[UltimateBans] %i Players Found with Similar Names . . . Unable to Ban!!",Found);
						return PLUGIN_HANDLED
					}				
				}
				else
				{
					get_user_authid(Target[0],ARG_TempTarget,charsmax(ARG_TempTarget))
					switch (NUM_BanType)
					{
					 	case 1:
					 	{
							if (IsValidAUTHID(ARG_TempTarget))
							{
								copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
								NUM_BanType = 2;
							}
							else
							{
								get_user_ip(ids,ARG_TempTarget,charsmax(ARG_TempTarget),1);
								copy(ARG_BanType,charsmax(ARG_BanType),"IP");
								NUM_BanType = 3;
							}
						}
						case 2:
						{
							if (!IsValidAUTHID(ARG_TempTarget))
							{
								if (id)
									client_cmd(id,"echo [UltimateBans] AuthID Not Valid for Banning!!");
								else
									server_print("[UltimateBans] AuthID Not Valid for Banning!!");
								return PLUGIN_HANDLED
							}
						}
					}
				}
			}	
			else
			{
				if (id)
					client_cmd(id,"echo [UltimateBans] Target Not Found!!");
				else
					server_print("[UltimateBans] Target Not Found!!");
				return PLUGIN_HANDLED
			}
		}
	}
	else
	{
		if (((NUM_Target_Type!=2)&&(NUM_BanType==2))||((NUM_Target_Type!=3)&&(NUM_BanType==3)))
		{
			if (id)
				client_cmd(id,"echo [UltimateBans] BanType doesn't match with TargetType");
			else
				server_print("[UltimateBans] BanType doesn't match with TargetType");
			MODE_ADDBAN = false
			return PLUGIN_HANDLED
		}
		if (NUM_BanType==1)
		{
			switch (NUM_Target_Type)
			{
				case 2: {copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");NUM_BanType=2;}
				case 3: {copy(ARG_BanType,charsmax(ARG_BanType),"IP");NUM_BanType=3;}
				case 4: {copy(ARG_BanType,charsmax(ARG_BanType),"NAME");NUM_BanType=4;}
			}
		}
		if (CheckBan(ARG_Target,ARG_BanType)!=-2)
		{
			if (id)
				client_cmd(id,"echo [UltimateBans] Player Already Banned");
			else
				server_print("[UltimateBans] Player Already Banned");
			MODE_ADDBAN = false
			return PLUGIN_HANDLED
		}
		for (new i=0;i<total;i++)
		{
			ids = player[i];
			switch (NUM_BanType)
			{
				case 2:
				{
					get_user_authid(ids,ARG_TempTarget,charsmax(ARG_TempTarget));
					if (equali(ARG_TempTarget,ARG_Target))
						Target[Found++] = ids;
				}
				case 3:
				{
					get_user_ip(ids,ARG_TempTarget,charsmax(ARG_TempTarget),1);
					new temp = CheckIP(ARG_Target,ARG_TempTarget);
					if (temp)
					{
						if (temp==2)
							MODE_RANGEBAN = true;
						Target[Found++] = ids;
					}
				}
				case 4:
				{
					get_user_name(ids,ARG_TempTarget,charsmax(ARG_TempTarget));
					if (equali(ARG_Target,ARG_TempTarget,strlen(ARG_Target)))
						Target[Found++] = ids;
				}
			}
		}
		if (Found)
		{
			if (id)
				client_cmd(id,"echo [UltimateBans] %s been FOUND Connected to the Server.",(Found==1)?"Target has":"Targets have");
			else
				server_print("[UltimateBans] %s been FOUND Connected to the Server.",(Found==1)?"Target has":"Targets have");
			MODE_ADDBAN = false;
		}
		else
			Found = 1;
	}
	if (!MODE_ADDBAN)
	{
		get_pcvar_string (cvar_Flags,Flags,charsmax(Flags));
		strtolower(Flags);
		for (new i=0;i<Found;i++)
			for (new j=0;j<strlen(Flags);j++)
				if ((isalpha(Flags[j]))&&(get_user_flags(Target[i]) & power(2,(Flags[j]-97))))
				{
					if (id)
						client_cmd(id,"echo [UltimateBans] This/These Player(s) can't be Banned because of Access Flags assgined to them by Server");
					else
						server_print("[UltimateBans] This/These Player(s) can't be Banned because of Access Flags assgined to them by Server");
					return PLUGIN_HANDLED
				}
	}
	// ------==|| Time ||==------
	static dot,count_digits,years,months,days,hours,minutes,seconds,Float:NUM_Duration,STR_BanTime[32],STR_Duration[128],STR_UnbanTime[32],_years[7],_months[5],_days[5],_hours[5],_minutes[5],_seconds[5],bool:is_permanent;
	years=0,months=0,days=0,hours=0,minutes=0,seconds=0,dot=0,count_digits=1,is_permanent=false;
	if (!isdigit(ARG_Duration[0]))
	{
		bad_input(id);
		MODE_ADDBAN = false
		return PLUGIN_HANDLED
	}
	for (new i=1;i<strlen(ARG_Duration);i++)
	{
		if (ARG_Duration[i]=='.')
		{
			if (++dot>1)
			{
				bad_input(id);
				MODE_ADDBAN = false
				return PLUGIN_HANDLED
			}
		}
		else if (!isdigit(ARG_Duration[i]))
		{
			bad_input(id);
			MODE_ADDBAN = false
			return PLUGIN_HANDLED
		}
		else if (!dot)
			count_digits++;
	}
	if (count_digits>8)
		NUM_Duration = 0.0;
	else
		NUM_Duration = str_to_float(ARG_Duration);
	minutes = floatround(NUM_Duration,floatround_floor);
	seconds = floatround(floatfract(NUM_Duration)*60,floatround_floor);
	while(minutes>=60)
	{
		minutes -= 60;
		hours++;
	}
	while(hours>=24)
	{
		hours -= 24;
		days++;
	}
	if (NUM_Duration)
	{
		is_permanent = false;
		len = 0;
		if (days)
			len += formatex(STR_Duration[len],charsmax(STR_Duration)-len,"%d Day(s) ",days);
		if (hours)
			len += formatex(STR_Duration[len],charsmax(STR_Duration)-len,"%i Hour(s) ",hours);
		if (minutes)
			len += formatex(STR_Duration[len],charsmax(STR_Duration)-len,"%i Minute(s) ",minutes);
		if (seconds)
			len += formatex(STR_Duration[len],charsmax(STR_Duration)-len,"%i Second(s)",seconds);
		format_time(_hours,charsmax(_hours),"%H");
		format_time(_minutes,charsmax(_minutes),"%M");
		format_time(_seconds,charsmax(_seconds),"%S");
		format_time(_days,charsmax(_days),"%d");
		format_time(_months,charsmax(_months),"%m");
		format_time(_years,charsmax(_years),"%Y");
		formatex(STR_BanTime,charsmax(STR_BanTime),"%s:%s:%s %s/%s/%s",_hours,_minutes,_seconds,_days,_months,_years);
		hours = str_to_num(_hours);
		months= str_to_num(_months);
		days = str_to_num(_days);
		years = str_to_num(_years);
		minutes = floatround(NUM_Duration,floatround_floor)+str_to_num(_minutes);
		while(minutes>=60)
		{
			minutes -= 60;
			hours++;
		}
		while(hours>=24)
		{
			hours -= 24;
			days++;
		}
		while(days>get_monthdays(months,years))
		{
			days -= get_monthdays(months,years);
			if (++months>12)
			{
				months -= 12;
				years++;
			}
		}
		seconds += str_to_num(_seconds);
		if (seconds>59)
		{
			seconds -= 60;
			if (minutes<59)
				minutes++;
			else
			{
				minutes=0;
				if (hours<23)
					hours++;
				else
				{
					hours=0;
					if (days<get_monthdays(months,years))
						days++;
					else
					{
						days=1;
						if (months<12)
							months++;
						else
						{
							months=1;
							years++;
						}
					}
				}
			}
		}	
		formatex(STR_UnbanTime,charsmax(STR_UnbanTime),"%02i:%02i:%02i %02i/%02i/%d", hours,minutes,seconds,days,months,years);
	}
	else
	{
		is_permanent = true;
		copy(STR_Duration,charsmax(STR_Duration)," from the Server");
		format_time(STR_BanTime,charsmax(STR_BanTime),"%H:%M %d/%m/%Y");
		copy(STR_UnbanTime,charsmax(STR_UnbanTime),"<null>");
	}
	// ------==|| Banner ||==------
	static Name2[64],AuthID2[32],IP2[16];
	if (id)
	{
		get_user_name(id,Name2,charsmax(Name2));
		get_user_ip(id,IP2,charsmax(IP2),1);
		get_user_authid(id,AuthID2,charsmax(AuthID2));
	}		
	// ------==|| Final Step ||==------
	static Contact[128],Name1[64],AuthID1[32],IP1[16],DATA[BanInfo],func_buffer[1024],Float:handle_delay;
	len = 0;
	len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ",ARG_BanType);
	if (MODE_ADDBAN)
	{
		switch (NUM_BanType)
		{
			case 2: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ^"<null>^" ^"<null>^" ",ARG_Target);
			case 3: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"%s^" ^"<null>^" ",ARG_Target);
			case 4: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"<null>^" ^"%s^" ",ARG_Target);
		}
	}
	else
	{
		get_user_authid(Target[0],AuthID1,charsmax(AuthID1));
		get_user_ip(Target[0],IP1,charsmax(IP1),1);
		get_user_name(Target[0],Name1,charsmax(Name1));
		if (Found==1)
		{
			if (MODE_RANGEBAN)
				len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"%s^" ^"<null>^" ",ARG_Target);
			else
				len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ^"%s^" ^"%s^" ",AuthID1,IP1,(NUM_BanType==4)?ARG_Target:Name1);
		}
		else
		{	
			switch (NUM_BanType)
			{
				case 2: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ^"<null>^" ^"<null>^" ",AuthID1);
				case 3: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"%s^" ^"<null>^" ",MODE_RANGEBAN?ARG_Target:IP1);
				case 4: len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"<null>^" ^"%s^" ",ARG_Target);
			}
		}
	}
	len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ^"%s^" ",STR_BanTime,STR_UnbanTime);
	if (id)
		len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^" ^"%s^" ^"%s^" ",AuthID2,IP2,Name2);
	else
		len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"<null>^" ^"<null>^" ^"RCON/Server^" ");
	len += formatex(func_buffer[len],charsmax(func_buffer)-len,"^"%s^"",ARG_Reason);
	new file = fopen(ub_banlistfile,"a+");
	fprintf(file,"%s^n",func_buffer);
	fclose(file);
	parse(func_buffer,DATA[bantype],charsmax(DATA[bantype]),DATA[target_authid],charsmax(DATA[target_authid]),DATA[target_ip],charsmax(DATA[target_ip]),DATA[target_name],charsmax(DATA[target_name]),DATA[bantime],charsmax(DATA[bantime]),DATA[unbantime],charsmax(DATA[unbantime]),DATA[banner_authid],charsmax(DATA[banner_authid]),DATA[banner_ip],charsmax(DATA[banner_ip]),DATA[banner_name],charsmax(DATA[banner_name]),DATA[reason],charsmax(DATA[reason]));
	ArrayPushArray(banlist_array,DATA);
	TotalBans++;
	LastBanTime = get_gametime();
	if (MODE_ADDBAN)
	{
		formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has been ADDED to BANLIST^x04 %s%s^x04 BY^x03 %s.^x01 [ Reason - ^"%s^" ]",ARG_Target,is_permanent?"Permanently":"for ",is_permanent?"":STR_Duration,id?Name2:"RCON/Server",ARG_Reason);
		ChatPrint(func_buffer);
		if (id)
			log_to_file("addons/amxmodx/logs/UB_Logs.log","<ADDBAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" > BANNED %s %s BY < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" >. [ BanType - ^"%s^" ] [ Reason - ^"%s^" ]",DATA[target_authid],DATA[target_ip],DATA[target_name],is_permanent?"Permanently":"for",is_permanent?"from the Server":STR_Duration,AuthID2,IP2,Name2,ARG_BanType,ARG_Reason);
		else
			log_to_file("addons/amxmodx/logs/UB_Logs.log","<ADDBAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" > BANNED %s %s BY < RCON/Server >. [ BanType - ^"%s^" ] [ Reason - ^"%s^" ]",DATA[target_authid],DATA[target_ip],DATA[target_name],is_permanent?"Permanently":"for",is_permanent?"from the Server":STR_Duration,ARG_BanType,ARG_Reason);
		MODE_ADDBAN = false;
	}
	else
	{
		handle_delay = 0.0;
		static Hostname[64];
		get_user_name(0,Hostname,charsmax(Hostname));
		for ( new i=0;i<Found;i++)
		{		
			client_cmd(Target[i],"echo [UltimateBans] -------------------------------");
			client_cmd(Target[i],"echo [UltimateBans] --==|| BAN INFO ||==--");
			client_cmd(Target[i],"echo [UltimateBans] -------------------------------");
			client_cmd(Target[i],"echo [UltimateBans] Server - %s",Hostname);
			if (is_permanent)
				PrintBanInfo(DATA,Target[i]);
			else
				PrintBanInfo(DATA,Target[i],STR_Duration);
			get_pcvar_string(cvar_Contact,Contact,charsmax(Contact));
			if (!equali(Contact,"N/A"))
			{
				client_cmd(Target[i],"echo [UltimateBans] For Unban Request, Go to : ^"%s^"",Contact);
				client_cmd(Target[i],"echo [UltimateBans] -------------------------------");	
			}
			get_user_authid(Target[i],AuthID1,charsmax(AuthID1));
			get_user_ip(Target[i],IP1,charsmax(IP1),1);
			get_user_name(Target[i],Name1,charsmax(Name1));
			formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has been BANNED^x03 %s%s^x04 BY^x03 %s.^x01 [ Reason - ^"%s^" ]",Name1,is_permanent?"Permanently":"for ",STR_Duration,id?Name2:"RCON/Server",ARG_Reason);
			set_task(handle_delay,"ChatPrint",80085,func_buffer,charsmax(func_buffer));
			if (id)
				formatex(func_buffer,charsmax(func_buffer),"<BAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" > BANNED %s %s BY < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" >. [ BanType - ^"%s^" ] [ Reason - ^"%s^" ]",AuthID1,MODE_RANGEBAN?ARG_Target:IP1,Name1,is_permanent?"Permanently":"for",is_permanent?"from the Server":STR_Duration,AuthID2,IP2,Name2,ARG_BanType,ARG_Reason);
			else
				formatex(func_buffer,charsmax(func_buffer),"<BAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" > BANNED %s %s BY < RCON/Server >. [ BanType - ^"%s^" ] [ Reason - ^"%s^" ]",AuthID1,MODE_RANGEBAN?ARG_Target:IP1,Name1,is_permanent?"Permanently":"for",is_permanent?"from the Server":STR_Duration,ARG_BanType,ARG_Reason);
			set_task(handle_delay,"DelayedLog",80085,func_buffer,charsmax(func_buffer));
			handle_delay += 0.5;
			server_cmd("kick #%d ^"You have been BANNED %s%s. Check your Console for More Information.^"",get_user_userid(Target[i]),is_permanent?"Permanently":"for ",is_permanent?"from the Server":STR_Duration);
		}
	}
	if (handle_ban_menu_call[id])
	{
		Menu_Ban_Display(id,Menu_Ban_pos[id]);
		handle_ban_menu_call[id] = false;
	}
	return PLUGIN_HANDLED
}

public CmdADDBAN(id,level,cid) 
{
	if (!cmd_access(id,level,cid,2,false))
		return PLUGIN_HANDLED
	MODE_ADDBAN = true;
	static command[256];
	read_args(command,charsmax(command));
	if (id)
		client_cmd(id,"amx_ban %s",command);
	else
		server_cmd("amx_ban %s",command);
	return PLUGIN_HANDLED
}

public CmdUNBAN(id,level,cid)
{
	if (!cmd_access(id,level,cid,2,false))
		return PLUGIN_HANDLED		
	// ------==|| Input Data Handling ||==------
	new ARG_Target[64],ARG_BanType[8];
	static ARG_Count,ARG_STR[128];
	ARG_Count = 0;
	read_args(ARG_STR,charsmax(ARG_STR));
	parse(ARG_STR,ARG_Target,charsmax(ARG_Target),ARG_BanType,charsmax(ARG_BanType));
	if (strlen(ARG_Target))
	{
		ARG_Count=1;
		trim(ARG_Target);
		if (equali(ARG_Target,"<null>",6))
		{
			bad_input(id);
			return PLUGIN_HANDLED
		}
		if (strlen(ARG_BanType))
		{
			ARG_Count=2;
			trim(ARG_BanType);
		}		
	}	
	// ------==|| Input Type Handling ||==------
	static NUM_BanType;
	if (ARG_Count==2)
	{
		if (equali(ARG_BanType,"AUTO",4))
			NUM_BanType = 1;
		else if (equali(ARG_BanType,"STEAMID",7))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
			NUM_BanType = 2;
		}
		else if (equali(ARG_BanType,"IP",2))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"IP");
			NUM_BanType = 3;
		}
		else if (equali(ARG_BanType,"NAME",4))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"NAME");
			NUM_BanType = 4;
		}
		else
		{
			bad_input(id);
			return PLUGIN_HANDLED
		}
	}
	else
		NUM_BanType = 1;	
	if (NUM_BanType==1)
	{
		if (IsValidAUTHID(ARG_Target))
		{
			copy (ARG_BanType,charsmax(ARG_BanType),"STEAMID");
			NUM_BanType = 2;
		}
		else if (IsValidIP(ARG_Target))
		{
			copy (ARG_BanType,charsmax(ARG_BanType),"IP");
			NUM_BanType = 3;
		}
		else
		{
			copy (ARG_BanType,charsmax(ARG_BanType),"NAME");
			NUM_BanType = 4;
		}
	}
	// ------==|| Final Step ||==------
	static pos,Unbanner_Name[64],DATA[BanInfo],func_buffer[256];
	MODE_UNBAN = true;
	pos = CheckBan(ARG_Target,ARG_BanType);
	if (pos==-2)
	{
		if (id)
			client_cmd(id,"echo [UltimateBans] Player Not Found");
		else
			server_print("[UltimateBans] Player Not Found");
		MODE_UNBAN = false;
		return PLUGIN_HANDLED
	}
	if (id)
		get_user_name(id,Unbanner_Name,charsmax(Unbanner_Name));
	ArrayGetArray(banlist_array,pos,DATA);		
	if (!equali(DATA[target_name],"<null>"))
		formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has been^x03 UNBANNED^x04 BY^x03 ^"%s^"",DATA[target_name],id?Unbanner_Name:"RCON/Server");
	else
	{
		if (NUM_BanType==2)
			formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has been^x03 UNBANNED^x04 BY^x03 ^"%s^"",DATA[target_authid],id?Unbanner_Name:"RCON/Server");
		else
			formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has been^x03 UNBANNED^x04 BY^x03 ^"%s^"",DATA[target_ip],id?Unbanner_Name:"RCON/Server");		
	}
	ChatPrint(func_buffer);
	if (id)
		log_to_file("addons/amxmodx/logs/UB_Logs.log","<UNBAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" , BanType:^"%s^" > UNBANNED BY < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" >",DATA[target_authid],DATA[target_ip],DATA[target_name],ARG_BanType,DATA[banner_authid],DATA[banner_ip],DATA[banner_name]);
	else
		log_to_file("addons/amxmodx/logs/UB_Logs.log","<UNBAN> < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" , BanType:^"%s^" > UNBANNED BY < RCON/Server >",DATA[target_authid],DATA[target_ip],DATA[target_name],ARG_BanType);
	ArrayDeleteItem(banlist_array,pos);
	TotalBans--;
	new file = fopen(ub_banlistfile,"wt");
	for(new i=0;i<TotalBans;i++)
	{
		ArrayGetArray(banlist_array,i,DATA);
		fprintf(file,"^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",DATA[bantype],DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantime],DATA[unbantime],DATA[banner_authid],DATA[banner_ip],DATA[banner_name],DATA[reason]);
	}
	fclose(file);
	if (handle_unban_menu_call[id])
	{
		Menu_Unban_Display(id,Menu_Unban_pos[id]);
		handle_unban_menu_call[id] = false;
	}
	MODE_UNBAN = false;
	return PLUGIN_HANDLED
}

public CmdQUERYNEXT(id,level,cid)
{
	if (!cmd_access(id,level,cid,1,false))
		return PLUGIN_HANDLED
	if (QueryCount[id]<=QueryPointer[id]+4)
	{
		if (id)
			client_cmd(id,"echo [UltimateBans] Next Page of Query doesn't Exist");
		else
			server_print("[UltimateBans] Next Page of Query doesn't Exist");
		return PLUGIN_HANDLED
	}
	QueryPointer[id] += 5
	MODE_QUERY_CONTINUE = true;
	if (id)
		client_cmd(id,"ub_queryban %s %s",LastQuery[id],LastQueryType[id]);
	else
		server_cmd("ub_queryban %s %s",LastQuery[0],LastQueryType[0]);
	return PLUGIN_HANDLED
}

public CmdQUERYBACK(id,level,cid)
{
	if (!cmd_access(id,level,cid,1,false))
		return PLUGIN_HANDLED	
	if (QueryPointer[id]-5<=0)
	{
		if (id)
			client_cmd(id,"echo [UltimateBans] Previous Page of Query doesn't Exist");
		else
			server_print("[UltimateBans] Previous Page of Query doesn't Exist");
		return PLUGIN_HANDLED
	}
	QueryPointer[id] -= 5
	MODE_QUERY_CONTINUE = true;
	if (id)
		client_cmd(id,"ub_queryban %s %s",LastQuery[id],LastQueryType[id]);
	else
		server_cmd("ub_queryban %s %s",LastQuery[0],LastQueryType[0]);
	return PLUGIN_HANDLED
}		

public CmdQUERY(id,level,cid)
{     
	if (!cmd_access(id,level,cid,2,false))
		return PLUGIN_HANDLED		
	// ------==|| Input Data Handling ||==------
	new ARG_Target[64],ARG_BanType[8];
	static ARG_Count,ARG_STR[128];
	ARG_Count = 0;
	read_args(ARG_STR,charsmax(ARG_STR));
	trim(ARG_STR);
	parse(ARG_STR,ARG_Target,charsmax(ARG_Target),ARG_BanType,charsmax(ARG_BanType));
	if (strlen(ARG_Target))
	{
		ARG_Count=1;
		trim(ARG_Target);
		if (equali(ARG_Target,"<null>",6))
		{
			bad_input(id);
			MODE_QUERY_CONTINUE = false;
			return PLUGIN_HANDLED
		}
		if (strlen(ARG_BanType))
		{
			ARG_Count=2;
			trim(ARG_BanType);
		}		
	}	
	// ------==|| Input Type Handling ||==------
	static NUM_BanType;
	if (ARG_Count==2)
	{
		if (equali(ARG_BanType,"AUTO",4))
			NUM_BanType = 1;
		if (equali(ARG_BanType,"STEAMID",7))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"STEAMID");
			NUM_BanType = 2;
		}
		else if (equali(ARG_BanType,"IP",2))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"IP");
			NUM_BanType = 3;
		}
		else if (equali(ARG_BanType,"NAME",4))
		{
			copy(ARG_BanType,charsmax(ARG_BanType),"NAME");
			NUM_BanType = 4;
		}
		else
		{
			bad_input(id);
			MODE_QUERY_CONTINUE = false;
			return PLUGIN_HANDLED
		}
	}
	else
		NUM_BanType = 1;
	// ------==|| Final Step ||==------
	static DATA[BanInfo],bool:ShowData,bool:Found;
	Found = false;
	if (MODE_QUERY_CONTINUE)
		MODE_QUERY_CONTINUE = false;
	else
		QueryPointer[id] = 1;
	QueryCount[id] = 0;
	if (id)
	{
		client_cmd(id,"echo [UltimateBans] -------------------------------");
		client_cmd(id,"echo [UltimateBans] --==|| QUERY RESULT ||==--");
		client_cmd(id,"echo [UltimateBans] -------------------------------");
	}
	else
	{
		server_print("[UltimateBans] -------------------------------");
		server_print("[UltimateBans] --==|| QUERY RESULT ||==--");
		server_print("[UltimateBans] -------------------------------");
	}
	for (new i=0;i<TotalBans;i++)
	{
		ShowData = false;
		ArrayGetArray(banlist_array,i,DATA);
		switch (NUM_BanType)
		{
			case 1: if ((containi(DATA[target_authid],ARG_Target)!=-1)||(containi(DATA[target_ip],ARG_Target)!=-1)||(containi(DATA[target_name],ARG_Target)!=-1))	ShowData = true;
			case 2: if (containi(DATA[target_authid],ARG_Target)!=-1) ShowData = true;
			case 3: if (containi(DATA[target_ip],ARG_Target)!=-1) ShowData = true;
			case 4: if (containi(DATA[target_name],ARG_Target)!=-1) ShowData = true;
		}
		if (ShowData)
		{
			QueryCount[id]++;
			if (QueryPointer[id]+4>=QueryCount[id]>=QueryPointer[id])
			{
				Found = true;
				PrintBanInfo(DATA,id);
			}
		}
	}
	if (!Found)
	{
		if (id)
		{
			client_cmd(id,"echo [UltimateBans] Not Found / Page doesn't Exist");
			client_cmd(id,"echo [UltimateBans] -------------------------------");
		}
		else
		{
			server_print("[UltimateBans] Not Found / Page doesn't Exist");
			server_print("[UltimateBans] -------------------------------");
		}
	}
	else
	{
		copy(LastQuery[id],63,ARG_Target);
		if (ARG_Count==2)
			copy(LastQueryType[id],7,ARG_BanType);
		if (id)
		{
			if (QueryCount[id]>=QueryPointer[id]+5)
				client_cmd(id,"echo [UltimateBans] Type ^"ub_querynext^" to see the Next Page");
			if (QueryPointer[id]-5>=0)
				client_cmd(id,"echo [UltimateBans] Type ^"ub_queryback^" to see the Previous Page");
			if (QueryCount[id]>=6)
				client_cmd(id,"echo [UltimateBans] -------------------------------");
		}
		else
		{
			if (QueryCount[id]>=QueryPointer[id]+5)
				server_print("[UltimateBans] Type ^"ub_querynext^" to See Next Page");
			if (QueryPointer[id]-5>=0)
				server_print("[UltimateBans] Type ^"ub_queryback^" to See Previous Page");
			if (QueryCount[id]>=6)
				server_print("[UltimateBans] -------------------------------");
		}
	}
	return PLUGIN_HANDLED
}

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

	if (!TotalBans)
	{
		if (id)
			client_cmd(id,"echo [UltimateBans] Banlist is Empty");
		else
			server_print("[UltimateBans] Banlist is Empty");
		return PLUGIN_HANDLED
	}
	new ARG_STR[128],ARG_Start[8],Start,End;
	read_args(ARG_STR,charsmax(ARG_STR));
	parse(ARG_STR,ARG_Start,charsmax(ARG_Start));
	if (strlen(ARG_Start))
	{
		trim(ARG_Start);
		Start = str_to_num(ARG_Start);
		if (!Start)
		{
			bad_input(id);
			return PLUGIN_HANDLED
		}
		if (TotalBans>=5)
		{
			if (Start>TotalBans)
			{
				Start = TotalBans-4;
				End = TotalBans;
			}
			else
			{
				if (Start+4<=TotalBans)
					End = Start+4;
				else
					End = TotalBans;
			}
		}
		else
		{
			if (Start>TotalBans)
				Start = 1;
			End = TotalBans;
		}
	}		
	else
	{
		Start = 1;
		if (TotalBans>=5)
			End = 5;
		else
			End = TotalBans;
	}
	if (id)
	{
		client_cmd(id,"echo [UltimateBans] -------------------------------");
		client_cmd(id,"echo [UltimateBans] --==|| BAN LIST ||==--");
		client_cmd(id,"echo [UltimateBans] -------------------------------");
		client_cmd(id,"echo [UltimateBans] Entries %d-%d of %d",Start,End,TotalBans);
		client_cmd(id,"echo [UltimateBans] -------------------------------");
	}
	else
	{
		server_print("[UltimateBans] -------------------------------");
		server_print("[UltimateBans] --==|| BAN LIST ||==--");
		server_print("[UltimateBans] -------------------------------");
		server_print("[UltimateBans] Entries %d-%d of %d",Start,End,TotalBans);
		server_print("[UltimateBans] -------------------------------");	
	}
	static DATA[BanInfo];
	for (new i=0;i<TotalBans;i++)
	{
		if (Start<=i+1<=End)
		{
			ArrayGetArray(banlist_array,i,DATA);
			PrintBanInfo(DATA,id);
		}
		else if (i+1>End)
			break;
	}
	if (id)
	{
		if (End<TotalBans)
		{
			if (End+5<=TotalBans)
				client_cmd(id,"echo [UltimateBans] Type ^"ub_banlistfile %d^" to see next 5 Entry/Entries",End+1);
			else
				client_cmd(id,"echo [UltimateBans] Type ^"ub_banlistfile %d^" to see next %d Entry/Entries",End+1,TotalBans-End);
			client_cmd(id,"echo [UltimateBans] -------------------------------");
		}
	}
	else
	{
		if (End<TotalBans)
		{
			if (End+5<=TotalBans)
				server_print("[UltimateBans] Type ^"ub_banlistfile %d^" to see next 5 Entry/Entries",End+1);
			else
				server_print("[UltimateBans] Type ^"ub_banlistfile %d^" to see next %d Entry/Entries",End+1,TotalBans-End);
			server_print("[UltimateBans] -------------------------------");
		}
	}
	return PLUGIN_HANDLED
}

public CmdRELOAD()
{
	server_print("[UltimateBans] All Bans Reloaded!");
	CmdLOAD();
}

CmdLOAD()
{
	ArrayClear(banlist_array);
	TotalBans = 0;
	new file,func_buffer[1024],DATA[BanInfo],bool:filter_file,NUM_BanType;
	filter_file = false;
	MODE_LOADBAN = true;
	file = fopen(ub_banlistfile, "rt");
	while(!feof(file))
	{
		fgets(file,func_buffer,charsmax(func_buffer));
		trim(func_buffer);
		if (!func_buffer[0])
			continue;
		parse(func_buffer,DATA[bantype],charsmax(DATA[bantype]),DATA[target_authid],charsmax(DATA[target_authid]),DATA[target_ip],charsmax(DATA[target_ip]),DATA[target_name],charsmax(DATA[target_name]),DATA[bantime],charsmax(DATA[bantime]),DATA[unbantime],charsmax(DATA[unbantime]),DATA[banner_authid],charsmax(DATA[banner_authid]),DATA[banner_ip],charsmax(DATA[banner_ip]),DATA[banner_name],charsmax(DATA[banner_name]),DATA[reason],charsmax(DATA[reason]));
		trim(DATA[bantype]);
		if (!(DATA[bantype][0]))
			copy(DATA[bantype],charsmax(DATA[bantype]),"<null>");
		trim(DATA[target_authid]);
		if (!(DATA[target_authid][0]))
			copy(DATA[target_authid],charsmax(DATA[target_authid]),"<null>");
		trim(DATA[target_ip]);
		if (!(DATA[target_ip][0]))
			copy(DATA[target_ip],charsmax(DATA[target_ip]),"<null>");
		trim(DATA[target_name]);
		if (!(DATA[target_name][0]))
			copy(DATA[target_name],charsmax(DATA[target_name]),"<null>");
		trim(DATA[bantime]);
		if (!(DATA[bantime][0]))
			copy(DATA[bantime],charsmax(DATA[bantime]),"<null>");
		trim(DATA[unbantime]);
		if (!(DATA[unbantime][0]))
			copy(DATA[unbantime],charsmax(DATA[unbantime]),"<null>");
		trim(DATA[banner_authid]);
		if (!(DATA[banner_authid][0]))
			copy(DATA[banner_authid],charsmax(DATA[banner_authid]),"<null>");
		trim(DATA[banner_ip]);
		if (!(DATA[banner_ip][0]))
			copy(DATA[banner_ip],charsmax(DATA[banner_ip]),"<null>");
		trim(DATA[banner_name]);
		if (!(DATA[banner_name][0]))
			copy(DATA[banner_name],charsmax(DATA[banner_name]),"<null>");
		trim(DATA[reason]);
		if (!(DATA[reason][0]))
			copy(DATA[reason],charsmax(DATA[reason]),"<null>");
		if (equali(DATA[bantype],"STEAMID",7))
			NUM_BanType = 2;
		else if (equali(DATA[bantype],"IP",2))
			NUM_BanType = 3;
		else if (equali(DATA[bantype],"NAME",4))
			NUM_BanType = 4;
		else
		{
			filter_file = true;
			continue;
		}
		switch (NUM_BanType)
		{
			case 2:
			{
				if (!IsValidAUTHID(DATA[target_authid]))
				{
					filter_file = true;
					continue;
				}
				if (CheckBan(DATA[target_authid],"STEAMID")!=-2)
				{
					filter_file = true;
					continue;
				}
			}
			case 3:
			{
				if (!IsValidIP(DATA[target_ip]))
				{
					filter_file = true;
					continue;
				}
				if (CheckBan(DATA[target_ip],"IP")!=-2)
				{
					filter_file = true;
					continue;
				}
			}
			case 4:
			{
				if (equali(DATA[target_name],"<null>",6))
				{
					filter_file = true;
					continue;
				}
				if (CheckBan(DATA[target_name],"NAME")!=-2)
				{
					filter_file = true;
					continue;
				}
			}
		}
		if ((!equali(DATA[unbantime],"<null>",6))&&(!IsValidTIME(DATA[unbantime])))
		{
			filter_file = true;
			continue;
		}
		ArrayPushArray(banlist_array,DATA);
		TotalBans++;
	}
	fclose(file);
	MODE_LOADBAN = false;
	for (new i=0;i<33;i++)
		if (auth_delay[i])
		{
			client_authorized(i);
			auth_delay[i] = false;
		}
	if (task_exists(1337))
		remove_task(1337);
	set_task(1.0,"CheckTimeUP",1337);
	if (!filter_file)
		return;
	file = fopen(ub_banlistfile, "wt");
	for(new i=0;i<TotalBans;i++)
	{
		ArrayGetArray(banlist_array,i,DATA);
		fprintf(file,"^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",DATA[bantype],DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantime],DATA[unbantime],DATA[banner_authid],DATA[banner_ip],DATA[banner_name],DATA[reason]);
	}
	fclose(file);
}

public CmdRESET()
{
	new file = fopen(ub_banlistfile,"wt");fclose(file);
	ArrayClear(banlist_array);
	TotalBans=0;
	log_to_file("addons/amxmodx/logs/UB_Logs.log","< - - - - - ALL BANS RESET - - - - - >");
}

public CheckTimeUP()
{
	static Float:temp_interval;
	temp_interval = get_pcvar_float(cvar_CheckInterval);
	if (temp_interval<1.0)
	{
		set_task(1.0,"CheckTimeUP",1337);
		return PLUGIN_HANDLED
	}
	if (!TotalBans)
	{
		set_task(temp_interval,"CheckTimeUP",1337);
		return PLUGIN_HANDLED
	}
	static DATA[BanInfo],func_buffer[256],bool:filter_file,Float:handle_delay;
	handle_delay = 0.0;
	filter_file = false;
	for(new i=0;i<TotalBans;i++)
	{
		ArrayGetArray(banlist_array,i,DATA);
		if (equali(DATA[unbantime],"<null>",6))
			continue;
		if (!get_ban_timeleft(DATA[unbantime]))
		{
			if (!equali(DATA[target_name],"<null>",6))	
				formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_name]);	
			else
			{
				if ((equali(DATA[bantype],"STEAMID",7))&&(!equali(DATA[target_authid],"<null>",6)))
					formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_authid]);
				else
					formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x04 BANTIME Up/Elaped for^x03 %s",DATA[target_ip]);
			}
			set_task(handle_delay,"ChatPrint",80085,func_buffer,charsmax(func_buffer));
			formatex(func_buffer,charsmax(func_buffer),"<UNBAN> BANTIME Up/Elapsed for < AuthID:^"%s^" , IP:^"%s^" , Name:^"%s^" , BanType:^"%s^" >",DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantype]);
			set_task(handle_delay,"DelayedLog",80085,func_buffer,charsmax(func_buffer));
			handle_delay += 0.5;
			ArrayDeleteItem(banlist_array,i);
			TotalBans--;
			i--;
			filter_file = true;
		}
	}
	if (!filter_file)
	{
		set_task(temp_interval,"CheckTimeUP",1337);
		return PLUGIN_HANDLED
	}
	new file = fopen(ub_banlistfile,"wt");
	for(new i=0;i<TotalBans;i++)
	{
		ArrayGetArray(banlist_array,i,DATA);
		fprintf(file,"^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",DATA[bantype],DATA[target_authid],DATA[target_ip],DATA[target_name],DATA[bantime],DATA[unbantime],DATA[banner_authid],DATA[banner_ip],DATA[banner_name],DATA[reason]);
	}
	fclose(file);
	set_task(temp_interval,"CheckTimeUP",1337);
	return PLUGIN_HANDLED
}

public CmdBANMENU(id,level,cid)
{
	if (!cmd_access(id,level,cid,1,false))
		return PLUGIN_HANDLED
	Menu_Ban_pos[id] = 0;
	Menu_Ban_Display(id,Menu_Ban_pos[id]);
	return PLUGIN_HANDLED
}

public Menu_Ban_Keys(id,key)
{
	switch (key)
	{
		case 9:	
		{
			if (Menu_Ban_pos[id])
				Menu_Ban_Display(id,--Menu_Ban_pos[id])
			else
				Menu_Ban_pos[id] = 0;
			return PLUGIN_HANDLED
		}
		case 8: Menu_Ban_Display(id,++Menu_Ban_pos[id]);
		case 7:
		{
			client_print(id,print_chat,"[UltimateBans] Type in the Duration of BAN in Minute(s)");
			client_cmd(id,"messagemode UB_SetDuration");
		}			
		case 6:
		{
			if(Menu_Ban_BanType[id]<3)
				Menu_Ban_BanType[id]++;
			else
				Menu_Ban_BanType[id]=0;
			Menu_Ban_Display(id,Menu_Ban_pos[id]);
		}
		default:
		{
			Menu_Ban_Target[id] = Menu_Ban_Players[id][Menu_Ban_pos[id]*6+key];
			if(!is_user_connected(Menu_Ban_Target[id]))
			{
				client_print(id,print_chat,"[UltimateBans] Sorry, but the Player has already Disconnected from the Server");
				Menu_Ban_pos[id] = 0;
				Menu_Ban_Display(id,Menu_Ban_pos[id]);
				return PLUGIN_HANDLED
			}
			client_print(id,print_chat,"[UltimateBans] Type in the reason for banning this player");
			client_cmd(id,"messagemode UB_SetReason");
		}
	}
	return PLUGIN_HANDLED
}

Menu_Ban_Display(id,pos)
{
	static Keys,len,Start,End,temp_pos,Name[64],bool:is_flagged,func_Buffer[512];
	temp_pos=0,Keys=MENU_KEY_0|MENU_KEY_7|MENU_KEY_8;
	get_players(Menu_Ban_Players[id],Menu_Ban_Total[id]);
	Start = pos*6;
	if (Start>Menu_Ban_Total[id])
		return PLUGIN_HANDLED
	if (Start<0)
		Start=0;
	End = Start+6;
	if (End>Menu_Ban_Total[id])
		End=Menu_Ban_Total[id];
	get_pcvar_string (cvar_Flags,Flags,charsmax(Flags));
	strtolower(Flags);
	is_flagged = false;
	len = formatex(func_Buffer,charsmax(func_Buffer),"\yBan Menu:^n^n");
	for (new i=Start;i<End;i++)
	{
		ids = Menu_Ban_Players[id][i];
		temp_pos++;
		get_user_name(ids,Name,charsmax(Name));
		if (id==ids)
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \d%s^t\r(Self)^n",temp_pos,Name);
			continue;
		}
		for (new j=0;j<strlen(Flags);j++)
			if ((isalpha(Flags[j]))&&(get_user_flags(ids) & power(2,(Flags[j]-97))))
			{
				is_flagged = true;
				break;
			}
		if (is_flagged)
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \d%s^t\r(Flagged)^n",temp_pos,Name);
			is_flagged = false;
		}
		else
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \w%s^n",temp_pos,Name);
			Keys |= (1<<temp_pos-1);
		}
	}
	switch (Menu_Ban_BanType[id])
	{
		case 0: len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n\y7. \wBanType: \dAUTO^n");
		case 1: len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n\y7. \wBanType: \wSTEAMID^n");
		case 2: len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n\y7. \wBanType: \wIP^n");
		case 3: len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n\y7. \wBanType: \wNAME^n");
	}
	if (!Menu_Ban_Duration[id])
		len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y8. \wDuration: \dPermanent^n^n");
	else
		len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y8. \wDuration: \w%s^n^n",STR_Menu_Ban_Duration[id]);
	if (End!=Menu_Ban_Total[id])
	{
		len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y9. \wNext^n");
		Keys |= MENU_KEY_9;
	}
	len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y0. \w%s^n",Start?"Back":"Exit");
	show_menu(id,Keys,func_Buffer,-1,"Ban Menu");
	return PLUGIN_HANDLED
}

public CmdUNBANMENU(id,level,cid)
{
	if (!cmd_access(id,level,cid,1,false))
		return PLUGIN_HANDLED
	Menu_Unban_pos[id] = 0;
	Menu_Unban_Display(id,Menu_Unban_pos[id]);
	return PLUGIN_HANDLED
}

public Menu_Unban_Keys(id,key)
{
	switch (key)
	{
		case 9:	
		{
			if (Menu_Unban_pos[id])
				Menu_Unban_Display(id,--Menu_Unban_pos[id])
			else
				Menu_Unban_pos[id] = 0;
			return PLUGIN_HANDLED
		}
		case 8: Menu_Unban_Display(id,++Menu_Unban_pos[id]);
		default:
		{
			if(Menu_Unban_Time[id]<LastBanTime<=get_gametime())
			{
				client_print(id,print_chat,"[UltimateBans] Sorry, but the BanList was Updated since Last Time. Please Try Again.");
				Menu_Unban_pos[id] = 0;
				Menu_Unban_Display(id,Menu_Unban_pos[id]);
				return PLUGIN_HANDLED
			}
			static DATA[BanInfo];
			handle_unban_menu_call[id] = true;
			ArrayGetArray(banlist_array,TotalBans-1-Menu_Unban_pos[id]*6-key,DATA);
			if (equali(DATA[bantype],"STEAMID",7))
				client_cmd(id,"amx_unban ^"%s^" ^"STEAMID^"",DATA[target_authid]);
			else if (equali(DATA[bantype],"IP",2))
				client_cmd(id,"amx_unban ^"%s^" ^"IP^"",DATA[target_ip]);
			else if (equali(DATA[bantype],"NAME",4))
				client_cmd(id,"amx_unban ^"%s^" ^"NAME^"",DATA[target_name]);
		}
	}
	return PLUGIN_HANDLED
}

Menu_Unban_Display(id,pos)
{
	if (!TotalBans)
	{
		client_print(id,print_chat,"[UltimateBans] No Ban Entries found in the Server");
		return PLUGIN_HANDLED
	}
	static Keys,len,Start,End,temp_pos,func_Buffer[512],DATA[BanInfo];
	temp_pos=0,Keys=MENU_KEY_0;
	Start = TotalBans-1-pos*6;
	if (Start<0)
		return PLUGIN_HANDLED
	if (0<=Start<=5)	
		End = 0;
	else
		End = Start-5;
	len = formatex(func_Buffer,charsmax(func_Buffer),"\yUnban Menu:^n^n\yNote: \wFor More Information about the^n         Banned Player, Type in Console:^n         \yamx_queryban \w<target> \r<type>^n^n");
	for (new i=Start;i>=End;i--)
	{
		ArrayGetArray(banlist_array,i,DATA);
		temp_pos++;
		if (equali(DATA[target_name],"<null>"))
		{
			if (equali(DATA[bantype],"STEAMID",7))
				len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i.^t\w%s^t\r[STEAMID]^n",temp_pos,DATA[target_authid]);
			else
				len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i.^t\w%s^t\r[IP]^n",temp_pos,DATA[target_ip]);
		}
		else
		{
			if (equali(DATA[bantype],"STEAMID",7))
				len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i.^t\w%s^t\r[STEAMID]^t\d( %s )^n",temp_pos,DATA[target_authid],DATA[target_name]);
			else if (equali(DATA[bantype],"IP",2))
				len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i.^t\w%s^t\r[IP]^t\d( %s )^n",temp_pos,DATA[target_ip],DATA[target_name]);
			else
				len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i.^t\w%s^t\r[NAME]^n",temp_pos,DATA[target_name]);
		}
		Keys |= (1<<temp_pos-1);
	}
	len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n");
	if (End>0)
	{
		len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y9. \wNext^n");
		Keys |= MENU_KEY_9;
	}
	len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y0. \w%s^n",(Start==TotalBans-1)?"Exit":"Back");
	show_menu(id,Keys,func_Buffer,-1,"Unban Menu");
	Menu_Unban_Time[id] = get_gametime();
	return PLUGIN_HANDLED
}

public CmdVOTEMENU(id)
{
	if (!get_pcvar_num(cvar_vote_enable))
	{
		client_print(id,print_chat,"[UltimateBans] Voteban Menu feature has been disabled by Server");
		return PLUGIN_HANDLED
	}
	Menu_Ban_pos[id] = 0;
	Menu_Vote_Display(id,Menu_Ban_pos[id]);
	return PLUGIN_HANDLED
}

public Menu_Vote_Keys(id,key)
{
	switch (key)
	{
		case 9:	
		{
			if (Menu_Ban_pos[id])
				Menu_Vote_Display(id,--Menu_Ban_pos[id])
			else
				Menu_Ban_pos[id] = 0;
			return PLUGIN_HANDLED
		}
		case 8: Menu_Vote_Display(id,++Menu_Ban_pos[id]);
		default:
		{
			static ids,Float:duration,Req_Votes_Percent,szName[2][64],func_buffer[128];
			if (get_gametime()-LastVoted[id]<get_pcvar_float(cvar_vote_delay))
			{
				client_print(id,print_chat,"[UltimateBans] Wait for Sometime before using Voteban again");
				return PLUGIN_HANDLED
			}
			ids = Menu_Ban_Players[id][Menu_Ban_pos[id]*6+key];
			if(!is_user_connected(ids))
			{
				client_print(id,print_chat,"[UltimateBans] Sorry, but the Player has already Disconnected from the Server");
				Menu_Ban_pos[id] = 0;
				Menu_Vote_Display(id,Menu_Ban_pos[id]);
				return PLUGIN_HANDLED
			}
			if (Votes_Players[id][ids])
			{
				client_print(id,print_chat,"[UltimateBans] You have already voted against this Player");
				Menu_Vote_Display(id,Menu_Ban_pos[id]);	
				return PLUGIN_HANDLED
			}
			Votes_Players[id][ids] = 1;	
			get_user_name(id,szName[0],charsmax(szName[]));
			get_user_name(ids,szName[1],charsmax(szName[]));
			formatex(func_buffer,charsmax(func_buffer),"^x01[UltimateBans]^x03 %s^x04 has Voted to Ban^x03 %s",szName[0],szName[1]);
			get_players(player,total);
			for(new i=0;i<total;i++)
			{	
				message_begin(MSG_ONE,msgid,{0,0,0},player[i]);
				write_byte(player[i]);
				write_string(func_buffer);
				message_end();
			}
			LastVoted[id] = get_gametime();
			Req_Votes_Percent = floatround(floatmul(get_pcvar_float(cvar_vote_ratio),100.0))-eval_votes(ids);
			if (Req_Votes_Percent<=0)
			{
				duration = get_pcvar_float(cvar_vote_time);
				if (duration<0.0)
					server_cmd("amx_ban #%d ^"60.0^" ^"Banned by VOTE^" ^"AUTO^"",get_user_userid(ids));
				else if (duration==0.0||duration>9999999.0)
					server_cmd("amx_ban #%d ^"0.0^" ^"Banned by VOTE^" ^"AUTO^"",get_user_userid(ids));
				else
					server_cmd("amx_ban #%d ^"%f^" ^"Banned by VOTE^" ^"AUTO^"",get_user_userid(ids),duration);
			}
			else
				client_print(id,print_chat,"[UltimateBans] %i more Vote(s) are required to BAN %s",floatround(floatmul(float(Req_Votes_Percent)/100.0,float(total)),floatround_ceil),szName[1]);
			Menu_Vote_Display(id,Menu_Ban_pos[id]);
		}
	}
	return PLUGIN_HANDLED
}

Menu_Vote_Display(id,pos)
{
	static Keys,len,Start,End,temp_pos,Name[64],bool:is_flagged,func_Buffer[512];
	temp_pos=0,Keys=MENU_KEY_0;
	get_players(Menu_Ban_Players[id],Menu_Ban_Total[id]);
	if (Menu_Ban_Total[id]<get_pcvar_num(cvar_vote_min))
	{
		client_print(id,print_chat,"[UltimateBans] Too Less Players for Voteban Process");
		return PLUGIN_HANDLED
	}
	Start = pos*8;
	if (Start>Menu_Ban_Total[id])
		return PLUGIN_HANDLED
	if (Start<0)
		Start=0;
	End = Start+8;
	if (End>Menu_Ban_Total[id])
		End=Menu_Ban_Total[id];
	get_pcvar_string (cvar_Flags,Flags,charsmax(Flags));
	strtolower(Flags);
	is_flagged = false;
	len = formatex(func_Buffer,charsmax(func_Buffer),"\yVoteban Menu:^n^n");
	for (new i=Start;i<End;i++)
	{
		ids = Menu_Ban_Players[id][i];
		temp_pos++;
		get_user_name(ids,Name,charsmax(Name));
		if (id==ids)
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \d%s^t\y(\rSelf\y)^n",temp_pos,Name);
			continue;
		}
		for (new j=0;j<strlen(Flags);j++)
			if ((isalpha(Flags[j]))&&(get_user_flags(ids) & power(2,(Flags[j]-97))))
			{
				is_flagged = true;
				break;
			}
		if (is_flagged)
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \d%s^t\y(\rFlagged\y)^n",temp_pos,Name);
			is_flagged = false;
		}
		else
		{
			len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y%i. \w%s^t\y(\r%i%%\y)^n",temp_pos,Name,eval_votes(ids));
			Keys |= (1<<temp_pos-1);
		}
	}
	len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"^n");
	if (End!=Menu_Ban_Total[id])
	{
		len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y9. \wNext^n");
		Keys |= MENU_KEY_9;
	}
	len += formatex(func_Buffer[len],charsmax(func_Buffer)-len,"\y0. \w%s^n",Start?"Back":"Exit");
	show_menu(id,Keys,func_Buffer,-1,"Voteban Menu");
	return PLUGIN_HANDLED
}

public bad_input(id)
{
	if (id)
		client_cmd(id,"echo [UltimateBans] Bad Input");
	else
		server_print("[UltimateBans] Bad Input");
}

public JoinKick(Timeleft[],id)
{
	if (!equali(Timeleft,"<null>"))
		server_cmd("kick #%d ^"You are BANNED from this Server. Timeleft: %s. Check your Console for More Information.^"",get_user_userid(id),Timeleft);
	else
		server_cmd("kick #%d ^"You are Permanently BANNED from this Server. Check your Console for More Information.^"",get_user_userid(id));
}

get_monthdays (months,years=0)
{
	switch(months)
	{
		case 1:		return 31;
		case 2:		return ((years%4)?28:29);
		case 3:		return 31;
		case 4:		return 30;
		case 5:		return 31;
		case 6:		return 30;
		case 7:		return 31;
		case 8:		return 31;
		case 9:		return 30;
		case 10:	return 31;
		case 11:	return 30;
		case 12:	return 31;
	}
	return 30;
}

CheckBan (const input[],const input_type[])
{
	static DATA[BanInfo],pos,Found,bool:tmp;
	tmp=true,Found=0;
	for (new i=0;i<TotalBans;i++)
	{
		ArrayGetArray(banlist_array,i,DATA);
		if (!equali(DATA[bantype],input_type))
			continue;
		if (equali(input_type,"STEAMID",7))
		{	
			if (equali(DATA[target_authid],input))
			{
				if (MODE_LOADBAN)
					Found++;
				else
					return i;
			}
		}
		else if (equali(input_type,"IP",2))
		{
			if (MODE_LOADBAN)
			{
				if (equal(DATA[target_ip],input))
					Found++;
			}
			else if (MODE_UNBAN)
			{
				if (equal(DATA[target_ip],input))
					return i;
			}		
			else
			{
				if (CheckIP(DATA[target_ip],input))
				{
					if (MODE_ADDBAN)
						return i;
					else
						Found++;
				}
			}
		}
		else if (equali(input_type,"NAME",4))
		{
			if (MODE_LOADBAN)
			{
				if (equal(DATA[target_name],input))
					Found++;
			}			
			else if (MODE_UNBAN)
			{
				if (equal(DATA[target_name],input))
					return i;
			}
			else
			{
				if (equali(DATA[target_name],input,strlen(DATA[target_name])))
				{
					if (MODE_ADDBAN)
						return i;
					else
						Found++;
				}
			}
		}
		if ((Found==1)&&(tmp))
		{
			pos = i;
			tmp = false;
		}
		if (Found>1)
			return -1;
	}
	if (Found==1)
		return pos;
	return -2;
}

CheckIP (const param1[],const param2[])
{
	if (equal(param1,param2))
		return 1;
	static Range[16],IP[16],p1[3],p2[3],p3[3],p4[3],r1[3],r2[3],r3[3],r4[3];
	copy(Range,charsmax(Range),param1);
	copy(IP,charsmax(IP),param2);
	replace_all(Range,charsmax(Range),"."," ");
	replace_all(IP,charsmax(IP),"."," ");
	parse(Range,r1,charsmax(r1),r2,charsmax(r2),r3,charsmax(r3),r4,charsmax(r4));
	parse(IP,p1,charsmax(p1),p2,charsmax(p2),p3,charsmax(p3),p4,charsmax(p4));
	if (!str_to_num(r4))
	{
		if (equal(p1,r1)&&equal(p2,r2)&&equal(p3,r3))
			return 2;
		if (!str_to_num(r3))
		{
			if (equal(p1,r1)&&equal(p2,r2))
				return 2;
			if (!str_to_num(r2))
				if (equal(p1,r1))
					return 2;
		}
	}
	return 0;
}

get_ban_timeleft (const raw_input[],output[]="<null>",len2=-1)
{
	static NUM_NOW_hours,input[32],NUM_NOW_minutes,NUM_NOW_seconds,NUM_NOW_days,NUM_NOW_months,NUM_NOW_years,NOW_totalminutes,NUM_UNBAN_hours,NUM_UNBAN_minutes,NUM_UNBAN_seconds,NUM_UNBAN_days,NUM_UNBAN_months,NUM_UNBAN_years;
	static STR_NOW_hours[5],STR_NOW_minutes[5],STR_NOW_seconds[5],STR_NOW_days[5],STR_NOW_months[5],STR_NOW_years[7],STR_UNBAN_hours[5],STR_UNBAN_minutes[5],STR_UNBAN_seconds[5],STR_UNBAN_days[5],STR_UNBAN_months[5],STR_UNBAN_years[7];
	static UNBAN_totalminutes,days_left,hours_left,minutes_left,seconds_left,REM_totalminutes,len;			
	copy(input,charsmax(input),raw_input);
	replace_all(input,charsmax(input),":"," ");
	replace_all(input,charsmax(input),"/"," ");
	format_time(STR_NOW_hours,charsmax(STR_NOW_hours),"%H");
	format_time(STR_NOW_minutes,charsmax(STR_NOW_minutes),"%M");
	format_time(STR_NOW_seconds,charsmax(STR_NOW_seconds),"%S");
	format_time(STR_NOW_days,charsmax(STR_NOW_days),"%d");
	format_time(STR_NOW_months,charsmax(STR_NOW_months),"%m");
	format_time(STR_NOW_years,charsmax(STR_NOW_years),"%Y");
	NUM_NOW_hours = str_to_num(STR_NOW_hours);
	NUM_NOW_minutes = str_to_num(STR_NOW_minutes);
	NUM_NOW_seconds = str_to_num(STR_NOW_seconds);
	NUM_NOW_days = str_to_num(STR_NOW_days);
	NUM_NOW_months = str_to_num(STR_NOW_months);
	NUM_NOW_years = str_to_num(STR_NOW_years);
	parse(input,STR_UNBAN_hours,charsmax(STR_UNBAN_hours),STR_UNBAN_minutes,charsmax(STR_UNBAN_minutes),STR_UNBAN_seconds,charsmax(STR_UNBAN_seconds),STR_UNBAN_days,charsmax(STR_UNBAN_days),STR_UNBAN_months,charsmax(STR_UNBAN_months),STR_UNBAN_years,charsmax(STR_UNBAN_years));
	NUM_UNBAN_hours = str_to_num(STR_UNBAN_hours);
	NUM_UNBAN_minutes = str_to_num(STR_UNBAN_minutes);
	NUM_UNBAN_seconds = str_to_num(STR_UNBAN_seconds);
	NUM_UNBAN_days = str_to_num(STR_UNBAN_days);
	NUM_UNBAN_months = str_to_num(STR_UNBAN_months);
	NUM_UNBAN_years = str_to_num(STR_UNBAN_years);
	if (NUM_UNBAN_years<NUM_NOW_years
	||NUM_UNBAN_years==NUM_NOW_years&&NUM_UNBAN_months<NUM_NOW_months
	||NUM_UNBAN_years==NUM_NOW_years&&NUM_UNBAN_months==NUM_NOW_months&&NUM_UNBAN_days<NUM_NOW_days
	||NUM_UNBAN_years==NUM_NOW_years&&NUM_UNBAN_months==NUM_NOW_months&&NUM_UNBAN_days==NUM_NOW_days&&NUM_UNBAN_hours<NUM_NOW_hours
	||NUM_UNBAN_years==NUM_NOW_years&&NUM_UNBAN_months==NUM_NOW_months&&NUM_UNBAN_days==NUM_NOW_days&&NUM_UNBAN_hours==NUM_NOW_hours&&NUM_UNBAN_minutes<NUM_NOW_minutes
	||NUM_UNBAN_years==NUM_NOW_years&&NUM_UNBAN_months==NUM_NOW_months&&NUM_UNBAN_days==NUM_NOW_days&&NUM_UNBAN_hours==NUM_NOW_hours&&NUM_UNBAN_minutes==NUM_NOW_minutes&&NUM_UNBAN_seconds<=NUM_NOW_seconds)
		return 0;
	if (len2==-1)
		return 1;
	for (new z=0;z<=len2;z++)
		output[z] = 0;
	if (NUM_NOW_months==1||NUM_NOW_months==2)
	{
		NUM_NOW_months += 12;
		NUM_NOW_years--;
	}
	if (NUM_UNBAN_months==1||NUM_UNBAN_months==2)
	{
		NUM_UNBAN_months += 12;
		NUM_UNBAN_years--;
	}
	days_left	=(floatround(365.0*NUM_UNBAN_years,floatround_floor)-floatround(365.0*NUM_NOW_years,floatround_floor))
			+(floatround(NUM_UNBAN_years/4.0,floatround_floor)-floatround(NUM_NOW_years/4.0,floatround_floor))
			-(floatround(NUM_UNBAN_years/100.0,floatround_floor)-floatround(NUM_NOW_years/100.0,floatround_floor))
			+(floatround(NUM_UNBAN_years/400.0,floatround_floor)-floatround(NUM_NOW_years/400.0,floatround_floor))
			+(NUM_UNBAN_days-NUM_NOW_days)
			+(floatround(((153.0*NUM_UNBAN_months)+8.0)/5.0,floatround_floor)-floatround(((153.0*NUM_NOW_months)+8.0)/5.0,floatround_floor));
	NOW_totalminutes = (60*NUM_NOW_hours)+NUM_NOW_minutes;
	UNBAN_totalminutes = (60*NUM_UNBAN_hours)+NUM_UNBAN_minutes;
	if (UNBAN_totalminutes>=NOW_totalminutes)
		REM_totalminutes = UNBAN_totalminutes-NOW_totalminutes;
	else
	{
		REM_totalminutes = 1440-(NOW_totalminutes-UNBAN_totalminutes);
		days_left--;
	}
	hours_left = REM_totalminutes/60;
	minutes_left = REM_totalminutes-(hours_left*60);
	if (NUM_UNBAN_seconds-NUM_NOW_seconds>0)
		seconds_left = NUM_UNBAN_seconds-NUM_NOW_seconds;
	else
	{
		seconds_left = 60-(NUM_NOW_seconds-NUM_UNBAN_seconds);
		if (minutes_left)
			minutes_left--;
		else
		{
			minutes_left = 59;
			if (hours_left)
				hours_left--;
			else
			{
				hours_left = 23;
				days_left--;
			}
		}
	}
	len = 0;
	if (days_left)
		len += formatex(output[len],len2-len,"%d Day(s) ",days_left);
	if (hours_left)
		len += formatex(output[len],len2-len,"%i Hour(s) ",hours_left);
	if (minutes_left)
		len += formatex(output[len],len2-len,"%i Minute(s) ",minutes_left);
	if (seconds_left)
		len += formatex(output[len],len2-len,"%i Second(s)",seconds_left);	
	return 1;
}

public ChatPrint(const message[])
{
	get_players(player,total);
	for(new i=0;i<total;i++)
	{
		ids = player[i];
		message_begin(MSG_ONE,msgid,{0,0,0},ids);
		write_byte(ids);
		write_string(message);
		message_end();
	}
}

public DelayedLog(const message[])
	log_to_file("addons/amxmodx/logs/UB_Logs.log",message);

PrintBanInfo(DATA[],id=0,Timeleft[]="<null>")
{
	if (id)
	{	
		client_cmd(id,"echo [UltimateBans] BanType - %s",DATA[bantype]);
		if (!equali(DATA[target_authid],"<null>",6))
			client_cmd(id,"echo [UltimateBans] TargetID - %s",DATA[target_authid]);
		if (!equali(DATA[target_ip],"<null>",6))
			client_cmd(id,"echo [UltimateBans] TargetIP - %s",DATA[target_ip]);
		if (!equali(DATA[target_name],"<null>",6))
			client_cmd(id,"echo [UltimateBans] TargetName - %s",DATA[target_name]);
		client_cmd(id,"echo [UltimateBans] BanTime - %s",DATA[bantime]);
		if (!equali(DATA[unbantime],"<null>",6))
			client_cmd(id,"echo [UltimateBans] UnbanTime - %s",DATA[unbantime]);
		else
			client_cmd(id,"echo [UltimateBans] UnbanTime - Never ( Permanent Ban )");
		if (!equali(Timeleft,"<null>",6))
			client_cmd(id,"echo [UltimateBans] Timeleft - %s",Timeleft);
		if (!equali(DATA[banner_name],"<null>",6))
		{
			if (!equali(DATA[banner_name],"RCON/Server",11))
			{
				client_cmd(id,"echo [UltimateBans] BannerID - %s",DATA[banner_authid]);
				client_cmd(id,"echo [UltimateBans] BannerIP - %s",DATA[banner_ip]);
			}
			client_cmd(id,"echo [UltimateBans] BannerName - %s",DATA[banner_name]);
		}
		if (!equali(DATA[reason],"<null>",6))
			client_cmd(id,"echo [UltimateBans] Reason - %s",DATA[reason]);
		client_cmd(id,"echo [UltimateBans] -------------------------------");
	}
	else
	{
		server_print("[UltimateBans] BanType - %s",DATA[bantype]);
		if (!equali(DATA[target_authid],"<null>",6))
			server_print("[UltimateBans] TargetID - %s",DATA[target_authid]);
		if (!equali(DATA[target_ip],"<null>",6))
			server_print("[UltimateBans] TargetIP - %s",DATA[target_ip]);
		if (!equali(DATA[target_name],"<null>",6))
			server_print("[UltimateBans] TargetName - %s",DATA[target_name]);
		server_print("[UltimateBans] BanTime - %s",DATA[bantime]);
		if (!equali(DATA[unbantime],"<null>",6))
			server_print("[UltimateBans] UnbanTime - %s",DATA[unbantime]);
		if (!equali(DATA[banner_name],"<null>",6))
		{
			if (!equali(DATA[banner_name],"RCON/Server",11))
			{
				server_print("[UltimateBans] BannerID - %s",DATA[banner_authid]);
				server_print("[UltimateBans] BannerIP - %s",DATA[banner_ip]);
			}
			server_print("[UltimateBans] BannerName - %s",DATA[banner_name]);
		}
		if (!equali(DATA[reason],"<null>",6))
			server_print("[UltimateBans] Reason - %s",DATA[reason]);
		server_print("[UltimateBans] -------------------------------");
	}
}

public Menu_SetDuration(id)
{
	static len,dot,count_digits,seconds,minutes,hours,days,ARG_Menu_Duration[128];
	len=0,dot=0,count_digits=1,minutes=0,seconds=0,hours=0,days=0;
	read_args(ARG_Menu_Duration,charsmax(ARG_Menu_Duration));
	remove_quotes(ARG_Menu_Duration);
	trim(ARG_Menu_Duration);
	if (!strlen(ARG_Menu_Duration))
	{
		Menu_Ban_Display(id,Menu_Ban_pos[id]);
		return PLUGIN_HANDLED
	}
	if (!isdigit(ARG_Menu_Duration[0]))
	{
		client_print(id,print_chat,"[UltimateBans] Bad Input");
		Menu_Ban_Display(id,Menu_Ban_pos[id]);
		return PLUGIN_HANDLED
	}
	for (new i=1;i<strlen(ARG_Menu_Duration);i++)
	{
		if (ARG_Menu_Duration[i]=='.')
		{
			if (++dot>1)
			{
				client_print(id,print_chat,"[UltimateBans] Bad Input");
				Menu_Ban_Display(id,Menu_Ban_pos[id]);
				return PLUGIN_HANDLED
			}
		}
		else if (!isdigit(ARG_Menu_Duration[i]))
		{
			client_print(id,print_chat,"[UltimateBans] Bad Input");
			Menu_Ban_Display(id,Menu_Ban_pos[id]);
			return PLUGIN_HANDLED
		}
		else if (!dot)
			count_digits++;
	}
	if (count_digits>8)
	{
		Menu_Ban_Duration[id] = 0.0;
		copy(STR_Menu_Ban_Duration[id],127,"Permanent");
		return PLUGIN_HANDLED		
	}
	else
		Menu_Ban_Duration[id] = str_to_float(ARG_Menu_Duration);
	minutes = floatround(Menu_Ban_Duration[id],floatround_floor);
	seconds = floatround(floatfract(Menu_Ban_Duration[id])*60,floatround_floor);
	while(minutes>=60)
	{
		minutes -= 60;
		hours++;
	}
	while(hours>=24)
	{
		hours -= 24;
		days++;
	}
	if (Menu_Ban_Duration[id])
	{
		if (days)
			len += formatex(STR_Menu_Ban_Duration[id][len],127-len,"%d Day(s) ",days);
		if (hours)
			len += formatex(STR_Menu_Ban_Duration[id][len],127-len,"%i Hour(s) ",hours);
		if (minutes)
			len += formatex(STR_Menu_Ban_Duration[id][len],127-len,"%i Minute(s) ",minutes);
		if (seconds)
			len += formatex(STR_Menu_Ban_Duration[id][len],127-len,"%i Second(s)",seconds);
	}
	else
	{
		Menu_Ban_Duration[id] = 0.0;
		copy(STR_Menu_Ban_Duration[id],127,"Permanent");
	}
	Menu_Ban_Display(id,Menu_Ban_pos[id]);
	return PLUGIN_HANDLED
}

public Menu_SetReason(id)
{
	static ARG_Menu_Reason[128],AuthID[32];
	ids = Menu_Ban_Target[id];
	if(!is_user_connected(ids))
	{
		client_print(id,print_chat,"[UltimateBans] Sorry, but the Player has already Disconnected from the Server");
		Menu_Ban_Display(id,Menu_Ban_pos[id]);
		return PLUGIN_HANDLED
	}	
	read_args(ARG_Menu_Reason,charsmax(ARG_Menu_Reason));
	remove_quotes(ARG_Menu_Reason);
	trim(ARG_Menu_Reason);
	handle_ban_menu_call[id] = true;
	switch (Menu_Ban_BanType[id])
	{
		case 0: client_cmd(id,"amx_ban #%i ^"%f^" ^"%s^" ^"AUTO^"",get_user_userid(ids),Menu_Ban_Duration[id],ARG_Menu_Reason);
		case 1: 
		{
			get_user_authid(ids,AuthID,charsmax(AuthID));
			if (IsValidAUTHID(AuthID))
				client_cmd(id,"amx_ban #%i ^"%f^" ^"%s^" ^"STEAMID^"",get_user_userid(ids),Menu_Ban_Duration[id],ARG_Menu_Reason);
			else
			{
				client_print(id,print_chat,"[UltimateBans] AuthID Not Valid for Banning");
				handle_ban_menu_call[id] = false;
				Menu_Ban_Display(id,Menu_Ban_pos[id]);
				return PLUGIN_HANDLED
			}
		}	
		case 2: client_cmd(id,"amx_ban #%i ^"%f^" ^"%s^" ^"IP^"",get_user_userid(ids),Menu_Ban_Duration[id],ARG_Menu_Reason);
		case 3: client_cmd(id,"amx_ban #%i ^"%f^" ^"%s^" ^"NAME^"",get_user_userid(ids),Menu_Ban_Duration[id],ARG_Menu_Reason);
	}
	Menu_Ban_Reset(id);
	Menu_Ban_Display(id,Menu_Ban_pos[id]);
	return PLUGIN_HANDLED
}

public Menu_Ban_Reset(id)
{
	Menu_Ban_pos[id] = 0;
	Menu_Ban_Duration[id] = 0.0;
	for (new i=0;i<128;i++)
		STR_Menu_Ban_Duration[id][i]=0;
	Menu_Ban_BanType[id] = 0;
}

stock eval_votes(ids)
{
	new id,tmp_count;
	get_players(player,total);
	for (new i=0;i<total;i++)
	{
		id = player[i];
		if (Votes_Players[id][ids])
			tmp_count++;
	}
	return floatround(floatmul(float(tmp_count)/float(total),100.0));
}
p.s. I guess it is enough to correct the lines: 165, 781, 1777, 1779 ?!
iveto69 is offline
bigdaddy424
Senior Member
Join Date: Oct 2021
Location: Jupiter
Old 01-21-2023 , 15:51   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #2

so you want the suspect to have an access flag until he disconnects like nothing happened and later reconnect to realize he's been banned?
__________________
bigdaddy424 is online now
iveto69
Member
Join Date: Aug 2018
Old 01-21-2023 , 16:31   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #3

Quote:
Originally Posted by bigdaddy424 View Post
so you want the suspect to have an access flag until he disconnects like nothing happened and later reconnect to realize he's been banned?
I want to thank you for your review.
No! No! No!
I wish, if possible, that - from the moment of the ban until its expiration - the player can log into the server but always receive the designated VIP flag. This, however, will not be informed. For this, I think that it will be enough to change only the lines of the code that I indicated?! BUT I don't know how, I don't understand this programming language, or very little...
I apologize for my bad English!
p.s. My idea is not to prohibit entry of hackers with extras in the server, but to "compensate them with the appropriate extras". Thus, we consider both sides, we with the servers, do not lose players, and the hackers - get the "necessary compensation". I think you know what I'm talking about :-) !?

Last edited by iveto69; 01-21-2023 at 16:37.
iveto69 is offline
bigdaddy424
Senior Member
Join Date: Oct 2021
Location: Jupiter
Old 01-21-2023 , 17:31   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #4

theres a lot of code cleanup that has to be done on ultimatebans
wouldnt be worth making another one since this wouldnt be that hard
__________________
bigdaddy424 is online now
bigdaddy424
Senior Member
Join Date: Oct 2021
Location: Jupiter
Old 01-21-2023 , 17:57   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #5

Test Example

Code:
#include <amxmodx> #include <amxmisc> #include <sqlx> #define MYSQL_HOST "" #define MYSQL_USER "" #define MYSQL_PASSWORD "" #define MYSQL_DATABASE "" #define MYSQL_TABLE "" new Handle:MYSQL_CONNECTION; public plugin_init(){     register_plugin("Fake Ban", __DATE__, "big");     register_clcmd("amx_fakeban", "cmd_fakeban", ADMIN_LEVEL_A); } public plugin_cfg()     MYSQL_Init(); public MYSQL_Init(){     MYSQL_CONNECTION = SQL_MakeDbTuple(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);     new query[256];     formatex(query, charsmax(query), "CREATE TABLE IF NOT EXISTS `%s` (\         `id` INT(4) NOT NULL AUTO_INCREMENT,\         `steamid` VARCHAR(32) NOT NULL,\         `name` VARCHAR(32) NOT NULL,\         PRIMARY KEY (`id`),\         UNIQUE (`steamid`));", MYSQL_TABLE);     SQL_ThreadQuery(MYSQL_CONNECTION, "IgnoredOutput", query); } public client_putinserver(id){     new steamid[32], data[2], query[128];     data[0] = id; data[1] = 0;     get_user_authid(id, steamid, charsmax(steamid));     formatex(query, charsmax(query), "SELECT * FROM `%s` WHERE BINARY `steamid` = '%s';", MYSQL_TABLE, steamid)     SQL_ThreadQuery(MYSQL_CONNECTION, "DataOutput", query, data, sizeof(data)); } public cmd_fakeban(id, level, cid){     if (!cmd_access(id, level, cid, 0))         return PLUGIN_HANDLED;         new arg[32];     read_argv(1, arg, charsmax(arg));     if (!arg[0]){         console_print(id, "Please provide a name");     } else {         new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS);         if (player){             new steamid[32], query[128];             get_user_authid(player, steamid, charsmax(steamid));             formatex(query, charsmax(query), "INSERT INTO `%s` VALUES(NULL, '%s', '%n');", MYSQL_TABLE, steamid, player);             SQL_ThreadQuery(MYSQL_CONNECTION, "IgnoredOutput", query);             console_print(id, "Player %n added to the unliked player list", player);         } else {             console_print(id, "Can't find %s sorry", arg);         }     }     return PLUGIN_HANDLED; } public DataOutput(failState, Handle:query, error[], errNum, data[]){     new id = data[0];     if(is_user_connected(id)){         if(SQL_NumResults(query)){             client_print(0, print_chat, "Flagged player joined");             new steamid[32], query[128];             get_user_authid(id, steamid, charsmax(steamid));             formatex(query, charsmax(query), "UPDATE `%s` SET `name` = '%n' WHERE `steamid` = '%s';", MYSQL_TABLE, steamid);             SQL_ThreadQuery(MYSQL_CONNECTION, "IgnoredOutput", query);         }     } } public IgnoredOutput(failState, Handle:query, const error[], errNum)     if(errNum) server_print(error);
__________________

Last edited by bigdaddy424; 01-21-2023 at 17:59. Reason: fix name updating every connect
bigdaddy424 is online now
iveto69
Member
Join Date: Aug 2018
Old 01-21-2023 , 18:35   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #6

Hmmm, I think you're right! Maybe my request is very difficult or impossible! I just don't know if you fully understood me exactly what I wanted. My goal is not to ban players with a hack from entering the server in any way! I wanted to impose penalties on them for a certain time, in case of a registered hack. And by placing a flag - I can give them not only extras, but also other things, such as reduced damage, some HP...etc.
And I decided to use the Ultimate Ban code in the hope that it would be easily revised!?
For this purpose, can the notifications and "kicking" of the players be removed in the Ultimate Ban, and only the "database" remain. Please write a plugin, that reads the information about the banned players (from the log file with the directory: addons\amxmodx\data\UB_Banlist.txt and when someone from this list enters - to "award with VIP flags?" The plugin should check IP and Steam_ID, and if one of the two matches - to activate!
MAYBE this is a solution? What do you think?

i can use ban system without web part, sorry for your work, and hope this helps someone else

Last edited by iveto69; 01-21-2023 at 19:04.
iveto69 is offline
iveto69
Member
Join Date: Aug 2018
Old 01-21-2023 , 18:51   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #7

Similar code to the one I wrote about in the last comment:

Code:
#include <amxmodx>

#if AMXX_VERSION_NUM < 183
	#include <colorchat>
#endif

#define	PLUGIN	"Top Awards"
#define	VERSION	"1.0"
#define	AUTHOR	"Dom1no_[KZ]"

/* Настройки */
#define IGNORE_FLAGS (ADMIN_IMMUNITY)
	//	Игнорируемые флаги
	//	Закоментируйте если не требуется

#define	STATS_SYSTEM 0 // Система записи статистики
	//	0 - CSX
	//	1 - CsStats MySQL by SKAJIbnEJIb
	//	2 - CsStatsX SQL by serfreeman1337

#define MAX_AWARDS 256
	// Максимальная количество наград

const Float: TIME = 6.0;
	// Задержка в секундах перед проверкой игрока

enum _:DATA {
	FLAGS[32],
	MSG[128]
};
new g_arrAwardData[MAX_AWARDS][DATA], g_iDataSize = 1;
#if	STATS_SYSTEM == 0
	#include <csx>
	#define	get_player_stats get_user_stats
#endif
#if	STATS_SYSTEM == 1
	#include <csstats_mysql>
#endif
#if	STATS_SYSTEM == 2
	#include <csstatsx_sql>
	#define	get_player_stats get_user_stats_sql
#endif

public plugin_init(){
	register_plugin(PLUGIN, VERSION, AUTHOR);
}

public plugin_cfg(){
	new szPath[64];
	get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
	add(szPath, charsmax(szPath), "/top_awards.ini");

	new iFile = fopen(szPath, "rt");
	if(!iFile){
		new szError[96];
		formatex(szError, charsmax(szError), "File '%s' not found OR incorrect CHMOD!", szPath);
		set_fail_state(szError);
	}

	new szBuffer[MAX_AWARDS];
	while(!feof(iFile)){
		fgets(iFile, szBuffer, charsmax(szBuffer));
		trim(szBuffer);

		if(!szBuffer[0] || szBuffer[0] == ';')
			continue;

		if(parse(szBuffer, 
			g_arrAwardData[g_iDataSize][FLAGS], charsmax(g_arrAwardData[][FLAGS]),
			g_arrAwardData[g_iDataSize][MSG], charsmax(g_arrAwardData[][MSG])
		) == 2)	g_iDataSize++;
	}
	fclose(iFile);
}

public client_putinserver(id){
	set_task(TIME, "client_give_awards", id);
}

public client_give_awards(id){
	new g_iAccess, szName[32];
	g_iAccess = get_user_flags(id);
	get_user_name(id, szName, charsmax(szName));

	if(!is_user_connected(id)){
		return;
	}
	#if defined IGNORE_FLAGS
		if(g_iAccess & IGNORE_FLAGS){
			return;
		}
	#endif

	#if	STATS_SYSTEM == 0 || STATS_SYSTEM == 2
		new szStats[8];
		new iRank = get_player_stats(id, szStats, szStats);
	#else
		new szStats[22];
		new iRank = csstats_get_user_stats(id, szStats);
	#endif

	if(iRank <= g_iDataSize){
		set_user_flags(id, g_iAccess | read_flags(g_arrAwardData[iRank][FLAGS]));

		replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!n", "^1");
		replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!t", "^3");
		replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!g", "^4");
		replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "%name%", szName);

		client_print_color(id, print_team_default, "%s", g_arrAwardData[iRank][MSG]);
	}
}
This code fetches player information from file: top_awards.ini with directory: /cstrike/addons/amxmodx/configs/top_awards.ini , and gives the appropriate player flag from that file while on the server!
iveto69 is offline
bigdaddy424
Senior Member
Join Date: Oct 2021
Location: Jupiter
Old 01-22-2023 , 13:32   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #8

is there reason why you want to use ultimatebans specifically
what access flag do you want to give to players?
__________________
bigdaddy424 is online now
iveto69
Member
Join Date: Aug 2018
Old 01-23-2023 , 01:56   Re: Instead of a ban, add "VIP flag" to the hacker?!
Reply With Quote #9

First, I want to apologize for the late reply, but I was at work . This ban system bans both IP and Steam_Id. In the specified directory are stored: name, IP and Steam_id - as well as the time until the ban expires (which I think does not concern us). The goal is to have a plugin that monitors incoming players - and if there is a match by IP or steam_id - to "give" them a flag while they are in the server!? And the ban system itself has the function - only to remember the hacker with his data until the ban expires!? That is, as long as a player has a ban - every time he enters, he will be "recognized" and automatically receive his flag, including "compensatory" penalties, which I will add in a separate plugin !!! The flag should be any one of the following: n,o,p,q,r,s,t!
...about the ban system: I just don't have the sma-code for another better ban system and can't suggest one, but I think this one will do a great job for me too! It is enough to change the code only to the extent that it only remembers the hackers until their ban expires and the additional plugin for giving a flag - can use the necessary information!

Last edited by iveto69; 01-23-2023 at 02:06.
iveto69 is offline
Reply



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

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

Forum Jump


All times are GMT -4. The time now is 21:46.


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