В теме 1 сообщение

Santa_Claus
Популярный продавец
Здравствуйте, взял и доработал вот - ниже.
 
Преимущества:


*Простота в использовании
*При отправке запроса, проверяется на наличие всех аргументов.
*Возможность отправлять до 8 запросов (опционально)
*Возможность открывать список запросов
*Возможность просматривать информацию о запросе/отклонить/принять прямо из списка
*При выходе админа, который отправил запрос или наказуемого - запрос автоматически удаляется

- Нам потребуется Pawn.CMD, sscanf2


Скрины: https://imgur.com/a/mCd67KF
GitHub: https://github.com/execution-lab/adminbot-include

 

Автор: execution

Доработка: Santa Claus

 

Спойлер


#define MAX_PLAYER_LISTITEM                    25             // Количество принимаемых listitem

#define    MAX_ADMIN_BOT_REQUEST                 3            // Максимальное количество принимаемых команд для запроса
#define    MAX_ADMIN_BOT_REQUEST_LENGTH        8            // Максимальная длина команды для запроса
#define    MAX_ADMIN_BOT_SUPPORT_COUNT            8            // Максимальное количество запросов
#define MIN_ADMIN_BOT_SUPPORT_COUNT            0            // Минимальное количество запросов
#define    MAX_ADMIN_BOT_PUNISH_REASON            50          // Максимальная длина причины в запросе
#define MAX_ADMIN_BOT_PUNISN_NAME_LENGTH    24            // Максимальная длина названия вида наказания
#define ADMIN_BOT_INVALID_REQUEST_ID        MAX_ADMIN_BOT_SUPPORT_COUNT + 1        // Недействительный ID запроса
#define ADMIN_BOT_HEX_COLOR                    0xFF6347FF     // Цвета сообщения админ-бота


enum // Константы ID диалогов
{
    dAbotreqinfo,
    dAbotreqmenu,
    dAbotreqlist
}

enum // Константы ошибок при проверке запроса
{
    CA_REQUEST_NOT_FOUND,
    CA_REQUEST_FOUND,
    CA_NO_PLACE_IN_REQUEST,
    CA_MISSING_ARGUMENT,
    CA_INVALID_TARGET_ID
}

enum e_ADMIN_BOT_INFO 
{
    aBot_punish_type,
    aBot_punish_time,
    aBot_punish_reason[MAX_ADMIN_BOT_PUNISH_REASON + 1],
    aBot_targetid,
    aBot_adminid,
    aBot_unix_time
} 

 

 

Спойлер

 



new
    AdminBotInfo[MAX_ADMIN_BOT_SUPPORT_COUNT][e_ADMIN_BOT_INFO], // Информация запросов
    PlayerListitem[MAX_PLAYERS][MAX_PLAYER_LISTITEM] // Хранение записанных значений
;

new
    const ADMIN_BOT_PUNISH_NAME[MAX_ADMIN_BOT_REQUEST][MAX_ADMIN_BOT_PUNISN_NAME_LENGTH + 1] = // Название всех видов наказаний
    {
        "Заглушить",
        "Посадить в админ. тюрьму",
        "Посадить в тюрьму"
    };

new
    const ADMIN_BOT_SUPPORT_COMMAND[MAX_ADMIN_BOT_REQUEST][MAX_ADMIN_BOT_REQUEST_LENGTH] = // Название команд всех видов наказаний
    {  
        "/mute", 
        "/prison", 
        "/jail"
    };

new
    const ADMIN_BOT_LEVEL_USING_CMD[MAX_ADMIN_BOT_REQUEST] =  // Уровень возможности опирировать со всеми видами наказаний
    {
        3,
        3,
        3
    };
    
new
    gADMIN_BOT_SUPPORT_TOTAL_COUNT = 0, // Переменная записывающая количество запросов
    pAdminChoseRequest[MAX_PLAYERS char] // Массив хранения ID выбранного запроса
; 

 

 

Спойлер


/*
Функция:
    ShowPlayerAdminBotRequestInfo
Аргументы:
    playerid - ID игрока, которому показываем
Вернёт:
    1 - Показан успешно
    0 - Не удалось показать
Заметки:
    Показываем информацию о запросе выбранного из списка.
*/

stock ShowPlayerAdminBotRequestInfo(playerid)
{
    if(pAdminChoseRequest{playerid} == ADMIN_BOT_INVALID_REQUEST_ID)
        return 0;

    new
        count = pAdminChoseRequest{playerid},
        string[MAX_CHATBUBBLE_LEGNTH + 1]
    ;
    
    
    format(string, sizeof string, "\n\
        {C0F08E}Запросил: {FFFFFF}%s\n\
        {ED8473}Наказать: {FFFFFF}%s\n\n\
        Тип: %s\n\
        Время: %d мин\n\
        Причина: %s\n\n\n\
        %s",
        PlayerName(AdminBotInfo[count][aBot_adminid]),
        PlayerName(AdminBotInfo[count][aBot_targetid]),
        ADMIN_BOT_PUNISH_NAME[AdminBotInfo[count][aBot_punish_type]],
        AdminBotInfo[count][aBot_punish_time],
        AdminBotInfo[count][aBot_punish_reason],
        ADMIN_BOT_LEVEL_USING_CMD[AdminBotInfo[count][aBot_punish_type]] > AdminLevel(playerid) 
        ? ("{AFAFAF}Вы не можете принять запрос") : ("{E2BE1D}Вы можете принять запрос")
    );

    return ShowPlayerDialog(
        playerid,
        dAbotreqinfo,
        DIALOG_STYLE_MSGBOX,
        !" ",
        string,
        !"Хорошо", !""
    );
}

/*
Функция:
    ShowPlayerAdminBotRequestMenu
Аргументы:
    playerid - ID игрока, которому показываем
Вернёт:
    1 - Показан успешно
    0 - Не удалось показать
Заметки:
    Показываем меню запроса из списка.
*/

stock ShowPlayerAdminBotRequestMenu(playerid)
{
    if(pAdminChoseRequest{playerid} == ADMIN_BOT_INVALID_REQUEST_ID)
        return 0;

    return ShowPlayerDialog(
        playerid,
        dAbotreqmenu,
        DIALOG_STYLE_LIST,
        PlayerName(AdminBotInfo[pAdminChoseRequest{playerid}][aBot_targetid]),
        !"{C0F08E}Наказать\n{FFFFFF}Информация\nОтклонить", 
        !"Далее", !"Выход"
    );
}

/*
Функция:
    ShowPlayerAdminBotRequestList
Аргументы:
    playerid - ID игрока, которому показываем
Вернёт:
    1 - Показан успешно
Заметки:
    Показываем весь список запросов.
*/

stock ShowPlayerAdminBotRequestList(playerid)
{
    new
        string[(4 + ((MAX_PLAYER_NAME + 1 - 2) * 2) + (- 2 + MAX_ADMIN_BOT_PUNISH_REASON) + (- 2 + MAX_ADMIN_BOT_PUNISN_NAME_LENGTH) 
        + (- 2 + 4)) * MAX_ADMIN_BOT_SUPPORT_COUNT + 46] = 
        {
            "Запросил\tДейсвтие(время)\tНаказать\tПричина\n"
        },

        count = 0
    ;

    for(new iter = 0; iter < MAX_ADMIN_BOT_SUPPORT_COUNT; iter ++)
    {
        if(IsEmptyRequestInAdminBotList(iter))
                continue;
            
        format(string, sizeof string, "%s%s\t%s(%d мин)\t%s\t%s\n",
            string,
            PlayerName(AdminBotInfo[iter][aBot_adminid]),
            ADMIN_BOT_PUNISH_NAME[AdminBotInfo[iter][aBot_punish_type]],
            AdminBotInfo[iter][aBot_punish_time],
            PlayerName(AdminBotInfo[iter][aBot_targetid]),
            AdminBotInfo[iter][aBot_punish_reason]
        );

        PlayerListitem[playerid][count++] = iter;

    }

    return ShowPlayerDialog(
        playerid,
        dAbotreqlist,
        DIALOG_STYLE_TABLIST_HEADERS,
        !"Запросы админ-боту",
        string,
        !"Далее", !""
    );
}

/*
Функция:
    GetLastRequestInAdminBot
Аргументы:
    -
Вернёт:
    Вернёт ID последнего запроса.
    Вернёт -1, если спиоск запросов пуст.
Заметки:
    Получить ID последнего добавленного запроса.
*/

stock GetLastRequestInAdminBot()
{
    new
        tmp_ = -1;
    
    if(CountRequestInAdminBotList() == MIN_ADMIN_BOT_SUPPORT_COUNT)
        return tmp_;

    for(new iter = 0; iter < MAX_ADMIN_BOT_SUPPORT_COUNT; iter ++)
    {
        if(IsEmptyRequestInAdminBotList(iter))
                continue;
        
        if((tmp_ == -1) || (tmp_ != -1 && AdminBotInfo[iter][aBot_unix_time] > AdminBotInfo[tmp_][aBot_unix_time]))
        {
            tmp_ = iter;
        }
    }
    
    return tmp_;
}

/*
Функция:
    CountRequestInAdminBotList
Аргументы:
    -
Вернёт:
    Число созданных запросов.
Заметки:
    -
*/

stock CountRequestInAdminBotList()
{
    return gADMIN_BOT_SUPPORT_TOTAL_COUNT;
}

/*
Функция:
    CheckAvailabilityInAdminBot
Аргументы:
    playerid - ID игрока, подающий запрос
    parmas[] - Массив с хранением запроса
Вернёт:
    CA_REQUEST_NOT_FOUND - Запрос не найден
    CA_REQUEST_FOUND - Запрос создан/найден
    CA_NO_PLACE_IN_REQUEST - Лист с запросами переполнен
    CA_MISSING_ARGUMENT - Указаны не все аргументы
    CA_INVALID_TARGET_ID - Наказуемый не в сети
Заметки:
    Проверяем наличие элементов запроса. 
*/

stock CheckAvailabilityInAdminBot(playerid, params[])
{
    new
        bool:IsFinedCommand = false,

        strFindPos,

        supportCommand[MAX_ADMIN_BOT_REQUEST_LENGTH + 1],
        supportTargetid,
        supportTime,
        supportReason[MAX_ADMIN_BOT_PUNISH_REASON + 1],
        supportUnixtTime = gettime(),

        string[MAX_CHATBUBBLE_LENGTH + 1]
    ;

    for(new i = 0; i < MAX_ADMIN_BOT_REQUEST; ++i)
    {
        if((strFindPos = strfind(params, ADMIN_BOT_SUPPORT_COMMAND[i], true)) != -1)
        {
            if(CountRequestInAdminBotList() >= MAX_ADMIN_BOT_SUPPORT_COUNT)
                return CA_NO_PLACE_IN_REQUEST;

            strdel(params, 0, strFindPos);

            if(sscanf(params, "s[8]uds[50]",
                supportCommand, supportTargetid, supportTime, supportReason))
                return CA_MISSING_ARGUMENT;
            
            if(supportTargetid == INVALID_PLAYER_ID)
                return CA_INVALID_TARGET_ID;
        

            for(new j = 0; j < MAX_ADMIN_BOT_SUPPORT_COUNT; j ++)
            {
                if(!IsEmptyRequestInAdminBotList(j))
                    continue;
                
                format(string, sizeof string, "[ADMIN-BOT] {FFFFFF}%s запросил %s игрока %s на %d мин, причина: %s",
                    PlayerName(playerid), 
                    ADMIN_BOT_PUNISH_NAME[i], 
                    PlayerName(supportTargetid),
                    supportTime,
                    supportReason
                );
                SendAdminMessage(ADMIN_BOT_HEX_COLOR, string);

                SendAdminMessage(ADMIN_BOT_HEX_COLOR, !"Нажмите Y для одобрения, N для отказа. (/viewreq для просмотра всех запросов)");

                SetRequestInAdminBotList(
                    j, 
                    i, 
                    supportTime, 
                    playerid, 
                    supportTargetid, 
                    supportUnixtTime, 
                    supportReason
                );

                IsFinedCommand = true;

                break;
            }
            break;
        }
    }

    return (IsFinedCommand ? CA_REQUEST_FOUND : CA_REQUEST_NOT_FOUND);
}

/*
Функция:
    RejectRequestInAdminBotList
Аргументы:
    playerid - ID игрока, отклоняющий запрос
    index - ID запроса
Вернёт:
    -
Заметки:
    Отклоняем запрос. 
*/

stock RejectRequestInAdminBotList(playerid, index)
{
    new
        string[MAX_CHATBUBBLE_LENGTH + 1];

    format(string, sizeof string, "[ADMIN-BOT] {FFFFFF}%s отклонил запрос №%d",
        PlayerName(playerid), index + 1);
    SendAdminMessage(ADMIN_BOT_HEX_COLOR, string);

    format(string, sizeof string, "(Отправитель: %s | Просьба: %s | Наказуемый: %s | Причина: %s)",
        PlayerName(AdminBotInfo[index][aBot_targetid]),
        ADMIN_BOT_PUNISH_NAME[AdminBotInfo[index][aBot_punish_type]],
        PlayerName(AdminBotInfo[index][aBot_adminid]),
        AdminBotInfo[index][aBot_punish_reason]
    );
    SendAdminMessage(ADMIN_BOT_HEX_COLOR, string);

    DeleteRequestInAdminBotList(index);
}

/*
Функция:
    ApproveRequestInAdminBotList
Аргументы:
    playerid - ID игрока, принимающий запрос
    index - ID запроса
Вернёт:
    -
Заметки:
    Принимаем запрос. 
*/

stock ApproveRequestInAdminBotList(playerid, index)
{
    new
        string[MAX_CHATBUBBLE_LENGTH + 1];

    format(string, MAX_CHATBUBBLE_LENGTH + 1, "%s %d %d %s // %s",
            ADMIN_BOT_SUPPORT_COMMAND[AdminBotInfo[index][aBot_punish_type]],
            AdminBotInfo[index][aBot_targetid],
            AdminBotInfo[index][aBot_punish_time],
            AdminBotInfo[index][aBot_punish_reason],
            PlayerName(AdminBotInfo[index][aBot_adminid])
    );
    PC_EmulateCommand(playerid, string);

    DeleteRequestInAdminBotList(index);
}

/*
Функция:
    IsEmptyRequestInAdminBotList
Аргументы:
    index - ID запроса
Вернёт:
    1 - Запрос пустой
    0 - Запрос не пустой
Заметки:
    Смотрим, пустой ли запрос. 
*/

stock IsEmptyRequestInAdminBotList(index)
{
    return ((AdminBotInfo[index][aBot_punish_reason][0] == '\0') ? (1) : (0));
}

/*
Функция:
    DeleteRequestInAdminBotList
Аргументы:
    index - ID запроса
Вернёт:
    1 - Запрос успешно удалён
    0 - Запрос не был удалён
Заметки:
    Удаляем запрос из списка. 
*/

stock DeleteRequestInAdminBotList(index)
{
    if(!IsEmptyRequestInAdminBotList(index))
    {
        AdminBotInfo[index][aBot_targetid] = INVALID_PLAYER_ID;
        AdminBotInfo[index][aBot_punish_reason][0] = '\0';

        gADMIN_BOT_SUPPORT_TOTAL_COUNT --;

        return 1;
    }
    else
    {
        return 0;
    }
}

/*
Функция:
    SetRequestInAdminBotList
Аргументы:
    index - ID запроса
    type - Тип запроса (заглушка и т.п.)
    &time - Время в минутах
    &adminid - ID админа, оставившего запрос
    &targetid - ID наказуемого
    &unix_time - Unix время на момент добавления запроса
    reason[] - Причина наказания
    size - Размер массива с причиной (по-умолчании установлен) 
Вернёт:
    -
Заметки:
    Добавляем запрос в список 
*/

stock SetRequestInAdminBotList(index, type, &time, &adminid, &targetid, &unix_time, reason[], const size = sizeof reason)
{
    AdminBotInfo[index][aBot_punish_type] = type;
    AdminBotInfo[index][aBot_punish_time] = time;

    strmid(
        AdminBotInfo[index][aBot_punish_reason],
        reason,
        0,
        MAX_ADMIN_BOT_PUNISH_REASON,
        size
    );
    
    AdminBotInfo[index][aBot_targetid] = targetid;
    AdminBotInfo[index][aBot_adminid] = adminid;
    AdminBotInfo[index][aBot_unix_time] = unix_time;

    gADMIN_BOT_SUPPORT_TOTAL_COUNT ++;
} 

 

 

 

 

Спойлер


CMD:viewreq(playerid) // Для просмотра всех запросов
{
    if(!AdminLevel(playerid)) 
        return 1; CheckAdminLevel(playerid, CMD_ADMIN_viewreq);

    if(CountRequestInAdminBotList() == MIN_ADMIN_BOT_SUPPORT_COUNT)
        return SendClientMessage(playerid, -1, !"Список запросов пуст.");

     ShowPlayerAdminBotRequestList(playerid) 

    return 1;
}

CMD:admin(playerid, params[]) // Админ-чат
{
    if(AdminLevel(playerid))
    {
        if(!(0 < strlen(params) < 90))
            return SendClientMessage(playerid, -1, !"Используйте больше 1 символа и меньше 90");

        new
            string[128];

        format(string, sizeof(string), "[A] %s [%d]: %s", PlayerName(playerid), playerid, params);
        SendAdminMessage(-1, string);

        new
            ret = CheckAvailabilityInAdminBot(playerid, params),
            retrunMessage[][] =
            {
                !"Не удалось найти элементов запросов",
                !"Запрос успешно найден и зарегистрирован",
                !"К сожалению лист с запросами переполнен.",
                !"Указаны не все аргументы. (Например: /mute (Id/Nick) (Time) (Reason)",
                !"Данного игрока нет на сервере."
            }
        ;

        SendClientMessage(playerid, -1, retrunMessage[ret]);
    }

    return 1;
}
alias:admin("a"); 

 

 

 

 

Спойлер


case dAbotreqinfo:
{
    return ShowPlayerAdminBotRequestMenu(playerid);
}

case dAbotreqmenu:
{
    if(!response)
    {
        pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID;

        return 1;
    }

    if(IsEmptyRequestInAdminBotList(pAdminChoseRequest{playerid}))
        return SendClientMessage(playerid, -1, !"Данный запрос был удалён");
    
    new
        count = pAdminChoseRequest{playerid};

    switch(listitem)
    {
        case 0:
        {
            if(ADMIN_BOT_LEVEL_USING_CMD[AdminBotInfo[count][aBot_punish_type]] > AdminLevel(playerid))
            {
                pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID;

                return SendClientMessage(playerid, -1, !"Вы неуполномочены принимать данный запрос.");
            }
            
            pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID;

            ApproveRequestInAdminBotList(playerid, count);

            return 1;
        }
        case 1:
        {
            return ShowPlayerAdminBotRequestInfo(playerid);
        }
        case 2:
        {

            if((AdminBotInfo[count][aBot_adminid] != playerid) 
            && (ADMIN_BOT_LEVEL_USING_CMD[AdminBotInfo[count][aBot_punish_type]] > AdminLevel(playerid)))
            {
                pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID;

                return SendClientMessage(playerid, -1, !"Вы неуполномочены отлонять данный запрос");
            }
            
            pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID;

            RejectRequestInAdminBotList(playerid, count);

            return 1;
        }
    }
    return 1;
}

case dAbotreqlist:
{
    if(!response)
        return 1;
    
    new
        count = PlayerListitem[playerid][listitem];

    if(IsEmptyRequestInAdminBotList(count))
    {
        SendClientMessage(playerid, -1, !"Данный запрос был удалён");
        return ShowPlayerAdminBotRequestList(playerid);
    }

    pAdminChoseRequest{playerid} = count;
    
    return ShowPlayerAdminBotRequestMenu(playerid);
} 

 

 

 

 

 

 

Спойлер


pAdminChoseRequest{playerid} = ADMIN_BOT_INVALID_REQUEST_ID; 

 

 

Спойлер


    if(CountRequestInAdminBotList() != MIN_ADMIN_BOT_SUPPORT_COUNT) // Если список запрос не пуст
    {
        for(new iter = 0; iter < MAX_ADMIN_BOT_SUPPORT_COUNT; iter ++) // Перебираем все запросы
        {
            if(AdminBotInfo[iter][aBot_adminid] != playerid && AdminBotInfo[iter][aBot_targetid] != playerid) // Если ID игрока не равен админу, который запросил и наказуемого - пропускаем
                continue;
            
            DeleteRequestInAdminBotList(iter); // Удаляем запрос
        }
    } 

 

 

 

 

 

Спойлер


if(newkeys & KEY_NO)
{
    if(CountRequestInAdminBotList() != MIN_ADMIN_BOT_SUPPORT_COUNT)
    {
        if(AdminLevel(playerid))
        {
            new
                iter = GetLastRequestInAdminBot();

            if(iter != -1)
            {
                if(ADMIN_BOT_LEVEL_USING_CMD[AdminBotInfo[iter][aBot_punish_type]] > AdminLevel(playerid))
                {
                    SendClientMessage(playerid, -1, !"Малый уровень администрирования для отказа.");

                    return 1;
                }
                
                RejectRequestInAdminBotList(playerid, iter);

                return 1;
            }
        }
    }
}

if(newkeys & KEY_YES)
{
    if(CountRequestInAdminBotList() != MIN_ADMIN_BOT_SUPPORT_COUNT)
    {
        if(AdminLevel(playerid))
        {
            new
                iter = GetLastRequestInAdminBot();

            if(iter != -1)
            {    
                if(ADMIN_BOT_LEVEL_USING_CMD[AdminBotInfo[iter][aBot_punish_type]] > AdminLevel(playerid))
                {
                    SendClientMessage(playerid, -1, !"Малый уровень администрирования для принятия.");

                    return 1;
                }
                
                ApproveRequestInAdminBotList(playerid, iter);
            }
        }
    }
} 

 

 

 

 

Заменяемые под себя функции / макросы

  SendAdminMessage (открыть спойлер)

В начало мода или ко всем итераторам



new 
    Iterator:Connect_Admin<MAX_PLAYERS>; // Итератор , где будем хранить всех администраторов 

 

При добавлении/заходе администратора



if(!Iter_Contains(Connect_Admin, /*админ*/)) Iter_Add(Connect_Admin, /*админ*/); 

 

 
При выходе/снятии администратора


if(Iter_Contains(Connect_Admin, /*админ*/)) Iter_Remove(Connect_Admin, /*админ*/); 

 

 

 

Сток для отправки сообщения администраторам



stock SendAdminMessage(color, const string[])
{
    foreach(new i : Connect_Admin)
    {
        SendClientMessage(i, color, string);
    }
    return 1;
} 

 

 

  Макросы (открыть спойлер)

Макросы




#define PlayerName(%0)                 /*Массив с хранением имени игрока*/
#define AdminLevel(%0)                /*Массив с хранением админ-уровня*/ 

 

 

 

 

 

Изменение:

*Добавлена возможность подключить как include.

*Мы оптимизировали админ-бота.

*Убраны лишние строки.

 

Все вопросы задавать в личку.

Отредактировано пользователем DEST

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • patrickk
      От patrickk
      Всем привет, решил написать dm сервер и довольно хорошим получился, даже на голову выше Goat dm. Оставил не решенную проблему тем что  у меня есть 4 локации с rp run и cj run ну а как добавить cj бег на те локации не знаю и как эта система работает. Надеюсь мне помогут знающие люди
    • Samolet
      От Samolet
      Здраствуйте, cоздаю копию Arizona на ОМП, опен мультиплеер, загрузил и подключил бд, но сервер не хочет вот лог :[2026-10-20T21:03:32+0300] [Info] Log file reloaded. Starting open.mp server (1.5.8.3079) from commit c6759bd8d265171ae3d86598895a23d5a8d92a3b Loading component $CAPI.so Successfully loaded component C-API (1.5.8.3079) with UID 10467dd8d4c56fc6 Loading component LegacyConfig.so Successfully loaded component LegacyConfig (1.5.8.3079) with UID 24ef6216838f9ffc Loading component NPCs.so Successfully loaded component NPCs (1.5.8.3079) with UID 3d0e59e87f4e90bc Loading component Recordings.so Successfully loaded component Recordings (1.5.8.3079) with UID 871144d399f5f613 Loading component Checkpoints.so Successfully loaded component Checkpoints (1.5.8.3079) with UID 44a937350d611dde Loading component TextDraws.so Successfully loaded component TextDraws (1.5.8.3079) with UID 9b5dc2b1d15c992a Loading component Pawn.so Successfully loaded component Pawn (1.5.8.3079) with UID 78906cd9f19c36a6 Loading component GangZones.so Successfully loaded component GangZones (1.5.8.3079) with UID b3351d11ee8d8056 Loading component Actors.so Successfully loaded component Actors (1.5.8.3079) with UID c81ca021eae2ad5c Loading component Pickups.so Successfully loaded component Pickups (1.5.8.3079) with UID cf304faa363dd971 Loading component Dialogs.so Successfully loaded component Dialogs (1.5.8.3079) with UID 44a111350d611dde Loading component Objects.so Successfully loaded component Objects (1.5.8.3079) with UID 59f8415f72da6160 Loading component Console.so Successfully loaded component Console (1.5.8.3079) with UID bfa24e49d0c95ee4 Loading component TextLabels.so Successfully loaded component TextLabels (1.5.8.3079) with UID a0c57ea80a009742 Loading component Variables.so Successfully loaded component Variables (1.5.8.3079) with UID 75e121848bc01fa2 Loading component Databases.so Successfully loaded component Databases (1.5.8.3079) with UID 80092e7eb5821a96 Loading component LegacyNetwork.so Successfully loaded component RakNetLegacyNetwork (1.5.8.3079) with UID ea9799fd79cf8442 Loading component CustomModels.so Successfully loaded component CustomModels (1.5.8.3079) with UID 15e3cb1e7c77ffff Loading component Menus.so Successfully loaded component Menus (1.5.8.3079) with UID 621e219eb97ee0b2 Loading component Vehicles.so Successfully loaded component Vehicles (1.5.8.3079) with UID 3f1f62ee9e22ab19 Loading component Classes.so Successfully loaded component Classes (1.5.8.3079) with UID 8cfb3183976da208 Loading component Timers.so Successfully loaded component Timers (1.5.8.3079) with UID 2ad8124c5ea257a3 Loaded 22 component(s) from /home/gs113492/components Executing Server Config... [2026-10-20T21:03:33+0300] [Info] Loading plugin: crashdetect.so [2026-10-20T21:03:33+0300] [Info] CrashDetect plugin 4.19 [2026-10-20T21:03:33+0300] [Info] Loading plugin: mapandreas.so [2026-10-20T21:03:33+0300] [Info] Loading plugin: streamer.so [2026-10-20T21:03:33+0300] [Info] *** Streamer Plugin v2.9.4 by Incognito loaded *** [2026-10-20T21:03:33+0300] [Info] Loading plugin: sscanf.so [2026-10-20T21:03:33+0300] [Info] [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] sscanf plugin loaded. [2026-10-20T21:03:33+0300] [Info] Version: 2.8.3 [2026-10-20T21:03:33+0300] [Info] (c) 2018 Alex "Y_Less" Cole [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] Loading plugin: TOTP.so [2026-10-20T21:03:33+0300] [Info] TOTP plugin v1.0.1 by Games loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: mysql_static.so [2026-10-20T21:03:33+0300] [Info] >> plugin.mysql: R39-6 successfully loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: libpawn_json.so [2026-10-20T21:03:34+0300] [Error] Function not registered: YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_RegAlias [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Reset [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_RegHandler [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Delete [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_New [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_IgnoreBits [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_Init [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendRPC [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendPacket [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_WriteValue [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ReadValue [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Info] Legacy Network started on ***.**.**.***:2717. Помогите пожалуйста