boiii-scripts/shared/ai/blackboard_vehicle.gsc
2023-04-13 17:30:38 +02:00

69 lines
10 KiB
Plaintext

#using scripts\shared\ai\systems\blackboard;
#using scripts\shared\ai\systems\shared;
#using scripts\shared\ai\archetype_utility;
#namespace Blackboard;
//*****************************************************************************
// NOTE! When adding a new blackboard variable you must also declare the
// blackboard variable within the ast_definitions file found at:
//
// //t7/main/game/share/raw/animtables/ast_definitions.json
//
// This allows the Animation Selector Table system to determine how to create
// queries based on the blackboard variable.
//
// Also, all blackboard values must be lowercased! No convert to lower is
// perform when assigning values to the blackboard.
//
//*****************************************************************************
function RegisterVehicleBlackBoardAttributes()
{
Assert(IsVehicle(self), "RegisterVehicleBlackBoardAttributes: Should only be called on vehicles");
Blackboard::RegisterBlackBoardAttribute(self,"_speed",undefined,&BB_GetSpeed); if( IsActor(self) ) { /#self TrackBlackBoardAttribute("_speed");#/ };
Blackboard::RegisterBlackBoardAttribute(self,"_enemy_yaw",undefined,&BB_VehGetEnemyYaw); if( IsActor(self) ) { /#self TrackBlackBoardAttribute("_enemy_yaw");#/ };
}
function BB_GetSpeed()
{
velocity = self GetVelocity();
return Length( velocity );
}
function BB_VehGetEnemyYaw()
{
enemy = self.enemy;
if( !IsDefined( enemy ) )
return 0;
toEnemyYaw = VehGetPredictedYawToEnemy( self, 0.2 );
return toEnemyYaw;
}
function VehGetPredictedYawToEnemy( entity, lookAheadTime )
{
// don't run this more than once per frame
if( IsDefined(entity.predictedYawToEnemy) && IsDefined(entity.predictedYawToEnemyTime) && entity.predictedYawToEnemyTime == GetTime() )
return entity.predictedYawToEnemy;
selfPredictedPos = entity.origin;
moveAngle = entity.angles[1] + entity getMotionAngle();
selfPredictedPos += (cos( moveAngle ), sin( moveAngle ), 0) * 200.0 * lookAheadTime;
yaw = VectorToAngles(entity.enemy.origin - selfPredictedPos)[1] - entity.angles[1];
yaw = AbsAngleClamp360( yaw );
// cache
entity.predictedYawToEnemy = yaw;
entity.predictedYawToEnemyTime = GetTime();
return yaw;
}