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

180 lines
4.3 KiB
C++

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