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
6.5 KiB
256 lines
6.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef AI_SCRIPTCONDITIONS_H |
|
#define AI_SCRIPTCONDITIONS_H |
|
|
|
#include "baseentity.h" |
|
#include "entityoutput.h" |
|
#include "simtimer.h" |
|
#include "ai_npcstate.h" |
|
|
|
#if defined( _WIN32 ) |
|
#pragma once |
|
#endif |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_ProxTester |
|
{ |
|
public: |
|
CAI_ProxTester() |
|
: m_distSq( 0 ), |
|
m_fInside( false ) |
|
{ |
|
} |
|
|
|
void Init( float dist ) |
|
{ |
|
m_fInside = ( dist > 0 ); |
|
m_distSq = dist * dist; |
|
} |
|
|
|
bool Check( CBaseEntity *pEntity1, CBaseEntity *pEntity2 ) |
|
{ |
|
if ( m_distSq != 0 ) |
|
{ |
|
float distSq = ( pEntity1->GetAbsOrigin() - pEntity2->GetAbsOrigin() ).LengthSqr(); |
|
bool fInside = ( distSq < m_distSq ); |
|
|
|
return ( m_fInside == fInside ); |
|
} |
|
return true; |
|
} |
|
|
|
DECLARE_SIMPLE_DATADESC(); |
|
|
|
private: |
|
|
|
float m_distSq; |
|
bool m_fInside; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
class CAI_ScriptConditionsElement |
|
{ |
|
public: |
|
|
|
DECLARE_SIMPLE_DATADESC(); |
|
|
|
void SetActor( CBaseEntity *pEntity ) { m_hActor = pEntity; } |
|
CBaseEntity *GetActor( void ){ return m_hActor.Get(); } |
|
|
|
void SetTimer( CSimTimer timer ) { m_Timer = timer; } |
|
CSimTimer *GetTimer( void ) { return &m_Timer; } |
|
|
|
void SetTimeOut( CSimTimer timeout) { m_Timeout = timeout; } |
|
CSimTimer *GetTimeOut( void ) { return &m_Timeout; } |
|
|
|
private: |
|
EHANDLE m_hActor; |
|
CSimTimer m_Timer; |
|
CSimTimer m_Timeout; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// class CAI_ScriptConditions |
|
// |
|
// Purpose: Watches a set of conditions relative to a given NPC, and when they |
|
// are all satisfied, fires the relevant output |
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_ScriptConditions : public CBaseEntity, public IEntityListener |
|
{ |
|
DECLARE_CLASS( CAI_ScriptConditions, CBaseEntity ); |
|
|
|
public: |
|
CAI_ScriptConditions() |
|
: m_fDisabled( true ), |
|
m_flRequiredTime( 0 ), |
|
m_fMinState( NPC_STATE_IDLE ), |
|
m_fMaxState( NPC_STATE_IDLE ), |
|
m_fScriptStatus( TRS_NONE ), |
|
m_fActorSeePlayer( TRS_NONE ), |
|
m_flPlayerActorProximity( 0 ), |
|
m_flPlayerActorFOV( -1 ), |
|
m_fPlayerActorLOS( TRS_NONE ), |
|
m_fActorSeeTarget( TRS_NONE ), |
|
m_flActorTargetProximity( 0 ), |
|
m_flPlayerTargetProximity( 0 ), |
|
m_flPlayerTargetFOV( 0 ), |
|
m_fPlayerTargetLOS( TRS_NONE ), |
|
m_fPlayerBlockingActor( TRS_NONE ), |
|
m_flMinTimeout( 0 ), |
|
m_flMaxTimeout( 0 ), |
|
m_fActorInPVS( TRS_NONE ), |
|
m_fActorInVehicle( TRS_NONE ), |
|
m_fPlayerInVehicle( TRS_NONE ) |
|
{ |
|
#ifndef HL2_EPISODIC |
|
m_hActor = NULL; |
|
#endif |
|
} |
|
|
|
private: |
|
void Spawn(); |
|
void Activate(); |
|
|
|
void EvaluationThink(); |
|
|
|
void Enable(); |
|
void Disable(); |
|
|
|
void SetThinkTime() { SetNextThink( gpGlobals->curtime + 0.250 ); } |
|
|
|
// Evaluators |
|
struct EvalArgs_t |
|
{ |
|
CBaseEntity *pActor; |
|
CBasePlayer *pPlayer; |
|
CBaseEntity *pTarget; |
|
}; |
|
|
|
bool EvalState( const EvalArgs_t &args ); |
|
bool EvalActorSeePlayer( const EvalArgs_t &args ); |
|
bool EvalPlayerActorLook( const EvalArgs_t &args ); |
|
bool EvalPlayerTargetLook( const EvalArgs_t &args ); |
|
bool EvalPlayerActorProximity( const EvalArgs_t &args ); |
|
bool EvalPlayerTargetProximity( const EvalArgs_t &args ); |
|
bool EvalActorTargetProximity( const EvalArgs_t &args ); |
|
bool EvalActorSeeTarget( const EvalArgs_t &args ); |
|
bool EvalPlayerActorLOS( const EvalArgs_t &args ); |
|
bool EvalPlayerTargetLOS( const EvalArgs_t &args ); |
|
bool EvalPlayerBlockingActor( const EvalArgs_t &args ); |
|
bool EvalActorInPVS( const EvalArgs_t &args ); |
|
bool EvalPlayerInVehicle( const EvalArgs_t &args ); |
|
bool EvalActorInVehicle( const EvalArgs_t &args ); |
|
|
|
void OnEntitySpawned( CBaseEntity *pEntity ); |
|
|
|
int AddNewElement( CBaseEntity *pActor ); |
|
|
|
bool ActorInList( CBaseEntity *pActor ); |
|
void UpdateOnRemove( void ); |
|
|
|
// Input handlers |
|
void InputEnable( inputdata_t &inputdata ); |
|
void InputDisable( inputdata_t &inputdata ); |
|
|
|
// Output handlers |
|
COutputEvent m_OnConditionsSatisfied; |
|
COutputEvent m_OnConditionsTimeout; |
|
COutputEvent m_NoValidActors; |
|
|
|
//--------------------------------- |
|
|
|
#ifndef HL2_EPISODIC |
|
CBaseEntity *GetActor() { return m_hActor.Get(); } |
|
#endif |
|
CBasePlayer *GetPlayer() { return UTIL_GetLocalPlayer(); } |
|
|
|
//--------------------------------- |
|
|
|
// @Note (toml 07-17-02): At some point, it may be desireable to switch to using function objects instead of functions. Probably |
|
// if support for NPCs addiing custom conditions becomes necessary |
|
typedef bool (CAI_ScriptConditions::*EvaluationFunc_t)( const EvalArgs_t &args ); |
|
|
|
struct EvaluatorInfo_t |
|
{ |
|
EvaluationFunc_t pfnEvaluator; |
|
const char *pszName; |
|
}; |
|
|
|
static EvaluatorInfo_t gm_Evaluators[]; |
|
|
|
//--------------------------------- |
|
// Evaluation helpers |
|
|
|
static bool IsInFOV( CBaseEntity *pViewer, CBaseEntity *pViewed, float fov, bool bTrueCone ); |
|
static bool PlayerHasLineOfSight( CBaseEntity *pViewer, CBaseEntity *pViewed, bool fNot ); |
|
static bool ActorInPlayersPVS( CBaseEntity *pActor, bool bNot ); |
|
|
|
virtual void OnRestore( void ); |
|
|
|
//--------------------------------- |
|
// General conditions info |
|
|
|
bool m_fDisabled; |
|
bool m_bLeaveAsleep; |
|
EHANDLE m_hTarget; |
|
|
|
float m_flRequiredTime; // How long should the conditions me true |
|
|
|
#ifndef HL2_EPISODIC |
|
EHANDLE m_hActor; |
|
CSimTimer m_Timer; // @TODO (toml 07-16-02): save/load of timer once Jay has save/load of contained objects |
|
CSimTimer m_Timeout; |
|
#endif |
|
|
|
//--------------------------------- |
|
// Specific conditions data |
|
NPC_STATE m_fMinState; |
|
NPC_STATE m_fMaxState; |
|
ThreeState_t m_fScriptStatus; |
|
ThreeState_t m_fActorSeePlayer; |
|
string_t m_Actor; |
|
|
|
float m_flPlayerActorProximity; |
|
CAI_ProxTester m_PlayerActorProxTester; |
|
|
|
float m_flPlayerActorFOV; |
|
bool m_bPlayerActorFOVTrueCone; |
|
ThreeState_t m_fPlayerActorLOS; |
|
ThreeState_t m_fActorSeeTarget; |
|
|
|
float m_flActorTargetProximity; |
|
CAI_ProxTester m_ActorTargetProxTester; |
|
|
|
float m_flPlayerTargetProximity; |
|
CAI_ProxTester m_PlayerTargetProxTester; |
|
|
|
float m_flPlayerTargetFOV; |
|
bool m_bPlayerTargetFOVTrueCone; |
|
ThreeState_t m_fPlayerTargetLOS; |
|
ThreeState_t m_fPlayerBlockingActor; |
|
ThreeState_t m_fActorInPVS; |
|
|
|
float m_flMinTimeout; |
|
float m_flMaxTimeout; |
|
|
|
ThreeState_t m_fActorInVehicle; |
|
ThreeState_t m_fPlayerInVehicle; |
|
|
|
CUtlVector< CAI_ScriptConditionsElement > m_ElementList; |
|
|
|
//--------------------------------- |
|
|
|
DECLARE_DATADESC(); |
|
}; |
|
|
|
//============================================================================= |
|
|
|
#endif // AI_SCRIPTCONDITIONS_H
|