diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/NextBot/NextBotKnownEntity.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/NextBot/NextBotKnownEntity.h')
| -rw-r--r-- | game/server/NextBot/NextBotKnownEntity.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/game/server/NextBot/NextBotKnownEntity.h b/game/server/NextBot/NextBotKnownEntity.h new file mode 100644 index 0000000..7a4e9ed --- /dev/null +++ b/game/server/NextBot/NextBotKnownEntity.h @@ -0,0 +1,175 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// NextBotKnownEntity.h +// Encapsulation of being aware of an entity +// Author: Michael Booth, June 2009 + +#ifndef NEXT_BOT_KNOWN_ENTITY_H +#define NEXT_BOT_KNOWN_ENTITY_H + +//---------------------------------------------------------------------------- +/** + * A "known entity" is an entity that we have seen or heard at some point + * and which may or may not be immediately visible to us right now but which + * we remember the last place we encountered it, and when. + * + * TODO: Enhance interface to allow for sets of areas where an unseen entity + * could potentially be, knowing his last position and his rate of movement. + */ +class CKnownEntity +{ +public: + // constructing assumes we currently know about this entity + CKnownEntity( CBaseEntity *who ) + { + m_who = who; + m_whenLastSeen = -1.0f; + m_whenLastBecameVisible = -1.0f; + m_isVisible = false; + m_whenBecameKnown = gpGlobals->curtime; + m_hasLastKnownPositionBeenSeen = false; + UpdatePosition(); + } + + virtual ~CKnownEntity() { } + + virtual void Destroy( void ) + { + m_who = NULL; + m_isVisible = false; + } + + virtual void UpdatePosition( void ) // could be seen or heard, but now the entity's position is known + { + if ( m_who.Get() ) + { + m_lastKnownPostion = m_who->GetAbsOrigin(); + m_lastKnownArea = m_who->MyCombatCharacterPointer() ? m_who->MyCombatCharacterPointer()->GetLastKnownArea() : NULL; + m_whenLastKnown = gpGlobals->curtime; + } + } + + virtual CBaseEntity *GetEntity( void ) const + { + return m_who; + } + + virtual const Vector &GetLastKnownPosition( void ) const + { + return m_lastKnownPostion; + } + + // Have we had a clear view of the last known position of this entity? + // This encapsulates the idea of "I just saw a guy right over *there* a few seconds ago, but I don't know where he is now" + virtual bool HasLastKnownPositionBeenSeen( void ) const + { + return m_hasLastKnownPositionBeenSeen; + } + + virtual void MarkLastKnownPositionAsSeen( void ) + { + m_hasLastKnownPositionBeenSeen = true; + } + + virtual const CNavArea *GetLastKnownArea( void ) const + { + return m_lastKnownArea; + } + + virtual float GetTimeSinceLastKnown( void ) const + { + return gpGlobals->curtime - m_whenLastKnown; + } + + virtual float GetTimeSinceBecameKnown( void ) const + { + return gpGlobals->curtime - m_whenBecameKnown; + } + + virtual void UpdateVisibilityStatus( bool visible ) + { + if ( visible ) + { + if ( !m_isVisible ) + { + // just became visible + m_whenLastBecameVisible = gpGlobals->curtime; + } + + m_whenLastSeen = gpGlobals->curtime; + } + + m_isVisible = visible; + } + + virtual bool IsVisibleInFOVNow( void ) const // return true if this entity is currently visible and in my field of view + { + return m_isVisible; + } + + virtual bool IsVisibleRecently( void ) const // return true if this entity is visible or was very recently visible + { + if ( m_isVisible ) + return true; + + if ( WasEverVisible() && GetTimeSinceLastSeen() < 3.0f ) + return true; + + return false; + } + + virtual float GetTimeSinceBecameVisible( void ) const + { + return gpGlobals->curtime - m_whenLastBecameVisible; + } + + virtual float GetTimeWhenBecameVisible( void ) const + { + return m_whenLastBecameVisible; + } + + virtual float GetTimeSinceLastSeen( void ) const + { + return gpGlobals->curtime - m_whenLastSeen; + } + + virtual bool WasEverVisible( void ) const + { + return m_whenLastSeen > 0.0f; + } + + // has our knowledge of this entity become obsolete? + virtual bool IsObsolete( void ) const + { + return GetEntity() == NULL || !m_who->IsAlive() || GetTimeSinceLastKnown() > 10.0f; + } + + virtual bool operator==( const CKnownEntity &other ) const + { + if ( GetEntity() == NULL || other.GetEntity() == NULL ) + return false; + + return ( GetEntity() == other.GetEntity() ); + } + + virtual bool Is( CBaseEntity *who ) const + { + if ( GetEntity() == NULL || who == NULL ) + return false; + + return ( GetEntity() == who ); + } + +private: + CHandle< CBaseEntity > m_who; + Vector m_lastKnownPostion; + bool m_hasLastKnownPositionBeenSeen; + CNavArea *m_lastKnownArea; + float m_whenLastSeen; + float m_whenLastBecameVisible; + float m_whenLastKnown; // last seen or heard, confirming its existance + float m_whenBecameKnown; + bool m_isVisible; // flagged by IVision update as visible or not +}; + + +#endif // NEXT_BOT_KNOWN_ENTITY_H |