Столкнулся с проблемой в плагине. Суть плагина: проверка на высокий пинг и FPS + кик за превышенные значения. За пинг еще не тестил, не знаю, исправно работает ли. Но вот по части FPS есть нюанс. В кваре задано максимально допустимое значение 130. А меня кикает при fps_max 119. Кикает регулярно. Правда, я не выводил квары в amxx.cfg, а понадеялся, что значения оно будет черпать из деф заданных в самом плагине (g_pCvar_iLimitFPS = register_cvar("amxx_kicker_max_fps", "130")), так же можно? В общем, может кто сталкивался или знает, почему меня кикает с допустимым FPS - подскажите :)
PHP:
#include <amxmodx>
#include <fakemeta>
new const g_szPluginName[] = "Ping/FPS Kicker";
new const g_szPluginVersion[] = "1.0";
new const g_szPluginAuthor[] = "zmn";
new const g_szFile_LogPlayer[] = "AMXX_KICKER.txt";
#pragma semicolon 1
enum
{
NONE = 0,
PING,
FPS
};
new g_bConnected;
new g_iPlayerFPS[33];
new g_iChecks[33];
new Float:g_fCheckTime;
new g_iLimitPing;
new g_iLimitFPS;
new g_pCvar_iEnabled;
new g_pCvar_iInmunity;
new g_pCvar_iChecks;
new g_pCvar_iLimitPing;
new g_pCvar_iLimitFPS;
new g_pCvar_iTimeCheck;
const TASK_PFK = 21050;
public plugin_init()
{
register_plugin(g_szPluginName, g_szPluginVersion, g_szPluginAuthor);
g_pCvar_iEnabled = register_cvar("amxx_kicker_enabled", "1");
g_pCvar_iInmunity = register_cvar("amxx_kicker_admin_inmunity", "1");
g_pCvar_iChecks = register_cvar("amxx_kicker_check", "3");
g_pCvar_iLimitPing = register_cvar("amxx_kicker_max_ping", "130");
g_pCvar_iLimitFPS = register_cvar("amxx_kicker_max_fps", "130");
g_pCvar_iTimeCheck = register_cvar("amxx_kicker_check_time", "15");
register_forward(FM_CmdStart, "fw_CmdStart");
}
public plugin_cfg()
{
if (!get_pcvar_num(g_pCvar_iEnabled))
return;
g_iLimitFPS = get_pcvar_num(g_pCvar_iLimitFPS);
g_iLimitPing = get_pcvar_num(g_pCvar_iLimitPing);
g_fCheckTime = get_pcvar_float(g_pCvar_iTimeCheck);
set_task(g_fCheckTime, "Task_Kicker_Ping", TASK_PFK, .flags = "b");
}
public client_putinserver(id)
{
if (!get_pcvar_num(g_pCvar_iEnabled))
return;
g_bConnected |= (1<<(id - 1));
g_iPlayerFPS[id] = g_iChecks[id] = 0;
if (!is_user_bot(id) && !is_user_hltv(id))
set_task(10.0, "ShowMensaje", id);
}
public client_disconnected(id)
{
if (!get_pcvar_num(g_pCvar_iEnabled))
return;
g_bConnected &= ~(1<<(id - 1));
}
public ShowMensaje(id)
{
if (get_pcvar_num(g_pCvar_iInmunity) && get_user_flags(id) & ADMIN_LEVEL_H)
return;
client_print_color(id, print_team_default, "^x04[INFO]^x01 Игроки с пингом выше ^x04%d^x01 и FPS выше ^x04%d^x01 будут кикнуты!", g_iLimitPing, g_iLimitFPS);
}
public fw_CmdStart(id, uc_handle)
{
if (!get_pcvar_num(g_pCvar_iEnabled))
return;
if (~g_bConnected & (1<<(id - 1)))
return;
static iFPS;
iFPS = floatround(1 / (get_uc(uc_handle, UC_Msec) * 0.001));
if (iFPS > g_iPlayerFPS[id])
g_iPlayerFPS[id] = iFPS;
}
public Task_Kicker_Ping()
{
static Float:fCheckTime, iChecks;
fCheckTime = get_pcvar_float(g_pCvar_iTimeCheck);
iChecks = get_pcvar_num(g_pCvar_iChecks);
if (g_fCheckTime != fCheckTime)
{
change_task(TASK_PFK, fCheckTime);
g_fCheckTime = fCheckTime;
}
static id, iPing, iLoss;
for (id = 1; id <= get_maxplayers(); id++)
{
if (~g_bConnected & (1<<(id - 1)))
continue;
if (g_iPlayerFPS[id] >= g_iLimitFPS)
{
KickJugador(id, FPS);
continue;
}
get_user_ping(id, iPing, iLoss);
if (iPing >= g_iLimitPing)
{
if (++g_iChecks[id] >= iChecks)
KickJugador(id, PING);
}
}
}
KickJugador(id, iNum = NONE)
{
if (get_pcvar_num(g_pCvar_iInmunity) && get_user_flags(id) & ADMIN_LEVEL_H)
return;
new szName[32], szSteamID[32];
get_user_name(id, szName, charsmax(szName));
get_user_authid(id, szSteamID, charsmax(szSteamID));
server_cmd("kick #%d ^"Твой %s слишком высокий, сделай что то с этим :)^"", get_user_userid(id), iNum == PING ? "пинг" : "FPS");
client_print_color(0, print_team_default, "^x04[INFO]^x01 Боец^x03 %s^x01 был кикнут. Причина: ^x04высокий %s^x01 mayor de la permitida", szName, iNum == PING ? "пинг" : "fps");
log_to_file(g_szFile_LogPlayer, "Игрок ^"%s^" был кикнут из-за повышенного пинга/фпс: <Steam: ^"%s^" - ID: %d>", szName, szSteamID, get_user_userid(id));
}
stock ChatColor(id, const input[], any:...)
{
static szMsg[191];
vformat(szMsg, 190, input, 3);
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, get_user_msgid("SayText"), .player = id);
write_byte(id ? id : 33);
write_string(szMsg);
message_end();
}