198 lines
5.2 KiB
Ucode
198 lines
5.2 KiB
Ucode
|
//=============================================================================
|
||
|
// KFSM_Husk_FireBallAttack
|
||
|
//=============================================================================
|
||
|
// Player-controlled Husk fireball attack
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
class KFSM_PlayerHusk_FireBallAttack extends KFSM_PlaySingleAnim;
|
||
|
|
||
|
/** Cached reference to pawn */
|
||
|
var KFPawn_ZedHusk_Versus MyHuskPawn;
|
||
|
|
||
|
/** Time when the special move started */
|
||
|
var float HoldStartTime;
|
||
|
|
||
|
/** Set to true when wind up anim ahs finished */
|
||
|
var bool bReadyToFire;
|
||
|
|
||
|
/** Anims */
|
||
|
var name WindUpAnimName;
|
||
|
var name FireHeldAnimName;
|
||
|
|
||
|
/** VFX */
|
||
|
var ParticleSystem LoopingMuzzleEffect;
|
||
|
var ParticleSystemComponent MuzzlePSC;
|
||
|
var name MuzzleFXSocketName;
|
||
|
|
||
|
function SpecialMoveStarted( bool bForced, name PrevMove )
|
||
|
{
|
||
|
super.SpecialMoveStarted( bForced, PrevMove );
|
||
|
|
||
|
MyHuskPawn = KFPawn_ZedHusk_Versus( KFPOwner );
|
||
|
|
||
|
HoldStartTime = MyHuskPawn.WorldInfo.TimeSeconds;
|
||
|
bReadyToFire = false;
|
||
|
|
||
|
// Spawn and attach our muzzle FX
|
||
|
if( MyHuskPawn.WorldInfo.MyEmitterPool != none )
|
||
|
{
|
||
|
MuzzlePSC = MyHuskPawn.WorldInfo.MyEmitterPool.SpawnEmitterMeshAttachment( LoopingMuzzleEffect, MyHuskPawn.Mesh, MuzzleFXSocketName, true );
|
||
|
}
|
||
|
|
||
|
PlayWindUpAnimation();
|
||
|
}
|
||
|
|
||
|
/** Overridden to do nothing */
|
||
|
function PlayAnimation() {}
|
||
|
|
||
|
/** Plays our wind up anim, starts the barrel spin skel controller */
|
||
|
function PlayWindUpAnimation()
|
||
|
{
|
||
|
bUseRootMotion = false;
|
||
|
PlaySpecialMoveAnim( WindUpAnimName, AnimStance, BlendInTime, BlendOutTime, 1.f );
|
||
|
}
|
||
|
|
||
|
/** Plays our looping hold animation */
|
||
|
function PlayFireHeldAnimation()
|
||
|
{
|
||
|
bReadyToFire = true;
|
||
|
PlaySpecialMoveAnim( FireHeldAnimName, AnimStance, BlendInTime, BlendOutTime, 1.f, true );
|
||
|
|
||
|
if( MyHuskPawn != none )
|
||
|
{
|
||
|
MyHuskPawn.SetFireLightEnabled( true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Plays the fire animation */
|
||
|
function PlayFireAnimation()
|
||
|
{
|
||
|
bReadyToFire = false;
|
||
|
bPendingStopFire = false;
|
||
|
|
||
|
PlaySpecialMoveAnim( AnimName, AnimStance, BlendInTime, BlendOutTime, 1.f, false );
|
||
|
}
|
||
|
|
||
|
/** Plays subsequent animations in the barrage */
|
||
|
function AnimEndNotify(AnimNodeSequence SeqNode, float PlayedTime, float ExcessTime)
|
||
|
{
|
||
|
switch( SeqNode.AnimSeqName )
|
||
|
{
|
||
|
case WindUpAnimName:
|
||
|
if( bPendingStopFire )
|
||
|
{
|
||
|
PlayFireAnimation();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PlayFireHeldAnimation();
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case AnimName:
|
||
|
KFPOwner.EndSpecialMove();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Update looping muzzle effect size */
|
||
|
simulated function Tick( float DeltaTime )
|
||
|
{
|
||
|
local float Strength;
|
||
|
local vector2d StrengthRange;
|
||
|
|
||
|
super.Tick( DeltaTime );
|
||
|
|
||
|
if( MuzzlePSC != none )
|
||
|
{
|
||
|
StrengthRange = MyHuskPawn.GetFireballStrengthRange();
|
||
|
Strength = fClamp( (MyHuskPawn.WorldInfo.TimeSeconds - HoldStartTime) * MyHuskPawn.GetFireballStrengthPerSecond(), StrengthRange.X, StrengthRange.Y );
|
||
|
MuzzlePSC.SetFloatParameter( 'FX_Size', 1.f * (Strength / StrengthRange.Y) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SpecialMoveEnded(Name PrevMove, Name NextMove)
|
||
|
{
|
||
|
if( MuzzlePSC != none && MuzzlePSC.bIsActive )
|
||
|
{
|
||
|
MuzzlePSC.DeactivateSystem();
|
||
|
}
|
||
|
|
||
|
super.SpecialMoveEnded( PrevMove, NextMove );
|
||
|
}
|
||
|
|
||
|
/** Wait for a button release and fire */
|
||
|
function SpecialMoveFlagsUpdated()
|
||
|
{
|
||
|
if( KFPOwner.SpecialMoveFlags == FLAG_SpecialMoveButtonReleased )
|
||
|
{
|
||
|
bPendingStopFire = true;
|
||
|
if( bReadyToFire )
|
||
|
{
|
||
|
PlayFireAnimation();
|
||
|
}
|
||
|
}
|
||
|
else if( KFPOwner.SpecialMoveFlags == FLAG_SpecialMoveButtonPressed )
|
||
|
{
|
||
|
bPendingStopFire = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
super.SpecialMoveFlagsUpdated();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Called on some player-controlled moves when a firemode input has been pressed */
|
||
|
function SpecialMoveButtonRetriggered()
|
||
|
{
|
||
|
KFPOwner.DoSpecialMove( KFPOwner.SpecialMove, true,, FLAG_SpecialMoveButtonPressed );
|
||
|
if( KFPOwner.Role < ROLE_Authority && KFPOwner.IsLocallyControlled() )
|
||
|
{
|
||
|
KFPOwner.ServerDoSpecialMove( KFPOwner.SpecialMove, true,, FLAG_SpecialMoveButtonPressed );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Called on some player-controlled moves when a firemode input has been released */
|
||
|
function SpecialMoveButtonReleased()
|
||
|
{
|
||
|
KFPOwner.DoSpecialMove( KFPOwner.SpecialMove, true,, FLAG_SpecialMoveButtonReleased );
|
||
|
if( KFPOwner.Role < ROLE_Authority && KFPOwner.IsLocallyControlled() )
|
||
|
{
|
||
|
KFPOwner.ServerDoSpecialMove( KFPOwner.SpecialMove, true,, FLAG_SpecialMoveButtonReleased );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DefaultProperties
|
||
|
{
|
||
|
// SpecialMove
|
||
|
Handle=KFSM_PlayerHusk_FireBallAttack
|
||
|
bDisableSteering=false
|
||
|
bDisableMovement=true
|
||
|
bDisableTurnInPlace=true
|
||
|
bCanBeInterrupted=true
|
||
|
CustomTurnInPlaceAnimRate=2.f
|
||
|
|
||
|
// Animation
|
||
|
WindUpAnimName=Player_Shoot_Start
|
||
|
FireHeldAnimName=Player_Shoot_Loop
|
||
|
AnimName=Player_Shoot_End
|
||
|
AnimStance=EAS_FullBody
|
||
|
bUseRootMotion=false
|
||
|
|
||
|
// VFX
|
||
|
LoopingMuzzleEffect=ParticleSystem'ZED_Husk_EMIT.FX_Husk_muzzleflash_Loop_01'
|
||
|
MuzzleFXSocketName=EMPDisruptSocket
|
||
|
|
||
|
// Camera
|
||
|
bUseCustomThirdPersonViewOffset=true
|
||
|
CustomThirdPersonViewOffset={(
|
||
|
OffsetHigh=(X=-135,Y=75,Z=40),
|
||
|
OffsetLow=(X=-180,Y=75,Z=50),
|
||
|
OffsetMid=(X=-120,Y=60,Z=0),
|
||
|
)}
|
||
|
ViewOffsetInterpTime=0.3f
|
||
|
CustomCameraFOV=60.f
|
||
|
CameraFOVTransitionTime=0.4f
|
||
|
}
|