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

544 lines
15 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
//=============================================================================
// AICommand_Base_Crawler
//=============================================================================
// Base controller for the Crawler
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class AICommand_Base_Crawler extends AICommand_Base_Zed
within KFAIController_ZedCrawler;
var KFWallPathNode LeapTarget;
var bool bJumpingToWall;
var vector TempDest;
var vector OriginalTrans;
var actor TempMoveGoal;
/*********************************************************************************************
* Initialization
********************************************************************************************* */
function Pushed()
{
Super.Pushed();
Originaltrans = Pawn.Mesh.Translation;
if( OldFloor == vect(0,0,0) )
{
OldFloor = vect(0,0,1);
}
//EnableSeePlayer();
GotoState( DefaultStateName );
}
function Paused( GameAICommand NewCommand )
{
`AILog( self$" "$GetFuncName()$"() Paused for "$NewCommand, 'Crawler' );
Super.Paused( NewCommand );
}
function BeginMoveToWall()
{
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//GotoState( 'MoveToWall',, true );
}
function SightCheck();
function Resumed( name OldCommandName )
{
`AILog( self$" "$GetFuncName()$"() (OldCommandName: "$OldCommandName$")", 'Crawler' );
Super.Resumed( OldCommandName );
// Untested WIP
// DisableSeePlayer();
// if( Pawn.Physics == PHYS_Walking || Pawn.Physics == PHYS_Falling )
// {
// DisableMeleeRangeEventProbing();
// GotoState( 'MoveToWall' );
// }
// else if( GetStateName() != DefaultStateName && Pawn.Physics == PHYS_Spider && CanSee(Enemy) )
// {
// GotoState( 'MoveToWall', 'Begin' );
// }
// else
// GotoState( DefaultStateName,, true );
}
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//state MoveToWall
//{
// event BeginState( name PreviousStateName )
// {
// }
//
// event EndState( name NextStateName )
// {
// }
//
// function BeginMoveToWall();
//
// function SightCheck()
// {
//// if( FRand() < 0.33f && Enemy.Controller.CanSee(Pawn) && Pawn.Physics == PHYS_Spider )
//// {
//// StopAllLatentMovement();
//// JumpToTarget();
//// return;
//// }
//// SetTimer( 1.f + FRand() * 2.f, false, nameof(SightCheck), self );
// }
//
// function JumpToTarget()
// {
// local Vector Suggested;
// local NavigationPoint ClosestToEnemy, ClosestToMe;
// local actor Target;
//
// ClosestToEnemy = class'NavigationPoint'.static.GetNearestNavToActor( Enemy, class'KFPathnode' );
// DrawDebugSphere( ClosestToEnemy.Location, 32, 8, 255, 0, 0, true );
// ClosestToMe = class'NavigationPoint'.static.GetNearestNavToActor( Pawn, class'KFPathnode' );
// DrawDebugSphere( ClosestToMe.Location, 32, 8, 0, 255, 0, true );
// if( VSize( ClosestToEnemy.Location - Pawn.Location ) < VSize(Enemy.Location - Pawn.Location) )
// {
// Target = ClosestToEnemy;
// }
// else
// {
// Target = ClosestToMe;
// }
//
// //class'NavigationPoint'.static.GetAllNavInRadius( Outer, Enemy.Location
// if( Target != none )// && ActorReachable(Target) && VSize(Target.Location - Pawn.Location) < 750.f )
// {
// MyKFPawn.SuggestJumpVelocity( Suggested, Target.Location, Pawn.Location );
// MyKFPawn.Velocity = Suggested * MyKFPawn.Floor;;
// MoveTarget = Target;
// //MyKFPawn.Acceleration = vect( 0,0,0 );
// MyKFPawn.SetPhysics( PHYS_Falling );
// Pawn.ResetDesiredRotation();
// Focus = none;
// SetFocalPoint(MoveTarget.Location);
// // Focus = none;
//
// //Focus = Enemy;
// }
// }
//
// function SetBestAnchor()
// {
// local NavigationPoint BestAnchor;
// local float Dist;
//
// BestAnchor = Pawn.GetBestAnchor( Pawn, Pawn.Location, true, false, Dist );
// if( BestAnchor != none )
// {
// Pawn.SetAnchor( BestAnchor );
// }
// }
//
//Jumping:
// if( MyKFPawn.IsPawnMovingTowardMe( Enemy, 250.f ) )
// {
// Sleep( 0.1f );
// Goto( 'Jumping' );
// }
//
// Sleep( FRand() );
//// SetFocalPoint(vect(0,0,0) );
//// Focus = Enemy;
// StopAllLatentMovement();
// AIZeroMovementVariables();
// JumpToTarget();
// WaitForLanding();
// SetBestAnchor();
// LastAmbushNode = none;
// if( Pawn.Physics == PHYS_Walking )
// {
// GotoState( DefaultStateName,, true );
// }
// else
// {
// if( FRand() < 0.22f )
// {
// Sleep( 0.5f );
// }
// GotoState( DefaultStateName,, true );
// }
//
//Begin:
// // do not do this, this is set in the above function do not reset it
// //MyKFPawn.bIsSprinting = true;
// MyKFPawn.SetSprinting( true );
// if( FindAmbushNode(true) )
// {
// LastAmbushNode = NavigationPoint( RouteGoal );
//
// SetMoveGoal( RouteGoal,, false,, false, true, false, false, true );
// Goto( 'Jumping' );
// // Sleep( 0.f );
// }
// GotoState( DefaultStateName,, true );
//Moving:
// if( Steering != none )
// {
// Steering.EnableDefaultAcceleration();
// }
// //MyKFPawn.bIsSprinting = true;
// MyKFPawn.SetSprinting( true );
// SetTempDest();
// if( VSize( TempDest - Pawn.Location ) > 96.f )
// {
// //MoveTo( Pawn.Location + TempDest * 512.f );
// MoveTo( TempDest );
// }
// else
// {
// Sleep( 0.1f * FRand() );
// }
//
// Sleep( 0.f );
// Goto( 'Begin' );
//}
function CheckWalls()
{
local KFWallPathNode KFWP, BestKFWP;
local float BestDist;
// if( Pawn.Physics == PHYS_Spider )
// {
// return;
// }
DisableSeePlayer(0.f);
Enemy = none;
foreach WorldInfo.AllNavigationPoints( class'KFWallPathNode', KFWP )
{
if( BestKFWP == None || VSize(KFWP.Location - Pawn.Location) < BestDist )
{
if( KFWP.Location.Z > 350.f )
{
BestDist = VSize(KFWP.Location - Pawn.Location);
BestKFWP = KFWP;
}
}
}
LeapTarget = BestKFWP;
StopAllLatentMovement();
//GotoState( 'ZedBaseCommand', 'Leaping' );
}
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//state ZedBaseCommand
//{
// event BeginState( name PreviousStateName )
// {
// super.BeginState( PreviousStateName );
// DisableSeePlayer(0.f);
// //SetTimer( 1.5f, nameof(CheckWalls), true, self );
// }
//// Leaping:
//// bJumpingToWall = true;
//// DoWallLeap( LeapTarget );
//// if( Pawn.Physics == PHYS_Falling )
//// {
//// WaitForLanding();
//// }
//// Goto( 'Begin' );
//}
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//function bool NotifyFallingHitWall(vector HitNormal, actor Wall)
//{
// return NotifyHitWall( HitNormal, Wall );
//}
//
//// 1.31 check bCanStepUpOn below
//function bool NotifyHitWall( vector HitNormal, actor HitActor )
//{
// local KFDoorActor HitDoor;
//
// HitDoor = KFDoorActor( HitActor );
// if( HitDoor != none && MyKFPawn.Physics != PHYS_Spider )
// {
// if( HitDoor.WeldIntegrity <= 0 && KFDoorMarker(HitDoor.MyMarker) != none && !HitDoor.IsCompletelyOpen() )
// {
// DisableNotifyHitWall(0.25f);
// WaitForDoor( HitDoor );
// `AILog( "NotifyHitWall() while in MoveToGoal, Wall: "$HitActor$" Using door and waiting for it to open", 'Doors' );
// HitDoor.UseDoor(Pawn);
// return true;
// }
// // NOTE: Unless returning true, if the Wall is a closed door, SuggestMovePreparation event will be called on the associated KFDoorMarker
// `AILog( GetFuncName()$"() Wall: "$HitActor$" HitNormal: "$HitNormal$" ran into a door!", 'Doors' );
// if( !HitDoor.IsCompletelyOpen() && HitDoor.WeldIntegrity > 0 && (Pawn.Anchor == HitDoor.MyMarker || (DoorEnemy != none && (DoorEnemy == HitDoor || PendingDoor == HitDoor))) )
// {
// DisableNotifyHitWall(0.25f);
// `AILog( GetFuncName()$"() calling NotifyAttackDoor for "$HitDoor, 'Doors' );
// NotifyAttackDoor( HitDoor );
// return true;
// //`AILog( GetFuncName()$"() has door enemy "$DoorEnemy, 'Doors' );
// }
// }
// if( HitActor != none && !HitActor.bCanStepUpon )
// {
// `warn( GetFuncName()$"() Wall "$HitActor$" bCanStepUpOn is FALSE" );
// return false;
// }
//
// if( Pawn != none && HitActor != none && Pawn.Physics == PHYS_Falling )
//// if( bJumpingToWall )
// {
// `AILog( "*NotifyHitWall setting physics to PHYS_Spider and base to "$HitActor, 'Crawler' );
// Pawn.SetPhysics( PHYS_Spider );
// Pawn.SetBase( HitActor, HitNormal );
// DisableNotifyHitWall(1.f);
// }
// return true;
//}
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//state RotateToFocus
//{
// function PushedState()
// {
// super.PushedState();
// AIActionStatus = "In RotateToFocus state";
// }
//
//Begin:
//// SetFocalPoint( vect(0,0,0) );
//// Focus = LeapTarget;
//// FinishRotation();
//// SetFocalPoint(Vect(0,0,0));
//// Focus = none;
//// Pawn.ResetDesiredRotation();
// PopState();
//}
function SetTempDest()
{
local vector V, ProjFocus, X, EnemyLoc;
local float Distance;
if( Enemy == none )
{
Enemy = GetALocalPlayerController().Pawn;
}
EnemyLoc = Enemy.Location;
EnemyLoc.Z = Pawn.Location.Z + RandRange( -64, 64 );
v = EnemyLoc - Pawn.Location;
Distance = (V dot Pawn.Floor);
ProjFocus = EnemyLoc - Distance * Pawn.Floor;
X = normal(ProjFocus - Pawn.Location);
//vector v = Focus - Pawn->Location
if( X != vect(0,0,0) )
{
TempDest = ProjFocus;
// return true;
}
else
{
// return false;
}
}
// Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm
//function bool NotifyBaseChange( actor NewBase, vector NewFloor )
//{
//// if( NewFloor != OldFloor && Pawn.Physics == PHYS_Spider && NewBase != none /*&& bPreciseDestination*/ )
//// {
//// GotoState( GetStateName(), 'HandleNewFloor' );
////
////
//// }
//// else
//
// if( NewFloor != OldFloor )
// {
// if( NewFloor.Z > 0.7f ) // 2.9.2014 was if( NewFloor == vect(0,0,1) )
// {
// if( Pawn.Physics == PHYS_Spider )
// {
// `AILog( GetFuncName()$"() NewFloor is upright, physics is spider - setting physics back to walking!", 'Crawler' );
// Pawn.SetPhysics(PHYS_Walking);
// }
// }
// else if( Pawn.Physics == PHYS_Walking )
// {
// Pawn.SetPhysics( PHYS_Spider );
// }
// }
//
// `AILog( GetFuncName()$" in "$self$" NewBase: "$NewBase$" NewFloor: "$NewFloor$" Pawn Floor: "$Pawn.Floor$" OldFloor: "$OldFloor$" Physics: "$Pawn.GetPhysicsName(), 'Crawler' );
// if( NewFloor != OldFloor && Pawn != none && Pawn.Physics == PHYS_Spider && NewBase != none && !NewBase.IsA('Pawn') && NewBase.bWorldGeometry )
// {
// if( IsDoingLatentMove() )
// {
//// StopAllLatentMovement();
//// Pawn.ZeroMovementVariables();
//// MoveTimer = -1.f;
// }
// //`AILog( "NOTIFYBASECHANGE: "$NewBase$" New floor: "$NewFloor$" Old floor: "$OldFloor$" Floor set yet? "$Pawn.Floor );
// //GotoState( GetStateName(), 'HandleNewFloor' );
// }
//
// return false;
//}
//
//function bool NotifyLanded(vector HitNormal, Actor FloorActor )
//{
// `AILog( "**** NotifyLanded **** HitNormal: "$HitNormal$" FloorActor: "$FloorActor$" Floor is currently "$Pawn.Floor );
//
// bJumpingToWall = false;
// if( Pawn.Floor.Z == 1.f && (Pawn.Physics == PHYS_Walking || Pawn.Physics == PHYS_Falling) )
// {
// Pawn.SetPhysics( PHYS_Walking );
// return true;
// }
//
//
// bJumpingToWall = false;
// `AILog( GetFuncName()$" setting physics to PHYS_Spider, FloorActor: "$FloorActor, 'Crawler');
// Pawn.SetPhysics(PHYS_Spider);
// return true;
//}
// // Disabled for Early Access 1/14/15 as part of disabling wall walking - Ramm P.S. also doesn't seem to be called anywhere
//state Debug_InCombat
//{
// function bool NotifyLanded(vector HitNormal, Actor FloorActor )
// {
// `AILog( GetFuncName()$" 2 setting physics to PHYS_Spider, FloorActor: "$FloorActor, 'Crawler' );
// bJumpingToWall = false;
// Pawn.SetPhysics(PHYS_Spider);
// return true;
// }
//
// function Tick( float DeltaTime )
// {
//// local vector CeilingTrans;
//
//// if( Pawn.Floor.Z == -1 )
//// {
//// CeilingTrans = OriginalTrans;
//// CeilingTrans.X = 36;
//// Pawn.Mesh.SetTranslation( CeilingTrans );
//// }
//// else
//// {
//// Pawn.Mesh.SetTranslation( vect(0,0,-36) );
//// }
// super.Tick( DeltaTime );
// }
//
// event BeginState( name PreviousStateName )
// {
// local KFWallPathNode KFWP, BestKFWP;
// local float BestDist;
//
// DisableSeePlayer(0.f);
// Enemy = none;
// foreach WorldInfo.AllNavigationPoints( class'KFWallPathNode', KFWP )
// {
// if( BestKFWP == None || VSize(KFWP.Location - Pawn.Location) < BestDist )
// {
// BestDist = VSize(KFWP.Location - Pawn.Location);
// BestKFWP = KFWP;
// }
// }
// LeapTarget = BestKFWP;
// //GetAxes(Pawn.Rotation,ViewX,ViewY,ViewZ);
// }
//
// function bool NotifyHitWall(vector HitNormal, actor HitActor)
// {
// if( !HitActor.bCanStepUpon )
// {
// `warn( GetFuncName()$"() Wall "$HitActor$" bCanStepUpOn is FALSE" );
// }
//
// if( bJumpingToWall )
// {
// `AILog( GetFuncName()$" 3 setting physics to PHYS_Spider, HitActor: "$HitActor, 'Crawler' );
// Pawn.SetPhysics( PHYS_Spider );
// Pawn.SetBase( HitActor, HitNormal );
// }
// return true;
// }
//
// function SetTempDest()
// {
// local vector V, ProjFocus, X, EnemyLoc;
// local float Distance;
//
// if( Enemy == none )
// {
// Enemy = GetALocalPlayerController().Pawn;
// }
//
// EnemyLoc = Enemy.Location;
// EnemyLoc.Z = Pawn.Location.Z + RandRange( -72, 72 );
// v = EnemyLoc - Pawn.Location;
// Distance = (V dot Pawn.Floor);
// ProjFocus = EnemyLoc - Distance * Pawn.Floor;
// X = normal(ProjFocus - Pawn.Location);
// if( X != vect(0,0,0) )
// {
// TempDest = ProjFocus;
// }
// }
//
//Begin:
// if( Physics == PHYS_Falling )
// {
// WaitForLanding();
// }
// Pawn.SetPhysics(Phys_Walking);
// if( LeapTarget != none )
// {
// PushState( 'RotateToFocus' );
// }
//
// // Focus = none;
// Sleep( 1.f );
// bJumpingToWall = true;
// //DoWallLeap( LeapTarget );
// if( Pawn.Physics == PHYS_Falling )
// {
// WaitForLanding();
// }
//
//// Enemy = GetALocalPlayerController().Pawn;
// Sleep( 5.f );
// Pawn.SetAnchor( LeapTarget );
// SetMoveGoal( TempMoveGoal,, false,, false, true,,, true );
//Moving:
// MyKFPawn.SetSprinting( true );
// if( VSize( TempDest - Pawn.Location ) > 350.f )
// {
// //MoveTo( Pawn.Location + TempDest * 512.f );
// MoveTo( TempDest );
// }
// else
// {
// Sleep( 2.f * FRand() );
// }
// Goto( 'Moving' );
//
//HandleNewFloor:
// if( Pawn != none && Pawn.IsAliveAndWell() )
// {
// AIZeroMovementVariables();
// StopAllLatentMovement( true );
// Sleep( 0.1f );
// Goto( 'Moving' );
// }
//}
DefaultProperties
{
}