//============================================================================= // AICommand_Pause //============================================================================= // Command to pause the AI for seconds //============================================================================= // Killing Floor 2 // Copyright (C) 2015 Tripwire Interactive LLC //============================================================================= class AICommand_Pause extends AICommand within KFAIController; /** How long should the pause be active */ var float PauseTime; /** Whether or not to stop any current moves */ var bool bStopMovement; /** Option to abort any current movement commands */ var bool bAbortCommands; /** Don't begin pause until falling pawn has landed */ var bool bWaitForLanding; /********************************************************************************************* * Initialization ********************************************************************************************* */ static function bool Pause( KFAIController AI, float InDuration, optional bool InStopMovement=true, optional bool InAbortCommands=false, optional bool InWaitForLanding=true ) { local AICommand_Pause Cmd; if( AI != None ) { Cmd = new(AI) Default.Class; if( Cmd != None ) { Cmd.PauseTime = InDuration; Cmd.bStopMovement = InStopMovement; Cmd.bAbortCommands = InAbortCommands; Cmd.bWaitForLanding = InWaitForLanding; AI.PushCommand(Cmd); return TRUE; } } return FALSE; } function Pushed() { super.Pushed(); `AILog( "Pausing for "$PauseTime$" second(s)", 'Command_Pause' ); AIActionStatus = "Pausing for "$PauseTime$" seconds"; DisableMeleeRangeEventProbing(); GotoState('Wait'); } function Popped() { AIActionStatus = "Finished pause"; super.Popped(); EnableMeleeRangeEventProbing(); } function Paused( GameAICommand NewCommand ) { // Pausing the pause command can be bad, unless you're sure you want to do this. // See CanInterruptPauseCommand() //`warn( self$" PAUSED BY "$NewCommand ); } function bool AllowTransitionTo( class AttemptCommand ) { local class AIC; AIC = class(AttemptCommand); if( AIC != none && AIC.static.CanInterruptPauseCommand() ) { return true; } return super.AllowTransitionTo( AttemptCommand ); } /** Prevent changing enemy while paused */ function bool CanChangeEnemy( Pawn NewEnemy ) { return false; } /********************************************************************************************* * Wait (Paused) state ********************************************************************************************* */ state Wait { Begin: if( bWaitForLanding && MyKFPawn.Physics == PHYS_Falling ) { WaitForLanding(); } if( bStopMovement ) { AIZeroMovementVariables(); //StopAllLatentMovement(); // Abort move commands, too? } if( bAbortCommands ) { AbortMovementCommands(); AbortMovementPlugIns(); } Sleep( PauseTime ); GotoState( 'DelaySuccess' ); }; DefaultProperties { //bReplaceActiveSameClassInstance=true bAllowedToAttack=false bIgnoreNotifies=true bIgnoreStepAside=true PauseTime=10.0f }