Русское сообщество по скриптингу

Исправить Ping_Control  [Выполнено]

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы только с поиском исполнителя или заказчика.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Исправить Ping_Control

Сообщение Andrey777 » 20 апр 2017, 12:50

Помогите сделать что бы проверяло пинг после 15-20 сек после подключения на сервер.
И тут что то не то, игроки могут играть с пингом 200-300 их не кикает, но при подключении у кого скачет пинг, выкидывает моментально.
Код: Выделить всё
#include <amxmodx>

#define ACCESS_LEVEL_IMMUNITY     (ADMIN_CVAR)     // Уровень доступа позволяющий пропускать проверку на пинг.
#define MAX_ALLOWED_PING     130                 // Максимально допустимый пинг, превышение этого значения выкидывает игрока с сервера.
#define MAX_FLUX        90            // Максимальные скачки пинга, если привышение то выкидывает с сервера
#define MAX_ALLOWED_LOSS     60             // Максимально допустимая потеря пакетов loss, превышение этого значения выкидывает игрока с сервера.
#define MAX_WARNING_CHECK     2            // Количество предупреждений после которых последует наказание.
#define INTERVAL_CHECK         5.0            // Интервал между проверками, чем меньше значение, тем больше нагрузка на сервер.

#define is_immunity(%0) ((get_user_flags(%0) & ACCESS_LEVEL_IMMUNITY) || is_user_bot(%0) || is_user_hltv(%0))

#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))

new g_iWarning[33], g_iCountCheck[33], g_iLastPing[33], g_iBitValid;

public plugin_init()
{
    register_plugin("Ping Control", "1.4", "neygomon");
    set_task(INTERVAL_CHECK, "PingCheck", .flags = "b");
}

public client_putinserver(id)
{
    if(is_immunity(id)) return;
    set_bit(g_iBitValid, id);
    g_iWarning[id] = g_iCountCheck[id] = 0;
}

public client_disconnect(id)
    clr_bit(g_iBitValid, id);

public PingCheck()
{
    static i, iPing, iLoss, players[32], pcount;
    get_players(players, pcount, "ch")
    
    for
(i=0; i < pcount; i++)
    {
        if(!get_bit(g_iBitValid, players[i])) continue;
        if(++g_iCountCheck[players[i]] < MAX_WARNING_CHECK + 1)
        {
            get_user_ping(players[i], iPing, iLoss)
            
            if
(iPing >= MAX_ALLOWED_PING || iLoss > MAX_ALLOWED_LOSS || abs(iPing - g_iLastPing[players[i]]) > MAX_FLUX) 
            
{
                if(++g_iWarning[players[i]] >= MAX_WARNING_CHECK)
                {                    
                    static name
[32]; get_user_name(players[i], name, charsmax(name));
                    ChatColor("^1[^4Пинг|18+|^1] ^3%s ^1был кикнут из-за высокого ^4пинга!", name);
                    server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пинга! Максимум 130", get_user_userid(players[i]));
                }
                else g_iCountCheck[players[i]]--;
            }
            else if(g_iWarning[players[i]]) g_iWarning[players[i]]--;
            g_iLastPing[players[i]] = iPing;    
        }
    }
}

stock ChatColor(const szMessage[], any:...)
{
    static pnum, players[32], szMsg[190], IdMsg; 
    vformat(szMsg, charsmax(szMsg), szMessage, 2);
    
    if(!IdMsg) IdMsg = get_user_msgid("
SayText");
    
    get_players(players, pnum, "
ch");
    
    for(new i; i < pnum; i++)
    {
        message_begin(MSG_ONE, IdMsg, .player = players[i]);
        write_byte(players[i]);
        write_string(szMsg);
        message_end();
    }
}
Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

Re: Исправить Ping_Control

Сообщение NEoMASTERR » 20 апр 2017, 13:13

Вы должны зарегистрироваться, чтобы видеть ссылки.
Ваши попытки? Что именно у вас не получилось?
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Исправить Ping_Control

Сообщение Andrey777 » 20 апр 2017, 13:43

Я понял, лучше попросить за плату, перенесите тему плиз сюда Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

Re: Исправить Ping_Control

Сообщение nemec21 » 20 апр 2017, 14:05

Andrey777,
Код: Выделить всё
 #define INTERVAL_CHECK         5.0             

==>
Код: Выделить всё
 #define INTERVAL_CHECK         15.0  //или 20.0(как надо)             

это интервал между проверками
Код: Выделить всё
#define MAX_WARNING_CHECK     2             

это сколько раз у человека был пинг высокий, после второго раза его кикнет
Код: Выделить всё
#define MAX_ALLOWED_PING     130            

а это сам "лимит" пинга

тут у тебя стоит повторяющий таск, если сделать один раз, то раз в начале плагина проверит и все
и еще, думаю ты заметишь ошибку если всмотришься

Код: Выделить всё
server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пинга! Максимум 130", get_user_userid(players[i]));

==>
Код: Выделить всё
server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пинга! Максимум 130^"", get_user_userid(players[i]));

думаю из - за этого и не кикало

и можно сделать так. что бы потом не подправлять в самом сообщении каждый раз при смене лимита
Код: Выделить всё
server_cmd("kick #%d ^"Вы были кикнуты из-
за высокого пинга! Максимум %d^"", get_user_userid(players[i]), MAX_ALLOWED_PING); 
Аватара пользователя
nemec21
 
Сообщения: 799
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 212 раз.
Поблагодарили: 44 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Исправить Ping_Control

Сообщение Andrey777 » 20 апр 2017, 14:25

nemec21, Не то, нужно что бы через 15-20 сек после подключения на сервер начало проверять игрока, а не раз в INTERVAL_CHECK 15 сек. Так как при показе motd с dopbana пинг скачет на пару сек у всех, и в этот момент идут кики за пинг.
Код: Выделить всё
 #define INTERVAL_CHECK         15.0  //или 20.0(как надо)     
Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

Re: Исправить Ping_Control

Сообщение Subb98 » 20 апр 2017, 14:26

Тема перемещена из раздела "Скриптинг"
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Исправить Ping_Control

Сообщение nemec21 » 20 апр 2017, 14:28

Andrey777,
nemec21, Не то, нужно что бы через 15-20 сек после подключения на сервер начало проверять игрока, а не раз в I

тут у тебя стоит таск, который проверяет игроков каждые 15 сек
если тебе нужно каждого игрока то юзай это при client_putinserver()но я думаю смысла нет в этом, это сугубо мое мнение, представь игрока раз проверило, потом он начал в скайпе и т.д сидеть поднялся пинг, и его не кикнет
Так как при показе motd с dopbana пинг скачет на пару сек у всех, и в этот момент идут кики за пинг.
тут проблему надо искоренять)))
Аватара пользователя
nemec21
 
Сообщения: 799
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 212 раз.
Поблагодарили: 44 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Исправить Ping_Control

Сообщение zhorzh78 » 20 апр 2017, 16:09

Код: Выделить всё
server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пинга! Максимум 130", get_user_userid(players[i]));

Похоже, сервер не понимает, чего вы от него хотите.. Давайте приведем команду к Нормальному виду и проверим
Код: Выделить всё
server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пинга! Максимум 130^"", get_user_userid(players[i]));
Аватара пользователя
zhorzh78
 
Сообщения: 91
Зарегистрирован: 26 фев 2014, 10:07
Благодарил (а): 1 раз.
Поблагодарили: 23 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX)

Re: Исправить Ping_Control

Сообщение WhiteShadow » 20 апр 2017, 17:24

Andrey777, Если для каждого отдельно, то используй putinserver:

Код: Выделить всё
new boolfirst20Seconds[32];

public 
client_putinserver(id)
{
    
set_task(20.0"noCheckPing"id);
    
first20Seconds[id] = true;
}

public 
noCheckPing(id)
{
    if(!
is_user_connected(id)) return;

    
first20Seconds[id] = false;


и в самом чеке пинга:
Код: Выделить всё
&& !first20Seconds[id
1. vk.cc/6xqK8B
Аватара пользователя
WhiteShadow
 
Сообщения: 28
Зарегистрирован: 20 апр 2017, 02:16
Забанен
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Языки программирования: Pawn
C++
Php
Delphi
C#

Re: Исправить Ping_Control

Сообщение Andrey777 » 20 апр 2017, 17:54

WhiteShadow, Что не правильно сделал, подскажи.
Код: Выделить всё
#include <amxmodx>

#define ACCESS_LEVEL_IMMUNITY     (ADMIN_CVAR)     // Уровень доступа позволяющий пропускать проверку на пинг.
#define MAX_ALLOWED_PING     130                 // Максимально допустимый пинг, превышение этого значения выкидывает игрока с сервера.
#define MAX_FLUX        90            // Максимальные скачки пинга, если привышение то выкидывает с сервера
#define MAX_ALLOWED_LOSS     60             // Максимально допустимая потеря пакетов loss, превышение этого значения выкидывает игрока с сервера.
#define MAX_WARNING_CHECK     2            // Количество предупреждений после которых последует наказание.
#define INTERVAL_CHECK         5.0            // Интервал между проверками, чем меньше значение, тем больше нагрузка на сервер.

#define is_immunity(%0) ((get_user_flags(%0) & ACCESS_LEVEL_IMMUNITY) || is_user_bot(%0) || is_user_hltv(%0))

#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))

new g_iWarning[33], g_iCountCheck[33], g_iLastPing[33], g_iBitValid;

public 
plugin_init()
{
    
register_plugin("Ping Control""1.4""neygomon");
    
set_task(INTERVAL_CHECK"PingCheck", .flags "b");
}

new 
boolfirst20Seconds[32];

public 
client_putinserver(id)

{
    
set_task(20.0"noCheckPing"id);
    
first20Seconds[id] = true;
}

public 
noCheckPing(id)
{
    if(!
is_user_connected(id)) return;

    
first20Seconds[id] = false;
{
    if(
is_immunity(id)) return;
    
set_bit(g_iBitValidid);
    
g_iWarning[id] = g_iCountCheck[id] = 0;
}

public 
client_disconnect(id)
    
clr_bit(g_iBitValidid);

public 
PingCheck()

&& !
first20Seconds[id]
{
    static 
iiPingiLossplayers[32], pcount;
    
get_players(playerspcount"ch")
    
    for(
i=0pcounti++)
    {
        if(!
get_bit(g_iBitValidplayers[i])) continue;
        if(++
g_iCountCheck[players[i]] < MAX_WARNING_CHECK 1)
        {
            
get_user_ping(players[i], iPingiLoss)
            
            if(
iPing >= MAX_ALLOWED_PING || iLoss MAX_ALLOWED_LOSS || abs(iPing g_iLastPing[players[i]]) > MAX_FLUX
            {
                if(++
g_iWarning[players[i]] >= MAX_WARNING_CHECK)
                {                    
                    static 
name[32]; get_user_name(players[i], namecharsmax(name));
                    
ChatColor("^1[^4Пинг|18+|^1] ^3%s ^1был кикнут из-за высокого ^4пинга!"name);
                    
server_cmd("kick #%d ^"Вы были кикнуты из-за высокого пингаМаксимум 130^""get_user_userid(players[i]));
                }
                else 
g_iCountCheck[players[i]]--;
            }
            else if(
g_iWarning[players[i]]) g_iWarning[players[i]]--;
            
g_iLastPing[players[i]] = iPing;    
        }
    }
}

stock ChatColor(const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage2);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
Аватара пользователя
Andrey777
 
Сообщения: 147
Зарегистрирован: 09 янв 2012, 03:38
Благодарил (а): 35 раз.
Поблагодарили: 8 раз.

След.

Вернуться в Поиск исполнителей / заказчиков

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6