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

185 lines
5.2 KiB
Ucode

class ScrnAmmoPickup extends KFAmmoPickup;
function float GetRespawnTime()
{
return RespawnTime / clamp(Level.Game.NumPlayers, 1, 6);
}
state Pickup
{
function BeginState()
{
super.BeginState();
if ( ScrnGameType(Level.Game) != none )
ScrnGameType(Level.Game).CurrentAmmoBoxCount++;
}
function EndState()
{
super.EndState();
if ( ScrnGameType(Level.Game) != none )
ScrnGameType(Level.Game).CurrentAmmoBoxCount--;
}
// When touched by an actor.
function Touch(Actor Other)
{
local Inventory CurInv;
local bool bPickedUp;
local int AmmoPickupAmount;
local Boomstick DBShotty;
local bool bResuppliedBoomstick;
local KFAmmunition ammo;
local KFPlayerReplicationInfo KFPRI;
if ( Pawn(Other) != none && Pawn(Other).bCanPickupInventory && Pawn(Other).Controller != none &&
FastTrace(Other.Location, Location) )
{
KFPRI = KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo);
for ( CurInv = Other.Inventory; CurInv != none; CurInv = CurInv.Inventory )
{
if( Boomstick(CurInv) != none )
{
DBShotty = Boomstick(CurInv);
}
ammo = KFAmmunition(CurInv);
if ( ammo != none && ammo.bAcceptsAmmoPickups )
{
// changed from 1 to 0 -- PooSH
if ( ammo.AmmoPickupAmount > 0 )
{
if ( ammo.AmmoAmount < ammo.MaxAmmo )
{
if ( KFPRI != none && KFPRI.ClientVeteranSkill != none )
{
AmmoPickupAmount = float(ammo.AmmoPickupAmount) * KFPRI.ClientVeteranSkill.static.GetAmmoPickupMod(KFPRI, ammo);
}
else
{
AmmoPickupAmount = ammo.AmmoPickupAmount;
}
ammo.AmmoAmount = Min(ammo.MaxAmmo, ammo.AmmoAmount + AmmoPickupAmount);
if( DBShotgunAmmo(CurInv) != none )
{
bResuppliedBoomstick = true;
}
bPickedUp = true;
}
}
else if ( ammo.AmmoAmount < ammo.MaxAmmo )
{
bPickedUp = true;
if ( FRand() <= (1.0 / Level.Game.GameDifficulty) )
{
ammo.AmmoAmount++;
}
}
}
}
if ( bPickedUp )
{
// TODO: test if this KF hack is still needed in ScrN
// if( bResuppliedBoomstick && DBShotty != none )
// {
// DBShotty.AmmoPickedUp();
// }
AnnouncePickup(Pawn(Other));
GotoState('Sleeping', 'Begin');
if ( KFGameType(Level.Game) != none )
{
KFGameType(Level.Game).AmmoPickedUp(self);
}
}
}
}
}
auto state Sleeping
{
ignores Touch;
function bool ReadyToPickup(float MaxWait)
{
return (bPredictRespawns && LatentFloat < MaxWait);
}
function StartSleeping() {}
function BeginState()
{
local int i;
NetUpdateTime = Level.TimeSeconds - 1;
bHidden = true;
bSleeping = true;
SetCollision(false, false);
for ( i = 0; i < 4; i++ )
{
TeamOwner[i] = None;
}
}
function EndState()
{
NetUpdateTime = Level.TimeSeconds - 1;
bHidden = false;
bSleeping = false;
SetCollision(default.bCollideActors, default.bBlockActors);
}
Begin:
bSleeping = true;
Sleep(1000000.0); // Sleep for 11.5 days(never wake up)
DelayedSpawn:
bSleeping = false;
Sleep(GetRespawnTime()); // Delay before respawning
goto('Respawn');
TryToRespawnAgain:
Sleep(1.0);
Respawn:
bShowPickup = true;
// ignore player visibility here -- PooSH
// for ( OtherPlayer = Level.ControllerList; OtherPlayer != none; OtherPlayer=OtherPlayer.NextController )
// {
// if ( PlayerController(OtherPlayer) != none && OtherPlayer.Pawn != none )
// {
// if ( FastTrace(self.Location, OtherPlayer.Pawn.Location) )
// {
// bShowPickup = false;
// break;
// }
// }
// }
if ( bShowPickup )
{
RespawnEffect();
Sleep(RespawnEffectTime);
if ( PickUpBase != none )
{
PickUpBase.TurnOn();
}
GotoState('Pickup');
}
else
Goto('TryToRespawnAgain');
}
defaultproperties
{
RotationRate=(Yaw=0)
}