админов кикает обычных игроков нет.. хз чё делать..
пока пользуюсь этим 100% рабочим вариантом
Код:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#pragma tabsize 0
#define PLUGIN "AntiAfk"
#define AUTHOR "pic"
#define VERSION "1.3"
#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3
new Float:g_oldang[33][3], g_oldpos[33][3], g_afktime[33], bool:player_spawned[33]
new maxplayers, afkmaxplayers, afkbombdrop_time, warning_time, maxafk_time, afkbombtransfer, aimmunity, kick, check_frequency, bool:freezetime
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
check_frequency = register_cvar("afk_frequency", "1.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "40") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "15") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "1") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "1") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "15") // Время простоя, при котором покажет таймер простаивающему игроку
maxplayers = get_maxplayers()
afkmaxplayers = maxplayers - get_cvar_num("amx_reservation")
RegisterHam(Ham_Spawn, "player", "player_spawn")
register_logevent("round_start_event", 2, "1=Round_Start")
if(!get_pcvar_num(afkbombdrop_time) || get_pcvar_num(afkbombdrop_time) >= get_pcvar_num(maxafk_time))
set_pcvar_num(afkbombdrop_time, get_pcvar_num(maxafk_time) - 1)
if(get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")
set_task(get_pcvar_float(check_frequency), "checkPlayers", TASKID, _, _, "b")
}
public round_start_event()
freezetime = false
public event_new_round()
freezetime = true
public player_spawn(id)
{
if(task_exists(id))
remove_task(id)
player_spawned[id] = false
if(is_user_bot(id) || is_user_hltv(id))
return
set_task(MAXFLY, "playerSpawned", id)
}
public playerSpawned(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
return
pev(id, pev_v_angle, g_oldang[id])
get_user_origin(id, g_oldpos[id])
player_spawned[id] = true
}
public checkPlayers()
{
static Float:newang[3]
static newpos[3]
static i, players[32], num, player
get_players(players, num, "ach")
if(freezetime || num < 2)
return
for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && player_spawned[player])
{
pev(player, pev_v_angle, newang)
get_user_origin(player, newpos)
if(abs(floatround(newang[0])-floatround(g_oldang[player][0]))>MAXANG
|| abs(floatround(newang[1])-floatround(g_oldang[player][1]))>MAXANG)
{
g_oldang[player][0] = newang[0]
g_oldang[player][1] = newang[1]
g_afktime[player] = 0
continue
}
if(abs(newpos[0]-g_oldpos[player][0])>MAXPOS
|| abs(newpos[1]-g_oldpos[player][1])>MAXPOS
|| newpos[2] != g_oldpos[player][2])
{
g_oldpos[player][0] = newpos[0]
g_oldpos[player][1] = newpos[1]
g_oldpos[player][2] = newpos[2]
g_afktime[player] = 0
continue
}
g_afktime[player] += get_pcvar_num(check_frequency)
check_afktime(player)
}
}
}
public check_afktime(id)
{
new afktimetmp = get_pcvar_num(maxafk_time), afktimeleft, kickorspect
static punishname[40]
afktimeleft = afktimetmp - g_afktime[id]
if(get_pcvar_num(afkbombdrop_time) == g_afktime[id])
transfer_bomb(id)
if (afktimeleft <= get_pcvar_num(warning_time))
{
if((get_pcvar_num(kick) || get_playersnum() >= afkmaxplayers ) && checkimmunity(id))
{
kickorspect = 1
punishname = "кикнуты"
}
else
{
kickorspect = 0
punishname = "перенесены в зрители"
}
if(afktimeleft > 0)
{
set_hudmessage(0, 255, 0, -1.0, -0.9, 0, get_pcvar_float(check_frequency), get_pcvar_float(check_frequency)-0.1, 0.0, 0.0, -1)
show_hudmessage(id, "Вы будете %s за простой, через %d сек.", punishname, afktimeleft)
}
}
if(is_user_connected(id) && g_afktime[id] >= afktimetmp)
{
if(kickorspect == 1)
punish_player(id, PUNISH_AFK_KICK)
else
{
punish_player(id, PUNISH_AFK_SPECTATOR)
player_spawned[id] = false
g_afktime[id] = 0
}
}
}
public transfer_bomb(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return
if(!is_user_connected(id) || !is_user_alive(id) || !(pev(id, pev_weapons) & (1 << CSW_C4)))
return
new i, players[32], num, player
get_players(players, num, "ache", "TERRORIST")
if(num < 2)
return
if(get_pcvar_num(afkbombtransfer) == 0)
{
engclient_cmd(id, "drop", "weapon_c4")
return
}
new g_carrier[3], g_recipient[3], recipient, distance, mindistance = 999999
get_user_origin(id, g_carrier)
for (i = 0; i < num; i++)
{
player = players[i]
if(!is_user_connected(player) || player == id)
continue
get_user_origin(player, g_recipient)
distance = get_distance(g_carrier, g_recipient)
if(distance < mindistance)
{
mindistance = distance
recipient = player
}
}
if(!recipient)
return
engclient_cmd(id, "drop", "weapon_c4")
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
if(pev_valid(c4))
{
new backpack = pev(c4, pev_owner)
if(backpack > maxplayers)
{
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)
}
}
}
public client_putinserver(id)
{
player_spawned[id] = false
g_afktime[id] = 0
if(task_exists(id + 100))
remove_task(id + 100)
if(is_user_bot(id) || is_user_hltv(id))
return
set_task(get_pcvar_float(maxafk_time),"check_unassigned", id + 100)
if(get_playersnum() < afkmaxplayers)
return
static i, players[32], num, player
get_players(players, num, "ch")
for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && id != player && cs_get_user_team(player) == CS_TEAM_SPECTATOR && checkimmunity(player))
{
punish_player(player, PUNISH_SPECTATOR)
break
}
}
}
public check_unassigned(id)
{
new player = id - 100
if(is_user_connected(player) && cs_get_user_team(player) == CS_TEAM_UNASSIGNED)
client_cmd(player, "jointeam 6")
}
public checkimmunity(id)
{
if(get_pcvar_num(aimmunity)==0)
return true
else
if(get_user_flags(id) & AFK_IMMUNITY)
return false
return true
}
public plugin_end()
remove_task(TASKID)
stock punish_player(id, punishtype)
{
if(!is_user_connected(id))
return
static name[32]
get_user_name(id, name, 31)
switch(punishtype)
{
case PUNISH_SPECTATOR:
{
server_cmd("kick #%d ^"Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
server_cmd("kick #%d ^"Вы были кикнуты за простой^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
if (is_user_alive(id))
{
user_kill(id, 1)
cs_set_user_deaths(id, (cs_get_user_deaths(id)-1))
}
cs_set_user_team(id, CS_TEAM_SPECTATOR)
}
}
}