sqwarmed/sdk_src/game/shared/swarm/asw_usableobjectsenumerator...

114 lines
3.0 KiB
C++

#include "cbase.h"
#include "asw_usableobjectsenumerator.h"
#ifdef CLIENT_DLL
#include "c_ai_basenpc.h"
#include "c_asw_marine.h"
#include "c_asw_player.h"
#include "c_asw_use_area.h"
#include "c_asw_pickup.h"
#include "c_asw_sentry_base.h"
#include "iasw_client_vehicle.h"
#include "iasw_client_usable_entity.h"
#include "engine/IVDebugOverlay.h"
#else
#include "ai_basenpc.h"
#include "asw_marine.h"
#include "asw_player.h"
#include "asw_use_area.h"
#include "asw_pickup.h"
#include "asw_sentry_base.h"
#include "iasw_vehicle.h"
#include "iasw_server_usable_entity.h"
#define C_ASW_Use_Area CASW_Use_Area
#define C_ASW_Pickup CASW_Pickup
#define C_ASW_Sentry_Base CASW_Sentry_Base
#endif
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#ifdef CLIENT_DLL
extern ConVar asw_debug_hud;
#endif
// Enumator class for ragdolls being affected by explosive forces
CASW_UsableObjectsEnumerator::CASW_UsableObjectsEnumerator( float radius, C_ASW_Player *pPlayer )
{
m_flRadiusSquared = radius * radius;
m_Objects.RemoveAll();
m_pLocal = pPlayer;
}
int CASW_UsableObjectsEnumerator::GetObjectCount()
{
return m_Objects.Count();
}
C_BaseEntity *CASW_UsableObjectsEnumerator::GetObject( int index )
{
if ( index < 0 || index >= GetObjectCount() )
return NULL;
return m_Objects[ index ];
}
// Actual work code
IterationRetval_t CASW_UsableObjectsEnumerator::EnumElement( IHandleEntity *pHandleEntity )
{
if ( !m_pLocal )
return ITERATION_STOP;
#ifndef CLIENT_DLL
CBaseEntity *pEnt = gEntList.GetBaseEntity( pHandleEntity->GetRefEHandle() );
#else
C_BaseEntity *pEnt = ClientEntityList().GetBaseEntityFromHandle( pHandleEntity->GetRefEHandle() );
#endif
if ( pEnt == NULL )
return ITERATION_CONTINUE;
if ( pEnt == m_pLocal )
return ITERATION_CONTINUE;
C_ASW_Marine *pMarine = m_pLocal->GetMarine();
if (!pMarine)
return ITERATION_CONTINUE;
#ifdef CLIENT_DLL
IASW_Client_Usable_Entity *pUsable = dynamic_cast<IASW_Client_Usable_Entity*>(pEnt);
#else
IASW_Server_Usable_Entity *pUsable = dynamic_cast<IASW_Server_Usable_Entity*>(pEnt);
#endif
if (!pUsable || !pUsable->IsUsable(pMarine))
return ITERATION_CONTINUE;
if (pUsable->NeedsLOSCheck())
{
trace_t tr;
Vector vecSrc = pMarine->WorldSpaceCenter();
Vector vecDest = pEnt->WorldSpaceCenter();
UTIL_TraceLine(vecSrc, vecDest, MASK_SOLID_BRUSHONLY, pMarine, COLLISION_GROUP_NONE, &tr);
if (tr.fraction < 1.0f && tr.m_pEnt != pEnt) // didn't hit our target
{
#ifdef CLIENT_DLL
if (asw_debug_hud.GetBool())
debugoverlay->AddLineOverlay(vecSrc, tr.endpos, 255, 0, 0, true, 0.1f);
#endif
float dist = (vecSrc - vecDest).Length2D();
if (dist > 30) // and too far away
return ITERATION_CONTINUE;
}
#ifdef CLIENT_DLL
if (asw_debug_hud.GetBool())
debugoverlay->AddLineOverlay(vecSrc, tr.endpos, 0, 255, 0, true, 0.1f);
#endif
}
CHandle< C_BaseEntity > h;
h = pEnt;
m_Objects.AddToTail( h );
return ITERATION_CONTINUE;
}