1
0
KF2-Dev-Scripts/KFGame/Classes/KFSM_Stunned.uc
2020-12-13 18:01:13 +03:00

155 lines
4.5 KiB
Ucode

//=============================================================================
// KFSM_Stunned
//=============================================================================
// Used to stop a zed from moving and play a stunned and wakeup animation
// for a random amount of time
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Greg Felber 2/5/2014
//=============================================================================
class KFSM_Stunned extends KFSpecialMove;
var name StunnedAnim;
var array<name> WakeupAnims;
var float StunDuration;
var vector2D PlayerStunDurationRange;
var vector2D StunDurationRange;
/** Socket to attach our dazed/stunned effect */
var name DazedFXSocketName;
var rotator DazedFXRelativeRotation;
var transient ParticleSystemComponent DazedPSC;
/** Notification called when Special Move starts */
function SpecialMoveStarted(bool bForced, Name PrevMove )
{
super.SpecialMoveStarted( bForced, PrevMove );
DoStun();
}
/** Stop the movement and play the stun animation for all clients */
function DoStun()
{
if( KFPOwner.Role == ROLE_Authority )
{
// Disable Movement by using the DefaultAICommandClass to call LockdownAI()
if( KFPOwner.IsHumanControlled() )
{
StunDuration = KFPOwner.IncapSettings[AF_Stun].Duration > 0 ? KFPOwner.IncapSettings[AF_Stun].Duration : RandRange( PlayerStunDurationRange.X, PlayerStunDurationRange.Y );
}
else
{
StunDuration = KFPOwner.IncapSettings[AF_Stun].Duration > 0 ? KFPOwner.IncapSettings[AF_Stun].Duration : RandRange( StunDurationRange.X, StunDurationRange.Y );
}
KFPOwner.SetTimer( StunDuration, false, nameof(DoWakeup), self );
}
// We still want to preserve Z velocity, and not stop in mid-air
KFPOwner.Velocity.X = 0.f;
KFPOwner.Velocity.Y = 0.f;
KFPOwner.Acceleration = vect(0,0,0);
PlaySpecialMoveAnim( StunnedAnim, EAS_FullBody, 0.4f, 0.3f, 1.f, true );
// Spawn the dazed particle effect
if( KFPOwner.WorldInfo.NetMode != NM_DedicatedServer )
{
DazedPSC = AttachDazedEffect( KFPawn_Monster(KFPOwner) );
}
}
/** Wakeup the zed once the servers timer has finished */
function DoWakeup()
{
// replicate to all clients
if( KFPOwner.Role == ROLE_Authority )
{
KFPOwner.SpecialMoveFlags = 1;
KFPOwner.ReplicatedSpecialMove.Flags = 1;
PlayWakeupAnimation();
}
}
/* Play a random wakeup animation */
function PlayWakeupAnimation()
{
local byte WakeupIndex;
WakeupIndex = Rand( WakeupAnims.Length );
PlaySpecialMoveAnim( WakeupAnims[WakeupIndex], EAS_FullBody, 0.2f, 0.3f, 1.f, false );
// Deactivate dazed particle effect
if( DazedPSC != none )
{
DazedPSC.DeactivateSystem();
}
}
/* Play the wakeup animation for all clients */
function SpecialMoveFlagsUpdated()
{
PlayWakeupAnimation();
}
/** Notification called when Special Move starts when ReplicatedSpecialMove changes*/
function SpecialMoveEnded(Name PrevMove, Name NextMove)
{
super.SpecialMoveEnded( PrevMove, NextMove );
// Make sure dazed particle effect is always deactivated
if( DazedPSC != none && DazedPSC.bIsActive )
{
DazedPSC.DeactivateSystem();
}
}
/** Attaches the dazed effect to a monster pawn */
static function ParticleSystemComponent AttachDazedEffect( KFPawn_Monster KFPM )
{
local ParticleSystemComponent PSC;
local KFCharacterInfo_Monster MonsterArch;
if( KFPM != none )
{
MonsterArch = KFPM.GetCharacterMonsterInfo();
if( MonsterArch != none && MonsterArch.DazedEffectTemplate != none && KFPM.WorldInfo.MyEmitterPool != none )
{
PSC = KFPM.WorldInfo.MyEmitterPool.SpawnEmitterMeshAttachment( MonsterArch.DazedEffectTemplate, KFPM.Mesh, default.DazedFXSocketName, true );
if( PSC != none )
{
PSC.SetAbsolute( false, true, false );
PSC.SetRotation( rotator(vect(0,0,1)) + default.DazedFXRelativeRotation );
return PSC;
}
}
}
return none;
}
defaultproperties
{
Handle=KFSM_Stunned
StunnedAnim=Stun_Loop_V1
WakeupAnims.Add(Stun_Wakeup_V1)
WakeupAnims.Add(Stun_Wakeup_V2)
WakeupAnims.Add(Stun_Wakeup_V3)
StunDurationRange=(X=2.f, Y=4.f)
PlayerStunDurationRange=(X=1.f, Y=1.5f)
bAllowHitReactions=true
bDisableMovement=TRUE
bLockPawnRotation=TRUE
DefaultAICommandClass=class'KFGame.AICommand_PushedBySM'
bDisablesWeaponFiring=true
bCanOnlyWanderAtEnd=true
DazedFXSocketName=FX_Dazed
DazedFXRelativeRotation=( Yaw=0,Pitch=16384,Roll=0 )
}