void c_movement::auto_stop(c_user_cmd* user_cmd, c_cs_player_pawn* local_player, c_base_player_weapon* active_weapon, bool no_spread) {
if (!g_cfg->rage_bot.m_auto_stop)
return;
if (no_spread)
return;
if (!(local_player->m_flags() & FL_ONGROUND))
return;
// Убираем ускорение (IN_SPEED) и любые движения, кроме нужных для остановки
user_cmd->m_forward_move = 0.f;
user_cmd->m_side_move = 0.f;
user_cmd->m_up_move = 0.f;
// Получаем скорость игрока
vec3_t velocity = local_player->m_vec_velocity();
velocity.z = 0.f; // игнорируем вертикальную компонету
float speed = velocity.length();
if (speed < 1.f) // если скорость маленькая, не делаем ничего
return;
// Направление торможения — противоположное текущей скорости
vec3_t direction = velocity / speed * -1.f;
// Максимальная скорость для остановки - 25% от максимальной скорости оружия
float wish_speed = active_weapon->get_max_speed() * 0.25f;
// Устанавливаем движение пользователя в сторону остановки с ограничением wish_speed
user_cmd->m_forward_move = direction.x * wish_speed;
user_cmd->m_side_move = direction.y * wish_speed;
// Отменяем прыжок и ускорение
user_cmd->m_button_state.m_button_state &= ~IN_JUMP;
user_cmd->m_button_state.m_button_state &= ~IN_SPEED;
}