Информация о файле
Мутатор проверяет 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