//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #ifndef NPC_SCANNER_H #define NPC_SCANNER_H #ifdef _WIN32 #pragma once #endif #include "npc_basescanner.h" //------------------------------------ // Spawnflags //------------------------------------ #define SF_CSCANNER_NO_DYNAMIC_LIGHT (1 << 16) #define SF_CSCANNER_STRIDER_SCOUT (1 << 17) class CBeam; class CSprite; class SmokeTrail; class CSpotlightEnd; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CNPC_CScanner : public CNPC_BaseScanner { DECLARE_CLASS(CNPC_CScanner, CNPC_BaseScanner); public: CNPC_CScanner(); int GetSoundInterests(void) { return (SOUND_WORLD | SOUND_COMBAT | SOUND_PLAYER | SOUND_DANGER); } int OnTakeDamage_Alive(const CTakeDamageInfo &info); bool FValidateHintType(CAI_Hint *pHint); virtual int TranslateSchedule(int scheduleType); Disposition_t IRelationType(CBaseEntity *pTarget); void NPCThink(void); void GatherConditions(void); void PrescheduleThink(void); void Precache(void); void RunTask(const Task_t *pTask); int SelectSchedule(void); virtual char *GetScannerSoundPrefix(void); void Spawn(void); void Activate(); void StartTask(const Task_t *pTask); void UpdateOnRemove(void); void DeployMine(); float GetMaxSpeed(); virtual void Gib(void); void HandleAnimEvent(animevent_t *pEvent); Activity NPC_TranslateActivity(Activity eNewActivity); void InputDisableSpotlight(inputdata_t &inputdata); void InputSetFollowTarget(inputdata_t &inputdata); void InputClearFollowTarget(inputdata_t &inputdata); void InputInspectTargetPhoto(inputdata_t &inputdata); void InputInspectTargetSpotlight(inputdata_t &inputdata); void InputDeployMine(inputdata_t &inputdata); void InputEquipMine(inputdata_t &inputdata); void InputShouldInspect(inputdata_t &inputdata); void InspectTarget(inputdata_t &inputdata, ScannerFlyMode_t eFlyMode); void Event_Killed(const CTakeDamageInfo &info); char *GetEngineSound(void); virtual float MinGroundDist(void); virtual void AdjustScannerVelocity(void); virtual float GetHeadTurnRate(void); public: bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter *sourceEnt); // ------------------------------ // Inspecting // ------------------------------ Vector m_vInspectPos; float m_fInspectEndTime; float m_fCheckCitizenTime; // Time to look for citizens to harass float m_fCheckHintTime; // Time to look for hints to inspect bool m_bShouldInspect; bool m_bOnlyInspectPlayers; bool m_bNeverInspectPlayers; void SetInspectTargetToEnt(CBaseEntity *pEntity, float fInspectDuration); void SetInspectTargetToPos(const Vector &vInspectPos, float fInspectDuration); void SetInspectTargetToHint(CAI_Hint *pHint, float fInspectDuration); void ClearInspectTarget(void); bool HaveInspectTarget(void); Vector InspectTargetPosition(void); bool IsValidInspectTarget(CBaseEntity *pEntity); CBaseEntity *BestInspectTarget(void); void RequestInspectSupport(void); bool IsStriderScout() { return HasSpawnFlags(SF_CSCANNER_STRIDER_SCOUT); } // ------------------------ // Photographing // ------------------------ float m_fNextPhotographTime; CSprite *m_pEyeFlash; void TakePhoto(void); void BlindFlashTarget(CBaseEntity *pTarget); // ------------------------------ // Spotlight // ------------------------------ Vector m_vSpotlightTargetPos; Vector m_vSpotlightCurrentPos; CHandle m_hSpotlight; CHandle m_hSpotlightTarget; Vector m_vSpotlightDir; Vector m_vSpotlightAngVelocity; float m_flSpotlightCurLength; float m_flSpotlightMaxLength; float m_flSpotlightGoalWidth; float m_fNextSpotlightTime; int m_nHaloSprite; void SpotlightUpdate(void); Vector SpotlightTargetPos(void); Vector SpotlightCurrentPos(void); void SpotlightCreate(void); void SpotlightDestroy(void); protected: void BecomeClawScanner(void) { m_bIsClawScanner = true; } private: bool MovingToInspectTarget(void); virtual float GetGoalDistance(void); bool m_bIsClawScanner; // Formerly the shield scanner. bool m_bIsOpen; // Only for claw scanner COutputEvent m_OnPhotographPlayer; COutputEvent m_OnPhotographNPC; bool OverrideMove(float flInterval); void MoveToTarget(float flInterval, const Vector &MoveTarget); void MoveToSpotlight(float flInterval); void MoveToPhotograph(float flInterval); // Attacks bool m_bNoLight; bool m_bPhotoTaken; void AttackPreFlash(void); void AttackFlash(void); void AttackFlashBlind(void); virtual void AttackDivebomb(void); DEFINE_CUSTOM_AI; // Custom interrupt conditions enum { COND_CSCANNER_HAVE_INSPECT_TARGET = BaseClass::NEXT_CONDITION, COND_CSCANNER_INSPECT_DONE, COND_CSCANNER_CAN_PHOTOGRAPH, COND_CSCANNER_SPOT_ON_TARGET, NEXT_CONDITION, }; // Custom schedules enum { SCHED_CSCANNER_SPOTLIGHT_HOVER = BaseClass::NEXT_SCHEDULE, SCHED_CSCANNER_SPOTLIGHT_INSPECT_POS, SCHED_CSCANNER_SPOTLIGHT_INSPECT_CIT, SCHED_CSCANNER_PHOTOGRAPH_HOVER, SCHED_CSCANNER_PHOTOGRAPH, SCHED_CSCANNER_ATTACK_FLASH, SCHED_CSCANNER_MOVE_TO_INSPECT, SCHED_CSCANNER_PATROL, NEXT_SCHEDULE, }; // Custom tasks enum { TASK_CSCANNER_SET_FLY_PHOTO = BaseClass::NEXT_TASK, TASK_CSCANNER_SET_FLY_SPOT, TASK_CSCANNER_PHOTOGRAPH, TASK_CSCANNER_ATTACK_PRE_FLASH, TASK_CSCANNER_ATTACK_FLASH, TASK_CSCANNER_SPOT_INSPECT_ON, TASK_CSCANNER_SPOT_INSPECT_WAIT, TASK_CSCANNER_SPOT_INSPECT_OFF, TASK_CSCANNER_CLEAR_INSPECT_TARGET, TASK_CSCANNER_GET_PATH_TO_INSPECT_TARGET, NEXT_TASK, }; DECLARE_DATADESC(); }; #endif // NPC_SCANNER_H