mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-29 09:33:00 +00:00
84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
|
// SharedFunctorUtils.cpp
|
||
|
// Useful functors
|
||
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "SharedFunctorUtils.h"
|
||
|
#include "collisionutils.h"
|
||
|
#ifdef CLIENT_DLL
|
||
|
#include "ClientTerrorPlayer.h"
|
||
|
#else
|
||
|
#include "TerrorPlayer.h"
|
||
|
#endif
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
bool AvoidActors::operator()( CBaseCombatCharacter *obj )
|
||
|
{
|
||
|
if ( !obj || ( obj == m_owner ) || ( obj->GetTeamNumber() != m_owner->GetTeamNumber() ) )
|
||
|
return true;
|
||
|
|
||
|
#ifdef CLIENT_DLL
|
||
|
if ( obj->IsDormant() )
|
||
|
return true;
|
||
|
#endif
|
||
|
|
||
|
if ( obj->IsSolidFlagSet( FSOLID_NOT_SOLID ) )
|
||
|
return true;
|
||
|
|
||
|
CTerrorPlayer *player = ToTerrorPlayer( obj );
|
||
|
if ( !player )
|
||
|
return true;
|
||
|
|
||
|
if ( player->IsIncapacitatedRevivable() )
|
||
|
return true;
|
||
|
|
||
|
if ( player->IsGhost() )
|
||
|
return true;
|
||
|
|
||
|
Vector objOrigin = obj->GetAbsOrigin();
|
||
|
Vector vObjMins = objOrigin + obj->WorldAlignMins();
|
||
|
Vector vObjMaxs = objOrigin + obj->WorldAlignMaxs();
|
||
|
Vector vOwnerMins = *m_dest + m_owner->WorldAlignMins();
|
||
|
Vector vOwnerMaxs = *m_dest + m_owner->WorldAlignMaxs();
|
||
|
if ( !IsBoxIntersectingBox( vOwnerMins, vOwnerMaxs, vObjMins, vObjMaxs ) )
|
||
|
return true;
|
||
|
|
||
|
float objWidth = vObjMaxs.x - vObjMins.x;
|
||
|
float ownerWidth = vOwnerMaxs.x - vOwnerMins.x;
|
||
|
float idealDistance = (objWidth + ownerWidth) * 0.5f * m_scale;
|
||
|
|
||
|
Vector vDelta = objOrigin - *m_dest;
|
||
|
vDelta.z = 0;
|
||
|
float fDist = vDelta.NormalizeInPlace();
|
||
|
if ( fDist > idealDistance )
|
||
|
return true;
|
||
|
|
||
|
Vector rayOrigin = m_origin;
|
||
|
Vector rayDelta = *m_dest - m_origin;
|
||
|
Vector sphereCenter = objOrigin;
|
||
|
float sphereRadius = idealDistance;
|
||
|
rayOrigin.z = rayDelta.z = sphereCenter.z = 0.0f;
|
||
|
float t1, t2;
|
||
|
if ( IntersectRayWithSphere( rayOrigin, rayDelta, sphereCenter, sphereRadius, &t1, &t2 ) )
|
||
|
{
|
||
|
Vector sphereToDest = *m_dest - sphereCenter;
|
||
|
sphereToDest.z = 0.0f;
|
||
|
if ( !sphereToDest.IsZero() )
|
||
|
{
|
||
|
float radius = sphereToDest.NormalizeInPlace();
|
||
|
sphereToDest *= (idealDistance - radius);
|
||
|
*m_dest += sphereToDest;
|
||
|
m_avoidedActors.AddToTail( obj );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|