rott/kf_sources/AdminPlus_v4/Classes/PlayerControllerArray.uc
2026-07-14 20:27:09 +07:00

351 lines
20 KiB
Ucode
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class PlayerControllerArray extends Actor;
var array<KFPlayerController> playerControllersArray;
var string pcArrayNames;
var string pcArrayNamesUnfound;
var bool isNamesPlural; //for example "name1"=0; "name1, name2"=1; "All players"=1
var KFPlayerController admin;
var KFPlayerController currentPlayer;
var int currentPlayerNumber;
function private clean()
{
if(playerControllersArray.length > 0)
playerControllersArray.remove(0, playerControllersArray.length);
pcArrayNames = "";
pcArrayNamesUnfound = "";
isNamesPlural = false;
currentPlayer = none;
currentPlayerNumber = 0;
}
function bool findPlayers(string inputNames)
{
//iteration things
local Controller c;
local KFPlayerController kfpc;
local int i;
local array<string> nicknames;
local array<int> ids;
local array<byte> nicknamesFound; //yes, it should be "bool", but it doesn't work, ffs
//buffer values
local string idsString;
local array<string> idsStringSplitted;
clean();
switch(inputNames)
{
case "":
playerControllersArray[0] = admin;
pcArrayNames = admin.playerReplicationInfo.playerName;
break;
case "all":
case "ingame":
for(c = level.controllerList; c != none; c = c.nextController)
{
kfpc = KFPlayerController(c);
if(kfpc != none)
if(kfpc.playerReplicationInfo != none)
if(!kfpc.playerReplicationInfo.bOnlySpectator)
{
playerControllersArray[playerControllersArray.length] = kfpc;
}
}
pcArrayNames = "All players";
isNamesPlural = true;
break;
case "specs":
case "spectators":
for(c = level.controllerList; c != none; c = c.nextController)
{
kfpc = KFPlayerController(c);
if(kfpc != none)
if(kfpc.playerReplicationInfo != none)
if(kfpc.playerReplicationInfo.bOnlySpectator)
{
playerControllersArray[playerControllersArray.length] = kfpc;
}
}
pcArrayNames = "All spectators";
isNamesPlural = true;
break;
case "everybody":
for(c = level.controllerList; c != none; c = c.nextController)
{
kfpc = KFPlayerController(c);
if(kfpc != none)
playerControllersArray[playerControllersArray.length] = kfpc;
}
pcArrayNames = "Everybody (including spectators)";
break;
default:
//filling array with nicknames which should be found
split(caps(inputNames), ",", nicknames);
//filling array with IDs
for(i = nicknames.length - 1; i >= 0 ; i--)
{
//removing void names
if(nicknames[i] == "")
nicknames.remove(i, 1);
if(left(caps(nicknames[i]), 3) == "ID:")
{
idsString = repl(nicknames[i], "ID", "")$idsString;
nicknames.remove(i, 1);
}
}
if(idsString != "")
{
split(idsString, ":", idsStringSplitted);
for(i = 0; i < idsStringSplitted.length; i++)
{
//avoiding wrong typed IDs (with chars) and WebAdmin
if(int(idsStringSplitted[i]) > 0)
ids[ids.length] = int(idsStringSplitted[i]);
}
//DEBUG//////////////////////////////////////////
/*
admin.teamMessage(none, "DEBUG INFORMATION (DETELE THIS BLOCK LATER)", 'AdminPlus');
admin.teamMessage(none, " IDs:", 'AdminPlus');
for(i = 0; i < ids.length; i++)
{
admin.teamMessage(none, " "$string(ids[i]), 'AdminPlus');
}
admin.teamMessage(none, " NICKNAMES:", 'AdminPlus');
for(i = 0; i < nicknames.length; i++)
{
admin.teamMessage(none, " "$nicknames[i], 'AdminPlus');
}
*/
/////////////////////////////////////////////////
}
//just create array with the same length and fill it with 'false'
nicknamesFound[nicknames.length - 1] = 0;
//finding players
for(c = level.controllerList; c != none; c = c.nextController)
{
kfpc = KFPlayerController(c);
if(kfpc != none)
if(kfpc.playerReplicationInfo != none)
{
//find player with nickname
for(i = 0; i < nicknames.length; i++)
if(inStr(caps(kfpc.playerReplicationInfo.playerName), nicknames[i]) >= 0)
{
if(!isPlayerInArray(kfpc))
{
playerControllersArray[playerControllersArray.length] = kfpc;
if(playerControllersArray.length == 1)
pcArrayNames = kfpc.playerReplicationInfo.playerName;
else
pcArrayNames = pcArrayNames$","@kfpc.playerReplicationInfo.playerName;
//player with this nickaname was found
nicknamesFound[i] = 1;
}
//continue; (shouldn't do it, it will affect 'pcArrayNamesUnfound')
//i.e. for example (it's player NikC- and input string was "ni, ik, john, nikc")
//so 'ni', 'ik', and 'nikc' should be all checked as found (not just 'ni')
}
//find player with ID
for(i = 0; i < ids.length; i++)
if(kfpc.playerReplicationInfo.playerId == ids[i])
{
if(!isPlayerInArray(kfpc))
{
playerControllersArray[playerControllersArray.length] = kfpc;
if(playerControllersArray.length == 1)
pcArrayNames = kfpc.playerReplicationInfo.playerName;
else
pcArrayNames = pcArrayNames $ "," @ kfpc.playerReplicationInfo.playerName;
}
continue;
}
}
}
for(i = 0; i < nicknames.length; i++)
{
if(nicknamesFound[i] == 0)
{
if(pcArrayNamesUnfound == "")
pcArrayNamesUnfound = nicknames[i];
else
pcArrayNamesUnfound = pcArrayNamesUnfound $ ", " $ nicknames[i];
}
}
if(playerControllersArray.length > 1)
isNamesPlural = true;
}
if(playerControllersArray.length == 0)
return false;
return true;
}
function private bool isPlayerInArray(KFPlayerController inKfpc)
{
local int i;
for(i = 0; i < playerControllersArray.length; i++)
if(playerControllersArray[i] == inKfpc)
return true;
return false;
}
function bool nextPlayer()
{
if(playerControllersArray.length == 0)
return false;
//first cycle in "while(pca.nextPlayer){}" so "pca.currentPlayer()" will return 1st player
if(currentPlayer == none && currentPlayerNumber == 0)
{
currentPlayer = playerControllersArray[0];
return true;
}
if((currentPlayerNumber + 1) < playerControllersArray.length)
{
currentPlayerNumber++;
currentPlayer = playerControllersArray[currentPlayerNumber];
return true;
}
else
{
currentPlayer = none;
return false;
}
}
function KFPlayerController getCurrentPlayer()
{
return currentPlayer;
}
function string getCurrentPlayerName()
{
if(currentPlayer != none)
if(currentPlayer.playerReplicationInfo != none)
return class'Helper'.static.ParsePlayerName(currentPlayer);
}
function string getNames()
{
return pcArrayNames;
}
function bool hasUnfoundPlayers()
{
return pcArrayNamesUnfound != "";
}
function string getNamesUnfound()
{
return pcArrayNamesUnfound;
}
function bool isPluralForm()
{
return isNamesPlural;
}
function bool applyFilter(string filter)
{
local int i;
local bool bFilterApplied;
//applying the filter:
switch(filter)
{
case "hasPawn":
for(i = playerControllersArray.length - 1; i >= 0; i--)
if(playerControllersArray[i] == none || playerControllersArray[i].pawn == none)
{
playerControllersArray.remove(i, 1);
bFilterApplied = true;
}
break;
case "isSpectator":
for(i = playerControllersArray.length - 1; i >= 0; i--)
if(playerControllersArray[i] == none || playerControllersArray[i].playerReplicationInfo == none ||
!playerControllersArray[i].playerReplicationInfo.bOnlySpectator)
{
playerControllersArray.remove(i, 1);
bFilterApplied = true;
}
break;
case "isInGame":
for(i = playerControllersArray.length - 1; i >= 0; i--)
if(playerControllersArray[i] == none || playerControllersArray[i].playerReplicationInfo == none ||
playerControllersArray[i].playerReplicationInfo.bOnlySpectator)
{
playerControllersArray.remove(i, 1);
bFilterApplied = true;
}
break;
}
if(!bFilterApplied)
return playerControllersArray.length > 0;
//
//In case at least one player was deleted from player list
//all information has to be refreshed
//
//reset
currentPlayer = none;
currentPlayerNumber = 0;
//refreshing "pcArrayNames":
pcArrayNames = "";
for(i = 0; i < playerControllersArray.length; i++)
{
if(pcArrayNames == "")
pcArrayNames = playerControllersArray[i].playerReplicationInfo.playerName;
else
pcArrayNames = pcArrayNames $ "," @ playerControllersArray[i].playerReplicationInfo.playerName;
}
if(playerControllersArray.length == 0)
return false;
//refreshing "isNamesPlural":
isNamesPlural = playerControllersArray.length > 1;
return true;
}
defaultproperties
{
bHidden=true
}