По-разному, наверное, можно сделать.. По крайней мере я делал, переопределяя void C_BaseCombatWeapon::OverrideMouseInput(float *dx, float *dy). Это будет примерно так:
code:{
....C_BasePlayer *p = ToBasePlayer(GetOwner());
....if ( !p )
........return;
....float ratio = engine->GetScreenAspectRatio();
....float fov_h = p->GetFOV();
....float fov_v = RAD2DEG( atan( tan(DEG2RAD(fov_h)/2)/ratio ) * 2 );
....static const ConVarRef m_yaw( "m_yaw" );
....static const ConVarRef m_pitch( "m_pitch" );
....float dyaw = m_yaw.GetFloat() * *dx * -0.5;
....float dpitch = m_pitch.GetFloat() * *dy * +0.5;
....m_flViewmodelYaw += dyaw;
....m_flViewmodelPitch += dpitch;
....float maxYaw = fov_h*0.5 * weapon_maxyaw.GetFloat();
....float maxPitch = fov_v*0.5 * weapon_maxpitch.GetFloat();
....if ( m_flViewmodelYaw > -maxYaw && m_flViewmodelYaw < maxYaw )
........*dx = 0;
....else
........m_flViewmodelYaw = clamp( m_flViewmodelYaw, -maxYaw, maxYaw );
....if ( m_flViewmodelPitch > -maxPitch && m_flViewmodelPitch < maxPitch )
........*dy = 0;
....else
........m_flViewmodelPitch = clamp( m_flViewmodelPitch, -maxPitch, maxPitch );
}
m_flViewmodelYaw и m_flViewmodelPitch - члены класса твоего оружия, которые надо прибавлять к углам вьюмодели. Например в AddViewmodelBob.
Ну и не надо забывать отправлять на сервер эти углы (см. CUserCmd), чтобы там стрелялось нормально.