/*
 * BIG tanks to "aNNakin"
 * Big tanks to "Cheesy Peteza"
 * 2 Plugins autokick
 * Strongly Recommandate to FULLY servers
 */
 
#include <amxmodx>
#include <cstrike>
 
#define PLUGIN "Anti spec,afk"
#define VERSION "9.0"
#define AUTHOR "Prior of Sion"
 
#define ACCESS ADMIN_RESERVATION
 
#define MIN_AFK_TIME 30  
#define WARNING_TIME 15
#define CHECK_FREQ 5
 
new const g_Reason[] = "Nem foglalj plusz slotot a spectatorban.";
new const g_Teams[2][32] = { "Terrorist", "Counter-Terrorist" }
 
new toggle_plugin, toggle_mode, toggle_time, toggle_announce, toggle_evoy;
new g_Count[33],g_msgsaytext;
 
new g_oldangles[33][3]
new g_afktime[33]
new bool:g_spawned[33] = {true, ...}
 
public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_event("TeamInfo","event_teaminfo", "a");
 
	toggle_plugin = register_cvar("detectspectators", "1"); //Ezeket ne piszkald
	toggle_mode = register_cvar("detectspectators_mode", "1"); //Ezeket ne piszkald
	toggle_time = register_cvar("detectspectators_time", "60"); //Mennyi idejig maradhat a Spectatorba egy jatekos
	toggle_evoy = register_cvar("detectspectators_admins", "0"); //Adminokat kirúgja -e azaz az adminok immunisok legyenek
	toggle_announce = register_cvar("detectspectators_announe", "1");
 
	g_msgsaytext = get_user_msgid("SayText");
 
	register_cvar("afk_version", "1.0b", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY)
	register_cvar("mp_afktime", "90") //Mennyi másodpecig AFKolhat az illető	
	register_cvar("mp_afkminplayers", "8")	 //Mennyi játékos kell ahoz hogy működjön ez az AFK rendszer.
	set_task(float(CHECK_FREQ),"checkPlayers",_,_,_,"b")
	register_event("ResetHUD", "playerSpawned", "be")
}
 
public event_teaminfo()
{
	if(get_pcvar_num(toggle_plugin) != 1)
		return PLUGIN_CONTINUE;
 
	new index = read_data(1);
	new team[ 2 ];
	read_data(2, team, sizeof team - 1);
 
	if(team[0] == 'S')
	{
		if(g_Count[ index ] >= 1)
			g_Count[ index ] = 0;
 
		print(index, "[AFK Kicker] Te nem vagy admin, es mar %d masodperce AFKoltal ezert a rendszer kirugott!", get_pcvar_num( toggle_time ) );	
		set_task(1.0, "count_time", index+123, _, _, "b");
 
	} else {
		g_Count[ index ] = 0;
		remove_task( index+123 );
	}
 
	return PLUGIN_CONTINUE;
}
 
public count_time(task)
{
	new index = task - 123;
 
	if( !is_user_connected( index ))
		return 0;
	if( ( get_user_flags( index ) & ACCESS ) && get_pcvar_num( toggle_evoy ) == 0)
		return 0;
 
	g_Count[ index ]++;
 
	if( get_timer( index ) >= get_pcvar_num( toggle_time ))
	{
		switch( get_pcvar_num( toggle_mode ) )
		{
			case 1:
			{
				new i = random_num( 1, 2 );
				cs_set_user_team( index, i == 1 ? CS_TEAM_T : CS_TEAM_CT );
				print( index, "[AFK Kirugo] Te %s csapatba lettel iranyitva!", i == 1 ? g_Teams[ 0 ] : g_Teams[ 1 ] );
			}
 
			case 2: 
			{
				server_cmd( "kick #%d ^"%s^"", get_user_userid( index ), g_Reason );
				if( get_pcvar_num( toggle_announce ) == 1 )
					print(0, "[AFK Kirugo] %s teged kihuztak, mivel %d masodpercig AFK-oltal.!", get_pcvar_num( toggle_time ) );
			}
		}
 
		remove_task( index+ 123 );
		g_Count[ index ] = 0;
	}
 
	return 0;
}
 
public get_timer( index ) return g_Count[ index ];
 
public client_putinserver( id ) g_Count[ id ] = 0; 
public client_disconnect( id )
{ 
	g_Count[ id ] = 0; 
	remove_task(id+123); 
}
 
print( id, const message[], {Float,Sql,Result,_}:... )
{
	new Buffer[ 128 ],Buffer2[ 128 ];
	new players[ 32 ], index, num, i;
 
	formatex( Buffer2, sizeof Buffer2 - 1, "%s",message );
	vformat( Buffer, sizeof Buffer - 1, Buffer2, 3 );
	get_players( players, num, "ch" );
 
	if( id )
	{
		if( !is_user_connected( id ))
			return 0;
 
		message_begin( MSG_ONE, g_msgsaytext, _, id );
		write_byte( id );
		write_string( Buffer );
		message_end();
	} else {
		for( i = 0; i < num;i++ )
		{
			index = players[ i ];
			if( !is_user_connected( index )) 
				continue;
 
			message_begin( MSG_ONE, g_msgsaytext, _, index );
			write_byte( index );
			write_string( Buffer );
			message_end();
		}
	}
 
	return PLUGIN_HANDLED
}
 
 
public checkPlayers() {
	for (new i = 1; i <= get_maxplayers(); i++) {
		if (is_user_alive(i) && is_user_connected(i) && !is_user_bot(i) && !is_user_hltv(i) && g_spawned[i]) {
			new newangle[3]
			get_user_origin(i, newangle)
 
			if ( newangle[0] == g_oldangles[i][0] && newangle[1] == g_oldangles[i][1] && newangle[2] == g_oldangles[i][2] ) {
				g_afktime[i] += CHECK_FREQ
				check_afktime(i)
			} else {
				g_oldangles[i][0] = newangle[0]
				g_oldangles[i][1] = newangle[1]
				g_oldangles[i][2] = newangle[2]
				g_afktime[i] = 0
			}
		}
	}
	return PLUGIN_HANDLED
}
 
check_afktime(id) {
	new numplayers = get_playersnum()
	new minplayers = get_cvar_num("mp_afkminplayers")
 
	if (numplayers >= minplayers) {
		new maxafktime = get_cvar_num("mp_afktime")
		if (maxafktime < MIN_AFK_TIME) {
			log_amx("cvar mp_afktime %i is too low. Minimum value is %i.", maxafktime, MIN_AFK_TIME)
			maxafktime = MIN_AFK_TIME
			set_cvar_num("mp_afktime", MIN_AFK_TIME)
		}
 
		if ( maxafktime-WARNING_TIME <= g_afktime[id] < maxafktime) {
			new timeleft = maxafktime - g_afktime[id]
			client_print(id, print_chat, "[AFK Kirugo] Ha nem mozdulsz meg: %i masodpercig atleszel iranyitva,vagy pedig kirugva.", timeleft)
		} else if (g_afktime[id] > maxafktime) {
			new name[32]
			get_user_name(id, name, 31)
			client_print(0, print_chat, "[AFK Kicker] %s teged kihuztak, mivel %i masodpercig AFK-oltal!", name, maxafktime)
			log_amx("%s kirugtak mert nem mozdult meg: %i masodpercig.", name, maxafktime)
			server_cmd("kick #%d ^"[AFK Kicker] You was pulled out for being AFK longer than %i seconds!^"", get_user_userid(id), maxafktime)
		}
	}
}
 
public playerSpawned(id) {
	g_spawned[id] = false
	new sid[1]
	sid[0] = id
	set_task(0.75, "delayedSpawn",_, sid, 1)	
	return PLUGIN_HANDLED
}
 
public delayedSpawn(sid[]) {
	get_user_origin(sid[0], g_oldangles[sid[0]])
	g_spawned[sid[0]] = true
	return 1;
}