1
0
KF2-Dev-Scripts/KFGame/Classes/KFAccessControl.uc
2020-12-13 18:01:13 +03:00

162 lines
4.0 KiB
Ucode

//=============================================================================
// KFAccessControl
//=============================================================================
// Extended Functionality for Admin controls
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Christian "schneidzekk" Schneider
//=============================================================================
class KFAccessControl extends AccessControl;
var globalconfig bool bSilentAdminLogin; // If set, there will be no announcement when an Admin logs in
var Array<UniqueNetID> SessionBannedIDs;
/**
* @brief Kick a player and session bans the UniqueId
*
* @param C The kicked player's controller
* @param KickReason Text shown to the player with a reason for the kick
*
* @return Kick/sessionban un/successfull
*/
function KickSessionBanPlayer( PlayerController C, UniqueNetID KickBanID, string KickReason )
{
if( KickBanID != class'PlayerReplicationInfo'.default.UniqueId )
{
if( !IsIDBanned( KickBanID ) && !IsSessionBanned( KickBanID ) )
{
SessionBannedIDs.AddItem( KickBanID );
}
// Kick player from server if they didn't leave before vote ended
if( C != none )
{
KickPlayer( C, KickReason );
}
}
}
/** Overriden from AccessControl.uc, controller is removed in ClientWasKicked() */
function bool ForceKickPlayer(PlayerController C, string KickReason)
{
if (C != None && NetConnection(C.Player)!=None )
{
if (C.Pawn != None)
{
C.Pawn.Suicide();
}
C.ClientWasKicked();
return true;
}
return false;
}
function AdminEntered( PlayerController P )
{
if(P == none)
{
return;
}
if(bSilentAdminLogin)
{
P.ReceiveLocalizedMessage(Class'KFLocalMessage', LMT_AdminLogin, P.PlayerReplicationInfo);
}
else
{
P.BroadcastLocalizedMessage(class'KFLocalMessage', LMT_AdminLogin, P.PlayerReplicationInfo);
}
}
function AdminExited( PlayerController P )
{
if(P == none)
{
return;
}
if(bSilentAdminLogin)
{
P.ReceiveLocalizedMessage(Class'KFLocalMessage', LMT_AdminLogout, P.PlayerReplicationInfo);
}
else
{
P.BroadcastLocalizedMessage(class'KFLocalMessage', LMT_AdminLogout, P.PlayerReplicationInfo);
}
}
/** Overridden so we do not commit suicide upon logging out */
function bool AdminLogout(PlayerController P)
{
if (P.PlayerReplicationInfo.bAdmin)
{
P.PlayerReplicationInfo.bAdmin = false;
P.bGodMode = false;
return true;
}
return false;
}
/**
* @brief Kick a player and perma bans the IP
*
* @param C The kicked player's controller
* @param KickReason Text shown to the player with a reason for the kick
*
* @return Kick/ban un/successfull
*/
function KickBanPlayer( PlayerController C, string KickReason )
{
local string IP;
if( NetConnection( C.Player ) != None )
{
if( !WorldInfo.IsConsoleBuild() )
{
IP = C.GetPlayerNetworkAddress();
if( CheckIPPolicy( IP ) )
{
IP = Left(IP, InStr(IP, ":"));
`Log("Adding IP Ban for: "$IP);
IPPolicies[IPPolicies.length] = "DENY," $ IP;
SaveConfig();
}
}
if( C.PlayerReplicationInfo.UniqueId != C.PlayerReplicationInfo.default.UniqueId &&
!IsIDBanned( C.PlayerReplicationInfo.UniqueID ) )
{
BannedIDs.AddItem( C.PlayerReplicationInfo.UniqueId );
SaveConfig();
}
KickPlayer( C, KickReason );
return;
}
}
/**
* @brief Checks if UniqueNetID is already banned
*
* @param UniqueNetID Player's unique net ID
* @return Ban found or not
*/
function bool IsSessionBanned( const out UniqueNetID NetID )
{
return SessionBannedIDs.Find('Uid', NetID.Uid) > INDEX_NONE;
}
/**
* @brief Called from gameinfo when player joins server
*
* @param UniqueNetID Player's unique net ID
* @return Ban found or not
*/
function bool IsIDBanned(const out UniqueNetID NetID)
{
return ( IsSessionBanned(NetID) || super.IsIDBanned(NetID) );
}