Вопрос Как работает правильный хитшанс?

Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2020
Сообщения
59
Реакции[?]
5
Поинты[?]
0
как сделать правильный хитшанс, который будет получать верный процент вероятности попадания?
как я понял, чит берет разброс возможный и считает сколько выстрелов попадет из 255, и этот процент и есть хитшанс? или это работает сложнее
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2021
Сообщения
1,019
Реакции[?]
315
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
гетсприд & гет инакураси это самый простой способ расчета хитшанса.
Но можно и с пропусканием трейсов. Обрати внимание на тот же хитшанс фаталити. С математикой там все хорошо
C++:
float aimbot::calc_hc( QAngle vangles, const aimpoint_t& point, C_CSPlayer* player ) const
{
    auto weapon = get_weapon( g_pLocalPlayer->get_active_weapon() );
    if ( !weapon )
        return 0.f;

    const auto hitchance_cfg = get_config( weapon )->hitchance->get<float>();

    const auto backupvel = g_pLocalPlayer->get_velocity();
    const auto backupabsvel = g_pLocalPlayer->get_abs_velocity();
    g_pLocalPlayer->get_abs_velocity() = g_pLocalPlayer->get_velocity() = prediction::get().get_unpred_vel();
    weapon->update_accuracy();
    g_pLocalPlayer->get_velocity() = backupvel;
    g_pLocalPlayer->get_abs_velocity() = backupabsvel;

    Vector forward, right, up;
    const auto eyepos = prediction::get().get_unpred_eyepos();
    const auto spread = weapon->get_spread();
    const auto inaccuracy = weapon->get_inaccuracy();
    const auto angles = vangles.Clamp();
    math::get().angle_vectors( angles, &forward, &right, &up );
    math::get().fast_vec_normalize( forward );
    math::get().fast_vec_normalize( right );
    math::get().fast_vec_normalize( up );
    auto endpoint = point.center;

    const auto needed = static_cast< int >( 256 * ( hitchance_cfg / 100.f ) );
    const auto allowed_misses = 256 - needed;
    auto hits = 0;
    auto i = 0;

    while ( i < 256 )
    {
        random_seed( ( i & 255 ) + 1 );
        const auto b = random_float( 0.f, 2.0f * M_PI );
        const auto c = random_float( 0.0f, 1.0f );
        const auto d = random_float( 0.f, 2.0f * M_PI );

        const auto spread_val = c * spread;
        const auto inaccuracy_val = c * inaccuracy;

        const Vector v_spread( ( cos( b ) * spread_val ) + ( cos( d ) * inaccuracy_val ), ( sin( b ) * spread_val ) + ( sin( d ) * inaccuracy_val ), 0 );
        Vector dir;

        dir.x = forward.x + ( right.x * v_spread.x ) + ( up.x * v_spread.y );
        dir.y = forward.y + ( right.y * v_spread.x ) + ( up.y * v_spread.y );
        dir.z = forward.z + ( right.z * v_spread.x ) + ( up.z * v_spread.y );

        math::get().fast_vec_normalize( dir );

        QAngle spread_view;
        Vector end;
        math::get().vector_angles( dir, spread_view );
        spread_view.NormalizeNoClamp();
        math::get().angle_vectors( angles - ( spread_view - angles ), &end );
        math::get().fast_vec_normalize( end );

        trace_t tr;
        Ray_t ray;
        const auto trace_end = eyepos + ( end * endpoint.Dist( eyepos ) );
        ray.Init( eyepos, trace_end );
        //g_pDebugOverlay->AddLineOverlay( eyepos, trace_end, 180, 240, 0, true, 0.1f );
        g_pTrace->ClipRayToEntity( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, player, &tr );

        if ( tr.m_pEnt == player )
            hits++;

        const auto hitchance = ( static_cast< float >( hits ) / 255.f ) * 100.f;
        if ( hitchance >= hitchance_cfg )
            return hitchance;

        if ( i - hits > allowed_misses )
            return hitchance;

        i++;
    }

    return 0.0f;
}
 
Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2020
Сообщения
59
Реакции[?]
5
Поинты[?]
0
гетсприд & гет инакураси это самый простой способ расчета хитшанса.
Но можно и с пропусканием трейсов. Обрати внимание на тот же хитшанс фаталити. С математикой там все хорошо
C++:
float aimbot::calc_hc( QAngle vangles, const aimpoint_t& point, C_CSPlayer* player ) const
{
    auto weapon = get_weapon( g_pLocalPlayer->get_active_weapon() );
    if ( !weapon )
        return 0.f;

    const auto hitchance_cfg = get_config( weapon )->hitchance->get<float>();

    const auto backupvel = g_pLocalPlayer->get_velocity();
    const auto backupabsvel = g_pLocalPlayer->get_abs_velocity();
    g_pLocalPlayer->get_abs_velocity() = g_pLocalPlayer->get_velocity() = prediction::get().get_unpred_vel();
    weapon->update_accuracy();
    g_pLocalPlayer->get_velocity() = backupvel;
    g_pLocalPlayer->get_abs_velocity() = backupabsvel;

    Vector forward, right, up;
    const auto eyepos = prediction::get().get_unpred_eyepos();
    const auto spread = weapon->get_spread();
    const auto inaccuracy = weapon->get_inaccuracy();
    const auto angles = vangles.Clamp();
    math::get().angle_vectors( angles, &forward, &right, &up );
    math::get().fast_vec_normalize( forward );
    math::get().fast_vec_normalize( right );
    math::get().fast_vec_normalize( up );
    auto endpoint = point.center;

    const auto needed = static_cast< int >( 256 * ( hitchance_cfg / 100.f ) );
    const auto allowed_misses = 256 - needed;
    auto hits = 0;
    auto i = 0;

    while ( i < 256 )
    {
        random_seed( ( i & 255 ) + 1 );
        const auto b = random_float( 0.f, 2.0f * M_PI );
        const auto c = random_float( 0.0f, 1.0f );
        const auto d = random_float( 0.f, 2.0f * M_PI );

        const auto spread_val = c * spread;
        const auto inaccuracy_val = c * inaccuracy;

        const Vector v_spread( ( cos( b ) * spread_val ) + ( cos( d ) * inaccuracy_val ), ( sin( b ) * spread_val ) + ( sin( d ) * inaccuracy_val ), 0 );
        Vector dir;

        dir.x = forward.x + ( right.x * v_spread.x ) + ( up.x * v_spread.y );
        dir.y = forward.y + ( right.y * v_spread.x ) + ( up.y * v_spread.y );
        dir.z = forward.z + ( right.z * v_spread.x ) + ( up.z * v_spread.y );

        math::get().fast_vec_normalize( dir );

        QAngle spread_view;
        Vector end;
        math::get().vector_angles( dir, spread_view );
        spread_view.NormalizeNoClamp();
        math::get().angle_vectors( angles - ( spread_view - angles ), &end );
        math::get().fast_vec_normalize( end );

        trace_t tr;
        Ray_t ray;
        const auto trace_end = eyepos + ( end * endpoint.Dist( eyepos ) );
        ray.Init( eyepos, trace_end );
        //g_pDebugOverlay->AddLineOverlay( eyepos, trace_end, 180, 240, 0, true, 0.1f );
        g_pTrace->ClipRayToEntity( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, player, &tr );

        if ( tr.m_pEnt == player )
            hits++;

        const auto hitchance = ( static_cast< float >( hits ) / 255.f ) * 100.f;
        if ( hitchance >= hitchance_cfg )
            return hitchance;

        if ( i - hits > allowed_misses )
            return hitchance;

        i++;
    }

    return 0.0f;
}
благодарю
 
sapphire dev
Пользователь
Статус
Оффлайн
Регистрация
15 Мар 2018
Сообщения
188
Реакции[?]
124
Поинты[?]
36K
Если в общем, то выше сказали правильно, хоть и не объяснили где, что и почему, хотя пастерам это не нужно)
Данный хитшанс далеко не идеальный и не самый правильный.
Математику рассчета сприда оставь, а если все хреново, то советую юзать интерсекцию вместо трейсрея(сохранит фпс и даст возможность рассчета в теоретически возможные места, к примеру бектрек), вынеси последнии 2 ретарна с хитшансом за пределы цикла(он возвращает тру когда дойдет до нужного значения), ну и впринципе весь хс переделать, а так будет уже получше
 
Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2020
Сообщения
59
Реакции[?]
5
Поинты[?]
0
Если в общем, то выше сказали правильно, хоть и не объяснили где, что и почему, хотя пастерам это не нужно)
Данный хитшанс далеко не идеальный и не самый правильный.
Математику рассчета сприда оставь, а если все хреново, то советую юзать интерсекцию вместо трейсрея(сохранит фпс и даст возможность рассчета в теоретически возможные места, к примеру бектрек), вынеси последнии 2 ретарна с хитшансом за пределы цикла(он возвращает тру когда дойдет до нужного значения), ну и впринципе весь хс переделать, а так будет уже получше
можно плиз ссылку на файл с сурсов кски где можно почитать про это?
 
Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
можно плиз ссылку на файл с сурсов кски где можно почитать про это?
Вообще...
Лучше не пастить всякие хитшансы по типу Enrage(nemesis dump) и остальных лв паст.
Все что могу сказать что в кидахуке вроде нормальная реализация разброса, в фатале тоже нормально.

А вообще лучше изучить автоволл и уже по нему строит свой хитшанс ( как недавно trace может равняться 128 а не 255, вот только от чего оно зависит не особо понял ).

Если в общем, то выше сказали правильно, хоть и не объяснили где, что и почему, хотя пастерам это не нужно)
Данный хитшанс далеко не идеальный и не самый правильный.
Математику рассчета сприда оставь, а если все хреново, то советую юзать интерсекцию вместо трейсрея(сохранит фпс и даст возможность рассчета в теоретически возможные места, к примеру бектрек), вынеси последнии 2 ретарна с хитшансом за пределы цикла(он возвращает тру когда дойдет до нужного значения), ну и впринципе весь хс переделать, а так будет уже получше
По поводу интерсекции странная тема, у меня без нее фпс стал больше и начал стрелять по бектреку (сделал проверку по клипу)
 
Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции[?]
135
Поинты[?]
0
как сделать правильный хитшанс, который будет получать верный процент вероятности попадания?
как я понял, чит берет разброс возможный и считает сколько выстрелов попадет из 255, и этот процент и есть хитшанс? или это работает сложнее
Он работает правильно
 
sapphire dev
Пользователь
Статус
Оффлайн
Регистрация
15 Мар 2018
Сообщения
188
Реакции[?]
124
Поинты[?]
36K
Сверху Снизу