You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.6 KiB
148 lines
3.6 KiB
//========= 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; |
|
}
|
|
|