Код за потвърждение: Избери целия код
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <hamsandwich>
#define VERSION "2.3"
#define is_user_valid(%0) (1 <= %0 <= MaxClients)
#define set_bCantShoot(%1,%2) set_ent_data(%1, "CBasePlayer", "m_bIsDefusing", %2)
/* Settings */
#define TAG "AFK Protection" // Задаем тег
#define ICON // Закомментируйте, если хотите убрать иконку (спрайт) афк.
/* End of Settigns */
enum _:Cvars
{
EFFECTS,
MESSAGE,
TIME
}
new bool:g_IsAfk[MAX_PLAYERS + 1], Float:g_PlayerPosition[MAX_PLAYERS + 1][3], Float:g_ViewAngle[MAX_PLAYERS + 1][3];
new g_Cvar[Cvars], g_MoveTimer[MAX_PLAYERS + 1], g_Backup[MAX_PLAYERS + 1], g_iMsgScreenFade;
public plugin_init()
{
register_plugin("AFK Protection", VERSION, "rapara13/Nordic Warrior");
RegisterHam(Ham_Spawn, "player", "Player_spawns");
RegisterHam(Ham_Killed, "player", "Player_killed");
new pCvar = create_cvar("afk_effects", "3", FCVAR_NONE, "Эффекты: 0 - выкл. 1 - прозрачность игрока, 2 - затемнение экрана игроку, 3 - всё вместе", true, 0.0, true, 3.0);
bind_pcvar_num(pCvar, g_Cvar[EFFECTS]);
pCvar = create_cvar("afk_type_message", "2", FCVAR_NONE, "Тип сообщений клиенту о переходе в режим АФК: 0 - выкл. 1 - hud, 2 - DHUD, 3 - чат", true, 0.0, true, 3.0);
bind_pcvar_num(pCvar, g_Cvar[MESSAGE]);
pCvar = create_cvar("afk_time", "15", FCVAR_NONE, "Время простоя игрока до входа в режим АФК. (в секундах)", true, 1.0);
bind_pcvar_num(pCvar, g_Cvar[TIME]);
AutoExecConfig(true, "afk_protection");
g_iMsgScreenFade = get_user_msgid("ScreenFade");
set_task_ex(0.5, "afkcheck", .flags = SetTask_Repeat);
}
public plugin_natives()
{
register_native("ap_is_user_afk", "native_check_afk");
}
public afkcheck()
{
static Float:current_v_angle[3], Float:origin[3], Float:distance;
static players[MAX_PLAYERS], pnum;
get_players_ex(players, pnum, GetPlayers_ExcludeDead);
for(new i, iPlayer; i < pnum; i++)
{
iPlayer = players[i];
if(pev(iPlayer, pev_flags) & FL_INWATER)
continue;
pev(iPlayer, pev_origin, origin);
pev(iPlayer, pev_angles, current_v_angle);
distance = vector_distance(g_PlayerPosition[iPlayer], origin);
if((distance <= 1) & (g_ViewAngle[iPlayer][0] == current_v_angle[0] || g_ViewAngle[iPlayer][1] == current_v_angle[1]))
{
g_MoveTimer[iPlayer]++;
if(g_MoveTimer[iPlayer] > g_Cvar[TIME] * 2)
{
g_MoveTimer[iPlayer] = 0;
afk(iPlayer);
}
}
else
{
g_MoveTimer[iPlayer] = 0;
g_ViewAngle[iPlayer][0] = current_v_angle[0];
g_ViewAngle[iPlayer][1] = current_v_angle[1];
back(iPlayer);
}
xs_vec_copy(origin, g_PlayerPosition[iPlayer]);
}
}
afk(id)
{
if(g_IsAfk[id])
return;
fm_set_user_godmode(id, true);
set_pev(id, pev_solid, SOLID_NOT);
set_bCantShoot(id, true);
#if defined ICON
add_icon(id);
#endif
if(g_Cvar[EFFECTS] == 1 || g_Cvar[EFFECTS] == 3)
{
fm_set_rendering(id, kRenderFxNone, 255, 255, 255, kRenderTransAlpha, 120);
}
if(g_Cvar[EFFECTS] == 2 || g_Cvar[EFFECTS] == 3)
{
Screen_Fade(id, { 0, 0, 0 }, 130, ~0, ~0, 0x0004);
}
switch(g_Cvar[MESSAGE])
{
case 1:
{
set_hudmessage(0, 206, 209, -1.0, 0.1, 0, 1.0, 3.0, 0.1, 0.2, -1);
show_hudmessage(id, "[%s]^nYou went into AFK mode.", TAG);
}
case 2:
{
set_dhudmessage(0, 206, 209, -1.0, 0.1, 0, 1.0, 3.0, 0.1, 0.2);
show_dhudmessage(id, "[%s]^nYou went into AFK mode.", TAG);
}
case 3:
{
client_print_color(id, print_team_default, "^4[%s] ^1You went into ^3AFK ^4mode.", TAG);
}
}
g_IsAfk[id] = true;
}
back(id)
{
if(!g_IsAfk[id])
return;
fm_set_user_godmode(id, false);
set_pev(id, pev_solid, SOLID_SLIDEBOX);
set_bCantShoot(id, false);
#if defined ICON
remove_icon(id);
#endif
if(g_Cvar[EFFECTS] == 1 || g_Cvar[EFFECTS] == 3)
{
fm_set_rendering(id, 0, 0, 0, kRenderTransAlpha, 0);
}
if(g_Cvar[EFFECTS] == 2 || g_Cvar[EFFECTS] == 3)
{
Screen_Fade(id, { 0, 0, 0 }, 100, 1<<10, 1<<10, 0x0000);
}
switch(g_Cvar[MESSAGE])
{
case 1:
{
set_hudmessage(148, 0, 211, -1.0, 0.2, 0, 1.0, 3.0, 0.1, 0.2, -1);
show_hudmessage(id, "[%s]^nYou are out of AFK mode.", TAG);
}
case 2:
{
set_dhudmessage(148, 0, 211, -1.0, 0.2, 0, 1.0, 3.0, 0.1, 0.2);
show_dhudmessage(id, "[%s]^nYou are out of AFK mode.", TAG);
}
case 3:
{
client_print_color(id, print_team_default, "^4[%s] ^1You are out of ^3AFK ^4mode.", TAG);
}
}
g_IsAfk[id] = false;
}
public client_disconnected(id)
{
g_IsAfk[id] = false;
remove_task(id);
}
#if defined ICON
new g_Sprite;
public plugin_precache()
{
g_Sprite = precache_model("sprites/afk/afk.spr");
}
#endif
public Player_spawns(id)
{
new mapname[64];
get_mapname(mapname, charsmax(mapname));
if(equal(mapname, "35hp_", 5))
{
set_task(1.5, "Backup", id);
}
else
{
set_task(0.5, "Backup", id);
}
}
public Player_killed(id)
{
g_Backup[id] = g_MoveTimer[id];
}
public Backup(id)
{
g_MoveTimer[id] = g_Backup[id];
}
#if defined ICON
public add_icon(id)
{
new origin[3];
get_user_origin(id, origin);
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_SPRITE);
write_coord(origin[0] + 6);
write_coord(origin[1]);
write_coord(origin[2] + 53);
write_short(g_Sprite);
write_byte(5);
write_byte(120);
message_end();
set_task(2.0, "add_icon", id);
}
public remove_icon(id)
{
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_KILLPLAYERATTACHMENTS);
write_byte(id);
message_end();
remove_task(id);
}
#endif
stock Screen_Fade(const id, iColor[3], iAlpha, Duration, HoldTime, Flag)
{
message_begin(MSG_ONE, g_iMsgScreenFade, .player = id);
write_short(Duration);
write_short(HoldTime);
write_short(Flag);
write_byte(iColor[0]);
write_byte(iColor[0]);
write_byte(iColor[0]);
write_byte(iAlpha);
message_end();
}
public native_check_afk(amxx, params)
{
enum { player = 1 }
new iPlayer = get_param(player);
if(!is_user_valid(iPlayer))
abort(AMX_ERR_NATIVE, "Player out of range (id: %d)", iPlayer);
return g_IsAfk[iPlayer];
}