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

243 lines
5.5 KiB
Ucode

class KFAmmoPickup extends Ammo;
var() Material KFPickupImage;
var bool bSleeping;
var bool bShowPickup;
var Controller OtherPlayer;
event PostBeginPlay()
{
// Add to KFGameType.AmmoPickups array
if ( KFGameType(Level.Game) != none )
{
KFGameType(Level.Game).AmmoPickups[KFGameType(Level.Game).AmmoPickups.Length] = self;
GotoState('Sleeping', 'Begin');
}
}
state Pickup
{
// When touched by an actor.
function Touch(Actor Other)
{
local Inventory CurInv;
local bool bPickedUp;
local int AmmoPickupAmount;
local Boomstick DBShotty;
local bool bResuppliedBoomstick;
if ( Pawn(Other) != none && Pawn(Other).bCanPickupInventory && Pawn(Other).Controller != none &&
FastTrace(Other.Location, Location) )
{
for ( CurInv = Other.Inventory; CurInv != none; CurInv = CurInv.Inventory )
{
if( Boomstick(CurInv) != none )
{
DBShotty = Boomstick(CurInv);
}
if ( KFAmmunition(CurInv) != none && KFAmmunition(CurInv).bAcceptsAmmoPickups )
{
if ( KFAmmunition(CurInv).AmmoPickupAmount > 1 )
{
if ( KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo )
{
if ( KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill != none )
{
AmmoPickupAmount = float(KFAmmunition(CurInv).AmmoPickupAmount) * KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill.static.GetAmmoPickupMod(KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo), KFAmmunition(CurInv));
}
else
{
AmmoPickupAmount = KFAmmunition(CurInv).AmmoPickupAmount;
}
KFAmmunition(CurInv).AmmoAmount = Min(KFAmmunition(CurInv).MaxAmmo, KFAmmunition(CurInv).AmmoAmount + AmmoPickupAmount);
if( DBShotgunAmmo(CurInv) != none )
{
bResuppliedBoomstick = true;
}
bPickedUp = true;
}
}
else if ( KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo )
{
bPickedUp = true;
if ( FRand() <= (1.0 / Level.Game.GameDifficulty) )
{
KFAmmunition(CurInv).AmmoAmount++;
}
}
}
}
if ( bPickedUp )
{
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(RespawnTime/GetNumPlayers()); // Delay before respawning
goto('Respawn');
TryToRespawnAgain:
Sleep(1.0);
Respawn:
bShowPickup = true;
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');
}
Goto('TryToRespawnAgain');
}
// Returns the number of players
function float GetNumPlayers()
{
local int NumPlayers;
local Controller C;
For( C=Level.ControllerList; C!=None; C=C.NextController )
{
if( C.bIsPlayer && C.Pawn!=None && C.Pawn.Health > 0 )
{
NumPlayers++;
}
}
// Always return at least 1
if( NumPlayers < 1 )
{
NumPlayers = 1;
}
return NumPlayers;
}
function float BotDesireability(Pawn Bot)
{
local Actor InvIt;
local KFWeapon Weap;
// Only make this desirable if bot can use it
for ( InvIt = Bot; InvIt != none; InvIt = InvIt.Inventory )
{
Weap = KFWeapon(InvIt);
if ( Weap != none && (Weap.AmmoClass[0] == self.class || Weap.AmmoClass[1] == self.class) )
{
return super.BotDesireability(Bot);
}
}
return 0;
}
function Reset()
{
GotoState('Sleeping', 'Begin');
}
event Landed(Vector HitNormal)
{
}
defaultproperties
{
MessageClass=class'PickupMessagePlus'
InventoryType=Class'KFMod.BullpupAmmo'
PickupForce="AssaultAmmoPickup"
DrawType=DT_StaticMesh
StaticMesh=StaticMesh'kf_generic_sm.pickups.Metal_Ammo_Box'
RespawnTime=30.000000
PickupSound=Sound'KF_InventorySnd.Ammo_GenericPickup'
PickupMessage="Found Some Ammo!";
bDynamicLight=True
Physics=PHYS_Falling
AmbientGlow=40
TransientSoundVolume=100.000000
CollisionRadius=20.000000
CollisionHeight=10.000000
PrePivot=(X=0,Y=21,Z=12)
UV2Texture=FadeColor'PatchTex.Common.PickupOverlay'
bOnlyReplicateHidden=false
}