This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

216 lines
6.2 KiB
C++

//========= 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