float max_desync( c_animstate* override_animstate = nullptr, bool jitter = false ) {
float max_desync_angle = 0.f;
auto anim_state = override_animstate != nullptr ? override_animstate : this->animstate( );
if ( !anim_state )
return max_desync_angle;
float duck_amount = anim_state->duck_amount;
float speed_fraction = math::max< float >( 0, math::min< float >( anim_state->feet_speed_forwards_or_sideways, 1 ) );
float speed_factor = math::max< float >( 0, math::min< float >( 1, anim_state->feet_speed_unknown_forwards_or_sideways ) );
float yaw_modifier = ( ( ( anim_state->stop_to_full_running_fraction * -0.3f ) - 0.2f ) * speed_fraction ) + 1.0f;
if ( duck_amount > 0.f ) {
yaw_modifier += ( ( duck_amount * speed_factor ) * ( 0.5f - yaw_modifier ) );
}
max_desync_angle = anim_state->velocity_subtract_y * yaw_modifier;
if ( jitter ) {
const auto yaw_feet_delta = anim_state->goal_feet_yaw - anim_state->eye_angles_y;
if ( yaw_feet_delta < max_desync_angle ) {
max_desync_angle = 180.f;
}
}
return max_desync_angle;
}