Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

[ ALL ][ Simple AFK System ]

Статус
В этой теме нельзя размещать новые ответы.

stasik

Дебютант
Здравствуйте!
Сегодня я решил написать простенькую систему AFK для вашего сервера!
В наличии имеется:
  • 3Д тексты AFK над головой игрока
  • Легко настраиваемые параметры (все понятно даже новичкам)
Как подключить?
  1. Открываем pawno.exe создаем новый файл. Удаляем из него все и вставляем мой код
  2. Сохраняем файл в папке filterscripts под именем afk.pwn
  3. Жмем F5 - в папке должен появиться afk.amx
  4. Открываем server.cfg и добавляем в строчку filterscripts слово afk
  5. Запускаем сервер, I vse GOOOD

Внимание!
Эта система не кикает администратора RCON, если будете тестировать фильтрскрипт - тестируйте с обычными правами!

Исходный код:

PHP:
//-------------------------------------------------------------------
// [FS] Simple AFK 1.0 filtercript by OFFREAL
// 13.04.2010
// Только для некоммерческого использования, специально для pawno.ru
//-------------------------------------------------------------------

#include <a_samp>

// --------------- Время в секундах ---------------------------------
#define MAX_AFK_TIME 60    // максимально время AFK до кика
#define FIRST_CHECK 40    // первое предупреждение
#define SECOND_CHECK 55    // второе предупреждение
#define AFK_TEXT_SET 20    // время до появления надписи AFK над головой

// --------------- Цвета --------------------------------------------
#define T_COLOR 0xFF000080    // цвет 3Д текста
#define M1_COLOR 0xFFFFFFFF // цвет текста первого предупреждения
#define M2_COLOR 0xFFFFFFFF // цвет текста второго предупреждения
#define MK_COLOR 0xFFFFFFFF // цвет текста оповещения о кике

// --------------- Прочее -------------------------------------------
#define T_DIST 20.0 // расстояние с которого видно 3Д текст

// --------------- Структура данных ---------------------------------
enum afk_info {
AFK_Time,            // время AFK
Float:AFK_Coord,    // последняя координата
AFK_Stat            // статус 3Д текста
}

// --------------- Объявление переменных ----------------------------
new PlayerAFK[MAX_PLAYERS][afk_info];    // данные AFK игроков
new AFK_Timer;        // таймер фильтрскрипта для работы функции
new Text3D:AFK_3DT[MAX_PLAYERS]; // 3Д тексты над головами игроков

// --------------- Объявление функции проверки ----------------------
forward AFKCheck();

public AFKCheck()
{
    new Float:AFKCoords[3];
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
        if(!IsPlayerConnected(i)){continue;}
        if(IsPlayerNPC(i)){continue;}

        // получаем координаты игроков
        GetPlayerPos(i,AFKCoords[0],AFKCoords[1],AFKCoords[2]);

        // если координата не изменилась
        if(AFKCoords[0] == PlayerAFK[i][AFK_Coord])
        {
            PlayerAFK[i][AFK_Time]++;
        }
        else
        {
            PlayerAFK[i][AFK_Time] = 0;
            if(PlayerAFK[i][AFK_Stat] != 0) { Delete3DTextLabel(AFK_3DT[i]); PlayerAFK[i][AFK_Stat] = 0; }
        }

        // сохраняем текущую координату до следующей проверки
        PlayerAFK[i][AFK_Coord] = AFKCoords[0];

        // показываем 3Д текст
        if(PlayerAFK[i][AFK_Time] == AFK_TEXT_SET && PlayerAFK[i][AFK_Stat] == 0)
        {
            AFK_3DT[i] = Create3DTextLabel("AFK", T_COLOR, 0.00, 0.00, 10000.0, T_DIST, 0);
            Attach3DTextLabelToPlayer(AFK_3DT[i], i, 0.0, 0.0, 1.3);
            PlayerAFK[i][AFK_Stat] = 1;
        }

        // строка ниже исключает возможность кика админа за AFK
        if(IsPlayerAdmin(i)){continue;}

        // кикаем игрока
        if(PlayerAFK[i][AFK_Time] > MAX_AFK_TIME)
        {
            SendClientMessage(i, MK_COLOR," AFK: Вы были кикнуты за состояние AFK более " #MAX_AFK_TIME " секунд");
            Kick(i);
            continue;
        }

        // первое предупреждение
        if(PlayerAFK[i][AFK_Time] == FIRST_CHECK)
        {
            SendClientMessage(i, M1_COLOR,
            " AFK: Вы будете кикнуты через " #MAX_AFK_TIME - #FIRST_CHECK " секунд если не начнте двигаться!");
            continue;
        }

        // второе предупреждение
        if(PlayerAFK[i][AFK_Time] == SECOND_CHECK)
        {
            SendClientMessage(i, M2_COLOR,
            " AFK: Вы будете кикнуты через " #MAX_AFK_TIME - #SECOND_CHECK " секунд если не начнте двигаться!");
            continue;
        }
    }
    return 1;
}

public OnFilterScriptInit()
{
    print("FS Simple AFK 1.0 by OFFREAL > Started");

    // запуск таймера для функции проверки
    AFK_Timer = SetTimer("AFKCheck",1000,1);
    return 1;
}

public OnFilterScriptExit()
{
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        Delete3DTextLabel(AFK_3DT[i]);
    }

    KillTimer(AFK_Timer);

    return 1;
}


public OnPlayerConnect(playerid)
{
    PlayerAFK[playerid][AFK_Time] = 0;
    PlayerAFK[playerid][AFK_Stat] = 0;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    PlayerAFK[playerid][AFK_Time] = 0;
    if(PlayerAFK[playerid][AFK_Stat] != 0) { Delete3DTextLabel(AFK_3DT[playerid]); PlayerAFK[playerid][AFK_Stat] = 0; }
    return 1;
}

Ну вот и все от "+" Не откажусь если помог ставь +

Автор:OFFREAL
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу