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.

215 lines
5.9 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================
  6. #ifndef NPC_SCANNER_H
  7. #define NPC_SCANNER_H
  8. #ifdef _WIN32
  9. #pragma once
  10. #endif
  11. #include "npc_basescanner.h"
  12. //------------------------------------
  13. // Spawnflags
  14. //------------------------------------
  15. #define SF_CSCANNER_NO_DYNAMIC_LIGHT (1 << 16)
  16. #define SF_CSCANNER_STRIDER_SCOUT (1 << 17)
  17. class CBeam;
  18. class CSprite;
  19. class SmokeTrail;
  20. class CSpotlightEnd;
  21. //-----------------------------------------------------------------------------
  22. // Purpose:
  23. //-----------------------------------------------------------------------------
  24. class CNPC_CScanner : public CNPC_BaseScanner
  25. {
  26. DECLARE_CLASS( CNPC_CScanner, CNPC_BaseScanner );
  27. public:
  28. CNPC_CScanner();
  29. int GetSoundInterests( void ) { return (SOUND_WORLD|SOUND_COMBAT|SOUND_PLAYER|SOUND_DANGER); }
  30. int OnTakeDamage_Alive( const CTakeDamageInfo &info );
  31. bool FValidateHintType(CAI_Hint *pHint);
  32. virtual int TranslateSchedule( int scheduleType );
  33. Disposition_t IRelationType(CBaseEntity *pTarget);
  34. void NPCThink( void );
  35. void GatherConditions( void );
  36. void PrescheduleThink( void );
  37. void Precache(void);
  38. void RunTask( const Task_t *pTask );
  39. int SelectSchedule(void);
  40. virtual char *GetScannerSoundPrefix( void );
  41. void Spawn(void);
  42. void Activate();
  43. void StartTask( const Task_t *pTask );
  44. void UpdateOnRemove( void );
  45. void DeployMine();
  46. float GetMaxSpeed();
  47. virtual void Gib( void );
  48. void HandleAnimEvent( animevent_t *pEvent );
  49. Activity NPC_TranslateActivity( Activity eNewActivity );
  50. void InputDisableSpotlight( inputdata_t &inputdata );
  51. void InputSetFollowTarget( inputdata_t &inputdata );
  52. void InputClearFollowTarget( inputdata_t &inputdata );
  53. void InputInspectTargetPhoto( inputdata_t &inputdata );
  54. void InputInspectTargetSpotlight( inputdata_t &inputdata );
  55. void InputDeployMine( inputdata_t &inputdata );
  56. void InputEquipMine( inputdata_t &inputdata );
  57. void InputShouldInspect( inputdata_t &inputdata );
  58. void InspectTarget( inputdata_t &inputdata, ScannerFlyMode_t eFlyMode );
  59. void Event_Killed( const CTakeDamageInfo &info );
  60. char *GetEngineSound( void );
  61. virtual float MinGroundDist(void);
  62. virtual void AdjustScannerVelocity( void );
  63. virtual float GetHeadTurnRate( void );
  64. public:
  65. bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter* sourceEnt);
  66. // ------------------------------
  67. // Inspecting
  68. // ------------------------------
  69. Vector m_vInspectPos;
  70. float m_fInspectEndTime;
  71. float m_fCheckCitizenTime; // Time to look for citizens to harass
  72. float m_fCheckHintTime; // Time to look for hints to inspect
  73. bool m_bShouldInspect;
  74. bool m_bOnlyInspectPlayers;
  75. bool m_bNeverInspectPlayers;
  76. void SetInspectTargetToEnt(CBaseEntity *pEntity, float fInspectDuration);
  77. void SetInspectTargetToPos(const Vector &vInspectPos, float fInspectDuration);
  78. void SetInspectTargetToHint(CAI_Hint *pHint, float fInspectDuration);
  79. void ClearInspectTarget(void);
  80. bool HaveInspectTarget(void);
  81. Vector InspectTargetPosition(void);
  82. bool IsValidInspectTarget(CBaseEntity *pEntity);
  83. CBaseEntity* BestInspectTarget(void);
  84. void RequestInspectSupport(void);
  85. bool IsStriderScout() { return HasSpawnFlags( SF_CSCANNER_STRIDER_SCOUT ); }
  86. // ------------------------
  87. // Photographing
  88. // ------------------------
  89. float m_fNextPhotographTime;
  90. CSprite* m_pEyeFlash;
  91. void TakePhoto( void );
  92. void BlindFlashTarget( CBaseEntity *pTarget );
  93. // ------------------------------
  94. // Spotlight
  95. // ------------------------------
  96. Vector m_vSpotlightTargetPos;
  97. Vector m_vSpotlightCurrentPos;
  98. CHandle<CBeam> m_hSpotlight;
  99. CHandle<CSpotlightEnd> m_hSpotlightTarget;
  100. Vector m_vSpotlightDir;
  101. Vector m_vSpotlightAngVelocity;
  102. float m_flSpotlightCurLength;
  103. float m_flSpotlightMaxLength;
  104. float m_flSpotlightGoalWidth;
  105. float m_fNextSpotlightTime;
  106. int m_nHaloSprite;
  107. void SpotlightUpdate(void);
  108. Vector SpotlightTargetPos(void);
  109. Vector SpotlightCurrentPos(void);
  110. void SpotlightCreate(void);
  111. void SpotlightDestroy(void);
  112. protected:
  113. void BecomeClawScanner( void ) { m_bIsClawScanner = true; }
  114. private:
  115. bool MovingToInspectTarget( void );
  116. virtual float GetGoalDistance( void );
  117. bool m_bIsClawScanner; // Formerly the shield scanner.
  118. bool m_bIsOpen; // Only for claw scanner
  119. COutputEvent m_OnPhotographPlayer;
  120. COutputEvent m_OnPhotographNPC;
  121. bool OverrideMove(float flInterval);
  122. void MoveToTarget(float flInterval, const Vector &MoveTarget);
  123. void MoveToSpotlight(float flInterval);
  124. void MoveToPhotograph(float flInterval);
  125. // Attacks
  126. bool m_bNoLight;
  127. bool m_bPhotoTaken;
  128. void AttackPreFlash(void);
  129. void AttackFlash(void);
  130. void AttackFlashBlind(void);
  131. virtual void AttackDivebomb(void);
  132. DEFINE_CUSTOM_AI;
  133. // Custom interrupt conditions
  134. enum
  135. {
  136. COND_CSCANNER_HAVE_INSPECT_TARGET = BaseClass::NEXT_CONDITION,
  137. COND_CSCANNER_INSPECT_DONE,
  138. COND_CSCANNER_CAN_PHOTOGRAPH,
  139. COND_CSCANNER_SPOT_ON_TARGET,
  140. NEXT_CONDITION,
  141. };
  142. // Custom schedules
  143. enum
  144. {
  145. SCHED_CSCANNER_SPOTLIGHT_HOVER = BaseClass::NEXT_SCHEDULE,
  146. SCHED_CSCANNER_SPOTLIGHT_INSPECT_POS,
  147. SCHED_CSCANNER_SPOTLIGHT_INSPECT_CIT,
  148. SCHED_CSCANNER_PHOTOGRAPH_HOVER,
  149. SCHED_CSCANNER_PHOTOGRAPH,
  150. SCHED_CSCANNER_ATTACK_FLASH,
  151. SCHED_CSCANNER_MOVE_TO_INSPECT,
  152. SCHED_CSCANNER_PATROL,
  153. NEXT_SCHEDULE,
  154. };
  155. // Custom tasks
  156. enum
  157. {
  158. TASK_CSCANNER_SET_FLY_PHOTO = BaseClass::NEXT_TASK,
  159. TASK_CSCANNER_SET_FLY_SPOT,
  160. TASK_CSCANNER_PHOTOGRAPH,
  161. TASK_CSCANNER_ATTACK_PRE_FLASH,
  162. TASK_CSCANNER_ATTACK_FLASH,
  163. TASK_CSCANNER_SPOT_INSPECT_ON,
  164. TASK_CSCANNER_SPOT_INSPECT_WAIT,
  165. TASK_CSCANNER_SPOT_INSPECT_OFF,
  166. TASK_CSCANNER_CLEAR_INSPECT_TARGET,
  167. TASK_CSCANNER_GET_PATH_TO_INSPECT_TARGET,
  168. NEXT_TASK,
  169. };
  170. DECLARE_DATADESC();
  171. };
  172. #endif // NPC_SCANNER_H