1
0
KF2-Dev-Scripts/KFGame/Classes/KFPowerUp.uc

184 lines
5.2 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
//=============================================================================
// KFPowerUp
//=============================================================================
// Base class for the KF2 power ups
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFPowerUp extends ReplicationInfo
config(game);
/** Localized name of the power up */
var localized string PowerUpName;
/** Duration of the power up */
var float PowerUpDuration;
/** Current time remaining until the power up ends */
var transient float RemainingDuration;
/** Is the power up active */
var bool bPowerUpActive;
/** Can the player pawn be healed with the power up active */
var bool CanBeHealedWhilePowerUpIsActive;
/*********************************************************************************************
* Secondary Damage
********************************************************************************************* */
/** Damage type to use for the burning DOT */
var class<KFDamageType> SecondaryDamageType;
/** Damage value to use for the burning DOT */
var int SecondaryDamage;
/*********************************************************************************************
* Caching
********************************************************************************************* */
var KFPlayerController OwnerPC;
var KFPawn_Human OwnerPawn;
/*********************************************************************************************
* Effects and sounds
********************************************************************************************* */
/** The name of the screen material to update when the power up is active */
var name ScreenMaterialName;
/** Camera lens emitter effects when a pawn has this power up */
var class<EmitterCameraLensEffectBase> CameraLensEffectTemplate;
/** 3rd person effect attached to the pawn for the power up */
var ParticleSystem PowerUpEffect;
/** Audio loop for first person */
var AKEvent AudioLoopFirstPerson;
/** Audio loop for third person */
var AKEvent AudioLoopThirdPerson;
/** Audio triggered at the end of the loop for first person */
var AKEvent AudioLoopThirdPersonStop;
/** Audio triggered at the end of the loop for third person */
var AKEvent AudioLoopFirstPersonStop;
function ActivatePowerUp()
{
if(Role == Role_Authority)
{
RemainingDuration = PowerUpDuration;
bPowerUpActive = true;
OwnerPawn.UpdateGroundSpeed();
OwnerPawn.SetPowerUpAmbientSound(AudioLoopThirdPerson, AudioLoopFirstPerson);
SetTimer(0.05f, false, nameof(PlayPowerUp));
}
}
function ReactivatePowerUp()
{
if(Role == Role_Authority && bPowerUpActive && RemainingDuration > 0)
{
RemainingDuration = PowerUpDuration;
OwnerPawn.UpdateGroundSpeed();
OwnerPawn.StopPowerUp(class);
SetTimer(0.05f, false, nameof(PlayPowerUp));
}
}
function PlayPowerUp()
{
OwnerPawn.PlayPowerUp(class);
}
function DeactivatePowerUp()
{
if(Role == Role_Authority)
{
bPowerUpActive = false;
RemainingDuration = 0;
if(OwnerPC != none)
{
OwnerPawn.StopPowerUp(class);
OwnerPawn.SetPowerUpAmbientSound(none, none, AudioLoopThirdPersonStop, AudioLoopFirstPersonStop);
OwnerPC.CurrentPowerUp = none;
OwnerPC.CurrentPowerUpClass = none;
OwnerPC.ClientUpdatePowerUp(none);
}
OwnerPawn.UpdateGroundSpeed();
self.Destroy();
}
}
simulated function ModifySpeed( out float Speed );
simulated function ModifySprintSpeed( out float Speed ){ ModifySpeed( Speed ); }
function FinalizeSpeedVariables();
function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class<KFDamageType> DamageType, optional int HitZoneIdx );
function ModifyDamageTaken( out int InDamage, optional class<DamageType> DamageType, optional Controller InstigatedBy );
function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy );
function bool CanBeHealed(){ return CanBeHealedWhilePowerUpIsActive; }
static function PlayEffects( KFPawn_Human P )
{
local ParticleSystemComponent ParticleEffect;
if( default.PowerUpEffect != none )
{
ParticleEffect = P.WorldInfo.MyEmitterPool.SpawnEmitterMeshAttachment(default.PowerUpEffect, P.Mesh, 'Hips', false);
P.CurrentPowerUpEffect.PowerUpType = default.class;
P.CurrentPowerUpEffect.ParticleEffect = ParticleEffect;
}
}
simulated event Tick(float DeltaTime)
{
if(Role == Role_Authority)
{
if(bPowerUpActive)
{
RemainingDuration -= DeltaTime;
if(RemainingDuration <= 0)
{
DeactivatePowerUp();
}
}
}
}
event Destroyed()
{
if(bPowerUpActive)
{
DeactivatePowerUp();
}
super.Destroyed();
}
simulated function PlayerDied()
{
DeactivatePowerUp();
}
DefaultProperties
{
PowerUpDuration=0.5f
CanBeHealedWhilePowerUpIsActive=true
bTickIsDisabled=False
// network
RemoteRole=ROLE_SimulatedProxy
NetUpdateFrequency=1.0
bAlwaysRelevant=True
bOnlyRelevantToOwner=true
}