1
0
KF2-Dev-Scripts/KFGameContent/Classes/KFAIController_HansFriendlyTest.uc

188 lines
6.3 KiB
Ucode
Raw Permalink Normal View History

2020-12-13 15:01:13 +00:00
//=============================================================================
// KFAIController_HansFriendlyTest
//=============================================================================
// Hans's AIController that will target zeds not players - for testing
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFAIController_HansFriendlyTest extends KFAIController_Hans;
/** Hans doesn't get SeePlayer calls on monsters, so check occasionally if he can see his enemy */
var float EnemyVisionCheckInterval;
/** Hans doesn't get SeePlayer calls on monsters, so check occasionally if he can see his enemy */
var float LastEnemyVisionCheckTime;
/** Don't create a benchmarking PRI for the test Hans */
function InitPlayerReplicationInfo(){}
/** Make sure test Hans is on the human team */
simulated event byte ScriptGetTeamNum()
{
return 0;
}
/** Timer function called during latent moves that determines whether NPC should sprint or stop sprinting */
function bool ShouldSprint()
{
local float RangeToEnemy;
if( Enemy != none && MyHansPawn != none && !MyHansPawn.bIsHeadless && !MyHansPawn.bEmpPanicked )
{
// Always sprint if we're trying to track down players to heal from
if( MyHansPawn.bInHuntAndHealMode )
{
//`log(self@GetFuncName()$" bInHuntAndHealMode should sprint!");
return true;
}
// Hack, since Hans doesn't get SeePlayer calls on zeds, check here to see if we can see our enemy
if( LastEnemySightedTime == 0 && (LastEnemyVisionCheckTime == 0 ||
(`TimeSince(LastEnemyVisionCheckTime) > EnemyVisionCheckInterval)) )
{
LastEnemyVisionCheckTime = WorldInfo.TimeSeconds;
if( CanSee(Enemy) )
{
LastEnemySightedTime = WorldInfo.TimeSeconds;
}
}
// Sprint if we can't see our enemy
if( LastEnemySightedTime == 0 || `TimeSince(LastEnemySightedTime) > LostSightSprintDelay )
{
// Hack, since Hans doesn't get SeePlayer calls on zeds, check here to see if we can see our enemy
if( LastEnemyVisionCheckTime == 0 || (`TimeSince(LastEnemyVisionCheckTime) > EnemyVisionCheckInterval) )
{
LastEnemyVisionCheckTime = WorldInfo.TimeSeconds;
if( CanSee(Enemy) )
{
LastEnemySightedTime = WorldInfo.TimeSeconds;
return false;
}
}
//`log(self@GetFuncName()$" don't see any enemy should sprint = true! LastEnemySightedTime: "$LastEnemySightedTime$" TimeSince(LastEnemySightedTime): "$`TimeSince(LastEnemySightedTime));
return true;
}
// No sprinting with the guns out!
if( MyHansPawn.bGunsEquipped )
{
RangeToEnemy = VSize( Enemy.Location - Pawn.Location );
// Sprint if we're too close to shoot
if( RangeToEnemy > StartShootingRange || rangeToEnemy < MinShootingRange )
{
//`log(self@GetFuncName()$" guns out but enemy not in gun range. Should sprint = true!");
return true;
}
else
{
//`log(self@GetFuncName()$" guns out enemy not in gun range. Should sprint = false!");
return false;
}
}
//`log(self@GetFuncName()$" Generic should sprint depending on phase: "$MyHansPawn.DesireSprintingInThisPhase());
return MyHansPawn.DesireSprintingInThisPhase();
}
//`log(self@GetFuncName()$" Generic should sprint = false!");
return false;
}
// Below is code to turn on if we want to use Hans with "bIsPlayer=true".
// It simulates "SeePlayer" calls for "SeeMonster" calls so Hans will properly
// get vision calls for seeing monster enemies
/*********************************************************************************************
* Action_Idle State - default state this controller uses while pawn is active
********************************************************************************************* */
//state Action_Idle
//{
// event BeginState(Name PreviousStateName)
// {
// Super.BeginState( PreviousStateName );
//
// Enable( 'SeeMonster' );
// }
//}
//
///** Called when this controller has possessed inPawn */
//event Possess( Pawn inPawn, bool bVehicleTransition )
//{
// // Currently only enabling SeePlayer during latent moves in AICommand_MoveToGoal
// Disable( 'SeeMonster' );
//
// super.Possess( inPawn, bVehicleTransition );
//}
//
///** Timer which re-enables SeePlayer event polling */
//event EnableSeePlayer()
//{
// Super.EnableSeePlayer();
// if( !bHasDebugCommand )
// {
// Enable( 'SeeMonster' );
// }
//}
//
///** Disable this NPC's SeePlayer polling for DisabledTime seconds */
//event DisableSeePlayer( optional float DisabledTime )
//{
// Super.DisableSeePlayer( DisabledTime );
// Disable( 'SeeMonster' );
//
//}
//
//
///* epic ===============================================
//* ::SeeMonster
//*
//* Called whenever Seen is within of our line of sight
//* if Seen.bIsPlayer==false.
//*
//* =====================================================
//*/
//event SeeMonster( Pawn Seen )
//{
// SeePlayer( Seen );
//}
/* epic ===============================================
* ::NotifyTakeHit
*
* Notification from pawn that it has received damage
* via TakeDamage().
*
* =====================================================
*/
function NotifyTakeHit(Controller InstigatedBy, vector HitLocation, int Damage, class<DamageType> damageType, vector Momentum)
{
// Don't heal with a friendly test Hans
// if( MyHansPawn != none && !MyHansPawn.bHealedThisPhase && MyHansPawn.CurrentBattlePhase < 4 )
// {
// if( GetHealthPercentage() < 0.35 )
// {
// MyHansPawn.SetHuntAndHealMode( true );
// NextBattlePhase();
// }
// }
Super(KFAIController_ZedBoss).NotifyTakeHit(InstigatedBy, HitLocation, Damage, DamageType, Momentum);
}
defaultproperties
{
bAllowScriptTeamCheck=true
MinShootingRange=100
MaxGunAttackLength=30
ShootingCooldown=3.0
EnemyVisionCheckInterval=0.1
//bIsPlayer=true
}