Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Подредактировать Afk-кикер, чтобы админов и випов не кикал

Статус пользователя Izmayl7
сообщение 7.8.2017, 8:43
Сообщение #1
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

Всем привет. Подскажите, какие строки изменить, поменять в исходнике, чтобы админов и випов с флагом S, афк-кикер не кикал. В исходнике в строке register_event("ResetHUD", "playerSpawned", "be") стоит be, меняю как мне надо, но всё равно после заданного времени, происходит кик.
Исходник
Код
#include <amxmodx>
#include <colorchat>

#define MIN_AFK_TIME 30        // I use this incase stupid admins accidentally set mp_afktime to something silly.
#define WARNING_TIME 15        // Start warning the user this many seconds before they are about to be kicked.
#define CHECK_FREQ 5        // This is also the warning message frequency.

new g_oldangles[33][3]
new g_afktime[33]
new bool:g_spawned[33] = {true, ...}

public plugin_init() {
    register_plugin("AFK Kicker","1.0b","Cheesy Peteza")
    register_cvar("afk_version", "1.0b", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY)

    register_cvar("mp_afktime", "60")    // Kick people AFK longer than this time
    register_cvar("mp_afkminplayers", "1")    // Only kick AFKs when there is atleast this many players on the server
    set_task(float(CHECK_FREQ),"checkPlayers",_,_,_,"b")
    register_event("ResetHUD", "playerSpawned", "be")
}

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) {
            new newangle[3]
            get_user_origin(i, newangle)

            if ( newangle[0] == g_oldangles[0] && newangle[1] == g_oldangles[1] && newangle[2] == g_oldangles[2] ) {
                g_afktime += CHECK_FREQ
                check_afktime(i)
            } else {
                g_oldangles[0] = newangle[0]
                g_oldangles[1] = newangle[1]
                g_oldangles[2] = newangle[2]
                g_afktime = 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]
            ColorChat(id,GREEN,"^1[^4AFK Kicker^1] Если вы не начнёте ^4двигаться ^1через ^3%i^1 секунд, то вы будете ^4кикнуты.", timeleft)
        } else if (g_afktime[id] > maxafktime) {
            new name[32]
            get_user_name(id, name, 31)
            ColorChat(id,GREEN,"^1[^4AFK Kicker^1] ^4%s^x01 кикнут за то что не двигался ^3%i^1 секунд.", name, maxafktime)
            log_amx("%s was kicked for being AFK longer than %i seconds", name, maxafktime)
            server_cmd("kick #%d ^"Вы были кикнуты за то что не двигались %i секунд.^"", get_user_userid(id), maxafktime)
        }
    }
}

public client_connect(id) {
    g_afktime[id] = 0
    return PLUGIN_HANDLED
}

public client_putinserver(id) {
    g_afktime[id] = 0
    return PLUGIN_HANDLED
}

public playerSpawned(id) {
    g_spawned[id] = false
    new sid[1]
    sid[0] = id
    set_task(0.75, "delayedSpawn",_, sid, 1)    // Give the player time to drop to the floor when spawning
    return PLUGIN_HANDLED
}

public delayedSpawn(sid[]) {
    get_user_origin(sid[0], g_oldangles[sid[0]])
    g_spawned[sid[0]] = true
    return PLUGIN_HANDLED
}
stock client_printcolor(const id, const input[], any:...)
{
        new iCount = 1, iPlayers[32]
        static szMsg[191]

        vformat(szMsg, charsmax(szMsg), input, 3)
        replace_all(szMsg, 190, "/g", "^4")
        replace_all(szMsg, 190, "/y", "^1")
        replace_all(szMsg, 190, "/ctr", "^1")
        replace_all(szMsg, 190, "/w", "^0")

        if(id) iPlayers[0] = id
        else get_players(iPlayers, iCount, "ch")
        for (new i = 0; i < iCount; i++)
        {
                if(is_user_connected(iPlayers))
                {
                        message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers)
                        write_byte(iPlayers)
                        write_string(szMsg)
                        message_end()
                }
        }
}
Или в этом
исходнике
Код
// ********************************************************************************
*****//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
// Официальная тема поддержки: https://neugomon.ru/threads/34/                          //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// ********************************************************************************
*****//

/*
    Original code: Freedo.m
*/

#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define ACCESS_LEVEL_IMMUNITY (ADMIN_MENU|ADMIN_LEVEL_H)
    // Уровень доступа позволяющий беспрепятственно сидеть в зрителях

#define TIME_AFK_CHECK 15.0     
    // Интервал между проверками игроков, чем меньше значение, тем больше нагрузка на сервер.
    // В режиме NOROUND (для CSDM) ставьте маленькое значение TIME_AFK_CHECK, так как таймер обнуляется при спавне.

#define MAX_AFK_WARNING 3     // Количество предупреждений после которых последует наказание.
#define TIME_SPECT_CHECK 60.0     // Интервал между проверками зрителей, чем меньше значение, тем больше нагрузка на сервер.
#define MAX_SPECT_CHECK_PL 2     // Количество проверок игрока на нахождение в зрителях, после которых его кикнет
#define MIN_PLAYERS_CHECK 30     // Минимальное количество игроков, когда включается функция проверки зрителей.
// #define NOROUND        // Включает поддержку серверов с бесконечным раундом. Например CSDM, GunGame
#define BOMB_TRANSFER
    // Передавать ли бомбу игрокам, если игрок AFK.
    // Закомментируйте, если хотите, чтобы бомба просто выкидывалась
    // Игнорируется при включенном NOROUND

#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))

new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
new g_bitValid;
#if defined NOROUND
new g_bitSpec;
#endif
new g_iWarning[33];
new pnum, players[32];
new g_count[33];

public plugin_init()
{
#if defined NOROUND
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlrSpwn_Post", true);
    #define VERSION "1.4.1 [NoRnd]"
#else
    register_logevent("LeRoundStart", 2, "1=Round_Start");
    #define VERSION "1.4.1 [Rnd]"
#endif
    register_plugin("AFK Control", VERSION, "neygomon");
    set_task(TIME_SPECT_CHECK, "SpectatorCheck", .flags = "b");
}

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id) || get_user_flags(id) & ACCESS_LEVEL_IMMUNITY)
        clr_bit(g_bitValid, id);
    else    set_bit(g_bitValid, id);
    g_count[id] = 0;
#if defined NOROUND
    clr_bit(g_bitSpec, id);
#endif    
}
#if defined NOROUND
public client_disconnected(id)
    remove_task(id);

public PlrSpwn_Post(id)
    if(is_user_alive(id))
        LeRoundStart(id);
#endif    
public LeRoundStart(id)
{
#if defined NOROUND
    if(!get_bit(g_bitSpec, id))
    {
        get_entvar(id, var_origin, g_fOldOrigin[id]);
        get_entvar(id, var_angles, g_fOldAngles[id]);

        if(!task_exists(id))
            set_task(TIME_AFK_CHECK, "AfkCheck", id, .flags = "b");
        else    change_task(id, TIME_AFK_CHECK);
    }    
#else
    static freezetime;
    if(!freezetime) freezetime = get_cvar_pointer("mp_freezetime");
    if(get_pcvar_num(freezetime) > 0)
        GoCheckPlayers();
    else    set_task(1.0, "GoCheckPlayers");
#endif    
}

public GoCheckPlayers()
{
    get_players(players, pnum, "ah");
    for(new i; i < pnum; i++)
    {
        g_iWarning[players[i]] = 0;
        get_entvar(players[i], var_origin, g_fOldOrigin[players[i]]);
        get_entvar(players[i], var_angles, g_fOldAngles[players[i]]);
    }

    if(!task_exists(87892789))
        set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags = "b");
    else    change_task(87892789, TIME_AFK_CHECK);
}

public AfkCheck(id)
{
    if(id == 87892789)
        get_players(players, pnum, "ah");
    else if(!is_user_connected(id))
        return;
    else players[0] = id, pnum = 1;

    for(new i, Float:fNewOrigin[3], Float:fNewAngles[3], szName[32]; i < pnum; i++)
    {
        get_entvar(players[i], var_origin, fNewOrigin);
        get_entvar(players[i], var_angles, fNewAngles);
        
        if(!xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) || !xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
        {
            g_iWarning[players[i]] = 0;
            xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
            xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
            continue;
        }
        
        get_entvar(players[i], var_netname, szName, charsmax(szName));
        if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
        {
            user_kill(players[i], 1);
            engclient_cmd(players[i], "jointeam", "6");
            client_cmd(players[i], "spk events/friend_died");
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок ^3%s ^4был перемещен в зрители, так как был ^3AFK", szName);
        #if defined NOROUND
            set_bit(g_bitSpec, players[i]);
            remove_task(players[i]);
        #endif
        }
        else
        {
            client_cmd(players[i], "spk events/tutor_msg");
            ChatColor(players[i], 0, "^1[^4AFKControl^1] ^4Вы не проявляете активность! Предупреждения: ^3%i/%i", g_iWarning[players[i]], MAX_AFK_WARNING);
        }
#if !defined NOROUND
        if(get_entvar(players[i], var_weapons) & (1 << CSW_C4))
        {
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4У игрока ^3%s ^4отобрана бомба, так как находится ^3AFK", szName);
        #if defined BOMB_TRANSFER
            rg_transfer_c4(players[i], 0);
        #else
            engclient_cmd(players[i], "drop", "weapon_c4");
        #endif
        }
#endif    
    }    
}

public SpectatorCheck()
{
    if(get_playersnum() < MIN_PLAYERS_CHECK)
        return;

    new players[32], pnum;
    get_players(players, pnum, "h");
    for(new i, szName[32]; i < pnum; i++)
    {
        if(!get_bit(g_bitValid, players[i]))
            continue;
        
        switch(get_member(players[i], m_iTeam))
        {
            case 0, 3:
            {
                if(++g_count[players[i]] >= MAX_SPECT_CHECK_PL)
                {
                    get_entvar(players[i], var_netname, szName, charsmax(szName));
                    ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок^3 %s ^4удален за длительное нахождение в спектрах.", szName);
                    server_cmd("kick #%d Вы были кикнуты из-за длительного нахождения в зрителях.", get_user_userid(players[i]));
                }
            }    
        }    
    }
}

stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
    return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);

stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
{
    vecOut[0] = vecIn[0];
    vecOut[1] = vecIn[1];
    vecOut[2] = vecIn[2];
}

stock ChatColor(id, id2, const szMessage[], any:...)
{
    if(id && !is_user_connected(id))
        return;
        
    new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4);
    
    message_begin(id ? MSG_ONE : MSG_ALL, 76, .player = id);
    write_byte(id2 ? id2 : id);
    write_string(szMsg);
    message_end();
}
вырезать перевод в спектра, а сразу кик по истечению такого-то времени. И Админов, випов с флагом S не кикало вообще) Заранее спасибо=!)

Отредактировал: Izmayl7, - 7.8.2017, 8:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя cscms
сообщение 7.8.2017, 8:57
Сообщение #2
Стаж: 10 лет

Сообщений: 311
Благодарностей: 17
Полезность: < 0

#define ACCESS_LEVEL_IMMUNITY (ADMIN_MENU|ADMIN_LEVEL_H)
// Уровень доступа позволяющий беспрепятственно сидеть в зрителях
Замени на админ левел G
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ChesterField
сообщение 7.8.2017, 10:54
Сообщение #3


Стаж: 11 лет

Сообщений: 145
Благодарностей: 46
Полезность: 198

По таблице флагов:
#define ADMIN_LEVEL_G 262144 //Flag "s", custom
И просто заменяешь то на это.
Если самому лень, то на:
Cкрытый текст
Код:


#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define ADMIN_LEVEL_G
// Уровень доступа позволяющий беспрепятственно сидеть в зрителях

#define TIME_AFK_CHECK 15.0
// Интервал между проверками игроков, чем меньше значение, тем больше нагрузка на сервер.
// В режиме NOROUND (для CSDM) ставьте маленькое значение TIME_AFK_CHECK, так как таймер обнуляется при спавне.

#define MAX_AFK_WARNING 3 // Количество предупреждений после которых последует наказание.
#define TIME_SPECT_CHECK 60.0 // Интервал между проверками зрителей, чем меньше значение, тем больше нагрузка на сервер.
#define MAX_SPECT_CHECK_PL 2 // Количество проверок игрока на нахождение в зрителях, после которых его кикнет
#define MIN_PLAYERS_CHECK 30 // Минимальное количество игроков, когда включается функция проверки зрителей.
// #define NOROUND // Включает поддержку серверов с бесконечным раундом. Например CSDM, GunGame
#define BOMB_TRANSFER
// Передавать ли бомбу игрокам, если игрок AFK.
// Закомментируйте, если хотите, чтобы бомба просто выкидывалась
// Игнорируется при включенном NOROUND

#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))

new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
new g_bitValid;
#if defined NOROUND
new g_bitSpec;
#endif
new g_iWarning[33];
new pnum, players[32];
new g_count[33];

public plugin_init()
{
#if defined NOROUND
RegisterHookChain(RG_CBasePlayer_Spawn, "PlrSpwn_Post", true);
#define VERSION "1.4.1 [NoRnd]"
#else
register_logevent("LeRoundStart", 2, "1=Round_Start");
#define VERSION "1.4.1 [Rnd]"
#endif
register_plugin("AFK Control", VERSION, "neygomon");
set_task(TIME_SPECT_CHECK, "SpectatorCheck", .flags = "b");
}

public client_putinserver(id)
{
if(is_user_bot(id) || is_user_hltv(id) || get_user_flags(id) & ACCESS_LEVEL_IMMUNITY)
clr_bit(g_bitValid, id);
else set_bit(g_bitValid, id);
g_count[id] = 0;
#if defined NOROUND
clr_bit(g_bitSpec, id);
#endif
}
#if defined NOROUND
public client_disconnected(id)
remove_task(id);

public PlrSpwn_Post(id)
if(is_user_alive(id))
LeRoundStart(id);
#endif
public LeRoundStart(id)
{
#if defined NOROUND
if(!get_bit(g_bitSpec, id))
{
get_entvar(id, var_origin, g_fOldOrigin[id]);
get_entvar(id, var_angles, g_fOldAngles[id]);

if(!task_exists(id))
set_task(TIME_AFK_CHECK, "AfkCheck", id, .flags = "b");
else change_task(id, TIME_AFK_CHECK);
}
#else
static freezetime;
if(!freezetime) freezetime = get_cvar_pointer("mp_freezetime");
if(get_pcvar_num(freezetime) > 0)
GoCheckPlayers();
else set_task(1.0, "GoCheckPlayers");
#endif
}

public GoCheckPlayers()
{
get_players(players, pnum, "ah");
for(new i; i < pnum; i++)
{
g_iWarning[players[i]] = 0;
get_entvar(players[i], var_origin, g_fOldOrigin[players[i]]);
get_entvar(players[i], var_angles, g_fOldAngles[players[i]]);
}

if(!task_exists(87892789))
set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags = "b");
else change_task(87892789, TIME_AFK_CHECK);
}

public AfkCheck(id)
{
if(id == 87892789)
get_players(players, pnum, "ah");
else if(!is_user_connected(id))
return;
else players[0] = id, pnum = 1;

for(new i, Float:fNewOrigin[3], Float:fNewAngles[3], szName[32]; i < pnum; i++)
{
get_entvar(players[i], var_origin, fNewOrigin);
get_entvar(players[i], var_angles, fNewAngles);

if(!xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) || !xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
{
g_iWarning[players[i]] = 0;
xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
continue;
}

get_entvar(players[i], var_netname, szName, charsmax(szName));
if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
{
user_kill(players[i], 1);
engclient_cmd(players[i], "jointeam", "6");
client_cmd(players[i], "spk events/friend_died");
ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок ^3%s ^4был перемещен в зрители, так как был ^3AFK", szName);
#if defined NOROUND
set_bit(g_bitSpec, players[i]);
remove_task(players[i]);
#endif
}
else
{
client_cmd(players[i], "spk events/tutor_msg");
ChatColor(players[i], 0, "^1[^4AFKControl^1] ^4Вы не проявляете активность! Предупреждения: ^3%i/%i", g_iWarning[players[i]], MAX_AFK_WARNING);
}
#if !defined NOROUND
if(get_entvar(players[i], var_weapons) & (1 << CSW_C4))
{
ChatColor(0, players[i], "^1[^4AFKControl^1] ^4У игрока ^3%s ^4отобрана бомба, так как находится ^3AFK", szName);
#if defined BOMB_TRANSFER
rg_transfer_c4(players[i], 0);
#else
engclient_cmd(players[i], "drop", "weapon_c4");
#endif
}
#endif
}
}

public SpectatorCheck()
{
if(get_playersnum() < MIN_PLAYERS_CHECK)
return;

new players[32], pnum;
get_players(players, pnum, "h");
for(new i, szName[32]; i < pnum; i++)
{
if(!get_bit(g_bitValid, players[i]))
continue;

switch(get_member(players[i], m_iTeam))
{
case 0, 3:
{
if(++g_count[players[i]] >= MAX_SPECT_CHECK_PL)
{
get_entvar(players[i], var_netname, szName, charsmax(szName));
ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок^3 %s ^4удален за длительное нахождение в спектрах.", szName);
server_cmd("kick #%d Вы были кикнуты из-за длительного нахождения в зрителях.", get_user_userid(players[i]));
}
}
}
}
}

stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);

stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
{
vecOut[0] = vecIn[0];
vecOut[1] = vecIn[1];
vecOut[2] = vecIn[2];
}

stock ChatColor(id, id2, const szMessage[], any:...)
{
if(id && !is_user_connected(id))
return;

new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4);

message_begin(id ? MSG_ONE : MSG_ALL, 76, .player = id);
write_byte(id2 ? id2 : id);
write_string(szMsg);
message_end();
}


Отредактировал: ChesterField, - 7.8.2017, 10:56


Почему бы и нет?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Izmayl7
сообщение 7.8.2017, 11:35
Сообщение #4
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

ChesterField, спасибо=!) да вот бы еще вырезать перевод в спектра стоящего игрока афк, а сделать чтобы, его кикало по истечению такого-то времени))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя cs7RG
сообщение 7.8.2017, 19:11
Сообщение #5


Стаж: 10 лет
Город: Иваново

Сообщений: 693
Благодарностей: 139
Полезность: 79


Izmayl7, 128 строчка
заменить на
Код
engclient_cmd(players[i], "kick");


Помог ? Нажми спасибку »
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Izmayl7
сообщение 8.8.2017, 9:10
Сообщение #6
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

cs7RG, да почему-то вип-игрока или админа с флагом S кикает с сервера
исходник
Код
// ********************************************************************************
*****//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon  [ [url=http://c-s.net.ua/url?u=https%3A%2F%2Fneugomon.ru%2Fmembers%2F1%2F]https://neugomon.ru/members/1/[/url] ]                                  //
// Официальная тема поддержки: [url=http://c-s.net.ua/url?u=https%3A%2F%2Fneugomon.ru%2Fthreads%2F34%2F]https://neugomon.ru/threads/34/[/url]                          //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// ********************************************************************************
*****//

/*
    Original code: Freedo.m
*/

#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define ACCESS_LEVEL_IMMUNITY ADMIN_LEVEL_G // Уровень доступа позволяющий беспрепятственно сидеть в зрителях

#define TIME_AFK_CHECK 60.0    
    // Интервал между проверками игроков, чем меньше значение, тем больше нагрузка на сервер.
    // В режиме NOROUND (для CSDM) ставьте маленькое значение TIME_AFK_CHECK, так как таймер обнуляется при спавне.

#define MAX_AFK_WARNING 3     // Количество предупреждений после которых последует наказание.
#define MIN_PLAYERS_CHECK 30     // Минимальное количество игроков, когда включается функция проверки зрителей.
#define NOROUND        // Включает поддержку серверов с бесконечным раундом. Например CSDM, GunGame
#define BOMB_TRANSFER
    // Передавать ли бомбу игрокам, если игрок AFK.
    // Закомментируйте, если хотите, чтобы бомба просто выкидывалась
    // Игнорируется при включенном NOROUND

#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))

new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
new g_bitValid;
#if defined NOROUND
new g_bitSpec;
#endif
new g_iWarning[33];
new pnum, players[32];
new g_count[33];

public plugin_init()
{
#if defined NOROUND
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlrSpwn_Post", true);
    #define VERSION "1.4.1 [NoRnd]"
#else
    register_logevent("LeRoundStart", 2, "1=Round_Start");
    #define VERSION "1.4.1 [Rnd]"
#endif
    register_plugin("AFK Control", VERSION, "neygomon");
}

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id) || get_user_flags(id) & ACCESS_LEVEL_IMMUNITY)
        clr_bit(g_bitValid, id);
    else    set_bit(g_bitValid, id);
    g_count[id] = 0;
#if defined NOROUND
    clr_bit(g_bitSpec, id);
#endif    
}
#if defined NOROUND
public client_disconnected(id)
    remove_task(id);

public PlrSpwn_Post(id)
    if(is_user_alive(id))
        LeRoundStart(id);
#endif    
public LeRoundStart(id)
{
#if defined NOROUND
    if(!get_bit(g_bitSpec, id))
    {
        get_entvar(id, var_origin, g_fOldOrigin[id]);
        get_entvar(id, var_angles, g_fOldAngles[id]);

        if(!task_exists(id))
            set_task(TIME_AFK_CHECK, "AfkCheck", id, .flags = "b");
        else    change_task(id, TIME_AFK_CHECK);
    }    
#else
    static freezetime;
    if(!freezetime) freezetime = get_cvar_pointer("mp_freezetime");
    if(get_pcvar_num(freezetime) > 0)
        GoCheckPlayers();
    else    set_task(1.0, "GoCheckPlayers");
#endif    
}

public GoCheckPlayers()
{
    get_players(players, pnum, "ah");
    for(new i; i < pnum; i++)
    {
        g_iWarning[players[i]] = 0;
        get_entvar(players[i], var_origin, g_fOldOrigin[players[i]]);
        get_entvar(players[i], var_angles, g_fOldAngles[players[i]]);
    }

    if(!task_exists(87892789))
        set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags = "b");
    else    change_task(87892789, TIME_AFK_CHECK);
}

public AfkCheck(id)
{
    if(id == 87892789)
        get_players(players, pnum, "ah");
    else if(!is_user_connected(id))
        return;
    else players[0] = id, pnum = 1;

    for(new i, Float:fNewOrigin[3], Float:fNewAngles[3], szName[32]; i < pnum; i++)
    {
        get_entvar(players[i], var_origin, fNewOrigin);
        get_entvar(players[i], var_angles, fNewAngles);
        
        if(!xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) || !xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
        {
            g_iWarning[players[i]] = 0;
            xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
            xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
            continue;
        }
        
        get_entvar(players[i], var_netname, szName, charsmax(szName));
        if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
        {
            client_cmd(players[i], "spk events/friend_died");
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок^3 %s ^4удален за АФК", szName);
            server_cmd("kick #%d Вы были кикнуты из-за АФК", get_user_userid(players[i]));
        #if defined NOROUND
            set_bit(g_bitSpec, players[i]);
            remove_task(players[i]);
        #endif
        }
        else
        {
            client_cmd(players[i], "spk events/tutor_msg");
            ChatColor(players[i], 0, "^1[^4AFKControl^1] ^4Вы не проявляете активность! Предупреждения: ^3%i/%i", g_iWarning[players[i]], MAX_AFK_WARNING);
        }
#if !defined NOROUND
        if(get_entvar(players[i], var_weapons) & (1 << CSW_C4))
        {
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4У игрока ^3%s ^4отобрана бомба, так как находится ^3AFK", szName);
        #if defined BOMB_TRANSFER
            rg_transfer_c4(players[i], 0);
        #else
            engclient_cmd(players[i], "drop", "weapon_c4");
        #endif
        }
#endif    
    }    
}

stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
    return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);

stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
{
    vecOut[0] = vecIn[0];
    vecOut[1] = vecIn[1];
    vecOut[2] = vecIn[2];
}

stock ChatColor(id, id2, const szMessage[], any:...)
{
    if(id && !is_user_connected(id))
        return;
        
    new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4);
    
    message_begin(id ? MSG_ONE : MSG_ALL, 76, .player = id);
    write_byte(id2 ? id2 : id);
    write_string(szMsg);
    message_end();
}


Отредактировал: Izmayl7, - 8.8.2017, 9:11
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя cs7RG
сообщение 8.8.2017, 22:21
Сообщение #7


Стаж: 10 лет
Город: Иваново

Сообщений: 693
Благодарностей: 139
Полезность: 79

Izmayl7, А чем прошлый плагин не устроил?
У меня даже сервера нету пошишить затестить , понять что не так то там. В коде понимаю не все, разбираться нужно.


Помог ? Нажми спасибку »
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Izmayl7
сообщение 8.8.2017, 22:40
Сообщение #8
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

Цитата(cs7RG @ 8.8.2017, 23:21) *
Izmayl7, А чем прошлый плагин не устроил?
У меня даже сервера нету пошишить затестить , понять что не так то там. В коде понимаю не все, разбираться нужно.

в афк-кикере, в нём тоже поменял флаги, но он всё равно кикает админов и випов)) а в афк-контролe, мод сервера пушки-лазеры, когда игрок стоит афк, его сначала переводит в спектра, а из спектров игрок, потом не может зайти за команду, т.е. возродится... приходится перезаходить)))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя cs7RG
сообщение 9.8.2017, 14:01
Сообщение #9


Стаж: 10 лет
Город: Иваново

Сообщений: 693
Благодарностей: 139
Полезность: 79

Izmayl7, Напишите в skype cs-7rg помогу


Помог ? Нажми спасибку »
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Izmayl7
сообщение 9.8.2017, 15:49
Сообщение #10
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

Цитата(cs7RG @ 9.8.2017, 15:01) *
Izmayl7, Напишите в skype cs-7rg помогу
хорошо. завтра напишу тогда=!) ok.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Izmayl7
сообщение 11.8.2017, 20:21
Сообщение #11
Стаж: 10 лет

Сообщений: 831
Благодарностей: 312
Полезность: 578

afk_control
Код
// ********************************************************************************
*****//
// Плагин загружен с  www.neugomon.ru                                                   //        
// Автор: Neygomon  [ [url="http://c-s.net.ua/url?u=https%3A%2F%2Fneugomon.ru%2Fmembers%2F1%2F"]https://neugomon.ru/members/1/[/url] ]                                  //
// Официальная тема поддержки: [url="http://c-s.net.ua/url?u=https%3A%2F%2Fneugomon.ru%2Fthreads%2F34%2F"]https://neugomon.ru/threads/34/[/url]                          //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// ********************************************************************************
*****//

/*
    Original code: Freedo.m
*/

#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define ACCESS_LEVEL_IMMUNITY (ADMIN_MENU | ADMIN_LEVEL_H)
    // Уровень доступа позволяющий беспрепятственно сидеть в зрителях

#define TIME_AFK_CHECK 15.0    
    // Интервал между проверками игроков, чем меньше значение, тем больше нагрузка на сервер.
    // В режиме NOROUND (для CSDM) ставьте маленькое значение TIME_AFK_CHECK, так как таймер обнуляется при спавне.

#define MAX_AFK_WARNING 3     // Количество предупреждений после которых последует наказание.
//#define NOROUND        // Включает поддержку серверов с бесконечным раундом. Например CSDM, GunGame
#define BOMB_TRANSFER
    // Передавать ли бомбу игрокам, если игрок AFK.
    // Закомментируйте, если хотите, чтобы бомба просто выкидывалась
    // Игнорируется при включенном NOROUND

#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))
                                                                  
new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
new g_bitValid;
#if defined NOROUND
new g_bitSpec;
#endif
new g_iWarning[33];
new pnum, players[32];
new g_count[33];          

public plugin_init()
{
#if defined NOROUND
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlrSpwn_Post", true);
    #define VERSION "1.4.1 [NoRnd]"
#else                                                                      
    register_logevent("LeRoundStart", 2, "1=Round_Start");
    #define VERSION "1.4.1 [Rnd]"
#endif
    register_plugin("AFK Control", VERSION, "neygomon");
}

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id) || get_user_flags(id) & ACCESS_LEVEL_IMMUNITY)
        clr_bit(g_bitValid, id);
    else    set_bit(g_bitValid, id);
    g_count[id] = 0;
#if defined NOROUND
    clr_bit(g_bitSpec, id);
#endif    
}
#if defined NOROUND
public client_disconnected(id)
    remove_task(id);

public PlrSpwn_Post(id)
    if(is_user_alive(id))
        LeRoundStart(id);
#endif    
public LeRoundStart(id)
{
#if defined NOROUND
    if(!get_bit(g_bitSpec, id))
    {
        get_entvar(id, var_origin, g_fOldOrigin[id]);
        get_entvar(id, var_angles, g_fOldAngles[id]);

        if(!task_exists(id))
            set_task(TIME_AFK_CHECK, "AfkCheck", id, .flags = "b");
        else    change_task(id, TIME_AFK_CHECK);
    }    
#else
    static freezetime;
    if(!freezetime) freezetime = get_cvar_pointer("mp_freezetime");
    if(get_pcvar_num(freezetime) > 0)
        GoCheckPlayers();
    else    set_task(1.0, "GoCheckPlayers");
#endif    
}

public GoCheckPlayers()
{
    get_players(players, pnum, "ah");            
    for(new i; i < pnum; i++)
    {
        g_iWarning[players[i]] = 0;
        get_entvar(players[i], var_origin, g_fOldOrigin[players[i]]);
        get_entvar(players[i], var_angles, g_fOldAngles[players[i]]);
    }

    if(!task_exists(87892789))
        set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags = "b");
    else    change_task(87892789, TIME_AFK_CHECK);
}

public AfkCheck(id)
{
    if(id == 87892789)
        get_players(players, pnum, "ah");
    else if(!is_user_connected(id))
        return;
    else players[0] = id, pnum = 1;

    for(new i, Float:fNewOrigin[3], Float:fNewAngles[3], szName[32]; i < pnum; i++)
    {                                                              
        if(get_user_flags(players[i]) & ACCESS_LEVEL_IMMUNITY) return;
        
        get_entvar(players[i], var_origin, fNewOrigin);
        get_entvar(players[i], var_angles, fNewAngles);
        
        if(!xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) || !xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
        {
            g_iWarning[players[i]] = 0;
            xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
            xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
            continue;
        }
        
        get_entvar(players[i], var_netname, szName, charsmax(szName));
        if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
        {
            client_cmd(players[i], "spk events/friend_died");
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4Игрок^3 %s ^4удален за АФК", szName);
            server_cmd("kick #%d Вы были кикнуты из-за АФК", get_user_userid(players[i]));
        #if defined NOROUND
            set_bit(g_bitSpec, players[i]);
            remove_task(players[i]);
        #endif
        }
        else
        {
            client_cmd(players[i], "spk events/tutor_msg");
            ChatColor(players[i], 0, "^1[^4AFKControl^1] ^4Вы не проявляете активность! Предупреждения: ^3%i/%i", g_iWarning[players[i]], MAX_AFK_WARNING);
        }
#if !defined NOROUND
        if(get_entvar(players[i], var_weapons) & (1 << CSW_C4))
        {
            ChatColor(0, players[i], "^1[^4AFKControl^1] ^4У игрока ^3%s ^4отобрана бомба, так как находится ^3AFK", szName);
        #if defined BOMB_TRANSFER
            rg_transfer_c4(players[i], 0);
        #else
            engclient_cmd(players[i], "drop", "weapon_c4");
        #endif
        }
#endif    
    }    
}

stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
    return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);

stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
{
    vecOut[0] = vecIn[0];
    vecOut[1] = vecIn[1];
    vecOut[2] = vecIn[2];
}

stock ChatColor(id, id2, const szMessage[], any:...)
{
    if(id && !is_user_connected(id))
        return;
        
    new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4);
    
    message_begin(id ? MSG_ONE : MSG_ALL, 76, .player = id);
    write_byte(id2 ? id2 : id);
    write_string(szMsg);
    message_end();
}
Всё, делаю тему решённой)))
Всем спасибо=!) Отдельное спасибо за помощь: NoNaMe

Отредактировал: Izmayl7, - 11.8.2017, 20:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: