//----------------------------------------------------------------------------- // Purpose: // Input : *pMoveData - //----------------------------------------------------------------------------- void CPropAPC::ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMoveData ) { BaseClass::ProcessMovement( pPlayer, pMoveData ); if ( m_flDangerSoundTime > gpGlobals->curtime ) return; QAngle vehicleAngles = GetLocalAngles(); Vector vecStart = GetAbsOrigin(); Vector vecDir; GetVectors( &vecDir, NULL, NULL ); // Make danger sounds ahead of the APC trace_t tr; Vector vecSpot, vecLeftDir, vecRightDir; // lay down sound path vecSpot = vecStart + vecDir * 600; CSoundEnt::InsertSound( SOUND_DANGER, vecSpot, 400, 0.1, this ); // put sounds a bit to left and right but slightly closer to APC to make a "cone" of sound // in front of it QAngle leftAngles = vehicleAngles; leftAngles[YAW] += 20; VehicleAngleVectors( leftAngles, &vecLeftDir, NULL, NULL ); vecSpot = vecStart + vecLeftDir * 400; UTIL_TraceLine( vecStart, vecSpot, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); CSoundEnt::InsertSound( SOUND_DANGER, vecSpot, 400, 0.1, this ); QAngle rightAngles = vehicleAngles; rightAngles[YAW] -= 20; VehicleAngleVectors( rightAngles, &vecRightDir, NULL, NULL ); vecSpot = vecStart + vecRightDir * 400; UTIL_TraceLine( vecStart, vecSpot, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); CSoundEnt::InsertSound( SOUND_DANGER, vecSpot, 400, 0.1, this); m_flDangerSoundTime = gpGlobals->curtime + 0.3; }
//----------------------------------------------------------------------------- // Purpose: Tells whether or not the car has been overturned // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CPropVehicleDriveable::IsOverturned( void ) { Vector vUp; VehicleAngleVectors( GetAbsAngles(), NULL, NULL, &vUp ); float upDot = DotProduct( Vector(0,0,1), vUp ); // Tweak this number to adjust what's considered "overturned" if ( upDot < 0.0f ) return true; return false; }