diff options
Diffstat (limited to 'game/server/ai_goalentity.h')
| -rw-r--r-- | game/server/ai_goalentity.h | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/game/server/ai_goalentity.h b/game/server/ai_goalentity.h new file mode 100644 index 0000000..2a6805f --- /dev/null +++ b/game/server/ai_goalentity.h @@ -0,0 +1,194 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef AI_GOALENTITY_H +#define AI_GOALENTITY_H + +#include "ai_basenpc.h" +#include "utlvector.h" + +#if defined( _WIN32 ) +#pragma once +#endif + +//----------------------------------------------------------------------------- +// +// CAI_GoalEntity +// +// Purpose: Serves as the base class for all entities the designer may place +// that establish an NPC goal. Provides standard input, output & +// fields common to all goals. +// + +class CAI_GoalEntity : public CBaseEntity, + public IEntityListener +{ + DECLARE_CLASS( CAI_GoalEntity, CBaseEntity ); +public: + CAI_GoalEntity() + : m_iszActor(NULL_STRING), + m_iszGoal(NULL_STRING), + m_fStartActive(false), + m_SearchType(ST_ENTNAME), + m_iszConceptModifiers(NULL_STRING), + m_hGoalEntity(NULL), + m_flags( 0 ) + { + } + + virtual int ObjectCaps() { return ((BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_NOTIFY_ON_TRANSITION); } + + virtual void Spawn(); + virtual void OnRestore(); + virtual int DrawDebugTextOverlays(); + + virtual void InputActivate( inputdata_t &inputdata ); + virtual void InputUpdateActors( inputdata_t &inputdata ); + virtual void InputDeactivate( inputdata_t &inputdata ); + + // Goal entities can become Dormant if they're left behind on previous maps. + // Transitioning back to the map with cause a dormant goal entity to reactivate itself. + void EnterDormant( void ); + void ExitDormant( void ); + + bool IsActive(); + + int NumActors(); + CAI_BaseNPC * GetActor( int iActor = 0 ); + + void SetGoalEntity( CBaseEntity *pGoalEntity ); + CBaseEntity * GetGoalEntity(); + const char * GetGoalEntityName(); + + const char * GetConceptModifiers(); + +protected: + virtual void UpdateOnRemove(); + + virtual void OnEntityCreated( CBaseEntity *pEntity ); + virtual void OnEntityDeleted( CBaseEntity *pEntity ); + + virtual void EnableGoal( CAI_BaseNPC *pAI ) {} + virtual void DisableGoal( CAI_BaseNPC *pAI ) {} + + void UpdateActors(); + + const CUtlVector<AIHANDLE> &AccessActors() + { + return m_actors; + } + +private: + enum Flags_t + { + ACTIVE = 0x01, + RESOLVED_NAME = 0x02, + DORMANT = 0x04, + }; + + enum SearchType_t + { + ST_ENTNAME, + ST_CLASSNAME, + }; + + void DelayedRefresh(); + void PruneActors(); + void ResolveNames(); + + // From Worldcraft + string_t m_iszActor; + string_t m_iszGoal; + bool m_fStartActive; + SearchType_t m_SearchType; + string_t m_iszConceptModifiers; + + CUtlVector<AIHANDLE> m_actors; + EHANDLE m_hGoalEntity; + unsigned m_flags; + + +protected: + DECLARE_DATADESC(); +}; + +//------------------------------------- + +// @TODO (toml 03-18-03): Efficiency wart -- make this an explicit duty of the client? +inline void CAI_GoalEntity::UpdateActors() +{ + if ( !( m_flags & ACTIVE ) || !( m_flags & RESOLVED_NAME ) ) + { + ResolveNames(); + m_flags |= RESOLVED_NAME; + } + else + PruneActors(); +} + +//------------------------------------- + +inline bool CAI_GoalEntity::IsActive() +{ + if ( m_flags & ACTIVE ) + { + UpdateActors(); + return ( m_actors.Count() != 0 ); + } + return false; +} + +//------------------------------------- + +inline int CAI_GoalEntity::NumActors() +{ + UpdateActors(); + return m_actors.Count(); +} + +//------------------------------------- + +inline CAI_BaseNPC *CAI_GoalEntity::GetActor( int iActor ) +{ + UpdateActors(); + if ( m_actors.Count() > iActor ) + return m_actors[iActor]; + return NULL; +} + +//------------------------------------- + +inline void CAI_GoalEntity::SetGoalEntity( CBaseEntity *pGoalEntity ) +{ + m_iszGoal = pGoalEntity->GetEntityName(); + m_hGoalEntity = pGoalEntity; +} + +//------------------------------------- + +inline CBaseEntity *CAI_GoalEntity::GetGoalEntity() +{ + UpdateActors(); + return m_hGoalEntity; +} + +//------------------------------------- + +inline const char *CAI_GoalEntity::GetGoalEntityName() +{ + return STRING( m_iszGoal ); +} + +//------------------------------------- + +inline const char *CAI_GoalEntity::GetConceptModifiers() +{ + return STRING( m_iszConceptModifiers ); +} + +//----------------------------------------------------------------------------- + +#endif // AI_GOALENTITY_H |