You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.4 KiB
149 lines
4.4 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef AI_BASENPC_PHYSICSFLYER_H |
|
#define AI_BASENPC_PHYSICSFLYER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "ai_basenpc.h" |
|
#include "ai_navigator.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// The combot. |
|
//----------------------------------------------------------------------------- |
|
abstract_class CAI_BasePhysicsFlyingBot : public CAI_BaseNPC, public IMotionEvent |
|
{ |
|
DECLARE_CLASS( CAI_BasePhysicsFlyingBot, CAI_BaseNPC ); |
|
public: |
|
DECLARE_DATADESC(); |
|
|
|
void StartTask( const Task_t *pTask ); |
|
void GetVelocity(Vector *vVelocity, AngularImpulse *vAngVelocity); |
|
virtual QAngle BodyAngles(); |
|
|
|
virtual bool ShouldSavePhysics() { return true; } |
|
|
|
protected: |
|
|
|
CAI_BasePhysicsFlyingBot(); |
|
~CAI_BasePhysicsFlyingBot(); |
|
|
|
Vector VelocityToAvoidObstacles(float flInterval); |
|
virtual float MinGroundDist(void); |
|
|
|
virtual void TurnHeadToTarget( float flInterval, const Vector &moveTarget ); |
|
|
|
void MoveInDirection( float flInterval, const Vector &targetDir, |
|
float accelXY, float accelZ, float decay) |
|
{ |
|
decay = ExponentialDecay( decay, 1.0, flInterval ); |
|
accelXY *= flInterval; |
|
accelZ *= flInterval; |
|
|
|
m_vCurrentVelocity.x = ( decay * m_vCurrentVelocity.x + accelXY * targetDir.x ); |
|
m_vCurrentVelocity.y = ( decay * m_vCurrentVelocity.y + accelXY * targetDir.y ); |
|
m_vCurrentVelocity.z = ( decay * m_vCurrentVelocity.z + accelZ * targetDir.z ); |
|
} |
|
|
|
void MoveToLocation( float flInterval, const Vector &target, |
|
float accelXY, float accelZ, float decay) |
|
{ |
|
Vector targetDir = target - GetLocalOrigin(); |
|
VectorNormalize(targetDir); |
|
|
|
MoveInDirection(flInterval, targetDir, accelXY, accelZ, decay); |
|
} |
|
|
|
void Decelerate( float flInterval, float decay ) |
|
{ |
|
decay *= flInterval; |
|
m_vCurrentVelocity.x = (decay * m_vCurrentVelocity.x); |
|
m_vCurrentVelocity.y = (decay * m_vCurrentVelocity.y); |
|
m_vCurrentVelocity.z = (decay * m_vCurrentVelocity.z); |
|
} |
|
|
|
void AddNoiseToVelocity( float noiseScale = 1.0 ) |
|
{ |
|
if( m_vNoiseMod.x ) |
|
{ |
|
m_vCurrentVelocity.x += noiseScale*sin(m_vNoiseMod.x * gpGlobals->curtime + m_vNoiseMod.x); |
|
} |
|
|
|
if( m_vNoiseMod.y ) |
|
{ |
|
m_vCurrentVelocity.y += noiseScale*cos(m_vNoiseMod.y * gpGlobals->curtime + m_vNoiseMod.y); |
|
} |
|
|
|
if( m_vNoiseMod.z ) |
|
{ |
|
m_vCurrentVelocity.z -= noiseScale*cos(m_vNoiseMod.z * gpGlobals->curtime + m_vNoiseMod.z); |
|
} |
|
} |
|
|
|
void LimitSpeed( float zLimit, float maxSpeed = -1 ) |
|
{ |
|
if ( maxSpeed == -1 ) |
|
maxSpeed = m_flSpeed; |
|
if (m_vCurrentVelocity.Length() > maxSpeed) |
|
{ |
|
VectorNormalize(m_vCurrentVelocity); |
|
m_vCurrentVelocity *= maxSpeed; |
|
} |
|
// Limit fall speed |
|
if (zLimit > 0 && m_vCurrentVelocity.z < -zLimit) |
|
{ |
|
m_vCurrentVelocity.z = -zLimit; |
|
} |
|
} |
|
|
|
AI_NavPathProgress_t ProgressFlyPath( float flInterval, |
|
const CBaseEntity *pNewTarget, |
|
unsigned collisionMask, |
|
bool bNewTrySimplify = true, |
|
float strictPointTolerance = 32.0 ); |
|
|
|
const Vector &GetCurrentVelocity() const { return m_vCurrentVelocity; } |
|
void SetCurrentVelocity(const Vector &vNewVel) { m_vCurrentVelocity = vNewVel; } |
|
|
|
const Vector &GetNoiseMod() const { return m_vNoiseMod; } |
|
void SetNoiseMod( float x, float y, float z ) { m_vNoiseMod.Init( x, y, z ); } |
|
void SetNoiseMod( const Vector &noise ) { m_vNoiseMod = noise; } |
|
|
|
void TranslateNavGoal( CBaseEntity *pTarget, Vector &chasePosition ); |
|
|
|
virtual void MoveToTarget(float flInterval, const Vector &MoveTarget) = 0; |
|
|
|
virtual float GetHeadTurnRate( void ) { return 15.0f; } // Degrees per second |
|
|
|
bool CreateVPhysics( void ); |
|
IMotionEvent::simresult_e Simulate( IPhysicsMotionController *pController, IPhysicsObject *pObject, float deltaTime, Vector &linear, AngularImpulse &angular ); |
|
|
|
virtual void ClampMotorForces( Vector &linear, AngularImpulse &angular ) |
|
{ |
|
// limit reaction forces |
|
linear.x = clamp( linear.x, -3000, 3000 ); |
|
linear.y = clamp( linear.y, -3000, 3000 ); |
|
linear.z = clamp( linear.z, -3000, 3000 ); |
|
|
|
// add in weightlessness |
|
linear.z += 800; |
|
} |
|
|
|
// ------------------------------- |
|
// Movement vars |
|
// ------------------------------- |
|
Vector m_vCurrentVelocity; |
|
Vector m_vCurrentBanking; |
|
Vector m_vNoiseMod; |
|
float m_fHeadYaw; |
|
Vector m_vLastPatrolDir; |
|
IPhysicsMotionController *m_pMotionController; |
|
}; |
|
|
|
#endif // AI_BASENPC_PHYSICSFLYER_H
|
|
|