Spectator Bots

Сообщения
3
Реакции
0
Здравствуйте, хотелось бы изменить этот плагин, не могли бы вы помочь? Хотелось бы добавить, чтобы при заходе игрока с определённым ником бот выходил

Код:
#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: Lan-Game.com");

// Задержка на добавление бота после смены карты
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();
}
 

Вложения

Последнее редактирование модератором:
Сообщения
2,722
Реакции
2,997
Помог
60 раз(а)
Один из ботов, или оба?

Попробуйте:
Код:
/* Add kick bots by "nickname join" */

// Включить возможность кика ботов, при заходе игрока с данным ником
#define NICKNAME "My Nickname"

#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: Lan-Game.com");

// Задержка на добавление бота после смены карты
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]);
}

#if defined NICKNAME
new szName[32]; get_user_name(id, szName, charsmax(szName));

if(equal(szName, NICKNAME))
{
if(g_iBotsData[BOTS_ACTIVE_1])
{
// Делаем Первого бота Не Активным
g_iBotsData[BOTS_ACTIVE_1] = 0;

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

return;
}
else if(g_iBotsData[BOTS_ACTIVE_2])
{
// Делаем Второго бота Не Активным
g_iBotsData[BOTS_ACTIVE_2] = 0;

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

return;
}
}


#endif
}

/*===============================================================================================================================================
[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();
}
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу