154 lines
3.8 KiB
C++
154 lines
3.8 KiB
C++
|
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
|||
|
//
|
|||
|
// Purpose:
|
|||
|
//
|
|||
|
// $NoKeywords: $
|
|||
|
//
|
|||
|
//=============================================================================//
|
|||
|
|
|||
|
#include "cbase.h"
|
|||
|
#include "game.h"
|
|||
|
#include "ai_looktarget.h"
|
|||
|
|
|||
|
// NOTE: This has to be the last file included!
|
|||
|
#include "tier0/memdbgon.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;
|
|||
|
}
|