[FilterScript] Anti Quick Reconnect
#1

Крохотный FS по просьбам участников форума. FS не дает игроку быстро реконектится после выхода. Если пауза между выходом и входом одного и того же игрока меньше 5 сек, то войти он не сможет. Если у игрока был просто тайм аут соединения, то его этот запрет не коснется.

Скрипт оптимизирован, юзает динамическую память и надежную систему запрета доступа.
Учтены пожелания.

НОВЫЙ ОПТИМИЗИРОВАННЫЙ КОД
PHP Code:
/*
    Этот FS не дает реконектится игроку быстрее чем через 5 сек.
    после выхода. Для проверки используется IP игрока.
    Скрипт оптимизирован, юзает динамическую память и
    надежную систему запрета доступа.
    MX_Master, 14.07.2010 2:46:25
*/
#include <a_samp>
const player_machine 1// ид виртуальной машины для хранения IP игроков, которые онлайн
      
rec_delay_sec  5// сек. после дисконекта, после котороых снова можно конектится
public OnFilterScriptExit()
{
    
// при выгрузке скрипта, освободим, используюемую им, память
    
for ( new GetMaxPlayers() - 1>= 0; --)
        if ( 
existpropertyplayer_machine_) ) deletepropertyplayer_machine_);
}
public 
OnPlayerConnect playerid )
{
    new 
cur_str_ip[16];
    
GetPlayerIpplayeridcur_str_ip16 );
    
setpropertyplayer_machine_playeridcur_str_ip );
    return 
1;
}
public 
OnPlayerDisconnect playeridreason )
{
    if ( 
reason == ) return 1// если был тайм аут соединения у игрока
    
new saved_str_ip[16];
    
getproperty(    player_machine_playeridsaved_str_ip );
    
deletepropertyplayer_machine_playerid );
    
strunpacksaved_str_ipsaved_str_ip );
    new 
rcon_cmd[32];
    
formatrcon_cmd32"banip %s"saved_str_ip );
    
SendRconCommand(rcon_cmd);
    
SetTimerEx"unban_ip"rec_delay_sec 10000"s"saved_str_ip );
    return 
1;
}
forward unban_ip ip[] );
public  
unban_ip ip[] )
{
    new 
rcon_cmd[32];
    
formatrcon_cmd32"unbanip %s"ip );
    
SendRconCommand(rcon_cmd);

код старой версии - http://pawn.pastebin.com/46EN4w2U
Reply
#2

Так не проще?
PHP Code:
#include <a_samp>
#define RTIME  5
new LastIP[MAX_PLAYERS][20],LastTime[MAX_PLAYERS];
public 
OnPlayerConnect(playerid)
{
    new 
str_ip[20];
    
GetPlayerIpplayeridstr_ip20 );
    for(new 
i,gettime();i<sizeof(LastIP),i++)
    {
        if(!
strlen(LastIP[i]))break;
        if(
strcmp(str_ip,LastIP[i],false) == 0)
        {
            if(
s-LastTime[i] < RTIME)return Kick(playerid);
            else
            {
                
LastIP[i] = "";
                
LastTime[i] = 0;
                break;
            }
        }
    }
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    for(new 
i,gettime();i<sizeof(LastIP),i++)
    {
        if(
s-LastTime[i] > RTIME)
        {
            
LastIP[i] = "";
            
LastTime[i] = 0;
        }
        if(
strlen(LastIP[i]))continue;
        
GetPlayerIp(playeridLastIP[i], 20 );
        
LastTime[i] = gettime();
        break;
    }
    return 
1;

Reply
#3

Ip адрес хранится в 4 байтах...и сравнение будет тогда легче .... слабо запаковать?)
Reply
#4

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

Code:
[16:14:00] [join] Test has joined the server (3:127.0.0.1)
[16:14:03] [part] Test has left the server (3:1)
[16:14:03] Incoming connection: 127.0.0.1:4097
[16:14:03] [join] Test has joined the server (3:127.0.0.1)
[16:14:03] [part] Test has left the server (3:2)
[16:14:04] Incoming connection: 127.0.0.1:4099
[16:14:04] [join] Test has joined the server (4:127.0.0.1)
[16:14:04] [part] Test has left the server (4:2)
[16:14:05] Incoming connection: 127.0.0.1:4101
[16:14:05] [join] Test has joined the server (5:127.0.0.1)
[16:14:05] [part] Test has left the server (5:2)
[16:14:05] Incoming connection: 127.0.0.1:4103
[16:14:05] [join] Test has joined the server (6:127.0.0.1)
[16:14:05] [part] Test has left the server (6:2)
[16:14:06] Incoming connection: 127.0.0.1:4105
[16:14:06] [join] Test has joined the server (7:127.0.0.1)
[16:14:06] [part] Test has left the server (7:2)
[16:14:07] Incoming connection: 127.0.0.1:4107
[16:14:07] [join] Test has joined the server (8:127.0.0.1)
[16:14:07] [part] Test has left the server (8:2)
[16:14:07] Incoming connection: 127.0.0.1:4109
[16:14:07] [join] Test has joined the server (9:127.0.0.1)
[16:14:07] [part] Test has left the server (9:2)
[16:14:08] Incoming connection: 127.0.0.1:4111
[16:14:08] [join] Test has joined the server (10:127.0.0.1)
[16:14:08] [part] Test has left the server (10:2)
[16:14:08] Incoming connection: 127.0.0.1:4113
[16:14:08] [join] Test has joined the server (11:127.0.0.1)
[16:14:08] [part] Test has left the server (11:2)
[16:14:09] Incoming connection: 127.0.0.1:4115
[16:14:09] [join] Test has joined the server (12:127.0.0.1)
[16:14:09] [part] Test has left the server (12:2)
[16:14:10] Incoming connection: 127.0.0.1:4117
[16:14:10] [join] Test has joined the server (13:127.0.0.1)
[16:14:10] [part] Test has left the server (13:2)
[16:14:10] Incoming connection: 127.0.0.1:4119
[16:14:10] [join] Test has joined the server (14:127.0.0.1)
[16:14:10] [part] Test has left the server (14:2)
[16:14:11] Incoming connection: 127.0.0.1:4121
[16:14:11] [join] Test has joined the server (15:127.0.0.1)
[16:14:11] [part] Test has left the server (15:2)
[16:14:11] Incoming connection: 127.0.0.1:4123
[16:14:11] [join] Test has joined the server (16:127.0.0.1)
[16:14:11] [part] Test has left the server (16:2)
[16:14:12] Incoming connection: 127.0.0.1:4125
[16:14:12] [join] Test has joined the server (17:127.0.0.1)
[16:14:12] [part] Test has left the server (17:2)
[16:14:13] Incoming connection: 127.0.0.1:4129
[16:14:13] [join] Test has joined the server (19:127.0.0.1)
[16:14:13] [part] Test has left the server (19:1)
[16:14:14] Incoming connection: 127.0.0.1:4131
[16:14:14] [join] Test has joined the server (20:127.0.0.1)
[16:14:14] [part] Test has left the server (20:1)
[16:14:15] Incoming connection: 127.0.0.1:4133
[16:14:15] [join] Test has joined the server (4:127.0.0.1)
[16:14:15] [part] Test has left the server (4:1)
[16:14:16] Incoming connection: 127.0.0.1:4135
[16:14:16] [join] Test has joined the server (5:127.0.0.1)
[16:14:17] [part] Test has left the server (5:1)
[16:14:17] Incoming connection: 127.0.0.1:4137
[16:14:17] [join] Test has joined the server (6:127.0.0.1)
[16:14:18] [part] Test has left the server (6:1)
[16:14:18] Incoming connection: 127.0.0.1:4139
[16:14:18] [join] Test has joined the server (7:127.0.0.1)
[16:14:18] [part] Test has left the server (7:2)
[16:14:19] Incoming connection: 127.0.0.1:4141
[16:14:19] [join] Test has joined the server (8:127.0.0.1)
[16:14:20] [part] Test has left the server (8:1)
[16:14:20] Incoming connection: 127.0.0.1:4143
[16:14:20] [join] Test has joined the server (8:127.0.0.1)
[16:14:20] [part] Test has left the server (8:2)
[16:14:21] Incoming connection: 127.0.0.1:4145
[16:14:21] [join] Test has joined the server (8:127.0.0.1)
[16:14:21] [part] Test has left the server (8:1)
[16:14:21] Incoming connection: 127.0.0.1:4147
[16:14:21] [join] Test has joined the server (11:127.0.0.1)
[16:14:21] [part] Test has left the server (11:2)
[16:14:22] Incoming connection: 127.0.0.1:4149
[16:14:22] [join] Test has joined the server (12:127.0.0.1)
[16:14:23] [part] Test has left the server (12:1)
[16:14:23] Incoming connection: 127.0.0.1:4151
[16:14:23] [join] Test has joined the server (13:127.0.0.1)
[16:14:23] [part] Test has left the server (13:2)
[16:14:24] Incoming connection: 127.0.0.1:4153
[16:14:24] [join] Test has joined the server (14:127.0.0.1)
[16:14:24] [part] Test has left the server (14:1)
[16:14:24] Incoming connection: 127.0.0.1:4155
[16:14:24] [join] Test has joined the server (14:127.0.0.1)
[16:14:24] [part] Test has left the server (14:2)
[16:14:26] Incoming connection: 127.0.0.1:4157
[16:14:26] [join] Test has joined the server (14:127.0.0.1)
[16:14:26] [part] Test has left the server (14:1)
[16:14:26] Incoming connection: 127.0.0.1:4159
[16:14:26] [join] Test has joined the server (14:127.0.0.1)
[16:14:26] [part] Test has left the server (14:2)
[16:14:27] Incoming connection: 127.0.0.1:4161
[16:14:27] [join] Test has joined the server (15:127.0.0.1)
[16:14:27] [part] Test has left the server (15:1)
[16:14:28] Incoming connection: 127.0.0.1:4163
[16:14:28] [join] Test has joined the server (15:127.0.0.1)
[16:14:28] [part] Test has left the server (15:2)
хм, я поменял кик на бан и перед тем как забанит успеваю зафлудить весь чат банить только с 20 раза, изза чего так может быть?
Reply
#6

Степаха, ты не прав ((: Ты не сомневайся, если мастер так сделал, значит оно имеет значение, смысл и предназначение, ну и, естественно, выигрыш в скорости, меньший объем озу и т.д. и т.п. Кстати, ты не учел в своем скрипте другие важные аспекты.

slikki, сэмп ваще не совершенен, поэтому к одной блокировочной системе надо (кто бы сомневался) добавлять дополнительные, которые: что-то блокируют в чате, в игре, в моде и еще где-то. Я сам не люблю ФСки запускать, исключением являются только те, которые абсолютно не влияют на механизмы в самом моде.

- Не слышно отзывов по коду, неужели все работает как часы?
- Отзывы по поведению скрипта выкладывайте более детальные.
Reply
#7

Quote:
Originally Posted by MX_Master
View Post
ты не учел в своем скрипте другие важные аспекты.
и какие?
Reply
#8

Самый главный аспект - ФС может быть включен уже после того, как игроки на серв законектились. И как раз таких игроков ФС твой выпустит из виду. Это ваще ошибка многих ФСописателей. Забывается, что ФС это не мод, который загружается до любого из конектов. А фс - это динамичный скрипт, который требует в себе больше динамики в обработке данных.
Reply
#9

хм, а при дисконнекте не нужно учитывать как игрок отключился? ведь бывает вылетает при обрыве связи и тут же подключается обратно, скрипт посчитает как реконнект?
Reply
#10

при вылете все равно же ты тратишь время, чтобы нажать на конект, а у кого-то хак стоит, он не выходя с игры сразу конектится.

-- слегка подумав --

ты после вылета игры сможешь зайти обратно быстрее чем за 5 секунд? ))
Reply
#11

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

ребят, те у кого куча игроков с большим пингом - не ставьте этот ФС ((:
Reply
#13

дак ведь с 0.2 паблик OnPlayerDisconnect имеет "reason"
Code:
public OnPlayerDisconnect(playerid, reason)
{
    new
        string[64],
        name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,MAX_PLAYER_NAME);
    switch(reason)
    {
        case 0: format(string,sizeof string,"%s left the server. (Timed out)",name);
        case 1: format(string,sizeof string,"%s left the server. (Leaving)",name);
        case 2: format(string,sizeof string,"%s left the server. (Kicked/Banned)",name);
    }
    SendClientMessageToAll(0xFFFFFFAA,string);
    return 1;
}
у себя сделал только чтоб при кике и выходе считало )
Reply
#14

во, все равно ведь каждый сделает свои изменения, это же не универсал
Reply
#15

Quote:
Originally Posted by mx_master
View Post
самый главный аспект - фс может быть включен уже после того, как игроки на серв законектились. и как раз таких игроков фс твой выпустит из виду. это ваще ошибка многих фсописателей. забывается, что фс это не мод, который загружается до любого из конектов. а фс - это динамичный скрипт, который требует в себе больше динамики в обработке данных.
отвечу вопросом на вопрос: накой нам знать ip тех кто уже на сервере?

зы я никогда не забываю про такие нюансы, но в данном случае это лишняя проверка.
Reply
#16

Quote:
Originally Posted by mx_master
View Post
ты после вылета игры сможешь зайти обратно быстрее чем за 5 секунд? ))
если помудить с настройками драйверов видеокарты, то вполне возможно:d
Reply
#17

Quote:
Originally Posted by ziggi
View Post
если помудить с настройками драйверов видеокарты, то вполне возможно:d
не получиться, и дело не в видеокарте, если игра выгрузилась даже мощный комп её ща 5 сек не загрузит
Reply
#18

степаха, прасти меня, я невнимательно читал твой код (((: но мой все равно быстрее

-- посморел, подумал, пишу --
кста, я невнимателно читал, т.к. там ваще ни хрена непонятно, особенно, при дисконекте игрока

-- еще посморел --
возможно, в твоем коде не учитывается ситуация, когда у игрока, который быстро реконектнулся изменился ИД

-- важное замечание --
в твоем и моем случае можно было бы использовать динамические массивы property вместо статичных массивов, которые всегда висят в памяти. Переделаю-ка я свой код (: на проперти массив..
Reply
#19

Quote:
Originally Posted by mx_master
View Post
степаха, прасти меня, я невнимательно читал твой код (((: но мой все равно быстрее

-- посморел, подумал, пишу --
кста, я невнимателно читал, т.к. там ваще ни хрена непонятно, особенно, при дисконекте игрока

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

-- важное замечание --
в твоем и моем случае можно было бы использовать динамические массивы property вместо статичных массивов, которые всегда висят в памяти. переделаю-ка я свой код (: на проперти массив..
одинаковы по скорости, проверил.
построчно пояснить?
PHP Code:
public OnPlayerDisconnect(playeridreason

    for(new 
i,gettime();i<sizeof(LastIP),i++)//думаю понятно, пробегаемся по массиву где храняться IP адреса
    

        if(
s-LastTime[i] > RTIME)//если встречаем запись у которой время больше 5 секунд обнуляем значения адреса и времени
        

            
LastIP[i] = ""
            
LastTime[i] = 0
        } 
        if(
strlen(LastIP[i]))continue;//если находим ненулевую строку пропускаем её, в случае если предыдущая проверка обнулила строку запись проиведется в неё
        
GetPlayerIp(playeridLastIP[i], 20 );//узнаем IP вышедшего игрока
        
LastTime[i] = gettime();//записываем время выхода
        
break;//обрываем дальнейшую проверку
    

    return 
1

система не зависит от ид игроков!
нука нука...
Reply
#20

проверил свой новый скрипт и наткнулся на ошибку, которая у тебя все равно есть )) при дисконекте игрока ип всегда будет 255,255,255,255

Так что мой скрипт в первом посте имеет верную логику, а твой скрипт во втором посте нет.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)