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

2125 lines
121 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 UltraAdmin extends Admin
config(AdminPlus_v4);
var APWeaponList APWeaponList;
var xAdminUser CurAdmin; // Currently logged admin (not thread safe)
var bool bSilent;
var bool bMaster;
var localized string MSG_PMSent;
var localized string MSG_PlayersNotFound;
var localized string MSG_AdminLogin;
var localized string MSG_AdminLoginS;
var localized string MSG_AdminLogout;
var localized string MSG_SetSpeed;
var localized string MSG_NotLobby;
var localized string MSG_ForceReady;
var localized string MSG_Lock;
var localized string MSG_UnLock;
var localized string MSG_DoorRestore;
var localized string MSG_DoorUnweld;
var localized string MSG_DoorIgnore;
var localized string MSG_DoorAttack;
var localized string MSG_DoorWeldOff;
var localized string MSG_DoorWeldOn;
var localized string MSG_Kill;
var float LastKillTime;
var transient int addedFakes;
//var string LogName;
//var string sFileFormat;
//var FileLog CurrentLog;
//var transient bool bInitiated;
//var float defaultSpawnRate;
//var float currentSpawnRate;
//TODO: 1. make work with silent login
// 2. remove "pca.admin =" part, and make it in pca's postBeginPlay
var PlayerControllerArray pca;
var APCleanList APCleanList;
var APRageList APRageList;
var APPawnActions APPawnActions;
var KFGameType KFGT;
// N.B.
// level.game.accessControl -> Manager
//=========================================================================
function Created()
{
super.Created();
/* if(bInitiated)
return;
bInitiated = true; */
KFGT = KFGameType(level.game);
if(KFGT == none)
log("Admin Plus: YOU FAILED FAGGOT! KFGameType is not found!");
if(APCleanList == none)
APCleanList = spawn(class'APCleanList',outer);
if(APRageList == none)
APRageList = spawn(class'APRageList');
if(APPawnActions == none)
APPawnActions = spawn(class'APPawnActions');
/* if(CurrentLog != none)
return;
CurrentLog = Spawn(class'FileLog');
LogName = LogFilename();
CurrentLog.OpenLog(LogName);
log("AdminPlus: Log File is created!"); */
}
//=========================================================================
// handle safe destroy and servertravel
event Destroyed()
{
DestroyMyObjects();
super.Destroyed();
}
// remove all refs and wipe spawned actors
function DestroyMyObjects()
{
if(pca != none)
{
pca.Destroy();
pca = none;
}
if(APCleanList != none)
{
APCleanList.Destroy();
APCleanList = none;
}
if(APRageList != none)
{
APRageList.Destroy();
APRageList = none;
}
if(APPawnActions != none)
{
APPawnActions.Destroy();
APPawnActions = none;
}
}
//=========================================================================
// modify Login, Logout messages, add TempAdmin feature
function DoLogin(string Username, string Password)
{
if(Manager.AdminLogin(outer, username, password))
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(!bSilent)
BroadcastText(GetPlayerName(outer)$MSG_AdminLogin);
else
BroadcastText(GetPlayerName(outer)$MSG_AdminLoginS);
bAdmin = true;
pca = spawn(class'PlayerControllerArray', outer);
pca.admin = KFPlayerController(outer);
//CurrentLog.Logf(GetPlayerName(outer)$" logged in as Evil Admin.");
}
if(outer.playerReplicationInfo.bAdmin == true && !Manager.AdminLogin(outer, username, password))
{
Manager.AdminLogout(Outer);
Manager.AdminLogin(outer, "ut2004", Manager.Users.Get(0).Password);
bAdmin = true;
pca = spawn(class'PlayerControllerArray', outer);
pca.admin = KFPlayerController(outer);
BroadcastText(GetPlayerName(outer)$" logged in as %rFake Admin.");
}
}
function doLoginSilent(string username, string password)
{
local bool bWasSilent;
bWasSilent = Outer.PlayerReplicationInfo.bSilentAdmin;
if (!bWasSilent && Manager.adminLoginSilent(outer, username, password))
{
// bAdmin = true;
SendMessage(outer,"%wYou silently logged in as a server administrator. No one noticed :p");
log("Admin Plus: "$GetPlayerName(outer)$" logged in silently.");
}
}
function DoLogout()
{
local bool bWasSilent;
bWasSilent = Outer.PlayerReplicationInfo.bSilentAdmin;
if(Manager.AdminLogout(outer))
{
pca.destroy();
bAdmin = false;
if(bWasSilent)
{
bWasSilent = false;
SendMessage(outer,"%wYou silently gave up administrator abilities.");
log("Admin Plus: "$GetPlayerName(outer)@ "logged in silently.",);
return;
}
BroadcastText(GetPlayerName(outer)$MSG_AdminLogout);
}
}
//=========================================================================
exec function SloMo(float Speed)
{
Speed = fClamp(Speed, 0.1, 7.0);
BroadcastText(GetPlayerName(outer)$MSG_SetSpeed$Speed);
level.game.SetGameSpeed(Speed);
}
//=========================================================================
exec function SetGravity(float F)
{
local PhysicsVolume PV;
local vector XYDir;
local float ZDiff, Time;
local JumpPad J;
local NavigationPoint N;
local name VolumeTag;
foreach AllActors(class'PhysicsVolume', PV, VolumeTag)
{
PV.Gravity.Z = F;
PV.NetUpdateTime = Level.TimeSeconds - 1;
PV.bAlwaysRelevant = true;
if ( PV.IsA('DefaultPhysicsVolume') )
Level.DefaultGravity = PV.Gravity.Z;
for ( N=Level.NavigationPointList; N!=none; N=N.NextNavigationPoint )
if ( N.IsA('JumpPad') && PV.Encompasses( N ) )
{
J = JumpPad(N);
if ( J != none )
{
XYDir = J.JumpTarget.Location - J.Location;
ZDiff = XYDir.Z;
Time = 2.5f * J.JumpZModifier * Sqrt(Abs(ZDiff/F));
J.JumpVelocity = XYDir/Time;
J.JumpVelocity.Z = ZDiff/Time - 0.5f * F * Time;
}
}
}
BroadcastText(GetPlayerName(outer)$" changed game gravity to -%b "$F);
}
exec function SG(float gr)
{
SetGravity(gr);
}
//=========================================================================
// make Target Invisible
exec function InvisOn(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().pawn.bHidden = true;
BroadcastText(GetPlayerName(outer)$" forced %b"$pca.getNames()$"%w to be %rinvisible");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
// make Target visible
exec function InvisOff(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().pawn.bHidden = false;
BroadcastText(GetPlayerName(outer)$" forced "$pca.getNames()$" to be %rvisible");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
exec function Summon(string ClassName)
{
local class<actor> NewClass;
local vector SpawnLoc;
NewClass = class<actor>(DynamicLoadObject(ClassName, class'Class'));
if(NewClass != none)
{
if(pawn != none)
SpawnLoc = pawn.Location;
else
SpawnLoc = Location;
Spawn( NewClass,,,SpawnLoc + 72 * Vector(Rotation) + vect(0,0,1) * 15 );
}
}
//=========================================================================
exec function AdvancedSummon(string ClassName,string target)
{
local class<actor> NewClass;
local vector SpawnLoc;
NewClass = class<actor>(DynamicLoadObject(ClassName,class'Class'));
if(NewClass == none)
{
SendMessage(outer,"%wCan't find class: %b"$className);
return;
}
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
SpawnLoc = pca.getCurrentPlayer().pawn.Location;
Spawn( NewClass,,,SpawnLoc + 72 * Vector(Rotation) + vect(0,0,1) * 15 );
}
}
else
{
while(pca.nextPlayer())
{
SpawnLoc = Location;
Spawn( NewClass,,,SpawnLoc + 72 * Vector(Rotation) + vect(0,0,1) * 15 );
}
}
BroadcastText(GetPlayerName(outer)$" summoned %r"$pca.getNames()$"!");
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
exec function Teleport()
{
local actor HitActor;
local vector HitNormal, HitLocation;
HitActor = Trace(HitLocation, HitNormal, ViewTarget.Location + 10000 * vector(Rotation),ViewTarget.Location, true);
if(HitActor == none)
HitLocation = ViewTarget.Location + 10000 * vector(Rotation);
else
HitLocation = HitLocation + ViewTarget.CollisionRadius * HitNormal;
ViewTarget.SetLocation(HitLocation);
ViewTarget.PlayTeleportEffect(false,true);
}
exec function tp()
{
Teleport();
}
//=========================================================================
exec function GiveItem(coerce string ItemName, coerce string target)
{
local pawn player;
local array<string> Items;
local int i;
//local string ItemOnly;
bSilent = class'Helper'.static.CheckSilent(outer,self);
split(ItemName, ",", Items);
//ItemOnly = Repl(ItemName,Left(ItemName,Instr(ItemName,".")+1),"");
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
player = pca.getCurrentPlayer().pawn;
for(i = Items.length - 1; i >= 0 ; i--)
{
//skip void text
if(Items[i] == "")
continue;
player.GiveWeapon(Items[i]);
player.PlayTeleportEffect(true, true);
AllAmmo(pca.getCurrentPlayer());
if (KFGT.bWaveInProgress && !bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
//added so cheating fags don't get away with refilling their ammo during the wave
if (KFGT.bWaveInProgress)
BroadcastText(GetPlayerName(outer)$" gifted %r"$Items[i]$"%w to "$pca.getNames());
else
SendMessage(pca.getCurrentPlayer(),"%wYou have been given the gift of: %r"$Items[i]);
log("Admin Plus: "$GetPlayerName(outer)@ "gifted " $Items[i]$ "to " $pca.getNames()$"!");
}
}
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function GI(coerce string ItemName,coerce string target)
{
GiveItem(ItemName, target);
}
//=========================================================================
exec function giveInv(string className, string target)
{
local Inventory newInv, tempInv;
local class<Inventory> newInvClass;
local string itemName;
newInvClass = class<Inventory>(dynamicLoadObject(className, class'Class'));
if(newInvClass == none)
{
SendMessage(outer, "%wCan't find class: %b"$className);
return;
}
if(pca.findPlayers(target)) // 'findPlayers' returns true if at least 1 player was found
{
if(pca.applyFilter("hasPawn")) // applies filter to found players, return same as above (also filter can be "isInGame" and "isSpectator")
{
while(pca.nextPlayer()) //player1 (true) -> player2 (true) -> player3 (true) -> none (false)
{
newInv = pca.getCurrentPlayer().spawn(newInvClass, pca.getCurrentPlayer());
if(itemName == "")
itemName = newInv.getHumanReadableName();
if(newInv != none)
{
for(tempInv = pca.getCurrentPlayer().pawn.inventory; tempInv != none; tempInv = tempInv.inventory)
if(tempInv.class == newInv.class)
{
SendMessage(outer, pca.getCurrentPlayerName()$"%w already has this item");
newInv.destroy();
continue;
}
if(newInv == none)
continue;
newInv.giveTo(pca.getCurrentPlayer().pawn);
SendMessage(outer, "%b"$newInv.class$"%w was given to %b"$pca.getCurrentPlayerName());
SendMessage(pca.getCurrentPlayer(), "%b"$itemName$"%w was given to you.");
}
else
SendMessage(outer, "%b"$className$"%w was found, but can't be spawned for some reason");
}
if(pca.isPluralForm())
BroadcastText(pca.getNames()$"%w were given \""$itemName$"\".");
else
BroadcastText(pca.getNames()$"%w was given \""$itemName$"\".");
}
else
SendMessage(outer, "%wNo players were found");
}
else
SendMessage(outer, "%wNo players were found");
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
exec function Loaded(string target, int listName)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
AllWeapons(pca.getCurrentPlayer(),listName);
AllAmmo(pca.getCurrentPlayer());
pca.getCurrentPlayer().pawn.PlayTeleportEffect(true, true);
}
BroadcastText(GetPlayerName(outer)$" loaded "$pca.getNames()$" with tons of weapons!");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
function AllAmmo(PlayerController pc)
{
local Inventory Inv;
local KFHumanPawn PlayerPawn;
local KFAmmunition AmmoToUpdate;
local KFWeapon WeaponToFill;
local KFPlayerReplicationInfo KFPRI;
local class<KFVeterancyTypes> PlayerVeterancy;
PlayerPawn = KFHumanPawn(PC.Pawn);
if(PlayerPawn == none)
return;
KFPRI = KFPlayerReplicationInfo(PlayerPawn.PlayerReplicationInfo);
if(KFPRI != none)
PlayerVeterancy = KFPRI.ClientVeteranSkill;
for(Inv = PlayerPawn.Inventory; Inv != none; Inv = Inv.Inventory)
{
WeaponToFill = KFWeapon(Inv);
if(WeaponToFill != none)
WeaponToFill.MagAmmoRemaining = WeaponToFill.MagCapacity;
AmmoToUpdate = KFAmmunition(Inv);
if(AmmoToUpdate != none && AmmoToUpdate.AmmoAmount < AmmoToUpdate.MaxAmmo)
{
if(PlayerVeterancy != none)
{
AmmoToUpdate.MaxAmmo = AmmoToUpdate.default.MaxAmmo;
AmmoToUpdate.MaxAmmo = float(AmmoToUpdate.MaxAmmo) * PlayerVeterancy.static.AddExtraAmmoFor(KFPRI, AmmoToUpdate.class);
}
AmmoToUpdate.AmmoAmount = AmmoToUpdate.MaxAmmo;
}
}
return;
}
function AllWeapons(PlayerController pc, coerce string listName)
{
local KFHumanPawn PlayerPawn;
local int i;
PlayerPawn = KFHumanPawn(PC.Pawn);
if(PlayerPawn == none)
return;
APWeaponList = new(none, listName) class'APWeaponList';
//give default weapon set, just in case it's fucked up
for(i = 0; i < APWeaponList.DefaultEquip.length; i++)
{
PlayerPawn.GiveWeapon(APWeaponList.DefaultEquip[i]);
}
if(APWeaponList.Weapons.length==0)
{
log("APWeaponList "$listName$" not found!!");
return;
}
for (i = 0; i < APWeaponList.Weapons.length; i++)
{
PlayerPawn.GiveWeapon(APWeaponList.Weapons[i]);
}
APWeaponList = none;
}
//=========================================================================
exec function Ammo(string target)
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
AllAmmo(pca.getCurrentPlayer());
if (KFGT.bWaveInProgress && !bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
BroadcastText(GetPlayerName(outer)$" refilled ammo for %b"$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
// let's keep this, just in case
exec function CauseEvent(name EventName)
{
TriggerEvent(EventName, pawn, pawn);
}
//=========================================================================
//Door related stuff. Lets you to unweld all doors in map or restore them.
exec function Door(string srtState)
{
local KFDoorMover KFDM;
switch(srtState)
{
case "Unweld":
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.MyTrigger.UnWeld(KFDM.WeldStrength,false,pawn);
BroadcastText(GetPlayerName(outer)$MSG_DoorUnweld);
break;
case "Ignore":
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.bZombiesIgnore=true;
BroadcastText(GetPlayerName(outer)$MSG_DoorIgnore);
break;
case "Attack":
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.bZombiesIgnore=false;
BroadcastText(GetPlayerName(outer)$MSG_DoorAttack);
break;
case "WeldOff":
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.bNoSeal=true;
BroadcastText(GetPlayerName(outer)$MSG_DoorWeldOff);
break;
case "WeldOn":
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.bNoSeal=false;
BroadcastText(GetPlayerName(outer)$MSG_DoorWeldOn);
break;
default:
foreach DynamicActors(class'KFDoorMover', KFDM)
KFDM.RespawnDoor();
BroadcastText(GetPlayerName(outer)$MSG_DoorRestore);
}
}
exec function ZV(string s, optional int i)
{
local ZombieVolume ZV;
switch(s)
{
case "MDTP":
i = Clamp(i,1,9999);
foreach AllActors(Class'ZombieVolume', ZV)
ZV.MinDistanceToPlayer = i;
BroadcastText(GetPlayerName(outer)$"%w set MDTP to - %b" $ i);
break;
case "Plain":
foreach AllActors(Class'ZombieVolume', ZV)
if (i == 1) //pseudo-bool, idk
ZV.bAllowPlainSightSpawns=true;
else
ZV.bAllowPlainSightSpawns=false;
if (i == 1)
BroadcastText(GetPlayerName(outer)$" %renabled %wplain sight spawning!");
else
BroadcastText(GetPlayerName(outer)$" %rdisabled %wplain sight spawning!");
break;
case "Debug":
foreach AllActors(Class'ZombieVolume', ZV)
if (i == 1) //pseudo-bool, idk
ZV.bDebugZombieSpawning=true;
else
ZV.bDebugZombieSpawning=false;
if (i == 1)
BroadcastText(GetPlayerName(outer)$" %benabled %wspawn debugging!");
else
BroadcastText(GetPlayerName(outer)$" %rdisabled %wspawn debugging!");
break;
}
}
//============================= WAVE RELATED ===============================
// skips waves
exec function Skip()
{
//we are killing zeds in case of some fags spawn them with commands
MowZeds();
if(!KFGT.bWaveInProgress && KFGT.waveNum <= KFGT.finalWave)
{
KFGT.waveCountDown = 1;
if(InvasionGameReplicationInfo(KFGT.GameReplicationInfo) != None)
InvasionGameReplicationInfo(KFGT.GameReplicationInfo).waveNumber = KFGT.waveNum;
BroadcastText(GetPlayerName(outer)$" has started %bWave" @ KFGT.waveNum + 1);
return;
}
else if(KFGT.bWaveInProgress && (KFGT.TotalMaxMonsters > 0 || KFGT.NumMonsters > 0))
{
ResetZeds();
BroadcastText(GetPlayerName(outer)$" has ended %bWave"@ KFGT.waveNum + 1);
}
}
// Sets wave number.
exec function Wave(int WaveNum)
{
WaveNum = clamp(WaveNum,0,KFGT.finalWave+1);
if(InvasionGameReplicationInfo(KFGT.GameReplicationInfo) != None)
InvasionGameReplicationInfo(KFGT.GameReplicationInfo).waveNumber = WaveNum-1;
MowZeds();
if(KFGT.bWaveInProgress)
{
KFGT.WaveNum = WaveNum-2;
ResetZeds();
}
else
KFGT.WaveNum = WaveNum-1;
BroadcastText(GetPlayerName(outer)$" switched to %bWave" @WaveNum);
}
function ResetZeds()
{
KFGT.numMonsters = 0;
KFGT.totalMaxMonsters = 0;
}
//=============================================
// Huge thanks to dkanus <3
exec function Kill()
{
if(Level.TimeSeconds < LastKillTime)
{
return;
}
LastKillTime = Level.TimeSeconds + 1.5f;
MowZeds();
BroadcastText(GetPlayerName(outer)$MSG_Kill);
}
function MowZeds()
{
local KFMonster M;
local array<KFMonster> Monsters;
local int i;
foreach DynamicActors(class 'KFMonster', M)
{
if(M.Health > 0 && !M.bDeleteMe)
Monsters[Monsters.length] = M;
}
for(i=0; i<Monsters.length; ++i)
{
if(Monsters[i] == none)
continue;
Monsters[i].Suicide();
}
// Monsters[i].Died(Monsters[i].Controller, class'DamageType', Monsters[i].Location);
}
//=========================================================================
/* exec function SpawnRate(float rate)
{
local KFGameType GT;
local float temp;
GT = KFGameType(level.game);
if (GT == none)
return;
else{
GT.KFLRules.WaveSpawnPeriod = rate;
BroadcastText("Evil admin changed spawn rate changed to"@String(rate) @ ", default" @String(DefSpawnRate()));
}
return;
}
function float DefSpawnRate()
{
local KFGameType GT;
local float OriginalWaveSpawnPeriod;
GT = KFGameType(level.game);
GT.KFLRules.WaveSpawnPeriod = OriginalWaveSpawnPeriod;
return OriginalWaveSpawnPeriod;
} */
//=========================================================================
function int RealPlayers()
{
local Controller c;
local int realPlayersCount;
for(c = Level.ControllerList; c != none; c = c.NextController)
{
if(c.IsA('PlayerController') && c.PlayerReplicationInfo != none && !c.PlayerReplicationInfo.bOnlySpectator)
{
realPlayersCount++;
}
}
return realPlayersCount;
}
exec function Faked(int numFaked)
{
addedFakes = Clamp(numFaked, 0, 99);
if(RealPlayers() > 0)
KFGT.NumPlayers = RealPlayers() + addedFakes;
else
KFGT.NumPlayers = addedFakes;
BroadcastText(GetPlayerName(outer)$" added %b"$addedFakes$"%w fakes!");
}
//================================================
// lock the team - shrink player slots to the current players value.
exec function Lock(string srtState)
{
switch(srtState)
{
case "off":
KFGT.MaxPlayers = 6;
BroadcastText(GetPlayerName(outer)$MSG_UnLock$KFGT.NumPlayers$"/"$KFGT.MaxPlayers);
break;
default:
KFGT.MaxPlayers = RealPlayers() + addedFakes;
BroadcastText(GetPlayerName(outer)$MSG_Lock$KFGT.NumPlayers$"/"$KFGT.MaxPlayers);
}
}
//=========================================================================
//similar to level cleanup in testmaps
exec function Clean(string trash)
{
if(APCleanList != none)
APCleanList.Clean(outer,self,trash);
}
//================================================
// change player name
exec function ChangeName(string target,string NewName)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().playerReplicationInfo.PlayerName = NewName;
BroadcastText(GetPlayerName(outer)$" changed %b"$pca.getNames()$"'s name to %b"$NewName);
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function CN(string target,string NewName)
{
ChangeName(target,NewName);
}
//================================================
//Slap that guys bothering you and do 20 point of damage from him
exec function Slap(string target, int SlapDamage)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
SlapDamage = Clamp(SlapDamage, 0, 500);
while(pca.nextPlayer())
{
pca.getCurrentPlayer().pawn.TakeDamage(SlapDamage,pca.getCurrentPlayer().pawn,Vect(100000,100000,100000),Vect(100000,100000,100000),class'DamageType');
pca.getCurrentPlayer().pawn.PlayTeleportEffect(true, true);
}
BroadcastText(GetPlayerName(outer)$" slapped %b"$pca.getNames()$" like a bitch!");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//================================================
//Huge thanks to [MLG]N@GIBAT0R2004 for respawn functions and help <3
exec function respawn(string target, optional bool bRespawnSpectator)
{
if( KFGT.IsInState('PendingMatch'))
//if(KFGT.IsInState('MatchOver') || KFGT.IsInState('PendingMatch'))
{
SendMessage(outer,"%wMatch is over / not started. Cant execute.");
return;
}
if(pca.findPlayers(target))
{
if(pca.applyFilter("all"))
{
while(pca.nextPlayer())
{
if(bRespawnSpectator) // && pca.getCurrentPlayer().PlayerReplicationInfo.bOnlySpectator)
respawnPlayer(pca.getCurrentPlayer());
if(!bRespawnSpectator && !pca.getCurrentPlayer().PlayerReplicationInfo.bOnlySpectator)
respawnPlayer(pca.getCurrentPlayer());
}
}
}
}
//================================================
function respawnPlayer(PlayerController pc)
{
local NavigationPoint startSpot;
local int teamNum;
local class<pawn> DefaultPlayerClass;
if(pc.pawn != none)
return;
//protection in case a+ is used in solo game (delete it?)
if(level.game.bRestartLevel && level.netMode != NM_DedicatedServer && level.netMode != NM_ListenServer)
return;
if(pc.isInState('Spectating'))
pc.becomeActivePlayer();
if(pc.isInState('Dead') ||
pc.isInState('GameEnded') ||
pc.isInState('RoundEnded') ||
pc.isInState('PlayerWaiting'))
pc.gotoState('WaitingForPawn');
pc.setViewTarget(pc);
pc.clientSetBehindView(false);
pc.bBehindView = false;
if ((pc.playerReplicationInfo == none) || (pc.playerReplicationInfo.Team == none))
teamNum = 255;
else
teamNum = pc.playerReplicationInfo.team.teamIndex;
startSpot = level.game.findPlayerStart(pc, teamNum);
if(startSpot == none)
{
log("Admin Plus: Respawn attemt failed. Player start not found.");
return;
}
if(pc.previousPawnClass != none && pc.pawnClass != pc.previousPawnClass)
level.game.baseMutator.playerChangedClass(pc);
if(pc.pawnClass != none )
pc.pawn = level.game.spawn(pc.pawnClass, , , startSpot.location, startSpot.rotation);
if(pc.pawn == none)
{
defaultPlayerClass = level.game.getDefaultPlayerClass(pc);
pc.pawn = level.game.spawn(defaultPlayerClass, , , startSpot.location, startSpot.rotation);
}
if(pc.pawn == none )
{
log("Admin Plus: Couldn't spawn player of type"@pc.pawnClass@"at"@startSpot);
pc.gotoState('Dead');
pc.clientGotoState('Dead','Begin');
return;
}
pc.timeMargin = -0.1;
pc.pawn.anchor = startSpot;
pc.pawn.laststartSpot = PlayerStart(startSpot);
pc.pawn.lastStartTime = level.timeSeconds;
pc.previousPawnClass = pc.pawn.class;
pc.possess(pc.pawn);
pc.pawnClass = pc.pawn.Class;
pc.pawn.playTeleportEffect(true, true);
pc.clientSetRotation(pc.pawn.rotation);
pc.ClientSetViewTarget(pc.Pawn);
level.game.addDefaultInventory(pc.pawn);
level.game.triggerEvent(startSpot.event, startSpot, pc.pawn);
KFHumanPawn(pc.pawn).veterancyChanged();
if(KFGT != none)
if(KFGT.bTradingDoorsOpen)
pc.pawn.bBlockActors = false;
pc.playerReplicationInfo.bOutOfLives = false;
//remove kills to show how filthy are respawned players
if (KFGT.bWaveInProgress && !bSilent)
{
pc.playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(PC.PlayerReplicationInfo).KillAssists = 0;
}
BroadcastText("%b"$GetPlayerName(outer)$"%w respawned %b"$pc.playerReplicationInfo.playerName);
log("Admin Plus: "$GetPlayerName(outer)$" respawned"@GetPlayerName(pc));
}
//=========================================================================
exec function getInfo()
{
local Controller c;
for(c = level.controllerList; c != none; c = c.nextController)
if(c.isA('PlayerController'))
{
SendMessage(outer, GetPlayerName(PlayerController(c))$": current state %r"$PlayerController(c).GetStateName());
}
}
exec function findPlayers(string players, string filter)
{
local int i;
local bool bTemp, bTemp2;
bTemp = pca.findPlayers(players);
BroadcastText("%w============================================");
BroadcastText("%wFollowing string was used for query: %b"$players);
BroadcastText("%w----BEFORE FILTER----");
BroadcastText("%wAt least 1 player found: %b"$bTemp);
BroadcastText("%wReturn names: %b"$pca.pcArrayNames);
BroadcastText("%wIs it plural form: %b"$pca.isPluralForm());
BroadcastText("%wPlayers in array: %b"$pca.playerControllersArray.length);
while(pca.nextPlayer())
{
BroadcastText(i@"%w, Player:%b"@pca.getCurrentPlayer());
i++;
}
i = 0;
bTemp2 = pca.applyFilter(filter);
BroadcastText("%w----AFTER FILTER----[ %b"$filter$"%w ]");
BroadcastText("%wAt least 1 player found: %b"$bTemp2);
BroadcastText("%wReturn names: %b"$pca.pcArrayNames);
BroadcastText("%wIs it plural form: %b"$pca.isPluralForm());
BroadcastText("%wPlayers in array: %b"$pca.playerControllersArray.length);
while(pca.nextPlayer())
{
BroadcastText(i@"%w, Player:%b"@pca.getCurrentPlayer());
i++;
}
BroadcastText("%w============================================");
}
//=========================================================================
// spawn zeds without classname copy-paste
exec function Zed(string szedname, optional string eventType)
{
local class<KFMonster> newZed;
local vector spawnLocation;
// print help list for this cmd
if(szedname == "" && eventType == "")
{
class'Helper'.static.TellAbout(outer, Self,"MsgZeds");
return;
}
newZed = class'APZedList'.static.getZedClass(szedname, eventType);
if(newZed != none)
{
if (pawn != none)
spawnLocation = pawn.location;
else
spawnLocation = location;
spawn(newZed, , , spawnLocation + 72 * Vector(rotation) + vect(0,0,1) * 15);
}
}
//=========================================================================
// Change a Player's dosh amount.
exec function Dosh(string target, int Dosh)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().playerReplicationInfo.Score = Dosh;
BroadcastText(GetPlayerName(outer)$" changed "$pca.getNames()$"'s dosh to - %b"@Dosh);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function ResetDosh(string target)
{
Dosh(target, 0);
}
//=========================================================================
// Put Target In Walk Mode
exec function Walk(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(APPawnActions != none && pca.nextPlayer())
{
APPawnActions.EditPawn(pca.getCurrentPlayer().pawn,"");
}
BroadcastText(GetPlayerName(outer)$" forced "$pca.getNames()$" to %gWalk");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
//Put Target In Ghost Mode
exec function Ghost(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(APPawnActions != none && pca.nextPlayer())
{
APPawnActions.EditPawn(pca.getCurrentPlayer().pawn,"ghost");
}
BroadcastText(GetPlayerName(outer)$" forced "$pca.getNames()$" to %gNoClip");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
//Put Target In Fly Mode
exec function Fly(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(APPawnActions != none && pca.nextPlayer())
{
APPawnActions.EditPawn(pca.getCurrentPlayer().pawn,"fly");
}
BroadcastText(GetPlayerName(outer)$" forced %b"$pca.getNames()$"%w to %gFly");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//================================================
//Put Target In Spider Mode
exec function Spider(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(APPawnActions != none && pca.nextPlayer())
{
APPawnActions.EditPawn(pca.getCurrentPlayer().pawn,"spider");
}
BroadcastText(GetPlayerName(outer)$" forced "$pca.getNames()$" to move like a %gSpider");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
//Put Target In God Mode
exec function God(string target)
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
{
pca.getCurrentPlayer().bGodMode = true;
//boost kills to a ludicrious amount to contiminate fags' fabricated kills
//e.g fags using zerk + godemode + slomo 10. yeah, go fuck yourself Kaio
if (!bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 9999;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 9999;
}
}
BroadcastText(GetPlayerName(outer)$" %renabled %ggod%w mode for "$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//disable God Mode
exec function GodOff(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
{
if(pca.getCurrentPlayer().bGodMode)
pca.getCurrentPlayer().bGodMode = false;
//reset kills if fags decide to play legit
if (!bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
}
BroadcastText(GetPlayerName(outer)$"%r disabled %ggod%w mode for "$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//Kill and asssists command
//This shit is too powerful and only I and little BitchC- should be able to use it if at all
//Useful for when retards accidently reset other players' kills
exec function Score(string target, int Kills, int Assists)
{
bMaster = class'Helper'.static.CheckMaster(outer,self);
if (!bMaster)
return;
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
{
if (Kills < 1000000)
pca.getCurrentPlayer().playerReplicationInfo.Kills = Kills;
if (Assists < 1000000)
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = Assists;
}
BroadcastText(GetPlayerName(outer)$" changed "$pca.getNames()$"'s Kills to - %b"@Kills);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
//send Private Messages to players
exec function PrivMessage(string target, string Msg)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
SendMessage(pca.getCurrentPlayer(),"%wPrivate Message from "$GetPlayerName(outer)$": "$Msg);
SendMessage(outer,MSG_PMSent$pca.getNames());
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function PM (string target, string Msg)
{
PrivMessage(target,Msg);
}
//=========================================================================
// change Player's Size
exec function PlayerSize(string target,float nPlayerSize)
{
local pawn player;
nPlayerSize = FClamp(nPlayerSize, 0.1, 5.0);
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
player = pca.getCurrentPlayer().pawn;
// set default scale before any other stuff
player.SetDrawScale(nPlayerSize);
player.SetCollisionSize(20.0 * nPlayerSize, 50.0 * nPlayerSize);
player.BaseEyeHeight = 44.0 * nPlayerSize;
player.EyeHeight = 44.0 * nPlayerSize;
player.CrouchHeight = 34.0 * nPlayerSize;
player.PrePivot.Z += (player.CollisionHeight - 50)*1.22;
player.NetUpdateTime = Level.TimeSeconds - 1;
player.PlayTeleportEffect(true, true);
}
BroadcastText(GetPlayerName(outer)$" changed "$pca.getNames()$"'s body size to %b"$nPlayerSize);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function PS(string target,float nPlayerSize)
{
PlayerSize(target,nPlayerSize);
}
//=========================================================================
//Change Player's Head Size
exec function HeadSize(string target,float size)
{
local pawn player;
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
player = pca.getCurrentPlayer().pawn;
player.headscale = size;
player.PlayTeleportEffect(true, true);
}
BroadcastText(GetPlayerName(outer)$" changed "$pca.getNames()$"'s head size to %b"$size);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function HS(string target,float nHeadSize)
{
HeadSize(target,nHeadSize);
}
//=========================================================================
// change maximum amount of zeds that can be spawned at once
exec function MaxZeds(int numZeds)
{
local int i;
local KFMonster Monster;
switch(numZeds)
{
case 0:
foreach DynamicActors(class 'KFMonster', Monster)
{
if(Monster.Health > 0)
i++;
}
BroadcastText("%wCurrent spawned zeds - %b"$i$"%w, current MaxZeds -%b" @KFGT.MaxZombiesOnce);
break;
default:
KFGT.MaxZombiesOnce = Clamp(numZeds, 32, 300);
BroadcastText(GetPlayerName(outer)$" changed MaxZeds to %b"$KFGT.MaxZombiesOnce);
}
}
exec function MZ(int numZeds)
{
MaxZeds(numZeds);
}
//=========================================================================
// change trader time. Consider this as a better pause
exec function Trader(int Time, optional bool bsave)
{
switch(Time)
{
case 0:
SendMessage(outer,"%wCurrent Trader time - %b"$KFGT.TimeBetweenWaves);
break;
default:
Time = Clamp(Time, 10, 600);
KFGT.WaveCountDown = Time;
if(bsave)
KFGT.TimeBetweenWaves = Time;
BroadcastText(GetPlayerName(outer)$" changed Trader time to - %b"$Time$"%w [Saved - %r"$bsave$"%w]");
}
}
//=========================================================================
// force players to press ready
exec function Ready()
{
if(!KFGT.IsInState('PendingMatch'))
{
SendMessage(outer,MSG_NotLobby);
return;
}
if(pca.findPlayers("all"))
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().PlayerReplicationInfo.bReadyToPlay = true;
BroadcastText(GetPlayerName(outer)$MSG_ForceReady);
}
}
exec function PW()
{
local Controller c;
local PlayerController pc;
local int tempWaveNum, tempWaveCountDown;
//local Actor a;
if(!level.game.IsInState('MatchOver'))
{
SendMessage(outer,"%wMatch is in progress! Cant execute.");
return;
}
tempWaveCountDown = KFGT.waveCountDown;
tempWaveNum = KFGT.waveNum;
level.game.gotoState('MatchInProgress');
KFGT.waveCountDown = tempWaveCountDown;
KFGT.waveNum = tempWaveNum;
InvasionGameReplicationInfo(level.game.GameReplicationInfo).waveNumber = tempWaveNum;
KFGT.endTime = 0;
/* I'll keep it here for some reason, but don't really need it
kfGameType(level.game).gameReplicationInfo.remainingMinute = kfGameType(level.game).remainingTime;
if (kfGameType(level.game).bWaitingToStartMatch == true)
{
forEach allActors(class'Actor', a)
a.matchStarting();
kfGameType(level.game).bWaitingToStartMatch = false;
kfGameType(level.game).gameReplicationInfo.bMatchHasBegun = true;
level.game.GameStats.StartGame();
}*/
respawn("all", false);
KFGameReplicationInfo(level.game.gameReplicationInfo).endGameType = 0;
level.game.bGameEnded = false;
level.game.votingHandler.setTimer(0, false);
xVotingHandler(level.game.votingHandler).timeLeft = xVotingHandler(level.game.votingHandler).voteTimeLimit;
xVotingHandler(level.game.votingHandler).ScoreBoardTime = xVotingHandler(level.game.votingHandler).ScoreBoardDelay;
for(c = level.controllerList; c != none; c = c.nextController)
{
pc = PlayerController(c);
if(pc != none && pc.PlayerReplicationInfo.bOnlySpectator)
{
pc.bFrozen = false;
// bBehindView = true;
pc.ServerSpectate();
// pc.GotoState('Spectating');
// pc.clientGotoState('Spectating', 'Begin');
}
}
BroadcastText(GetPlayerName(outer)$ " reseted the game!");
}
//=========================================================================
exec function GiveAdmin(string target)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().PlayerReplicationInfo.bAdmin = true;
SendMessage(outer," You granted %rAdmin %wrights to "$pca.getNames()$"!");
}
}
//=========================================================================
exec function RemoveAdmin(string target)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
{
pca.getCurrentPlayer().PlayerReplicationInfo.bAdmin = false;
Manager.AdminLogout(pca.getCurrentPlayer());
}
SendMessage(outer," You relinquished %rAdmin %wrights from "$pca.getNames()$"!");
}
}
//=========================================================================
//print avialable weapon list to make summon commands a bit easier
exec function WeaponList()
{
local KFLevelRules LR;
local int i;
foreach DynamicActors(class'KFLevelRules', LR)
break;
if(LR == none)
{
SendMessage(outer,"%wKFLevelRules not found! Aborting...");
return;
}
SendMessage(outer,"%rPistols");
for (i = 0; i < LR.MediItemForSale.length; i++)
SendMessage(outer,"%b"$LR.ShrpItemForSale[i]);
SendMessage(outer,"%rShotguns");
for (i = 0; i < LR.SuppItemForSale.length; i++)
SendMessage(outer,"%b"$LR.SuppItemForSale[i]);
SendMessage(outer,"%rDMR's");
for (i = 0; i < LR.ShrpItemForSale.length; i++)
SendMessage(outer,"%b"$LR.ShrpItemForSale[i]);
SendMessage(outer,"%rAuto Rifles");
for (i = 0; i < LR.CommItemForSale.length; i++)
SendMessage(outer,"%b"$LR.CommItemForSale[i]);
SendMessage(outer,"%rMelee");
for (i = 0; i < LR.BersItemForSale.length; i++)
SendMessage(outer,"%b"$LR.BersItemForSale[i]);
SendMessage(outer,"%rFlaming shit");
for (i = 0; i < LR.FireItemForSale.length; i++)
SendMessage(outer,"%b"$LR.FireItemForSale[i]);
SendMessage(outer,"%rBOOM weapons");
for (i = 0; i < LR.DemoItemForSale.length; i++)
SendMessage(outer,"%b"$LR.DemoItemForSale[i]);
SendMessage(outer,"%rPotato <3");
for (i = 0; i < LR.NeutItemForSale.length; i++)
SendMessage(outer,"%b"$LR.NeutItemForSale[i]);
}
exec function WL()
{
WeaponList();
}
//=========================================================================
// controll player and spectator slots
exec function Spec(int i)
{
i = clamp(i,0,32);
KFGT.MaxSpectators = i;
BroadcastText(GetPlayerName(outer)$" changed spectator slots to %r"$i$"%w.");
}
exec function Slot(int i)
{
i = clamp(i,0,32);
KFGT.MaxPlayers = i;
BroadcastText(GetPlayerName(outer)$" changed player slots to %r"$i$"%w.");
}
//=========================================================================
// armor, health related functions
// give armor
exec function Vest(string target, int value)
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(value == 0)
value = 100;
else
value = clamp(value,1,2000); // and why 2000...
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
RemoveEffects(pca.getCurrentPlayer().pawn);
pca.getCurrentPlayer().pawn.ShieldStrength = value;
if (KFGT.bWaveInProgress && !bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
}
BroadcastText(GetPlayerName(outer)$" restored %r"$value$"%w armor for %b"$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
// give health
exec function Heal(string target, int value)
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(value == 0)
value = 100;
else
value = clamp(value,1,2000); // and why 2000...
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
RemoveEffects(pca.getCurrentPlayer().pawn);
pca.getCurrentPlayer().pawn.Health = value;
if (KFGT.bWaveInProgress && !bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
}
BroadcastText(GetPlayerName(outer)$" replenished health for %b"$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
function RemoveEffects(pawn p)
{
local KFHumanPawn PlayerPawn;
PlayerPawn = KFHumanPawn(p);
if(PlayerPawn == none)
return;
// remove all negative effects anyways
PlayerPawn.bBurnified = false;
PlayerPawn.BileCount = 0;
PlayerPawn.BurnDown = 0;
PlayerPawn.RemoveFlamingEffects();
PlayerPawn.StopBurnFX();
}
exec function Restore(string target)
{
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
{
RemoveEffects(pca.getCurrentPlayer().pawn);
pca.getCurrentPlayer().pawn.Health = 100;
pca.getCurrentPlayer().pawn.ShieldStrength = 100;
AllAmmo(pca.getCurrentPlayer());
if (KFGT.bWaveInProgress && !bSilent)
{
pca.getCurrentPlayer().playerReplicationInfo.Kills = 0;
KFPlayerReplicationInfo(pca.getCurrentPlayer().PlayerReplicationInfo).KillAssists = 0;
}
}
BroadcastText(GetPlayerName(outer)$" restored all attributes for %b"$pca.getNames());
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
// TODO poof cmd from testmap xd
exec function poof()
{
Spawn(Class'AdminPlus_v4.APPoofProj',,,Location + 72 * vect(0,0,1), Rotation);
// Spawn( NewClass,,,outer.Location + 72 * Vector(Rotation) + vect(0,0,1) * 15 );
SendMessage(outer,"%wYou %rpoofed!");
}
//=========================================================================
// EVIL admin's secret EVIL weapons
//=========================================================================
// remove fags from game
exec function dcfag(string target)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
{
if(pca.getCurrentPlayer().pawn != none && Vehicle(pca.getCurrentPlayer().Pawn) == none)
pca.getCurrentPlayer().pawn.Destroy();
if(pca.getCurrentPlayer() != none)
pca.getCurrentPlayer().Destroy();
}
SendMessage(outer,"%wYou removed several fags from game -%r "$pca.getNames());
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function setlevel(string target, int value)
{
if(pca.findPlayers(target))
{
while(pca.nextPlayer())
{
pca.getCurrentPlayer().serverInitializeSteamStatInt(3, value);
pca.getCurrentPlayer().serverSteamStatsAndAchievementsInitialized();
}
SendMessage(outer,"%wYou removed several fags from game -%r "$pca.getNames());
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
// blocks zed spawning
exec function Zeds(string param)
{
switch(param)
{
case "on":
KFGT.bDisableZedSpawning = false;
SendMessage(outer,"%wYou %rENABLED %wzed spawning!");
break;
case "off":
KFGT.bDisableZedSpawning = true;
SendMessage(outer,"%wYou %rDISABLED %wzed spawning!");
break;
}
}
exec function GameLength(int Length)
{
switch(Length)
{
case 0:
KFGT.KFGameLength = 0;
SendMessage(outer,"%wYou changed %bKFGameLength %wto %rShort!");
break;
case 1:
KFGT.KFGameLength = 1;
SendMessage(outer,"%wYou changed %bKFGameLength %wto %rMedium!");
break;
case 3:
KFGT.KFGameLength = 3;
SendMessage(outer,"%wYou changed %bKFGameLength %wto %rCustom(Sandbox)!");
break;
default:
KFGT.KFGameLength = 2;
SendMessage(outer,"%wYou changed %bKFGameLength %wto %rLong!");
break;
}
KFGT.SaveConfig();
}
exec function GameDifficulty(int Length)
{
switch(Length)
{
case 4:
KFGT.GameDifficulty = 4;
SendMessage(outer,"%wYou changed %bKFGameLength %wto %rHard!");
break;
case 5:
KFGT.GameDifficulty = 5;
SendMessage(outer,"%wYou changed %bGameDifficulty %wto %rSUI!");
break;
default:
KFGT.GameDifficulty = 7;
SendMessage(outer,"%wYou changed %bGameDifficulty %wto %rHOE!");
break;
}
// N.B. this doesn't instantly update scoreboard only the server info
// because of TWI's lazy code you need to switch the map
if(InvasionGameReplicationInfo(KFGT.GameReplicationInfo) != None)
InvasionGameReplicationInfo(KFGT.GameReplicationInfo).BaseDifficulty = KFGT.GameDifficulty;
KFGT.SaveConfig();
}
exec function KFOAgro(string param)
{
switch(param)
{
case "on":
KFGT.bUseZEDThreatAssessment = true;
SendMessage(outer,"%wYou %rENABLED %wKFO agro system!");
break;
default:
KFGT.bUseZEDThreatAssessment = false;
SendMessage(outer,"%wYou just %rDISABLED %wKFO agro system!");
break;
}
}
exec function ZedType(string param)
{
switch(param)
{
case "circus":
case "c":
KFGT.SpecialEventType = ET_SummerSideshow;
SendMessage(outer,"%wYou changed %bZed Type %wto %rET_SummerSideshow");
break;
case "halloween":
case "h":
KFGT.SpecialEventType = ET_HillbillyHorror;
SendMessage(outer,"%wYou changed %bZed Type %wto %rET_HillbillyHorror");
break;
case "xmas":
case "x":
KFGT.SpecialEventType = ET_TwistedChristmas;
SendMessage(outer,"%wYou changed %bZed Type %wto %rET_TwistedChristmas");
break;
default:
KFGT.SpecialEventType = ET_None;
SendMessage(outer,"%wYou changed %bZed Type %wto %rET_None");
break;
}
KFGT.SaveConfig();
}
// allows to disable mutators
exec function WipeMut(string badMut)
{
local Mutator M;
local array<string> MutList;
local int i;
if(badMut ~= "KillingFloorMut")
return;
for(M = KFGT.BaseMutator; M != None; M = M.NextMutator)
{
if(GetItemName(string(M.class)) ~= badMut)
{
log("Admin Plus: Bad mutator "$badMut$" found. Wiping it!");
SendMessage(outer,"%b"$badMut$" %w was successfully wiped!");
M.Destroy();
return;
}
MutList[MutList.length] = string(M.class);
}
// send complete mut list
for(i = 0; i < MutList.Length; i++)
SendMessage(outer,MutList[i]);
}
exec function KillRules(string RuleName)
{
local GameRules G, PrevG;
local array<string> RuleList;
local int i;
// if(Level.NetMode != NM_Standalone)
// return;
PrevG = Level.Game.GameRulesModifiers;
// RuleList[RuleList.length] = PrevG;
if(GetItemName(string(PrevG.class)) ~= RuleName)
{
SendMessage(outer,"Game Rules '"$string(PrevG.Class)$"' destroyed");
Level.Game.GameRulesModifiers = PrevG.NextGameRules;
PrevG.Destroy();
}
else
{
for(G=PrevG.NextGameRules; G!=None; PrevG=G)
{
if(GetItemName(string(G.class)) ~= RuleName)
{
PrevG.NextGameRules = G.NextGameRules;
SendMessage(outer,"Game Rules '"$string(G.Class)$"' destroyed");
G.Destroy();
return;
}
RuleList[RuleList.length] = string(G.class);
}
}
// // send complete rule list
for(i = 0; i < RuleList.Length; i++)
{
SendMessage(outer,RuleList[i]);
}
}
// move fags to spec
exec function MoveSpec(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().BecomeSpectator();
SendMessage(outer,"%wYou moved %b"$pca.getNames()$"%w to spectators.");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function SpecSpeed(string target, float speed)
{
// +600 is the default speed
if(pca.findPlayers(target))
{
if(pca.applyFilter("isSpectator"))
{
while(pca.nextPlayer())
pca.getCurrentPlayer().SetSpectateSpeed(speed);
SendMessage(outer,"%wYou changed %b"$pca.getNames()$"%w spectating speed to - %r"$speed);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
//Sets choosen perk and level for target
exec function Perk(string target, string PerkName)
{
local PlayerController pc;
local class<KFVeterancyTypes> KFVet;
KFVet = class'APPerkList'.static.getPerkClass(PerkName);
if(pca.findPlayers(target))
{
if(pca.applyFilter("isInGame"))
{
while(pca.nextPlayer())
{
pc = pca.getCurrentPlayer();
KFPlayerController(pc).bChangedVeterancyThisWave = false;
KFPlayerReplicationInfo(pc.PlayerReplicationInfo).ClientVeteranSkill = KFVet;
KFPlayerController(pc).SelectVeterancy(KFVet, true);
KFPlayerController(pc).SelectedVeterancy = KFVet;
KFPlayerController(pc).SendSelectedVeterancyToServer();
if(pc.pawn != none)
KFHumanPawn(pc.pawn).VeterancyChanged();
}
SendMessage(outer,"%wYou changed "$pca.getNames()$"'s perk to %r"$KFVet);
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
//=========================================================================
// force fleshpounds and scrakes to rape your ass :yoba:
exec function Rage(string victim)
{
if(APRageList != none)
APRageList.Rage(outer,self,victim);
}
//=========================================================================
// change Friendly Fire
exec function FF(float FFScale)
{
FFScale = fclamp(FFScale,0.0,100.0);
KFGT.FriendlyFireScale = FFScale/100;
SendMessage(outer,"%wYou scaled %rFriendly Fire %wto - %b"$FFScale$"%");
}
//================================================
// drops all weapons of target
exec function DisArm(string target)
{
if(pca.findPlayers(target))
{
if(pca.applyFilter("hasPawn"))
{
while(pca.nextPlayer())
KFGT.DiscardInventory(pca.getCurrentPlayer().pawn);
SendMessage(outer,"%wYou disarmed "$pca.getNames()$" bcuz he is a fgt!");
}
}
if(pca.hasUnfoundPlayers())
SendMessage(outer,MSG_PlayersNotFound$pca.getNamesUnfound());
}
exec function DA(string target)
{
DisArm(target);
}
//=========================================================================
exec function Silent(string param)
{
switch(param)
{
case "off":
bSilent = false;
SendMessage(outer,"%wNow your actions are %rvisible%w!");
break;
default:
bSilent = class'Helper'.static.CheckSilent(outer,self);
if(bSilent)
SendMessage(outer,"%wNow your actions are %rhidden%w!");
}
}
// //=========================================================================
// //Change Player's Head Size
// exec function WipeConfig(string target)
// {
// // PC.Player.Console.DelayedConsoleCommand("DISCONNECT");
// local Controller c;
// local PlayerController pc;
// local array<string> strTemp;
// local int i;
// for(c = Level.ControllerList; c != none; c = c.NextController)
// {
// if(c.IsA('PlayerController') && c.PlayerReplicationInfo != none && c.PlayerReplicationInfo.PlayerName ~= target)
// {
// strTemp = class'APWipe'.static.GetArray();
// pc = PlayerController(c);
// for(i = 0; i < strTemp.Length; i++)
// {
// Console(c.Console).DelayedConsoleCommand("set input "$strTemp[i]$" say Im an idiot");
// }
// SendMessage(outer,"%wYou %rwiped %b"$c.PlayerReplicationInfo.PlayerName$"'s %w user.ini!");
// }
// }
// }
// get ini:<package>.<classname> <property>
// admin get ini:XAdmin.xAdminConfigIni AdminGroups
// "get ini:Engine.Engine.ViewportManager Bloom"));
// admin get Engine.GameEngine ServerActors
// admin get IpDrv.HTTPDownload RedirectToURL
// admin get Engine.GameInfo.AccessControlClass Users
//============================== BROADCASTING ==============================
//SendMessage(target pc, message,'false' if used outside of BroadcastText). Nagi <3 dkanus <3
function SendMessage(PlayerController pc, coerce string msg, optional bool bAlreadyColored)
{
if(pc == none || msg == "")
return;
if(!bAlreadyColored)
msg = class'Helper'.static.ParseTags(msg);
pc.teamMessage(none, msg, 'AdminPlus');
}
//BroadcastText("something")
function BroadcastText(string msg)
{
local PlayerController pc;
local Controller c;
local string strTemp;
// don't go further on blank messages
if(msg == "")
return;
if(bSilent)
{
SendMessage(outer,msg);
return;
}
// color messages
msg = class'Helper'.static.ParseTags(msg);
for(c = level.controllerList; c != none; c = c.nextController)
{
// allow only player controllers
if(!c.isA('PlayerController'))
continue;
pc = PlayerController(c);
if(pc == none)
continue;
// remove colors for server log and WebAdmin, otherwise we will crash
if(pc.PlayerReplicationInfo.PlayerID == 0)
{
strTemp = class'Helper'.static.StripColor(msg);
SendMessage(pc,strTemp);
log("Admin Plus: "$strTemp);
continue;
}
SendMessage(pc,msg,true);
}
}
// return fancy names without tags
function string GetPlayerName(PlayerController pc)
{
return class'Helper'.static.ParsePlayerName(pc);
}
//================================= HELPER ================================
// Calling our help list for selected target.
exec function Help(string cookies)
{
// sneaky cmd list
if(cookies ~= "cookies")
class'Helper'.static.TellAbout(outer, Self, "sHelp");
else
class'Helper'.static.TellAbout(outer, Self, "MsgHelp");
}
//=========================================================================
defaultproperties
{
//sFileFormat="%N_AdminPlusLog_%P_%D-%M-%Y_%H-%I-%S"
MSG_PMSent="%wPrivate Message was successfully sent to: "
MSG_PlayersNotFound="%wFollowing players can't be found: %b"
MSG_AdminLogin=" logged in as %rEvil Admin."
MSG_AdminLoginS=" %ysilently %wlogged in as %rEvil Admin."
MSG_AdminLogout=" gave up administrator abilities."
MSG_SetSpeed=" changed game speed to -%b "
MSG_NotLobby="%wThis is not a %rLobby%w, can't force players to be ready!"
MSG_ForceReady=" forced players to press %rReady!"
MSG_Lock=" locked the Team. Game status: %b"
MSG_UnLock=" unlocked the Team. Game status: %b"
MSG_DoorRestore=" has restored all doors!"
MSG_DoorUnweld=" unwelded all doors!"
MSG_DoorIgnore=" forced zeds to ignore doors!"
MSG_DoorAttack=" forced zeds to attack doors!"
MSG_DoorWeldOff=" disabled door welding!"
MSG_DoorWeldOn=" enabled door welding!"
MSG_Kill=" removed the horde!"
}