Автокик за 0 ID и за некорректный ник

Тема в разделе "Общего назначения", создана пользователем Flame, 25 апр 2013.

  1. Flame

    Flame -Заслуженый кодер форума-

    Ну можно сделать и чтобы в Data.ini (как и в ServerPerksStat.ini) писалось всё нормально
     
  2. Stein

    Stein Солдат

    у кого осталась версия с блокировкой игроков с символами ~
     
  3. Flame

    Flame -Заслуженый кодер форума-

    а. да. этот мутатор тоже пора обновить
    займусь ночью
    там сможете любые спецсимволы задать )

    upd. Не успел - завтра значит)
     
    Последнее редактирование: 7 окт 2016
    Stein нравится это.
  4. RaideN-

    RaideN- Игровая Администрация

    Во ВО!! Особенно с Р~С~Р~С~С~РР
     
    Stein и w.a.l нравится это.
  5. Flame

    Flame -Заслуженый кодер форума-

    Некогда было пока полноценно переделать мутатор

    Сделал вам временную версию. Всё то же самое, но добавил массив строк SpecialSymbols
    В отличии от массива Names - там проверяется не равенство, а вхождение
    То есть можно написать
    SpecialSymbols="~" и если в имени будет "~" - игрока пошлют
    Убрал из мутатора конфиг переменную отвечающую за проверку является ли ник игрока - инет адресом
    Можно вбить
    SpecialSymbols=".com" и если в имени будет ".com" - игрока пошлют

    Вначале я ещё добавил опцию проверки на какой позиции в слове находится "спецсимвол", но потом убрал. Чем проще тем лучше

    Код:
    Код:
    class KickNickMut extends Mutator config(KickNickMut);
    
    var config array<string> Names;
    var config array<string> SpecialSymbols;
    
    var config string forumLinkZeroID;
    var config string forumLinkBadNick;
    
    var array<PlayerReplicationInfo> PlayerList;
    
    function PostBeginPlay()
    {
        SaveConfig();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if (Other.IsA('PlayerReplicationInfo'))
        {
            PlayerList[PlayerList.Length] = PlayerReplicationInfo(Other);
            SetTimer(2.0,false);
        }
        return true;
    }
    
    function Timer()
    {
        local PlayerController PC;
        while( PlayerList.Length>0 )
        {
            if(PlayerList[0].PlayerID>0)
            {
                PC=PlayerController(PlayerList[0].Owner);
                if(CheckIfZeroID(PC.GetPlayerIDHash()))
                    CallZeroIDMessageBox(PC);
                else if(CheckIfBadNick(PlayerList[0].PlayerName) || CheckIfBadNick(PlayerList[0].PlayerName))
                    CallBanNickMessageBox(PC);
            }
            PlayerList.Remove(0,1);
        }
    }
    
    function bool CheckIfZeroID(string hash)
    {
        if(hash=="0" || hash=="76561197960265728")
            return true;
        return false;
    }
    
    function bool CheckIfBadNick(string playerName)
    {
        local int i;
        for(i=0; i<Names.Length; i++)
        {
            if(playerName~=Names[i])
                return true;
        }
        for(i=0; i<SpecialSymbols.Length; i++)
        {
            if(InStr(Caps(playerName),Caps(SpecialSymbols[i]))>=0)
                return true;
        }
        return false;
    }
    
    function CallZeroIDMessageBox(PlayerController PC)
    {
        KFPlayerController(PC).ClientOpenMenu("KickNickMut.ZeroIDMessage",,forumLinkZeroID);
    }
    
    function CallBanNickMessageBox(PlayerController PC)
    {
        KFPlayerController(PC).ClientOpenMenu("KickNickMut.BanNickMessage",,forumLinkBadNick);
    }
    
    defaultproperties
    {
        Names(0)="ZomboUser"
        SpecialSymbols(0)="~"
        SpecialSymbols(1)=".com"
        forumLinkZeroID=""
        forumLinkBadNick=""
        bAddToServerPackages=True
        GroupName="KF-KickNick"
        FriendlyName="KickNickMut"
        Description="Kicks player with zero ID or prohibited nickname"
    }
    

    Ссылка
     
    kok-s и Stein нравится это.
  6. kok-s

    kok-s Консильери

    Чуть ОФФтопа.
    Прочитав пост вспомнил проблему в ЭТОЙ теме ну и + в другой про сохранения ника.

    Суть в чём: У меня стоит этот мутатор и те 2 правки в ServerPerks. Так вот, что происходит у меня. Игрок заходит первый раз на сервер с русским ником. Выполняется замена символов как и должно быть, но при нажатии игроком на таблицу его ник превращается в ~~~~~~~~~ и сохраняется навсегда после карты. Далее меняется карта и мутатор KickNickMut шлёт игрока на*** из за символа ~ в нике. Ситуация прям так скажем не камельфо.

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

    Flame -Заслуженый кодер форума-

    Сервак с удалённой базой данных?
     
  8. kok-s

    kok-s Консильери

    Да с ней.
     
  9. Flame

    Flame -Заслуженый кодер форума-

    Так. Я поправил код и FixSteamRusNameMut и код в SP для фиксации
    Но там ведь фигня в том, что нельзя сохранить кириллицу в удалённом Data.ini файле
    Надо свой клиент с базой данных писать для этого видимо.

    Вот я накидал мутатор, который фиксирует ники игроков в файле на сервере
    В начале статьи его расположил. Потом я его поправлю, небось, но вроде работает
    Потестили бы вы - владельцы серваков с удалённой базой данных
     
    kok-s нравится это.
  10. Flame

    Flame -Заслуженый кодер форума-

    Очередная вариация мутатора
    Данная версия не пускает игрока с плохим ником, с ником содержащим спец символы, с запрещённым IP, с запрещённым ID
    Но самое главное не пускает на самом раннем этапе - до того, как он подключится на сервер
    Никакие ресурсы сервера не качаются - игрок сразу посылается
    [​IMG]

    Давно хотел разобраться как работает недопуск на самом раннем этапе - разобрался.
    Кому интересно - глядите код. Там всё написано.

    Данная версия мутатора требует наличия SP или аналогичного мутатора, потому как нам потребуется внести изменения в функцию геймтайпа PreLogin

    Настройки:
    Во многом мутатор аналогичен предшественникам

    FailCodeString - Текст ошибки в 1 строке, в этой переменной помещается не так много символов. Если переборщить она залезет на 2 строку
    ErrorString - Массив ошибок во 2 строке. Я сделал отдельную ошибку для каждого случая: неправильные Имя, IP, ID
    Поэтому данный массив содержит 3 элемента. Та абракадабра перед надписью это префикс для окраски в красный цвет. Подробнее тут.
    IPs - Массив запрещённых IP. При этом значение должно содержать хотя бы 4 символа - я поставил проверку от дураков, чтобы не было запрета из-за того, что кто-то прописал там какую-нибудь одну цифру, например.
    Можно задавать неполный IP, а подсеть
    Например, IPs="1.2.3" исключит всех игроков с IP "1.2.3.?","?.1.2.3". Да, в идеале бы только первых исключать, но лень было более сложный код писать)
    То есть просто идёт проверка есть ли в строке отвечающей за IP игрока, подстрока прописанная в одном из IPs.
    IDs - Массив запрещённых ID. Я там (в файле настроек) сразу прописал 0 (нулевой) ID, чтобы их владельцы автоматически шли нафик
    SpecialSymbols - Массив спец символов (скорее спец строк, ибо тут может быть сколько угодно длинная строка).
    Если ник содержит этот спец символ (примеры: "~",".com"), то игрок не допускается
    Names - Список запрещённых имён

    Если пишете текст ошибки с использованием кириллицы - не забывайте конвертировать ini файл в LittleEndian
    [​IMG]

    Код:
    Сам мутатор
    Код:
    class KickNickMut extends Mutator config(KickNickMut);
    
    var config array<string> Names;
    var config array<string> IPs;
    var config array<string> IDs;
    var config array<string> SpecialSymbols;
    var config string FailCodeString;
    var config array<string> ErrorString;
    
    /*
    //Автоматическое создание ini файла. Уберу пока что. Кому надо - раскомментируйте
    function PostBeginPlay()
    {
        SaveConfig();
    }
    */
    
    function bool PlayerHasBadNick(string playerName)
    {
        local int i;
        for(i=0; i<Names.Length; i++)
        {
            if(playerName~=Names[i])
                return true;
        }
        for(i=0; i<SpecialSymbols.Length; i++)
        {
            if(InStr(Caps(playerName),Caps(SpecialSymbols[i]))>=0)
                return true;
        }
        return false;
    }
    function bool PlayerHasBadIP(string PlayerIP)
    {
        local int i;
        for(i=0;i<IPs.Length;i++)
        {
            if(InStr(Caps(PlayerIP),Caps(IPs[i]))>=0 && Len(IPs[i])>3)
                return true;
        }
        return false;
    }
    function bool PlayerHasBadID(string hash)
    {
        local int i;
        for(i=0; i<IDs.Length; i++)
        {
            if(hash~=IDs[i])
                return true;
        }
        return false;
    }
    
    event bool OverrideDownload( string PlayerIP, string PlayerID, string PlayerName, out string RedirectURL )
    {
        if(RedirectURL=="PreLoginRequest")
        {
            if(PlayerHasBadNick(PlayerName))
                RedirectURL=ErrorString[0]$"|"$FailCodeString;
            else if(PlayerHasBadIP(PlayerIP))
                RedirectURL=ErrorString[1]$"|"$FailCodeString;
            else if(PlayerHasBadID(PlayerID))
                RedirectURL=ErrorString[2]$"|"$FailCodeString;
        }
        if(NextMutator!=None)
            return NextMutator.OverrideDownload(PlayerIP, PlayerID, PlayerName, RedirectURL);
        return true;
    }
    
    defaultproperties
    {
        ErrorString(0)="You Name is prohibited!"
        ErrorString(1)="You IP is prohibited!"
        ErrorString(2)="You ID is prohibited!"
        FailCodeString="Error"
        Names(0)="ZomboUser"
        IPs(0)="192.168.0.101"
        IDs(0)="76561197960265728"
        SpecialSymbols(0)="~"
        SpecialSymbols(1)=".com"
        GroupName="KF-KickNick"
        FriendlyName="KickNickMut"
        Description="Kicks player with prohibited name, IP or ID"
    }
    
    SRGameType
    Код:
    class SRGameType extends KFGameType config;
    ...
    //Flame 2016.10.21 Обрабатываем процедуру доступа игрока к серверу. Используется в мутаторе KickNickMut
    event PreLogin( string Options, string Address, string PlayerID, out string Error, out string FailCode )
    {
        local string PlayerName, CodeAndError;
        local int nameStartPos, nameEndPos;
        local array<string> parts;
        Super.PreLogin(Options,Address,PlayerID,Error,FailCode);
        //Даём мутатору понять, что нас вызвал PreLogin. В противном случае KickNick просто не обрабатывает запрос
        CodeAndError="PreLoginRequest";
        //
        //Вытаскиваем ник игрока из строки Options. Обычно это строка выглядит так:
        //?LAN?Class=Engine.Pawn?Character=Steampunk_MrFoster?team=1?Name=Flame?VAC=1
        nameStartPos=InStr(Options,"Name=") + 5;
        nameEndPos=InStr(Options,"?VAC");
        if(nameStartPos>=0 && nameEndPos>=0 && nameStartPos<nameEndPos)
            PlayerName=Mid(Options,nameStartPos,nameEndPos-nameStartPos);
        //
        //Вызываем функцию OverrideDownload на всех мутаторах
        //Мы используем эту функцию так как она очень редко где используется. Я не нашёл таких мутаторов. Кроме того она по-умолчанию
        //возвращает значение, которое не портит работу сервера (не будет такого, что всем игрокам доступ запрещён)
        if(Len(PlayerName)>0)
            BaseMutator.OverrideDownload(Address,PlayerID,PlayerName,CodeAndError);
        //Мы не трогаем возвращаемое значение функции! Результат смотрим в строке CodeAndError
        //Если там есть слова разделённые символом "|", то считаем, что доступ игроку закрыт, а эти слова - это информация об ошибке
        //Иначе считаем, что игрок допущен и ничего не делаем.
        Split(CodeAndError,"|",parts);
        if(parts.Length>1)
        {
            Error=parts[0];
            FailCode=parts[1];
        }
    }
    //
    ...
    
    Если у вас нет SRGameType - создаёте с нуля и добавляете в ServerPerksMut такую строчку.
    Либо сами напрямую прописываете этот геймтайп везде в ini файлах и файле запуска.
    Код:
    Class ServerPerksMut extends Mutator Config(ServerPerks);
    ...
    function PostNetBeginPlay()
    {
        ...
        if(SRGameType(Level.Game)==none)
            Level.ServerTravel("?game=ServerPerks.SRGameType",true);
        ...
    }
    ...
    

    Ссылка 1 или Ссылка 2
    KickNickMut.KickNickMut
     
    Последнее редактирование: 21 окт 2016
    Stein нравится это.
  11. RaideN-

    RaideN- Игровая Администрация

    функция PreLogin довольно интересная) можно ли сделать так чтобы по аналогии с этим в момент подключения сервер добавлялся в избранное?
     
  12. Flame

    Flame -Заслуженый кодер форума-

    Во время вызова PreLogin некому добавлять сервер в избранное. Есть только минимальная информация об игроке. Сервер в избранное можно добавить в любом PostBeginPlay (ну или PreBeginPlay или ещё где) любого мутатора
     
  13. RaideN-

    RaideN- Игровая Администрация

    Жаль конечно
     
  14. Flame

    Flame -Заслуженый кодер форума-

    Мне сложно тебя понять. Какая разница? Добавляется сервак в избранное при начале загрузки ресурсов или сразу после загрузки. У тебя столько ресурсов, что никто не дожидается загрузки? )