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