Anti overflow

Сообщения
673
Реакции
242
Помог
11 раз(а)
Нашел на румынском форуме костыль при переполнение канала, игрок реконнектится)))

Код:
#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++);
    }
}
 
Сообщения
458
Реакции
263
Помог
9 раз(а)
Limbooc, while true обычно юзают, а ретри на современных клиентах заблрчиться не должно? И расценивается ли это как либо мониками?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
@malniata,у меня нон стим, ретри пашет можно заменить на reconnect


Exe version 1.1.2.6 (cstrike)
Exe build: 16:05:41 Jun 15 2009 (455


видимо у меня старый билд
 
Последнее редактирование:
Сообщения
79
Реакции
9
Может кому пригодится, если это ещё актуально.

Код:
#include <amxmodx>

#define RETRY_ON_KICK
#define ReAPI

#if defined ReAPI
    #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


#if !defined ReAPI
new g_ClientPtr;
new g_ElementSize;
new g_EntityOffset;
#endif
new g_PlayerWarns[33];

enum CVAR
{
    CVAR_MAX_WARNS,
    CVAR_RESET_TIME
};

new g_Cvars[CVAR] = {0, };

#if !defined ReAPI
new g_DisconnectForward;
#endif

#pragma semicolon 1

public plugin_init()
{
#if defined ReAPI
    register_plugin("[ReAPI] Anti overflow", "3.1", "mazdan & Inline, WPMGPRoSToTeMa");
#else
    register_plugin("Anti overflow", "3.1", "mazdan & Inline, WPMGPRoSToTeMa");
#endif   

    g_Cvars[CVAR_MAX_WARNS] = register_cvar("antir_max_warns", "5");
    g_Cvars[CVAR_RESET_TIME] = register_cvar("antir_reset_time", "10");

#if defined ReAPI
    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 ReAPI
public SV_DropClient( id , crash , const message[] )
#else
public OrpheuHookReturn:SV_DropClient( clientPtr , crash , const message[] )
#endif
{   
    new ret = IGNORE_CALL;
#if !defined ReAPI   
    if(g_ElementSize && g_EntityOffset)
#endif
    {

        if(containi(message, "Reliable channel overflowed") != -1)
        {
#if !defined ReAPI
            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]), "Task_ResetWarns", id);
                
                ret = BLOCK_CALL;
            }
            else
            {
#if defined RETRY_ON_KICK
                client_cmd(id, "retry");
#endif
                ret = IGNORE_CALL;
            }
        }
    }
#if !defined ReAPI       
    else
    {
        if(containi(message, "Reliable channel overflowed") != -1)
        {
            ret = BLOCK_CALL;
        }
        g_ClientPtr = clientPtr;
    }
#endif

#if defined ReAPI   
    return ret;
#else
    return OrpheuHookReturn:ret;
#endif
}

public Task_ResetWarns(id)
    g_PlayerWarns[id] = 0;

public client_connect(id)
    g_PlayerWarns[id] = 0;

#if !defined ReAPI   
public ClientDisconnect(id) // After SV_DropClient
{
    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
 
Сообщения
354
Реакции
73
Помог
1 раз(а)
Artemyshka, а это не тоже самое, что выше скинули? :crazy:
 
Сообщения
79
Реакции
9
GALAXY, Ну как тоже самое :crazy:Вроде бы не Румынские разработчики :boast:

Код:
register_plugin("[ReAPI] Anti overflow", "3.1", "mazdan & Inline, WPMGPRoSToTeMa");
#else
    register_plugin("Anti overflow", "3.1", "mazdan & Inline, WPMGPRoSToTeMa");
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Artemyshka, это разработчик делает название плагина, если reapi есть такое, если нет, такое
 
Сообщения
83
Реакции
14
@mlibre,жто у кого-то работало? У меня нет. Устал от этой проблемы,на самом деле. Принял для себя, что подобная ошибка связана с закрытием клиента без выхода с сервера. Но вообще снижение рейтов (minrate 2500, maxrate 25000) помогает ошибку минимализировать. Но играть так не на мясе - такое себе.
А вообще это все, как мне кажется, связано с лимитами канала на игрока майарены для про (не вдс) серверов.
 

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

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