//============================================================================= // KFSM_RangedAttack //============================================================================= // //============================================================================= // Killing Floor 2 // Copyright (C) 2018 Tripwire Interactive LLC //============================================================================= class KFSM_RangedAttack extends KFSM_PlaySingleAnim abstract; var array AnimNames; /** Offsets for firing fireballs. */ var array FireOffsets; /** Set once each time move is invoked */ var transient protected vector FireOffset; static function byte PackFlagsBase(KFPawn P) { return Rand(default.AnimNames.Length); } protected function bool InternalCanDoSpecialMove() { // Case for player-controlled Husk if (KFPOwner.IsHumanControlled()) { return KFPOwner.IsCombatCapable(); } if (AIOwner == none || AIOwner.MyKFPawn == none || AIOwner.Enemy == none) { return false; } if (!KFPOwner.IsCombatCapable()) { return false; } // Make sure we have line of sight if (!AIOwner.DirectProjectileFireBehavior.IsThereClearDirectFireAttackLaneFromGivenLoc(PawnOwner.Location, AIOwner.Enemy)) { return false; } return super.InternalCanDoSpecialMove(); } function vector GetFireOffset() { return FireOffset; } function SpecialMoveStarted(bool bForced, name PrevMove) { super.SpecialMoveStarted(bForced, PrevMove); SetLockPawnRotation(false); if (AIOwner != none) { AIOwner.AIZeroMovementVariables(); } } function PlayAnimation() { local int AnimNum; AnimNum = Clamp(KFPOwner.SpecialMoveFlags, 0, AnimNames.Length); AnimName = AnimNames[AnimNum]; FireOffset = FireOffsets[AnimNum]; super.PlayAnimation(); } function SpecialMoveEnded(Name PrevMove, Name NextMove) { super.SpecialMoveEnded(PrevMove, NextMove); SetLockPawnRotation(false); } defaultproperties { bDisableSteering=false bDisableMovement=true bCanBeInterrupted=true }