Перейти к содержанию

Привязка IP (или серий IP) к одному ID. Отсекаем читеров меняющих ID


Информация о файле

Мутатор проверяет ini файл в котором прописаны пары ID игрока <-> IP игрока
То есть, если определённый игрок зашёл под странным IP, то ему доступ к игре будет закрыт
Изменить свой ID - сейчас не проблема, изменить свой IP - никогда не проблема, но подогнать пару ID+IP куда сложнее

 

Настройки:

 

Параметр ComparedBlocks - количество сравниваемых чисел используемых в IP

Например, пусть есть два IP
IP №1 = "121.45.22.15" и IP №2 = "121.45.41.15"

Eсли ComparedBlocks=1, то будут сравниваться только 1 числа каждого IP - а именно 121 и 121
Они равны и поэтому два IP считаются равными

Если ComparedBlocks=2, то сравниваться будут вначале 121 и 121, потом 45 и 45
В обоих случаях равенство. Значит эти IP равны и при ComparedBlocks=2

А вот при ComparedBlocks=3 IP уже не равны
121==121, 45==45, но 22!=41

Какое значение ставить для ComparedBlocks - дело ваше
По мне так оптимальны значения 2 или 3

Следующий параметр ForumLink - ссылка на форум или страничку соцсети (или ещё куда) ваших серверов
Там вы можете обсудить с игроком его IP. Некоторые же заходят с разных компов в игру (работа/дом/...) и IP могут отличаться очень значительно.
Ниже я напишу, как добавлять для одного игрока несколько возможных IP

 

 

И главная часть ini файла - элементы массива SecurePairList

 

SecurePairList=(PlayerName="Sgt.McNeal",PlayerIP="192.168.0.101",PlayerID="76555555555555555")

 

Здесь вроде всё понятно. Переменная PlayerName может быть любой - она тут только для удобства
Переменная PlayerIP должна задавать IP, PlayerID - задавать ID игрока

 

Если мы хотим добавить игроку несколько возможных IP пишем так

 

SecurePairList=(PlayerName="Sgt.McNeal",PlayerIP="192.168.0.101",PlayerID="76555555555555555")
SecurePairList=(PlayerName="Sgt.McNeal",PlayerIP="123.131.2.21",PlayerID="76555555555555555")
SecurePairList=(PlayerName="Sgt.McNeal",PlayerIP="54.121.11.81",PlayerID="76555555555555555")

 

То есть если мы так пропишем Sgt.McNeal настройки и поставим ComparedBlocks=2, то в игру будут допущены все
игроки с ID=76555555555555555 и с IP=192.168.xxx.xxx, 123.131.xxx.xxx, 54.121.xxx.xxx

 

Внешняя программа для конвертации (лежит в общем архиве):

 

Для тех у кого удалённая база - вам не повезло. По умолчанию в неё не пишутся IP игроков. Поэтому ждите
следующую версию мутатора, которая будет обновлять список пар IP-ID по мере захода игроков на сервера
Те же у кого локальная база - вот вам программа, которая конвертирует вашу базу в ini файл мутатора.

Инструкция:
Кидаем файл ServerPerksStat.ini в папку с программой, запускаем, получаем SecurePairMut.ini со всеми выдранными
парами. Копируем SecurePairMut.ini на сервер к мутатору.

Текст сообщения в табличке можете поправить сами в файле SecurePairMessage.uc

 

Код:

 

class SecurePairMut extends Mutator config(SecurePairMut);

var array<PlayerController> PendingPlayers;

struct SecurePairStruct
{
    var config string PlayerID;
    var config string PlayerName;
    var config string PlayerIP;
};
var config array<SecurePairStruct> SecurePairList;
var config int ComparedBlocks;
var config string ForumLink;

function PostBeginPlay()
{
    SaveConfig();
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
    if( PlayerController(Other)!=None )
    {
        PendingPlayers[PendingPlayers.Length] = PlayerController(Other);
        SetTimer(0.1,false);
    }
    return true;
}

function Timer()
{
    local string PlayerID,PlayerIP,PlayerName,tmpString;
    while( PendingPlayers.Length>0 )
    {
        PlayerID=PendingPlayers[0].GetPlayerIDHash();
        Divide(PendingPlayers[0].GetPlayerNetworkAddress(),":",PlayerIP,tmpString);
        PlayerName=PendingPlayers[0].PlayerReplicationInfo.PlayerName;
        if(IPIsDifferent(PlayerID,PlayerIP,ComparedBlocks))
            CallMessageBox(PendingPlayers[0]);
        PendingPlayers.Remove(0,1);
    }
}

function bool IPIsDifferent(string PlayerID, string PlayerIP, int N)
{
    local int i;
    local int counter;
    for(i=0;i<SecurePairList.Length;i++)
    {
        if(SecurePairList[i].PlayerID~=PlayerID)
        {
            if(SimilarIP(SecurePairList[i].PlayerIP,PlayerIP,N))
                return false;
            else
                counter++;
        }
    }
    if(counter>0)
        return true;
    return false;
}

function bool SimilarIP(string PlayerIP1, string PlayerIP2, int N)
{
    local array<string> ip1,ip2;
    local int i;
    Split(PlayerIP1, ".", ip1);
    Split(PlayerIP2, ".", ip2);
    for(i=0;i<N;i++)
    {
        if(ip1[i]!=ip2[i])
            return false;
    }
    return true;
}

function CallMessageBox(PlayerController PC)
{
    KFPlayerController(PC).ClientOpenMenu("SecurePairMut.SecurePairMessage",,ForumLink);
}

defaultproperties
{
    ComparedBlocks=2
    ForumLink="http://killingfloor.ru/forum/index.php?/topic/4119-priviazka-ip-ili-serii-ip-k-odnomu-id-otsekaem-chiterov/"
    SecurePairList(0)=(PlayerName="Sgt.McNeal",PlayerID="76561197960265728",PlayerIP="123.121.126.112")
    bAddToServerPackages=True
    GroupName="KF-SecurePair"
    FriendlyName="SecurePair"
    Description="SecurePair"

 

class SecurePairMessage extends UT2K4GUIPage;
var int tickNumber;
var string ForumLink;

event Opened(GUIComponent Sender)
{
    tickNumber=0;
    SetTimer(10,true);
    Super.Opened(Sender);
}

event HandleParameters(string Param1, string Param2)
{
    ForumLink=Param1;
    Super.HandleParameters(Param1,Param2);
}

event Timer()
{
    if(tickNumber>=3)
        MyOnClose();
    tickNumber++;
}

function bool DisconnectClick(GUIComponent Sender)
{
    local GUIController C;
    C = Controller;
    C.ViewportOwner.Console.ConsoleCommand("Disconnect");
    return true;
}

function bool VizitForumClick(GUIComponent Sender)
{
    local GUIController C;
    C = Controller;
    C.ViewportOwner.Console.ConsoleCommand("start"@ForumLink);
    return true;
}

function MyOnClose(optional bool bCanceled)
{
    DisconnectClick(self);
}

defaultproperties
{
    bRenderWorld=True
    bAllowedAsLast=True
    OnClose=SecurePairMessage.MyOnClose
    Begin Object Class=FloatingImage Name=FloatingFrameBackground
        Image=Texture'2K4Menus.BkRenders.Bgndtile'
        DropShadow=None
        ImageStyle=ISTY_Stretched
        
ImageRenderStyle=MSTY_Normal
        
WinTop=0.020000
        WinLeft=0.000000
        WinWidth=1.000000
        WinHeight=0.980000
        RenderWeight=0.000003
    End Object
    Controls(0)=FloatingFrameBackground

    Begin Object Class=GUIHeader Name=TitleBar
        bUseTextHeight=True
        Caption="Strange IP! / Странный IP!"
        WinHeight=0.043750
        RenderWeight=0.100000
        bBoundToParent=True
        bScaleToParent=True
        bAcceptsInput=True
        bNeverFocus=False
        ScalingType=SCALE_X
    
End Object
    Controls(1)=TitleBar

    Begin Object Class=GUILabel Name=RulesLabel1
        Caption="Attention! / Внимание!"
        TextColor=(B=0,R=255,G=0)
        WinTop=0.100000
        WinLeft=0.340000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(2)=RulesLabel1

    Begin Object Class=GUIButton Name=DisconnectButton
        Caption="Disconnect / Отключиться"
        WinTop=0.620000
        WinLeft=0.240000
        WinWidth=0.240000
        OnClick=SecurePairMessage.DisconnectClick
        OnKeyEvent=DisconnectButton.InternalOnKeyEvent
    End Object
    Controls(3)=DisconnectButton

    Begin Object Class=GUIButton Name=VisitForumButton
        Caption="Visit Forum / Форум"
        WinTop=0.620000
        WinLeft=0.520000
        WinWidth=0.240000
        OnClick=SecurePairMessage.VizitForumClick
        OnKeyEvent=VisitForumButton.InternalOnKeyEvent
    End Object
    Controls(4)=VisitForumButton

    Begin Object Class=GUILabel Name=RulesLabel2
        Caption=""
        TextColor=(B=255,G=255,R=255)
        WinTop=0.200000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(5)=RulesLabel2

    Begin Object Class=GUILabel Name=RulesLabel3
        Caption="You entered game under unusual IP"
        TextColor=(B=255,G=255,R=255)
        WinTop=0.250000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(6)=RulesLabel3

    Begin Object Class=GUILabel Name=RulesLabel4
        Caption=""
        TextColor=(B=255,G=255,R=255)
        WinTop=0.300000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(7)=RulesLabel4

    Begin Object Class=GUILabel Name=RulesLabel5
        Caption="Contact admin and discuss your new IP"
        TextColor=(B=255,G=255,R=255)
        WinTop=0.350000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(8)=RulesLabel5

    Begin Object Class=GUILabel Name=RulesLabel6
        Caption=""
        TextColor=(B=255,G=255,R=255)
        WinTop=0.450000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(9)=RulesLabel6

    Begin Object Class=GUILabel Name=RulesLabel7
        Caption="Вы зашли под необычным IP"
        TextColor=(B=255,G=255,R=255)
        WinTop=0.500000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(10)=RulesLabel7

    Begin Object Class=GUILabel Name=RulesLabel8
        Caption=""
        TextColor=(B=255,G=255,R=255)
        WinTop=0.550000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(11)=RulesLabel8

    Begin Object Class=GUILabel Name=RulesLabel9
        Caption="Обсудите с админом ваш новый IP"
        TextColor=(B=255,G=255,R=255)
        WinTop=0.600000
        WinLeft=0.070000
        WinWidth=0.460000
        WinHeight=20.000000
        bBoundToParent=True
    End Object
    Controls(12)=RulesLabel9

    WinTop=0.275000
    WinLeft=0.200000
    WinWidth=0.600000
    WinHeight=0.450000
}

 

 

Прописать как :

SecurePairMut.SecurePairMut

 

 


×
×
  • Создать...