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
215 lines
5.9 KiB
//========= 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<CBeam> m_hSpotlight; |
|
CHandle<CSpotlightEnd> 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
|
|
|