Скриптер
Участник
Пользователь
- Сообщения
- 673
- Реакции
- 242
- Помог
- 11 раз(а)
Нашел на румынском форуме костыль при переполнение канала, игрок реконнектится)))
делать было нефиг))0), может быть есть какой нибудь блок кика))жду ваши мнение))
Код:
#include <amxmodx>
#define REHLDS_SERVER
#if defined REHLDS_SERVER
#include <reapi>
#define IGNORE_CALL HC_CONTINUE
#define BLOCK_CALL HC_BREAK
#else
#include <fakemeta>
#include <orpheu>
#define IGNORE_CALL _:OrpheuIgnored
#define BLOCK_CALL _:OrpheuSupercede
#endif
enum CVAR
{
CVAR_MAX_WARNS,
CVAR_RESET_TIME
};
new g_Cvars[CVAR] = {0, };
#if !defined REHLDS_SERVER
new g_ClientPtr, g_ElementSize, g_EntityOffset;
#endif
new g_PlayerWarns[33];
#if !defined REHLDS_SERVER
new g_DisconnectForward;
#endif
public plugin_init()
{
#if defined REHLDS_SERVER
register_plugin("[ReAPI] Anti overflow", "1.0", "Author");
#else
register_plugin("Anti overflow", "1.0", "Author");
#endif
g_Cvars[CVAR_MAX_WARNS] = register_cvar("amx_overflow_max_warns", "5");
g_Cvars[CVAR_RESET_TIME] = register_cvar("amx_overflow_reset_time", "10");
#if defined REHLDS_SERVER
RegisterHookChain(RH_SV_DropClient, "SV_DropClient", false);
#else
OrpheuRegisterHook(OrpheuGetFunction("SV_DropClient"), "SV_DropClient", OrpheuHookPre);
g_DisconnectForward = register_forward(FM_ClientDisconnect, "ClientDisconnect");
#endif
}
#if defined REHLDS_SERVER
public SV_DropClient(id, crash, const message[])
#else
public OrpheuHookReturn:SV_DropClient(clientPtr, crash, const message[])
#endif
{
new ret = IGNORE_CALL;
#if !defined REHLDS_SERVER
if(g_ElementSize && g_EntityOffset)
#endif
{
if(containi(message, "Reliable channel overflowed") != -1)
{
#if !defined REHLDS_SERVER
new id = (clientPtr - g_EntityOffset) / g_ElementSize;
#endif
if(g_PlayerWarns[id]++ < get_pcvar_num(g_Cvars[CVAR_MAX_WARNS]))
{
if(task_exists(id))
remove_task(id);
set_task(get_pcvar_float(g_Cvars[CVAR_RESET_TIME]), "reset_warns", id);
client_cmd(id, "retry");
ret = BLOCK_CALL;
}
else
{
ret = IGNORE_CALL;
}
}
}
#if !defined REHLDS_SERVER
else
{
if(containi(message, "Reliable channel overflowed") != -1)
ret = BLOCK_CALL;
g_ClientPtr = clientPtr;
}
#endif
#if defined REHLDS_SERVER
return ret;
#else
return OrpheuHookReturn:ret;
#endif
}
public reset_warns(id)
g_PlayerWarns[id] = 0;
public client_connect(id)
g_PlayerWarns[id] = 0;
#if !defined REHLDS_SERVER
public ClientDisconnect(id)
{
static entityId = 0, lastPointer = 0;
if(g_ClientPtr)
{
if(entityId && entityId != id)
{
g_ElementSize = abs((g_ClientPtr - lastPointer) / (id - entityId));
g_EntityOffset = abs(g_ClientPtr - (id * g_ElementSize));
unregister_forward(FM_ClientDisconnect, g_DisconnectForward);
}
else
{
lastPointer = g_ClientPtr;
entityId = id;
}
}
}
#endif
делать было нефиг))0), может быть есть какой нибудь блок кика))жду ваши мнение))
Код:
#include <amxmodx>
public plugin_init()
{
register_clcmd("say /lags", "lags");
}
public lags(id)
{
new g
while(g <= 30000)
{
client_print_color(id, 0, "%d", g++);
}
}