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

160 lines
3.5 KiB
Ucode

//=============================================================================
// Powerup items - activatable inventory.
//=============================================================================
class Powerups extends Inventory
abstract
native
nativereplication;
var travel int NumCopies;
var() bool bCanHaveMultipleCopies; // if player can possess more than one of this
var() bool bAutoActivate; // automatically activated when picked up
var() bool bActivatable; // Whether item can be activated/deactivated (if true, must auto activate)
var travel bool bActive; // Whether item is currently activated.
var() localized String ExpireMessage; // Messages shown when powerup charge runs out
var() sound ActivateSound, DeActivateSound;
replication
{
// Things the server should send to the client.
reliable if( bNetOwner && bNetDirty && (Role==ROLE_Authority) )
NumCopies, bActivatable, bActive;
}
event TravelPreAccept()
{
Super.TravelPreAccept();
if( bActive )
Activate();
}
function PickupFunction(Pawn Other)
{
Super.PickupFunction(Other);
if (bActivatable && Other.SelectedItem==None)
Other.SelectedItem=self;
if (bActivatable && bAutoActivate && Other.bAutoActivate)
Activate();
}
//
// Select first activatable item.
//
function Powerups SelectNext()
{
if ( bActivatable )
return self;
if ( Inventory != None )
return Inventory.SelectNext();
else
return None;
}
//
// Toggle Activation of selected Item.
//
function Activate()
{
if( bActivatable )
{
GoToState('Activated');
}
}
//
// Advanced function which lets existing items in a pawn's inventory
// prevent the pawn from picking something up. Return true to abort pickup
// or if item handles the pickup
function bool HandlePickupQuery( Pickup Item )
{
if (item.InventoryType == class)
{
if (bCanHaveMultipleCopies)
NumCopies++;
else if ( bDisplayableInv )
{
if ( Item.Inventory != None )
Charge = Max(Charge, Item.Inventory.Charge);
else
Charge = Max(Charge, Item.InventoryType.Default.Charge);
}
else
return false;
Item.AnnouncePickup(Pawn(Owner));
Item.SetRespawn();
return true;
}
if ( Inventory == None )
return false;
return Inventory.HandlePickupQuery(Item);
}
function float UseCharge(float Amount);
function FireEffect();
//
// This is called when a usable inventory item has used up it's charge.
//
function UsedUp()
{
if ( Pawn(Owner) != None )
{
bActivatable = false;
Pawn(Owner).NextItem();
if (Pawn(Owner).SelectedItem == Self)
{
Pawn(Owner).NextItem();
if (Pawn(Owner).SelectedItem == Self)
Pawn(Owner).SelectedItem=None;
}
Instigator.ReceiveLocalizedMessage( MessageClass, 0, None, None, Self.Class );
}
Owner.PlaySound(DeactivateSound,SLOT_Interface);
Destroy();
}
static function string GetLocalString(
optional int Switch,
optional PlayerReplicationInfo RelatedPRI_1,
optional PlayerReplicationInfo RelatedPRI_2
)
{
return Default.ExpireMessage;
}
//=============================================================================
// Active state: this inventory item is armed and ready to rock!
state Activated
{
function BeginState()
{
bActive = true;
}
function EndState()
{
bActive = false;
}
function Activate()
{
if ( (Pawn(Owner) != None) && Pawn(Owner).bAutoActivate
&& bAutoActivate && (Charge>0) )
return;
Global.Activate();
}
}
defaultproperties
{
}