This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

173 lines
4.9 KiB
C++

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