//========= Copyright © 1996-2005, 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 OnActivate() {} virtual void OnDeactivate() {} 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 ) {} virtual void ResolveNames(); void UpdateActors(); const CUtlVector &AccessActors() { return m_actors; } protected: enum Flags_t { ACTIVE = 0x01, RESOLVED_NAME = 0x02, DORMANT = 0x04, }; enum SearchType_t { ST_ENTNAME, ST_CLASSNAME, }; void DelayedRefresh(); void PruneActors(); // From Worldcraft string_t m_iszActor; string_t m_iszGoal; bool m_fStartActive; SearchType_t m_SearchType; string_t m_iszConceptModifiers; CUtlVector m_actors; EHANDLE m_hGoalEntity; unsigned m_flags; 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