243 lines
5.5 KiB
Ucode
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
|
|
}
|