Ищу плагин 2 бота в спектрах

l0vecwk

Новичок
Сообщения
109
Реакции
-4
Ищу плагин 2 бота в спектрах, при 30 человек боты выходят, и когда падает меньше 30 то заходят обратно
 
@l0vecwk,
Код:
#include <amxmodx>
#include <fakemeta>
#include <amxmisc>

#define BOTS_TASKID_DELAY1            683246            // Уникальный ID для таска (первый бот)
#define BOTS_TASKID_DELAY2            683247            // Уникальный ID для таска (второй бот)

// Bots Data
enum _:e_BotsData
{
    BOTS_ACTIVE_1,        // Активность первого бота
    BOTS_ACTIVE_2,        // Активность второго бота
    BOTS_BLOBALID[33]    // Глобальный ID ботов
};

// Message IDs vars
new g_msgTeamInfo;

// Data
new g_iBotsData[e_BotsData], g_BotsName[2][32], g_Bot_Maxplayers[2];

// Cvars
new Float:g_fCvars_Time_Delay_Start, Float:g_fCvars_Time_Delay_Disconnect;

//Offsets
#define m_iTeam                    114
#define CBASEMONSTER_LINUX_XTRA_OFF    5

/*===============================================================================================================================================
                                                                    [Plugin Init]
================================================================================================================================================*/
public plugin_init()
{
    register_plugin("Spectator Bots", "2.1", "SISA");

    // Message IDs
    g_msgTeamInfo = get_user_msgid("TeamInfo");
}

/*===============================================================================================================================================
                                                                     [Plugin Cfg]
================================================================================================================================================*/
public plugin_cfg()
{
    // Задаем переменные
    new cfgdir[64], szServerIP[32], iData[6];

    // Получаем путь к папке с Конфигами
    get_configsdir(cfgdir, charsmax(cfgdir));

    // Название первого Бота
    iData[0] = register_cvar("specbots_name1", "Server IP: ");

    // Название второго Бота
    iData[1] = register_cvar("specbots_name2", "Site:");

    // Задержка на добавление бота после смены карты
    iData[2] = register_cvar("specbots_time_delay_start", "2.0");

    // Задержка на добавление бота при дисконнекте Игрока
    iData[3] = register_cvar("specbots_time_delay_disconnect", "3.0");

    // Максимальное количество игроков, при котором первый бот выйдет с сервера
    iData[4] = register_cvar("specbots_maxplayers1", "6");

    // Максимальное количество игроков, при котором второй бот выйдет с сервера
    iData[5] = register_cvar("specbots_maxplayers2", "8");

    // Подгружаем Конфиг
    server_cmd("exec %s/spectator_bots.cfg", cfgdir);
    server_exec();

    // Берем значения Кваров из конфига
    get_pcvar_string(iData[0], g_BotsName[0], charsmax(g_BotsName[]));
    get_pcvar_string(iData[1], g_BotsName[1], charsmax(g_BotsName[]));
    g_fCvars_Time_Delay_Start = get_pcvar_float(iData[2]);
    g_fCvars_Time_Delay_Disconnect = get_pcvar_float(iData[3]);
    g_Bot_Maxplayers[0] = get_pcvar_num(iData[4]);
    g_Bot_Maxplayers[1] = get_pcvar_num(iData[5]);

    // Создаем двух Ботов
    set_task(g_fCvars_Time_Delay_Start, "Task_Add_Fake_Bot", BOTS_TASKID_DELAY1, "1", 2);
    set_task(g_fCvars_Time_Delay_Start, "Task_Add_Fake_Bot", BOTS_TASKID_DELAY2, "2", 2);
}

/*===============================================================================================================================================
                                                                     [Client Disconnected]
================================================================================================================================================*/
public client_disconnected(id)
{
    // Задаем переменные
    static iPlayersNum, Players[32];

    // Получаем количество игроков, исключая Ботов
    get_players(Players, iPlayersNum, "c");

    // Если первый бот Не Создан и Количество игроков не превышает допустимый Максимум
    if(!g_iBotsData[BOTS_ACTIVE_1] && iPlayersNum <= g_Bot_Maxplayers[0] && !g_iBotsData[BOTS_BLOBALID][id])
    {
        // Если таск не Выполняется
        if(!task_exists(BOTS_TASKID_DELAY1))
            set_task(g_fCvars_Time_Delay_Disconnect, "Task_Add_Fake_Bot", BOTS_TASKID_DELAY1, "1", 2);    // Отправляем таск на создание Первого Бота
    }

    // Если второй бот Не Создан и Количество игроков не превышает допустимый Максимум
    if(!g_iBotsData[BOTS_ACTIVE_2] && iPlayersNum <= g_Bot_Maxplayers[1] && !g_iBotsData[BOTS_BLOBALID][id])
    {
        // Если таск не Выполняется
        if(!task_exists(BOTS_TASKID_DELAY2))
            set_task(g_fCvars_Time_Delay_Disconnect, "Task_Add_Fake_Bot", BOTS_TASKID_DELAY2, "2", 2);    // Отправляем таск на создание Второго Бота
    }

    // Если вышел Первый Бот
    if(g_iBotsData[BOTS_BLOBALID][id] == 1)
        g_iBotsData[BOTS_ACTIVE_1] = 0;    // Делаем Первого бота Не Активным

    // Если вышел Второй Бот
    if(g_iBotsData[BOTS_BLOBALID][id] == 2)
        g_iBotsData[BOTS_ACTIVE_2] = 0;    // Делаем Второго бота Не Активным

    // Обнуляем номер Бота
    g_iBotsData[BOTS_BLOBALID][id] = 0;
}

/*===============================================================================================================================================
                                                                     [Client Putinserver]
================================================================================================================================================*/
public client_putinserver(id)
{
    // Задаем переменные
    static iPlayersNum, Players[32];

    // Получаем количество игроков, исключая Ботов
    get_players(Players, iPlayersNum, "c");

    // Обнуляем номер Бота
    g_iBotsData[BOTS_BLOBALID][id] = 0;

    // Если первый бот Создан и Количество игроков превышает допустимый Максимум
    if(g_iBotsData[BOTS_ACTIVE_1] && iPlayersNum >= g_Bot_Maxplayers[0])
    {
        // Делаем Первого бота Не Активным
        g_iBotsData[BOTS_ACTIVE_1] = 0;

        // Киаем бота
            server_cmd("kick ^"%s^"", g_BotsName[0]);
    }

    // Если второй бот Создан и Количество игроков превышает допустимый Максимум
    if(g_iBotsData[BOTS_ACTIVE_2] && iPlayersNum >= g_Bot_Maxplayers[1])
    {
        // Делаем Второго бота Не Активным
        g_iBotsData[BOTS_ACTIVE_2] = 0;

        // Киаем бота
            server_cmd("kick ^"%s^"", g_BotsName[1]);
    }
}

/*===============================================================================================================================================
                                                                        [Task Add Fake Bot]
================================================================================================================================================*/
public Task_Add_Fake_Bot(param[2])
{
    // Задаем переменные
    static msg[128], iPlayersNum, Players[32];

    // Находим номер Бота
    new iBotNum = str_to_num(param);

    // Получаем количество игроков, исключая Ботов
    get_players(Players, iPlayersNum, "c");

    // Если на сервере слишком много игроков
    if(iPlayersNum >= g_Bot_Maxplayers[iBotNum-1])
        return;

    // Создаем Бота
    new Bot = engfunc(EngFunc_CreateFakeClient, g_BotsName[iBotNum-1]);

    // Если бот не был Создан
    if(!Bot)
    {
        // Отсправляем информацию в Амх Логи
        log_amx("[SpecBot] Couldn't create a bot");
        return;
    }

    // Вызываем ПриватДату
    engfunc(EngFunc_FreeEntPrivateData, Bot);

    // Задаем Сетинфо
    set_user_info(Bot, "model", "gordon");
    set_user_info(Bot, "*bot", "1");

    // Вызываем фейковый Коннект
    dllfunc(DLLFunc_ClientConnect, Bot, g_BotsName[iBotNum-1], "127.0.0.1", msg);

    // Если бот Не Подключен
    if(!is_user_connected(Bot))
        return;

    // Вызываем Путинсервер
    dllfunc(DLLFunc_ClientPutInServer, Bot);

    // Ставим Флаги
    set_pev(Bot, pev_spawnflags, pev(Bot, pev_spawnflags) | FL_FAKECLIENT);
    set_pev(Bot, pev_flags, pev(Bot, pev_flags) | FL_FAKECLIENT);

    // Глобальная активность Ботов
    if(iBotNum == 1)
        g_iBotsData[BOTS_ACTIVE_1] = 1;
    else if(iBotNum == 2)
        g_iBotsData[BOTS_ACTIVE_2] = 1;

    // Запоминаем ID бота
    g_iBotsData[BOTS_BLOBALID][Bot] = iBotNum;

    // Если Бот Не Валиден
    if(pev_valid(Bot) != 2)
        return;

    // Меняем команду
    set_pdata_int(Bot, m_iTeam, 3, CBASEMONSTER_LINUX_XTRA_OFF);
    
    // Меняем данные
    dllfunc(DLLFunc_ClientUserInfoChanged, Bot, engfunc(EngFunc_GetInfoKeyBuffer, Bot));
        
    // Отправляем мессагу со сменой Команды
    message_begin(MSG_BROADCAST, g_msgTeamInfo);
    write_byte(Bot);
    write_string("SPECTATOR");
    message_end();
}
 
Сверху
Назад