#include #include #define PLUGIN "BOT" #define AUTHOR "Lev" #define VERSION "1.0" #define BOTNAME "www.example.com" #define PLAYERS_THRESHOLD 1 #define TASKID_BOT 10 new g_iBot, g_Fw_FM_StartFrame; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); set_task(1.0, "BotAdjust", TASKID_BOT); } public client_putinserver(id) { if (g_iBot && id != g_iBot) BotAdjust(); } public client_disconnect(id) { if (id == g_iBot) { g_iBot = 0; unregister_forward(FM_StartFrame, g_Fw_FM_StartFrame); } else if (!g_iBot) set_task(2.0, "BotAdjust", TASKID_BOT); } public BotAdjust() { new num = get_playersnum(); if (g_iBot && num > PLAYERS_THRESHOLD) KickBot(); if (!g_iBot && num < PLAYERS_THRESHOLD) AddBot(); } AddBot() { new const name[] = BOTNAME; new id = engfunc(EngFunc_CreateFakeClient, name); if (!pev_valid(id)) return; g_iBot = id; engfunc(EngFunc_FreeEntPrivateData, id); dllfunc(MetaFunc_CallGameEntity, "player", id); set_pev(id, pev_flags, pev(id, pev_flags) | FL_FAKECLIENT); new msg[128]; dllfunc(DLLFunc_ClientConnect, id, name, "127.0.0.1", msg); dllfunc(DLLFunc_ClientPutInServer, id); g_Fw_FM_StartFrame = register_forward(FM_StartFrame, "Fw_FM_StartFrame"); } KickBot() { server_cmd("kick #%d", get_user_userid(g_iBot)); } public Fw_FM_StartFrame() { if (!g_iBot || !pev_valid(g_iBot)) return; static Float:fMSec; set_pev(g_iBot, pev_flags, pev(g_iBot, pev_flags) | FL_FAKECLIENT); global_get(glb_frametime, fMSec); fMSec *= 1000.0; engfunc(EngFunc_RunPlayerMove, g_iBot, Float:{0.0,0.0,0.0}, 0.0, 0.0, 0.0, 0, 0, floatround(fMSec)); }