source-engine/game/server/ai_component.h

172 lines
4.5 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright 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;
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 NPC_CLASS, class BASE_COMPONENT = CAI_Component>
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