source-engine/game/server/ai_goalentity.h

195 lines
4.1 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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