Team Fortress 2 Source Code as on 22/4/2020
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.

256 lines
7.4 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================
  6. #ifndef NPC_BASESCANNER_H
  7. #define NPC_BASESCANNER_H
  8. #ifdef _WIN32
  9. #pragma once
  10. #endif
  11. #include "cbase.h"
  12. #include "player_pickup.h"
  13. #include "weapon_physcannon.h"
  14. #include "hl2_player.h"
  15. #include "smoke_trail.h"
  16. #include "ai_basenpc_physicsflyer.h"
  17. //-----------------------------------------------------------------------------
  18. // States for the scanner's sound.
  19. //-----------------------------------------------------------------------------
  20. enum ScannerFlyMode_t
  21. {
  22. SCANNER_FLY_PHOTO = 0, // Fly close to photograph entity
  23. SCANNER_FLY_PATROL, // Fly slowly around the enviroment
  24. SCANNER_FLY_FAST, // Fly quickly around the enviroment
  25. SCANNER_FLY_CHASE, // Fly quickly around the enviroment
  26. SCANNER_FLY_SPOT, // Fly above enity in spotlight position
  27. SCANNER_FLY_ATTACK, // Get in my enemies face for spray or flash
  28. SCANNER_FLY_DIVE, // Divebomb - only done when dead
  29. SCANNER_FLY_FOLLOW, // Following a target
  30. };
  31. enum ScannerInspectAct_t
  32. {
  33. SCANNER_INSACT_HANDS_UP,
  34. SCANNER_INSACT_SHOWARMBAND,
  35. };
  36. // Sentences
  37. #define SCANNER_SENTENCE_ATTENTION 0
  38. #define SCANNER_SENTENCE_HANDSUP 1
  39. #define SCANNER_SENTENCE_PROCEED 2
  40. #define SCANNER_SENTENCE_CURIOUS 3
  41. // Scanner attack distances
  42. #define SCANNER_ATTACK_NEAR_DIST 150 // Fly attack min distance
  43. #define SCANNER_ATTACK_FAR_DIST 300 // Fly attack max distance
  44. #define SCANNER_ATTACK_RANGE 350 // Attack max distance
  45. #define SCANNER_ATTACK_MIN_DELAY 8 // Min time between attacks
  46. #define SCANNER_ATTACK_MAX_DELAY 12 // Max time between attacks
  47. #define SCANNER_EVADE_TIME 1 // How long to evade after take damage
  48. // Scanner movement vars
  49. #define SCANNER_BANK_RATE 30
  50. #define SCANNER_MAX_SPEED 250
  51. #define SCANNER_MAX_DIVE_BOMB_SPEED 2500
  52. #define SCANNER_SQUAD_FLY_DIST 500 // How far to scanners stay apart
  53. #define SCANNER_SQUAD_HELP_DIST 4000 // How far will I fly to help
  54. //-----------------------------------------------------------------------------
  55. // Purpose:
  56. //-----------------------------------------------------------------------------
  57. class CNPC_BaseScanner : public CAI_BasePhysicsFlyingBot, public CDefaultPlayerPickupVPhysics
  58. {
  59. DECLARE_CLASS( CNPC_BaseScanner, CAI_BasePhysicsFlyingBot );
  60. public:
  61. CNPC_BaseScanner();
  62. void Spawn(void);
  63. virtual void UpdateEfficiency( bool bInPVS );
  64. Class_T Classify( void ) { return(CLASS_SCANNER); }
  65. virtual float GetAutoAimRadius();
  66. void Event_Killed( const CTakeDamageInfo &info );
  67. int OnTakeDamage_Alive( const CTakeDamageInfo &info );
  68. int OnTakeDamage_Dying( const CTakeDamageInfo &info );
  69. void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
  70. void Gib(void);
  71. void OnStateChange( NPC_STATE eOldState, NPC_STATE eNewState );
  72. void ClampMotorForces( Vector &linear, AngularImpulse &angular );
  73. int DrawDebugTextOverlays(void);
  74. virtual float GetHeadTurnRate( void );
  75. virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
  76. // CDefaultPlayerPickupVPhysics
  77. void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason );
  78. void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason );
  79. bool ShouldPlayIdleSound( void );
  80. void IdleSound( void );
  81. void DeathSound( const CTakeDamageInfo &info );
  82. void AlertSound( void );
  83. void PainSound( const CTakeDamageInfo &info );
  84. virtual char *GetScannerSoundPrefix( void ) { return ""; }
  85. void ScannerEmitSound( const char *pszSoundName );
  86. int MeleeAttack1Conditions ( float flDot, float flDist );
  87. int SelectSchedule(void);
  88. void StartTask( const Task_t *pTask );
  89. void OnScheduleChange( void );
  90. void UpdateOnRemove( void );
  91. virtual float GetMaxSpeed( void );
  92. void PostRunStopMoving() {} // scanner can use "movement" activities but not be moving
  93. virtual bool CanBecomeServerRagdoll( void ) { return false; }
  94. void SpeakSentence( int sentenceType );
  95. bool IsHeldByPhyscannon( void );
  96. // Inputs
  97. void InputSetFlightSpeed( inputdata_t &inputdata );
  98. void InputSetDistanceOverride( inputdata_t &inputdata );
  99. protected:
  100. virtual char *GetEngineSound( void ) { return NULL; }
  101. void PlayFlySound(void);
  102. void SetBanking( float flInterval );
  103. void UpdateHead( float flInterval );
  104. inline CBaseEntity *EntityToWatch( void );
  105. bool IsEnemyPlayerInSuit( void );
  106. // Movement
  107. virtual bool OverridePathMove( CBaseEntity *pMoveTarget, float flInterval );
  108. virtual bool OverrideMove( float flInterval );
  109. Vector IdealGoalForMovement( const Vector &goalPos, const Vector &startPos, float idealRange, float idealHeight );
  110. virtual void AdjustScannerVelocity( void ) { return; }
  111. virtual void MoveToAttack(float flInterval);
  112. virtual void MoveToTarget( float flInterval, const Vector &vecMoveTarget );
  113. virtual void MoveExecute_Alive(float flInterval);
  114. virtual float MinGroundDist(void) { return 64; }
  115. Vector VelocityToEvade(CBaseCombatCharacter *pEnemy);
  116. virtual float GetGoalDistance( void );
  117. // Divebombing
  118. virtual void AttackDivebomb( void );
  119. void DiveBombSoundThink();
  120. void AttackDivebombCollide(float flInterval);
  121. void MoveToDivebomb(float flInterval);
  122. void BlendPhyscannonLaunchSpeed();
  123. private:
  124. bool GetGoalDirection( Vector *vOut );
  125. void StartSmokeTrail( void );
  126. // Take damage from being thrown by a physcannon
  127. void TakeDamageFromPhyscannon( CBasePlayer *pPlayer );
  128. // Take damage from physics impacts
  129. void TakeDamageFromPhysicsImpact( int index, gamevcollisionevent_t *pEvent );
  130. // Do we have a physics attacker?
  131. CBasePlayer *HasPhysicsAttacker( float dt );
  132. virtual void StopLoopingSounds(void);
  133. public:
  134. // ------------------------
  135. // Death Cleanup
  136. // ------------------------
  137. CTakeDamageInfo m_KilledInfo;
  138. protected:
  139. ScannerFlyMode_t m_nFlyMode;
  140. // Pose parameters
  141. int m_nPoseTail;
  142. int m_nPoseDynamo;
  143. int m_nPoseFlare;
  144. int m_nPoseFaceVert;
  145. int m_nPoseFaceHoriz;
  146. bool m_bHasSpoken;
  147. // Movement
  148. float m_flFlyNoiseBase;
  149. float m_flEngineStallTime;
  150. float m_fNextFlySoundTime;
  151. Vector m_vecDiveBombDirection; // The direction we dive bomb. Calculated at the moment of death.
  152. float m_flDiveBombRollForce; // Used for roll while dive bombing.
  153. float m_flGoalOverrideDistance;
  154. // Deriver scanner variables
  155. float m_flAttackNearDist;
  156. float m_flAttackFarDist;
  157. float m_flAttackRange;
  158. private:
  159. CSoundPatch *m_pEngineSound;
  160. // physics influence
  161. CHandle<CBasePlayer> m_hPhysicsAttacker;
  162. float m_flLastPhysicsInfluenceTime;
  163. // Attacks
  164. SmokeTrail *m_pSmokeTrail;
  165. protected:
  166. DEFINE_CUSTOM_AI;
  167. // Custom interrupt conditions
  168. enum
  169. {
  170. COND_SCANNER_FLY_CLEAR = BaseClass::NEXT_CONDITION,
  171. COND_SCANNER_FLY_BLOCKED,
  172. COND_SCANNER_GRABBED_BY_PHYSCANNON,
  173. COND_SCANNER_RELEASED_FROM_PHYSCANNON,
  174. NEXT_CONDITION,
  175. };
  176. // Custom schedules
  177. enum
  178. {
  179. SCHED_SCANNER_PATROL = BaseClass::NEXT_SCHEDULE,
  180. SCHED_SCANNER_ATTACK,
  181. SCHED_SCANNER_ATTACK_HOVER,
  182. SCHED_SCANNER_ATTACK_DIVEBOMB,
  183. SCHED_SCANNER_CHASE_ENEMY,
  184. SCHED_SCANNER_CHASE_TARGET,
  185. SCHED_SCANNER_FOLLOW_HOVER,
  186. SCHED_SCANNER_HELD_BY_PHYSCANNON,
  187. NEXT_SCHEDULE,
  188. };
  189. // Custom tasks
  190. enum
  191. {
  192. TASK_SCANNER_SET_FLY_PATROL = BaseClass::NEXT_TASK,
  193. TASK_SCANNER_SET_FLY_CHASE,
  194. TASK_SCANNER_SET_FLY_ATTACK,
  195. TASK_SCANNER_SET_FLY_DIVE,
  196. NEXT_TASK,
  197. };
  198. DECLARE_DATADESC();
  199. };
  200. #endif // NPC_BASESCANNER_H