diff options
Diffstat (limited to 'game/server/ai_looktarget.cpp')
| -rw-r--r-- | game/server/ai_looktarget.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/game/server/ai_looktarget.cpp b/game/server/ai_looktarget.cpp new file mode 100644 index 0000000..b10bb7c --- /dev/null +++ b/game/server/ai_looktarget.cpp @@ -0,0 +1,148 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +#include "cbase.h" +#include "game.h" +#include "ai_looktarget.h" + +// Mothballing this entity to get rid of it. info_hint does its job better (sjb) +//LINK_ENTITY_TO_CLASS( ai_looktarget, CAI_LookTarget ); + +BEGIN_DATADESC( CAI_LookTarget ) + + // Keyfields + DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "StartDisabled" ), + DEFINE_KEYFIELD( m_iContext, FIELD_INTEGER, "context" ), + DEFINE_KEYFIELD( m_iPriority, FIELD_INTEGER, "priority" ), + DEFINE_KEYFIELD( m_flMaxDist, FIELD_FLOAT, "maxdist" ), + + // Fields + DEFINE_FIELD( m_flTimeNextAvailable, FIELD_TIME ), + +END_DATADESC() + +//--------------------------------------------------------- +//--------------------------------------------------------- +int CAI_LookTarget::DrawDebugTextOverlays(void) +{ + int text_offset = BaseClass::DrawDebugTextOverlays(); + + if (m_debugOverlays & OVERLAY_BBOX_BIT) + { + int color = random->RandomInt( 50, 255 ); + NDebugOverlay::Cross3D( GetAbsOrigin(), 12, color, color, color, false, 0.1 ); + } + + if (m_debugOverlays & OVERLAY_TEXT_BIT) + { + char tempstr[512]; + + if( !IsEnabled() ) + { + Q_snprintf(tempstr,sizeof(tempstr),"DISABLED" ); + EntityText(text_offset,tempstr,0); + text_offset++; + } + + if( IsEligible( NULL ) ) + { + Q_snprintf(tempstr,sizeof(tempstr),"Eligible" ); + EntityText(text_offset,tempstr,0); + text_offset++; + } + else + { + Q_snprintf(tempstr,sizeof(tempstr),"NOT Eligible for selection"); + EntityText(text_offset,tempstr,0); + text_offset++; + } + } + return text_offset; +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +bool CAI_LookTarget::IsEligible( CBaseEntity *pLooker ) +{ + if( !IsEnabled() ) + return false; + + if( !IsAvailable() ) + return false; + + if( pLooker ) + { + float maxdistsqr = m_flMaxDist * m_flMaxDist; + + Vector vecPos = GetAbsOrigin(); + + if( vecPos.DistToSqr( pLooker->WorldSpaceCenter() ) > maxdistsqr ) + { + return false; + } + } + + return true; +} + +//--------------------------------------------------------- +// Someone's reserving this entity because they're going +// to attempt to look at it for flDuration seconds. We'll +// make it unavailable to anyone else for that time. +//--------------------------------------------------------- +void CAI_LookTarget::Reserve( float flDuration ) +{ + m_flTimeNextAvailable = gpGlobals->curtime + flDuration; + + if( HasSpawnFlags( SF_LOOKTARGET_ONLYONCE ) ) + { + // No one will look at this again. + Disable(); + } +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +CAI_LookTarget *CAI_LookTarget::GetFirstLookTarget() +{ + CBaseEntity *pEnt; + + string_t iszLookTarget = FindPooledString( "ai_looktarget" ); + if( iszLookTarget == NULL_STRING ) + { + return NULL; + } + + pEnt = gEntList.FirstEnt(); + while( pEnt && pEnt->m_iClassname != iszLookTarget ) + { + pEnt = gEntList.NextEnt( pEnt ); + } + + return (CAI_LookTarget*)pEnt; +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +CAI_LookTarget *CAI_LookTarget::GetNextLookTarget( CAI_LookTarget *pCurrentTarget ) +{ + CBaseEntity *pEnt; + + string_t iszLookTarget = FindPooledString( "ai_looktarget" ); + if( iszLookTarget == NULL_STRING ) + { + return NULL; + } + + pEnt = gEntList.NextEnt( pCurrentTarget ); + while( pEnt && pEnt->m_iClassname != iszLookTarget ) + { + pEnt = gEntList.NextEnt( pEnt ); + } + + return (CAI_LookTarget*)pEnt; +} |