Вопрос Как сделать педали

  • Автор темы Автор темы ayi
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
5 Мар 2022
Сообщения
109
Реакции
8
/del
 
Последнее редактирование:
у меня есть педали, стрейфер хороший все есть базару нету, скорость педалей быстрее типа который без них, но все равно проблема с тем, что педали слишком медленные.


Код:
Expand Collapse Copy
void c_movement::accelerate(vec3_t& out_velo, float& stamina, float& friction, vec3_t move, float frametime)
{
    static float sv_air_max_wishspeed = g_interfaces->m_var->get_by_name("sv_air_max_wishspeed")->get_float();
    static float sv_air_accelerate = g_interfaces->m_var->get_by_name("sv_airaccelerate")->get_float();
    static float sv_staminarecoveryrate = g_interfaces->m_var->get_by_name("sv_staminarecoveryrate")->get_float();

    float max_speed = out_velo.length_2d();
    if (stamina > 0)
    {
        float flSpeedScale = std::clamp(1.0f - (stamina / 100.f), 0.f, 1.f);
        max_speed *= flSpeedScale * flSpeedScale;
        stamina = fmaxf(stamina - (frametime * sv_staminarecoveryrate), 0.f);
    }

    vec3_t forward, left, up;
    auto wish_angles = g_interfaces->m_csgo_input->get_view_angles();
    g_math->angle_vectors(wish_angles, forward, left, up);
    forward.normalize_in_place();
    left.normalize_in_place();

    vec3_t wish_dir{};
    wish_dir.x = (((forward.x * move.x) * max_speed) - ((left.x * move.y) * max_speed));
    wish_dir.y = ((forward.y * move.x) * max_speed) - ((left.y * move.y) * max_speed);

    auto wish_speed = wish_dir.normalize_in_place();

    wish_speed = fminf(wish_speed, max_speed);

    const float spped_add = fminf(wish_speed, sv_air_max_wishspeed - out_velo.dot(wish_dir));

    if (spped_add > 0.f)
    {
        const float accelspd = fminf(spped_add, ((wish_speed * frametime) * sv_air_accelerate) * friction);
        out_velo += wish_dir * accelspd;
    }

    friction = 1.0f;
    if (g_ctx->m_local_pawn->m_flags() & FL_ONGROUND)
    {
        if (out_velo.z <= 140.0 && out_velo.z > 0.0)
            friction = 0.25f;
    }
}

void c_movement::auto_strafe(bool subtick, vec3_t player_velo, float frame_time, float stimar, float friction) {
    if (!g_interfaces->m_engine->is_connected() || !g_interfaces->m_engine->is_in_game())
        return;

    if (!g_ctx->m_local_pawn || !g_ctx->m_local_controller->m_pawn_is_alive())
        return;

    if (g_ctx->m_local_pawn->m_flags() & FL_ONGROUND)
        return;

    if (g_ctx->m_local_pawn->m_move_type() == 1794 || g_ctx->m_local_pawn->m_move_type() == 2313)
        return;

    if (!g_cfg->misc.m_auto_strafe)
        return;

    if (g_ctx->m_user_cmd->m_button_state.m_button_state & (1 << 16))
        return;

    auto movement_services = g_ctx->m_local_pawn->m_movement_services();
    if (!movement_services)
        return;

    static uint64_t last_pressed = 0;
    static uint64_t last_buttons = 0;
    const auto current_buttons = g_ctx->m_user_cmd->m_button_state.m_button_state;

    const auto check_button = [&](const uint64_t button) {
        if (current_buttons & button && (!(last_buttons & button) ||
            (button & IN_MOVELEFT && !(last_pressed & IN_MOVERIGHT)) ||
            (button & IN_MOVERIGHT && !(last_pressed & IN_MOVELEFT)) ||
            (button & IN_FORWARD && !(last_pressed & IN_BACK)) ||
            (button & IN_BACK && !(last_pressed & IN_FORWARD)))) {
            if (button & IN_MOVELEFT)
                last_pressed &= ~IN_MOVERIGHT;
            else if (button & IN_MOVERIGHT)
                last_pressed &= ~IN_MOVELEFT;
            else if (button & IN_FORWARD)
                last_pressed &= ~IN_BACK;
            else if (button & IN_BACK)
                last_pressed &= ~IN_FORWARD;

            last_pressed |= button;
        }
        else if (!(current_buttons & button))
            last_pressed &= ~button;
        };

    check_button(IN_MOVELEFT);
    check_button(IN_MOVERIGHT);
    check_button(IN_FORWARD);
    check_button(IN_BACK);

    last_buttons = current_buttons;

    float yaw = normalize(g_interfaces->m_csgo_input->get_view_angles().y);
    auto offset = 0.f;
    if (last_pressed & IN_MOVELEFT)
        offset += 90.f;
    if (last_pressed & IN_MOVERIGHT)
        offset -= 90.f;
    if (last_pressed & IN_FORWARD)
        offset *= 0.5f;
    else if (last_pressed & IN_BACK)
        offset = -offset * 0.5f + 180.f;

    yaw += offset;

    const int32_t tick_interval = g_interfaces->m_global_vars->m_tick_count;
    const float ov_frame_time = subtick ? tick_interval / 12.f : frame_time;
    const int subtick_count = subtick ? 12 : 1;

    vec3_t vel = g_ctx->m_local_pawn->m_vec_abs_velocity();
    vec3_t move = movement_services->m_last_movement_impulses();
    float fric = movement_services->m_surface_friction();
    float stamina = movement_services->m_stamina();

    auto rotate_movement = [](float target_yaw) {
        const float rot = DEG2RAD * (g_interfaces->m_csgo_input->get_view_angles().y - target_yaw);

        const float new_forward = std::cos(rot) * g_ctx->m_user_cmd->pb.mutable_base()->forwardmove() -
            std::sin(rot) * g_ctx->m_user_cmd->pb.mutable_base()->leftmove();
        const float new_side = std::sin(rot) * g_ctx->m_user_cmd->pb.mutable_base()->forwardmove() +
            std::cos(rot) * g_ctx->m_user_cmd->pb.mutable_base()->leftmove();

        g_ctx->m_user_cmd->m_button_state.m_button_state &= ~(IN_BACK | IN_FORWARD | IN_MOVELEFT | IN_MOVERIGHT);
        g_ctx->m_user_cmd->m_button_state.m_button_state2 &= ~(IN_BACK | IN_FORWARD | IN_MOVELEFT | IN_MOVERIGHT);

        g_ctx->m_user_cmd->pb.mutable_base()->set_forwardmove(std::clamp(new_forward, -1.f, 1.f));
        g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(std::clamp(new_side * -1.f, -1.f, 1.f));

        if (g_ctx->m_user_cmd->pb.mutable_base()->forwardmove() > 0.0f)
            g_ctx->m_user_cmd->m_button_state.m_button_state |= IN_FORWARD;
        else if (g_ctx->m_user_cmd->pb.mutable_base()->forwardmove() < 0.0f)
            g_ctx->m_user_cmd->m_button_state.m_button_state |= IN_BACK;
        if (g_ctx->m_user_cmd->pb.mutable_base()->leftmove() > 0.0f)
            g_ctx->m_user_cmd->m_button_state.m_button_state |= IN_MOVELEFT;
        else if (g_ctx->m_user_cmd->pb.mutable_base()->leftmove() < 0.0f)
            g_ctx->m_user_cmd->m_button_state.m_button_state |= IN_MOVERIGHT;
        };

    static bool side_switch = false;
    for (int i = 0; i < subtick_count; i++) {
        if (subtick) {
            auto move_step = g_protobuf->add_subtick_move_step(g_ctx->m_user_cmd);
            if (!move_step)
                continue;
            move_step->set_when((1.f / 12.f) * i);
        }

        auto velocity_angle = RAD2DEG * std::atan2f(vel.y, vel.x);
        if (velocity_angle < 0.0f)
            velocity_angle += 360.0f;
        velocity_angle -= floorf(velocity_angle / 360.0f + 0.5f) * 360.0f;

        const auto speed = vel.length_2d();
        auto ideal = speed > 0.f ? std::clamp(RAD2DEG * std::atan2(15.f, speed), 0.0f, 45.0f) : 0.f;
        auto correct = (100.f - g_cfg->misc.m_strafe_smooth) * 0.01f * ideal;

        g_ctx->m_user_cmd->pb.mutable_base()->set_forwardmove(0.f);
        g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(0.f);

        auto velocity_delta = normalize(yaw - velocity_angle);
        if (fabsf(velocity_delta) > 90.f)
            velocity_delta = std::copysignf(90.f, velocity_delta);

        side_switch = subtick ? !side_switch : g_ctx->m_user_cmd->m_command_number % 2 == 0;

        if (speed <= 80.f) {
            if (side_switch) {
                yaw = yaw - ideal * 0.5f;
                g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(-1.0f);
            }
            else {
                yaw = yaw + ideal * 0.5f;
                g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(1.0f);
            }
        }
        else if (velocity_delta > correct) {
            yaw = velocity_angle + correct;
            g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(-1.0f);
        }
        else if (velocity_delta < -correct) {
            yaw = velocity_angle - correct;
            g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(1.0f);
        }
        else {
            if (side_switch) {
                yaw = yaw - ideal;
                g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(-1.0f);
            }
            else {
                yaw = yaw + ideal;
                g_ctx->m_user_cmd->pb.mutable_base()->set_leftmove(1.0f);
            }
        }

        float prev_forward = g_ctx->m_user_cmd->pb.mutable_base()->forwardmove();
        float prev_left = g_ctx->m_user_cmd->pb.mutable_base()->leftmove();

        rotate_movement(normalize(yaw));

        move.x = g_ctx->m_user_cmd->pb.mutable_base()->forwardmove();
        move.y = g_ctx->m_user_cmd->pb.mutable_base()->leftmove();
        accelerate(vel, stamina, fric, move, ov_frame_time);

        if (subtick) {
            auto move_step = g_protobuf->add_subtick_move_step(g_ctx->m_user_cmd);
            if (move_step) {
                move_step->set_analog_forward_delta(move.x - prev_forward);
                move_step->set_analog_left_delta(move.y - prev_left);
            }
        }
    }
}
so cringe

first – tick_interval is not g_global_vars->m_tickcount
(to be honest, tick_interval is now a constant value – like 0.015625)
second – don’t try to iterate 12 subticks for your airstrafe booster

and yeah is it’s fucking shit, dude
Learn the game
 
твой аир аккселерйт вронг, открой иду и увидишь что у тебя вообще не правильная акселерация, во вторых, сама формула расчета идеала не правильная, на счет 12 сабтиков правильно, но следует добавить чеки на имеющиеся уже сабтики, так же не понял откуда ты прикол с фрикшионом взял, его не нужно вообще ставить/использовать. второе - стамина, тоже не понял зачем она тебе вообще, еще не вижу проверок на гравити и махинации с z углом велосити, так же ласт мувмент импульсы не правильно ставить, посмотри функции внутри SetupMove, там добавляется дельта между мувами твоими и бекапнутыми мувами, еще, сам аутвело не правильно считается, все сводится к тома, что нужно прочитать пару строк кода игры. удачи!

PS. что бы найти функцию AirMove используй в поиске квар sv_airaccelerate
 
so cringe

first – tick_interval is not g_global_vars->m_tickcount
(to be honest, tick_interval is now a constant value – like 0.015625)
second – don’t try to iterate 12 subticks for your airstrafe booster

and yeah is it’s fucking shit, dude
Learn the game
Have a nice day
C++:
Expand Collapse Copy
// 48 8B C4 48 89 58 18 48 89 70 20 55 57 41 56 48 8D 68 A1 48 81 EC C0 @server.dll
void CGameMovement::Accelerate( Vector& wish_vel, float& wish_friction, Vector wish_move, float wish_frametime, float max_speed )
{
    Vector fwd{}, left{};
   
    // maybe store angles in createmove?
    // after all stuff like movement rotation, normalize, etc
    auto wish_angles = g_Input->GetViewAngles( );
    math::angle_vectors( wish_angles, forward, left, nullptr );
   
    forward.normalize( );
    left.normalize( );
   
    Vector wish_dir{};
    wish_dir.x = ( ( ( forward.x * move.x ) * max_speed ) - ( ( left.x * move.y ) * max_speed ) );
    wish_dir.y = ( ( forward.y * move.x ) * max_speed ) - ( ( left.y * move.y ) * max_speed );
   
    auto wish_speed = wish_dir.normalized( );
   
    wish_speed = std::min( wish_speed, max_speed );
   
    /*
    accelerate_speed = sub_1800F00C0(&sv_air_max_wishspeed, 0xFFFFFFFFi64);
    *(double *)v15.m128_u64 = sub_1800E83D0(&speed, &accelerate_speed);
    speed = v15.m128_f32[0] - sub_1800E0CA0(a2 + 14, (float *)&v48);
    */
    auto speed = std::min( wish_speed, sv_air_max_wishspeed - wish_vel.dot( wish_dir ) );
   
    /*
    if ( speed > 0.0 )
    {
      accelerate_speed = (float)((float)(sv_accelerate_float * wish_speed) * *((float *)off_1813B2620 + 0xC))
                       * *(float *)(a1 + 0x1FC);
      *(double *)v15.m128_u64 = sub_1800E83D0(&speed, &accelerate_speed);
      v16 = v15;
      v16.m128_f32[0] = v15.m128_f32[0] * *(float *)&v42;
      v17 = v15;
      v17.m128_f32[0] = v15.m128_f32[0] * *((float *)&v42 + 1);
      v18 = v43 * v15.m128_f32[0];
      v19 = (float)(v15.m128_f32[0] * *(float *)&v42) + a2[54];
      v20 = (float)(v43 * v15.m128_f32[0]) + a2[56];
      a2[54] = v19;
      v21 = v17.m128_f32[0] + a2[55];
      a2[56] = v20;
      a2[55] = v21;
      v16.m128_f32[0] = v16.m128_f32[0] + a2[14];
      v17.m128_f32[0] = v17.m128_f32[0] + a2[15];
      v22 = v18 + a2[16];
      *((_QWORD *)a2 + 7) = _mm_unpacklo_ps(v16, v17).m128_u64[0];
      a2[16] = v22;
    }
    */
   
    if ( speed > 0.0f )
    {
        /*    
         accelerate_speed = (float)((float)(sv_accelerate_float * wish_speed) * *((float *)off_1813B2620 + 0xC))
                       * *(float *)(a1 + 0x1FC); - 0x1FC this is friction maybe
                     
         a2[16] = v22; - this is velocity
        */
       
        auto accelerate_speed = std::min( speed, ( ( wish_speed * wish_frametime ) * sv_air_accelerate ) * wish_friction );
        wish_vel += ( wish_dir * accelerate_speed );
    }
   
    /*
    now its up to the reader to add z velocity adjustments using sv_gravity and other calculations
    a2[16] = a2[16] - (float)((float)((float)(sub_18015DF60(&sv_gravity, 0xFFFFFFFFi64) * v23) * v24) * 0.5);
    */
}
 
Последнее редактирование:
стамина, тоже не понял зачем она тебе вообще
Он их использует ради того чтобы вычислить максимальную скорость для flMaxSpeed(
Пожалуйста, авторизуйтесь для просмотра ссылки.
|
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
48 83 EC 48 F3 0F 10 81 @server.dll
 
Have a nice day
C++:
Expand Collapse Copy
// 48 8B C4 48 89 58 18 48 89 70 20 55 57 41 56 48 8D 68 A1 48 81 EC C0 @server.dll
void CGameMovement::Accelerate( Vector& wish_vel, float& wish_friction, Vector wish_move, float wish_frametime, float max_speed )
{
    Vector fwd{}, left{};
 
    // maybe store angles in createmove?
    // after all stuff like movement rotation, normalize, etc
    auto wish_angles = g_Input->GetViewAngles( );
    math::angle_vectors( wish_angles, forward, left, nullptr );
 
    forward.normalize( );
    left.normalize( );
 
    Vector wish_dir{};
    wish_dir.x = ( ( ( forward.x * move.x ) * max_speed ) - ( ( left.x * move.y ) * max_speed ) );
    wish_dir.y = ( ( forward.y * move.x ) * max_speed ) - ( ( left.y * move.y ) * max_speed );
 
    auto wish_speed = wish_dir.normalized( );
 
    wish_speed = std::min( wish_speed, max_speed );
 
    /*
    accelerate_speed = sub_1800F00C0(&sv_air_max_wishspeed, 0xFFFFFFFFi64);
    *(double *)v15.m128_u64 = sub_1800E83D0(&speed, &accelerate_speed);
    speed = v15.m128_f32[0] - sub_1800E0CA0(a2 + 14, (float *)&v48);
    */
    auto speed = std::min( wish_speed, sv_air_max_wishspeed - wish_vel.dot( wish_dir ) );
 
    /*
    if ( speed > 0.0 )
    {
      accelerate_speed = (float)((float)(sv_accelerate_float * wish_speed) * *((float *)off_1813B2620 + 0xC))
                       * *(float *)(a1 + 0x1FC);
      *(double *)v15.m128_u64 = sub_1800E83D0(&speed, &accelerate_speed);
      v16 = v15;
      v16.m128_f32[0] = v15.m128_f32[0] * *(float *)&v42;
      v17 = v15;
      v17.m128_f32[0] = v15.m128_f32[0] * *((float *)&v42 + 1);
      v18 = v43 * v15.m128_f32[0];
      v19 = (float)(v15.m128_f32[0] * *(float *)&v42) + a2[54];
      v20 = (float)(v43 * v15.m128_f32[0]) + a2[56];
      a2[54] = v19;
      v21 = v17.m128_f32[0] + a2[55];
      a2[56] = v20;
      a2[55] = v21;
      v16.m128_f32[0] = v16.m128_f32[0] + a2[14];
      v17.m128_f32[0] = v17.m128_f32[0] + a2[15];
      v22 = v18 + a2[16];
      *((_QWORD *)a2 + 7) = _mm_unpacklo_ps(v16, v17).m128_u64[0];
      a2[16] = v22;
    }
    */
 
    if ( speed > 0.0f )
    {
        /*  
         accelerate_speed = (float)((float)(sv_accelerate_float * wish_speed) * *((float *)off_1813B2620 + 0xC))
                       * *(float *)(a1 + 0x1FC); - 0x1FC this is friction maybe
                   
         a2[16] = v22; - this is velocity
        */
     
        auto accelerate_speed = std::min( speed, ( ( wish_speed * wish_frametime ) * sv_air_accelerate ) * wish_friction );
        wish_vel += ( wish_dir * accelerate_speed );
    }
 
    /*
    now its up to the reader to add z velocity adjustments using sv_gravity and other calculations
    a2[16] = a2[16] - (float)((float)((float)(sub_18015DF60(&sv_gravity, 0xFFFFFFFFi64) * v23) * v24) * 0.5);
    */
}
1747653097917.png

не понимаю почему у тебя минус вместо плюса, так же сам виш спид чуть по другому считаете, у тебя немного вронг

так же то, на счёт чего я говорил про z велосити

1747653225500.png
 
не понимаю почему у тебя минус вместо плюса, так же сам виш спид чуть по другому считаете, у тебя немного вронг
1747669773330.png

На самом деле я и не чекал особо как там этот ваш виш дирекшен рассчитывается
Так как думал что у тс зафейлить это было невозможно(ошибался)
На счет виш спида не уверен в том что его рассчет ошибочный(на скриншоте также видно как игра рассчитывает его)
 
Последнее редактирование:
Посмотреть вложение 306754
На самом деле я и не чекал особо как там этот ваш виш дирекшен рассчитывается
Так как думал что у тс зафейлить это было невозможно(ошибался)
На счет виш спида не уверен в том что его рассчет ошибочный(на скриншоте также видно как игра рассчитывает его)
это не виш спид, а макс спид, там чек из схемы и мув даты
 
это не виш спид, а макс спид, там чек из схемы и мув даты
1747684824305.png

1747686087015.png

это как раз wish_speed(просто изначально он имеет значение от modifier`a) 0x3c это flMaxSpeed из мув даты
позже этот же flMaxSpeed из мув даты сторится в ProcessMovement
 
твой аир аккселерйт вронг, открой иду и увидишь что у тебя вообще не правильная акселерация, во вторых, сама формула расчета идеала не правильная, на счет 12 сабтиков правильно, но следует добавить чеки на имеющиеся уже сабтики, так же не понял откуда ты прикол с фрикшионом взял, его не нужно вообще ставить/использовать. второе - стамина, тоже не понял зачем она тебе вообще, еще не вижу проверок на гравити и махинации с z углом велосити, так же ласт мувмент импульсы не правильно ставить, посмотри функции внутри SetupMove, там добавляется дельта между мувами твоими и бекапнутыми мувами, еще, сам аутвело не правильно считается, все сводится к тома, что нужно прочитать пару строк кода игры. удачи!

PS. что бы найти функцию AirMove используй в поиске квар sv_airaccelerate
какие именно махинации мне нужно сделать с velocity.z? типо уменьшать, допустим velocity.z *= 0.4f, или сбрасывать его при < 5.0f, обнулять на земле или что именно? как мне однажды говорил один человек про педали, нужно расчитывать velocity. но что именно мне нужно сделать с велосити я так и не понял
 
какие именно махинации мне нужно сделать с velocity.z? типо уменьшать, допустим velocity.z *= 0.4f, или сбрасывать его при < 5.0f, обнулять на земле или что именно? как мне однажды говорил один человек про педали, нужно расчитывать velocity. но что именно мне нужно сделать с велосити я так и не понял
тебе нужно его рассчитать..

a2[16] = a2[16] - (float)((float)((float)(sub_18015DF60(&sv_gravity, 0xFFFFFFFFi64) * v23) * frame_time) * 0.5);
 
какие именно махинации мне нужно сделать с velocity.z? типо уменьшать, допустим velocity.z *= 0.4f, или сбрасывать его при < 5.0f, обнулять на земле или что именно? как мне однажды говорил один человек про педали, нужно расчитывать velocity. но что именно мне нужно сделать с велосити я так и не понял
C++:
Expand Collapse Copy
        const float gravity_half_tick = ( g_pEngineVars->sv_gravity->GetFloat( ) * g_pContext->m_pLocalPawn->m_flGravityScale( ) * frame_time ) * 0.5f;
        velocity.z -= gravity_half_tick;
        velocity.z += ( g_pContext->m_pLocalPawn->m_vecBaseVelocity( ).z * frame_time );
 
Назад
Сверху Снизу