void CRecoil::RecoilShoot(bool firstShot, float maxRecoil)
{
	float attack = firstShot ? m_recoilParams.first_attack : m_recoilParams.attack;
	attack = (float)__fsel(attack, attack, m_recoilParams.attack);
	m_attack = attack;
	m_recoil_time = m_recoilParams.recoil_time;
	if (m_recoil_time == 0.0f)
		m_recoil = clamp(m_recoil + m_attack, 0.0f, maxRecoil);

	Vec2 direction = Vec2(ZERO);
	const int recoilHintsCount = m_pRecoilHints ? m_pRecoilHints->hints.size() : 0;
	if (recoilHintsCount > 0)
	{
		direction = m_pRecoilHints->hints[m_recoil_dir_idx];
		m_recoil_dir_idx = (m_recoil_dir_idx+1) % recoilHintsCount;
	}

	const Vec3 randomDirectionAdd = Vec3(
		Random(m_recoilParams.randomness),
		BiRandom(m_recoilParams.randomness),
		Random(m_recoilParams.tilt));

	m_recoil_dir = direction.GetNormalized() + randomDirectionAdd;

	CRecoilDebugDraw::AddRecoilPoint(m_recoil_dir, m_recoil);
}