//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef AI_COMPONENT_H #define AI_COMPONENT_H #if defined( _WIN32 ) #pragma once #endif class CAI_BaseNPC; class CAI_Enemies; typedef int AI_TaskFailureCode_t; struct Task_t; //----------------------------------------------------------------------------- // CAI_Component // // Purpose: Shared functionality of all classes that assume some of the // responsibilities of an owner AI. //----------------------------------------------------------------------------- class CAI_Component { DECLARE_CLASS_NOBASE( CAI_Component ); protected: CAI_Component( CAI_BaseNPC *pOuter = NULL ) : m_pOuter(pOuter) { } virtual ~CAI_Component() {} public: virtual void SetOuter( CAI_BaseNPC *pOuter ) { m_pOuter = pOuter; } CAI_BaseNPC * GetOuter() { return m_pOuter; } const CAI_BaseNPC * GetOuter() const { return m_pOuter; } Hull_t GetHullType() const; float GetHullWidth() const; float GetHullHeight() const; const Vector & GetHullMins() const; const Vector & GetHullMaxs() const; int GetHullTraceMask() const; protected: // // Common services provided by CAI_BaseNPC, Convenience methods to simplify derived code // edict_t * GetEdict(); const Vector & GetLocalOrigin() const; void SetLocalOrigin( const Vector &origin ); const Vector & GetAbsOrigin() const; const QAngle& GetAbsAngles() const; void SetLocalAngles( const QAngle& angles ); const QAngle & GetLocalAngles( void ) const; const Vector& WorldAlignMins() const; const Vector& WorldAlignMaxs() const; Vector WorldSpaceCenter() const; int GetCollisionGroup() const; void SetSolid( SolidType_t val ); SolidType_t GetSolid() const; float GetGravity() const; void SetGravity( float ); CBaseEntity* GetEnemy(); const Vector & GetEnemyLKP() const; void TranslateNavGoal( CBaseEntity *pEnemy, Vector &chasePosition); CBaseEntity* GetTarget(); void SetTarget( CBaseEntity *pTarget ); const Task_t* GetCurTask( void ); virtual void TaskFail( AI_TaskFailureCode_t ); void TaskFail( const char *pszGeneralFailText ); virtual void TaskComplete( bool fIgnoreSetFailedCondition = false ); int TaskIsRunning(); inline int TaskIsComplete(); Activity GetActivity(); void SetActivity( Activity NewActivity ); float GetIdealSpeed() const; float GetIdealAccel() const; int GetSequence(); int GetEntFlags() const; void AddEntFlag( int flags ); void RemoveEntFlag( int flagsToRemove ); void ToggleEntFlag( int flagToToggle ); void SetGroundEntity( CBaseEntity *ground ); CBaseEntity* GetGoalEnt(); void SetGoalEnt( CBaseEntity *pGoalEnt ); void Remember( int iMemory ); void Forget( int iMemory ); bool HasMemory( int iMemory ); CAI_Enemies * GetEnemies(); const char * GetEntClassname(); int CapabilitiesGet(); float GetLastThink( const char *szContext = NULL ); public: #if defined(new) #error #endif void *operator new( size_t nBytes ) { MEM_ALLOC_CREDIT(); void *pResult = MemAlloc_Alloc( nBytes ); memset( pResult, 0, nBytes ); return pResult; }; void *operator new( size_t nBytes, int nBlockUse, const char *pFileName, int nLine ) { MEM_ALLOC_CREDIT(); void *pResult = MemAlloc_Alloc( nBytes, pFileName, nLine ); memset( pResult, 0, nBytes ); return pResult; } private: CAI_BaseNPC *m_pOuter; }; //----------------------------------------------------------------------------- template class CAI_ComponentWithOuter : public BASE_COMPONENT { protected: CAI_ComponentWithOuter(NPC_CLASS *pOuter = NULL) : BASE_COMPONENT(pOuter) { } public: // Hides base version void SetOuter( NPC_CLASS *pOuter ) { BASE_COMPONENT::SetOuter((CAI_BaseNPC *)pOuter); } NPC_CLASS * GetOuter() { return (NPC_CLASS *)(BASE_COMPONENT::GetOuter()); } const NPC_CLASS * GetOuter() const { return (NPC_CLASS *)(BASE_COMPONENT::GetOuter()); } }; //----------------------------------------------------------------------------- #define DEFINE_AI_COMPONENT_OUTER( NPC_CLASS ) \ void SetOuter( NPC_CLASS *pOuter ) { CAI_Component::SetOuter((CAI_BaseNPC *)pOuter); } \ NPC_CLASS * GetOuter() { return (NPC_CLASS *)(CAI_Component::GetOuter()); } \ const NPC_CLASS * GetOuter() const { return (NPC_CLASS *)(CAI_Component::GetOuter()); } //----------------------------------------------------------------------------- #endif // AI_COMPONENT_H