diff options
Diffstat (limited to 'mp/src/game/shared/SharedFunctorUtils.cpp')
| -rw-r--r-- | mp/src/game/shared/SharedFunctorUtils.cpp | 166 |
1 files changed, 83 insertions, 83 deletions
diff --git a/mp/src/game/shared/SharedFunctorUtils.cpp b/mp/src/game/shared/SharedFunctorUtils.cpp index f43f2c82..7dd3f8bc 100644 --- a/mp/src/game/shared/SharedFunctorUtils.cpp +++ b/mp/src/game/shared/SharedFunctorUtils.cpp @@ -1,83 +1,83 @@ -// 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;
-}
-
-
-//--------------------------------------------------------------------------------------------------------
+// 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; +} + + +//-------------------------------------------------------------------------------------------------------- |