[Include] Anti Quick ReConnect
#1

AQRC v1.0 by White_116
Не большой инклуд по просьбам участников форума. Инклуд не дает игроку быстро реконектится после выхода. Если пауза между выходом и входом одного и того же игрока меньше 15(настраивается) сек, то войти он не сможет. Если у игрока был просто тайм аут соединения, то его этот запрет не коснется. Так же добавлен фикс кика и бана для серверов X версии, что позволяет выводить причину игроку. Присутствует защита на перезаход без выполнения выхода и мультиконнект игроков, т.е. с одного ип адреса может зайти лишь один игрок.
Так же присутствует защита от "сохранения бана игроков" при падений мода. Когда после падение мода временно забаненные игроки оставались забаненные. Для хранения временно забаненных игроков используется БД SQL.

Инклуд содержит функции:
PHP код:
native AQRC_Ban(playeridreason[]);//Банитит игрока. Если указана причина то аналогичен BanEx иначе просто Ban.
native AQRC_Kick(playerid);//Кикает игрока.
native AQRC_UnBanIP(iip);//Разбанивает указаный ип в БД и в бан листе.
native AQRC_ScriptInit();//Разбанивает "псевдозабаненых" игроков. создаёт таблицу.
native AQRC_ScriptExit();//Закрывает БД.
native AQRC_OnPlayerConnect(playerid);//Проверка на "правильный" коннект.
native AQRC_OnPlayerDisconnect(playeridreason);//"Банит" игрока.
native AQRC_OnPlayerUpdate(playerid);//Фикс кика и бана.
native int2ip(iipszIP[]);//переводит ип из числа в строку.
native ip2int(szIP[]);//переводит ип из строки в число. 
Пример использования:
pawn Код:
#include <a_samp>
#include <AQRC>

public OnGameModeInit()
{
    AQRC_ScriptInit();
    return 1;
}

public OnGameModeExit()
{
    AQRC_ScriptExit();
    return 1;
}

public OnPlayerConnect(playerid)
{
    new reason;
    if(reason=AQRC_OnPlayerConnect(playerid))
    {
        printf("Не верная попытка входа. Причина: %d",reason);
        AQRC_Ban(playerid, "Плохое подключение.");//забаним игрока
        Ban(playerid);//ускорим процесс бана
    }
    //CODE
    return 1;
}

public OnPlayerDisconnect(playerid,reason)
{
    //CODE нельзя выйти раньше, должен выполниться AQRC_OnPlayerDisconnect!
    return AQRC_OnPlayerDisconnect(playerid, reason);
}

public OnPlayerUpdate(playerid)
{
    if(AQRC_OnPlayerUpdate(playerid) == 0)return 0;
    //CODE
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp("/kick", cmdtext, true, 5) == 0)
    {
        print("kick");
        strdel(cmdtext,0,6);
        new p=strval(cmdtext);
        SendClientMessage(p,-1,"ты был кикнут.");
        AQRC_Kick(p);
        return 1;
    }
    return 0;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(KEY_YES & newkeys)
    {
        SendClientMessage(playerid,-1,"ты был кикнут.");
        AQRC_Kick(playerid);
    }
    return 1;
}
Внимание:
-Для бана игрока используйте AQRC_Ban иначе его разбанит через ReConnectTime мс.
-Обратите внимание в примере на //CODE - это означает, что только там может располагаться ваш код.

Просмотреть/Скачать: Pastebin
Немного изменил код. Теперь можно самому выбрать наказание за "плохие" подключения.
Reply
#2

Было бы не плохо ещё добавить бан по IP за флуд реконнектами если много раз за одну секунду.
Reply
#3

Quote:
Originally Posted by XemyL
Посмотреть сообщение
Было бы не плохо ещё добавить бан по IP за флуд реконнектами если много раз за одну секунду.
Флуд реконнектами не возможен, так как игрок покинет сервер у будет временно забанен.
Но вы у помянули о бане. Сделал это возможным. Смотрите пример.
Reply
#4

Quote:

new reason;
if(reason=AQRC_OnPlayerConnect(playerid))
{

немного странно, или мне кажется?
Reply
#5

Просто у меня вместо reason другие переменный. Т.е. создаю одну меперенную и использую для 5 присвоений и проверок.
Reply
#6

Впихнул в мод ну получилось так что игрока вообще не кикает

AQRC_Kick(playerid); т.е не пашет функция
Reply
#7

Мне кажется или
PHP код:
new reason;
    if(
reason=AQRC_OnPlayerConnect(playerid)) 
Тоже самое что:
PHP код:
if(AQRC_OnPlayerConnect(playerid)) 
Reply
#8

Quote:
Originally Posted by Cypen
Посмотреть сообщение
Мне кажется или
PHP код:
new reason;
    if(
reason=AQRC_OnPlayerConnect(playerid)) 
Тоже самое что:
PHP код:
if(AQRC_OnPlayerConnect(playerid)) 
Для проверки да, но в первом случае мы дополнительно сохраняем результат проверки в переменную, для её последующего использования.
Reply
#9

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Для проверки да, но в первом случае мы дополнительно сохраняем результат проверки в переменную, для её последующего использования.
А да точно, не посмотрел.
Reply
#10

Quote:

new reason;
if(reason=AQRC_OnPlayerConnect(playerid))
{

Я один заметил некорректность условия if? Не хватает знака равенства вроде бы.
Reply
#11

Quote:
Originally Posted by warlock02
Посмотреть сообщение
Я один заметил некорректность условия if? Не хватает знака равенства вроде бы.
Всё окей. Это присвоение
Reply
#12

Quote:
Originally Posted by warlock02
Посмотреть сообщение
Я один заметил некорректность условия if? Не хватает знака равенства вроде бы.
Я один заметил что у вас проблемы со зрением, двумя постами ранее этот вопрос был рассмотрен?!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)