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

103 lines
2.4 KiB
Ucode

class TheGuardian extends TSCBaseGuardian
abstract;
var localized string strBlame;
function PawnBaseDied()
{
local vector base_loc;
if ( Pawn(Base) != none ) {
base_loc = Base.Location;
Base.DetachFromBone(self);
SetBase(none);
SetLocation( base_loc + vect(0, 0, 20) );
Velocity = PhysicsVolume.Gravity;
if ( KFGameType(Level.Game).bWaveBossInProgress )
GotoState('SettingUp');
else
GotoState('Dropped');
}
}
function BaseSetupFailed()
{
local TscGame game;
game = TscGame(Level.Game);
if ( LastHolder != none ) {
game.ScrnBalanceMut.BlamePlayer(LastHolder, strBlame);
}
else if ( ScrnPlayerController(GetBaseSetter()) != none ) {
game.ScrnBalanceMut.BlamePlayer(ScrnPlayerController(GetBaseSetter()), strBlame);
}
if ( TSCGRI.bWaveInProgress ) {
game.BootShopPlayers();
}
MoveToShop(MyShop); // teleport next to shop
Score();
if ( !bActive ) {
log( "Base setup failed", class.name );
SendHome();
}
}
auto state Home
{
function BeginState()
{
local StinkyController SC;
super.BeginState();
if ( Team != none )
SC = FTGGame(Level.Game).StinkyControllers[Team.TeamIndex];
if ( SC != none )
SC.Pawn.Suicide();
}
}
state Guarding
{
ignores TakeDamage;
function bool ValidHolder(Actor other)
{
return StinkyClot(other) != none; // only StinkyClot can grab the guardian while guarding
}
function EndState()
{
if ( Holder != none ) {
// make sure that Stinky Clot is not holding me
Holder.DetachFromBone(self);
SetBase(none);
}
Holder = none;
bHeld = false;
super.EndState();
}
function bool ShouldWipeOnBaseLost()
{
return WipeOnBaseLost != none && ( TSCGRI.MaxMonsters > 10 || KFGameType(Level.Game).bWaveBossInProgress );
}
}
defaultproperties
{
strBlame="%p blamed for base setup failure"
Damage=2
SameTeamCounter=25
WipeOnBaseLost=Class'ScrnBalanceSrv.DamTypeEnemyBase'
GameObjBone="CHR_RArmPalm"
GameObjOffset=(X=5.000000,Y=-10.000000,Z=-10.000000)
GameObjRot=(Pitch=0)
DrawScale=0.500000
CollisionHeight=12.000000
}