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); }