bool CAI_PlaneSolver::IsSegmentBlockedByGlobalObstacles( const Vector &vecStart, const Vector &vecEnd ) { for ( int i = s_GlobalObstacles.Head(); i != s_GlobalObstacles.InvalidIndex(); i = s_GlobalObstacles.Next( i ) ) { const CircleObstacles_t& obstacle = s_GlobalObstacles[i]; if ( obstacle.type == AIMST_MOVE ) continue; const Vector &vecObstacle = obstacle.center; float flDistSqr = CalcDistanceSqrToLineSegment( vecObstacle, vecStart, vecEnd ); if ( flDistSqr < obstacle.radius * obstacle.radius ) return true; } return false; }
void FX_TracerSound( const Vector &start, const Vector &end, int iTracerType ) { const char *pszSoundName = NULL; float flWhizDist = TRACER_MAX_HEAR_DIST; float flMinWhizTime = TRACER_SOUND_TIME_MIN; float flMaxWhizTime = TRACER_SOUND_TIME_MAX; Vector vecListenOrigin = MainViewOrigin(); switch( iTracerType ) { case TRACER_TYPE_DEFAULT: { pszSoundName = "Bullets.DefaultNearmiss"; flWhizDist = 24; Ray_t bullet, listener; bullet.Init( start, end ); Vector vecLower = vecListenOrigin; vecLower.z -= LISTENER_HEIGHT; listener.Init( vecListenOrigin, vecLower ); float s, t; IntersectRayWithRay( bullet, listener, s, t ); t = clamp( t, 0, 1 ); vecListenOrigin.z -= t * LISTENER_HEIGHT; } break; case TRACER_TYPE_GUNSHIP: pszSoundName = "Bullets.GunshipNearmiss"; break; case TRACER_TYPE_STRIDER: pszSoundName = "Bullets.StriderNearmiss"; break; case TRACER_TYPE_WATERBULLET: pszSoundName = "Underwater.BulletImpact"; flWhizDist = 48; flMinWhizTime = 0.3f; flMaxWhizTime = 0.6f; break; default: return; } if( !pszSoundName ) return; // Is it time yet? float dt = g_BulletWhiz.m_nextWhizTime - gpGlobals->curtime; if ( dt > 0 ) return; // Did the thing pass close enough to our head? float vDist = CalcDistanceSqrToLineSegment( vecListenOrigin, start, end ); if ( vDist >= (flWhizDist * flWhizDist) ) return; CSoundParameters params; if( C_BaseEntity::GetParametersForSound( pszSoundName, params, NULL ) ) { // Get shot direction Vector shotDir; VectorSubtract( end, start, shotDir ); VectorNormalize( shotDir ); CLocalPlayerFilter filter; enginesound->EmitSound( filter, SOUND_FROM_WORLD, CHAN_STATIC, params.soundname, params.volume, SNDLVL_TO_ATTN(params.soundlevel), 0, params.pitch, &start, &shotDir, false); } // FIXME: This has a bad behavior when both bullet + strider shots are whizzing by at the same time // Could use different timers for the different types. // Don't play another bullet whiz for this client until this time has run out g_BulletWhiz.m_nextWhizTime = gpGlobals->curtime + random->RandomFloat( flMinWhizTime, flMaxWhizTime ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void FX_TFTracerSound( const Vector &start, const Vector &end, int iTracerType ) { // don't play on very short hits if ( ( start - end ).Length() < 200 ) return; const char *pszSoundName = "Bullets.DefaultNearmiss"; float flWhizDist = 64; Vector vecListenOrigin = MainViewOrigin(); switch( iTracerType ) { case TRACER_TYPE_DEFAULT: flWhizDist = 96; // fall through ! default: { Ray_t bullet, listener; bullet.Init( start, end ); Vector vecLower = vecListenOrigin; vecLower.z -= LISTENER_HEIGHT; listener.Init( vecListenOrigin, vecLower ); float s, t; IntersectRayWithRay( bullet, listener, s, t ); t = clamp( t, 0, 1 ); vecListenOrigin.z -= t * LISTENER_HEIGHT; } break; } static float flNextWhizTime = 0; // Is it time yet? float dt = flNextWhizTime - gpGlobals->curtime; if ( dt > 0 ) return; // Did the thing pass close enough to our head? float vDist = CalcDistanceSqrToLineSegment( vecListenOrigin, start, end ); if ( vDist >= (flWhizDist * flWhizDist) ) return; CSoundParameters params; if( C_BaseEntity::GetParametersForSound( pszSoundName, params, NULL ) ) { // Get shot direction Vector shotDir; VectorSubtract( end, start, shotDir ); VectorNormalize( shotDir ); CLocalPlayerFilter filter; enginesound->EmitSound( filter, SOUND_FROM_WORLD, CHAN_STATIC, params.soundname, params.volume, SNDLVL_TO_ATTN(params.soundlevel), 0, params.pitch, 0, &start, &shotDir, false); } // Don't play another bullet whiz for this client until this time has run out flNextWhizTime = gpGlobals->curtime + 0.1f; }