Вопрос Hitchance

Пользователь
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
272
Реакции[?]
42
Поинты[?]
2K
вообщем пишу (пасчу) хитшанс и хотел задать пару вопросов знающим людям что будет лучше?
1 can_hit
C++:
bool can_hit_hitbox(const Vector start, const Vector end, studiohdr_t* hdr, int box, player_t* player, adjust_data* record)
{
    studiohdr_t* pStudioModel = m_modelinfo()->GetStudioModel(player->GetModel());
    mstudiohitboxset_t* set = pStudioModel->pHitboxSet(0);

    if (!set)
        return false;

    mstudiobbox_t* studio_box = set->pHitbox(box);
    if (!studio_box)
        return false;

    if (!record)
        return false;

    Vector min, max;

    const auto is_capsule = studio_box->radius != -1.f;

    if (is_capsule)
    {
        math::vector_transform(studio_box->bbmin, record->matrixes_data.main[studio_box->bone], min);
        math::vector_transform(studio_box->bbmax, record->matrixes_data.main[studio_box->bone], max);
        const auto dist = math::segment_to_segment(start, end, min, max);

        if (dist < studio_box->radius)
            return true;
    }
    else
    {
        adjust_data backup_data{};

        record->adjust_player();

        Ray_t ray;
        ray.Init(start, end);

        trace_t tr;
        m_trace()->ClipRayToEntity(ray, MASK_SHOT | CONTENTS_GRATE, player, &tr);

        if (auto ent = tr.hit_entity; ent)
        {
            if (ent == player)
                return true;
        }

        backup_data.adjust_player();
        return false;
    }

    return false;
}
2 can_hit
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)
{
    auto model = e->GetModel();

    if (!model)
        return false;

    auto studio_model = m_modelinfo()->GetStudioModel(model);

    if (!studio_model)
        return false;

    auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());

    if (!studio_set)
        return false;

    auto studio_hitbox = studio_set->pHitbox(hitbox);

    if (!studio_hitbox)
        return false;

    CGameTrace trace;
    Ray_t ray;

    ray.Init(start, end);

    return clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;;
}
3 can_hit
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)

{

    auto model = e->GetModel();



    if (!model)

        return false;



    auto studio_model = m_modelinfo()->GetStudioModel(model);



    if (!studio_model)

        return false;



    auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());



    if (!studio_set)

        return false;



    auto studio_hitbox = studio_set->pHitbox(hitbox);



    if (!studio_hitbox)

        return false;



    Vector min, max;



    const auto is_capsule = studio_hitbox->radius != -1.f;



    if (is_capsule)

    {

        math::vector_transform(studio_hitbox->bbmin, matrix[studio_hitbox->bone], min);

        math::vector_transform(studio_hitbox->bbmax, matrix[studio_hitbox->bone], max);

        const auto dist = math::segment_to_segment(start, end, min, max);



        if (dist < studio_hitbox->radius)

            return true;

    }

    else

    {

        math::vector_transform(math::vector_rotate(studio_hitbox->bbmin, studio_hitbox->rotation), matrix[studio_hitbox->bone], min);

        math::vector_transform(math::vector_rotate(studio_hitbox->bbmax, studio_hitbox->rotation), matrix[studio_hitbox->bone], max);



        math::vector_i_transform(start, matrix[studio_hitbox->bone], min);

        math::vector_i_rotate(end, matrix[studio_hitbox->bone], max);



        if (math::intersect_line_with_bb(min, max, studio_hitbox->bbmin, studio_hitbox->bbmax))

            return true;

    }

    return false;

}
1 способ у меня не внушает доверия, 2 мне нравится, 3 50/50, но что из этого лучше, и какая есть лучшая калькуляция хитшанса
 
Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
3 вариант вообще ноги не находит, так что легче и проще всего юзать 2.
По поводу хитшанса сказать ничего не могу но самый простой из всех это взять с гладиатора вроде? Вроде так называется.
И вместо 150 трейсов сделать 256 также вырезать математику в самом конце которая переводит углы в вектор.
C++:
bool AimRage::HitChance(QAngle angles, C_BasePlayer *ent, float chance)
{
    auto weapon = g_LocalPlayer->m_hActiveWeapon().Get();

    if (!weapon)
        return false;

    Vector forward, right, up;
    Vector src = g_LocalPlayer->GetEyePos();
    Math::AngleVectors(angles, forward, right, up);
// вроде везде нужно 256 трецсов, точно не помню.
    int cHits = 0;
    int cNeededHits = static_cast<int>(256.f * (chance / 100.f));

  //  weapon->UpdateAccuracyPenalty(); это нужно перенести в предикшн.
    float weap_spread = weapon->GetSpread();
    float weap_inaccuracy = weapon->GetInaccuracy();

    for (int i = 0; i < 256; i++)
    {
        float a = Utils::RandomFloat(0.f, 1.f);
        float b = Utils::RandomFloat(0.f, 2.f * PI_F);
        float c = Utils::RandomFloat(0.f, 1.f);
        float d = Utils::RandomFloat(0.f, 2.f * PI_F);

        float inaccuracy = a * weap_inaccuracy;
        float spread = c * weap_spread;

        if (weapon->m_iItemDefinitionIndex() == 64)
        {
            a = 1.f - a * a;
            a = 1.f - c * c;
        }

        Vector spreadView((cos(b) * inaccuracy) + (cos(d) * spread), (sin(b) * inaccuracy) + (sin(d) * spread), 0), direction;

        direction.x = forward.x + (spreadView.x * right.x) + (spreadView.y * up.x);
        direction.y = forward.y + (spreadView.x * right.y) + (spreadView.y * up.y);
        direction.z = forward.z + (spreadView.x * right.z) + (spreadView.y * up.z);
        direction.Normalized():

        viewForward = src + (direction * weapon->GetWeapInfo()->m_fRange());

        trace_t tr;
        Ray_t ray;

        ray.Init(src, viewForward);
        g_EngineTrace->ClipRayToEntity(ray, MASK_SHOT | CONTENTS_GRATE, ent, &tr);

        if (tr.hit_entity == ent)
            ++cHits;

        if (static_cast<int>((static_cast<float>(cHits) / 256.f) * 100.f) >= chance)
            return true;

        if ((256 - i + cHits) < cNeededHits)
            return false;
    }
    return false;
}
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,967
Реакции[?]
958
Поинты[?]
19K
и сидов для трейсов 128
что? а каких хуев? число 256 использует игра для рандомайза разброса
вообщем пишу (пасчу) хитшанс и хотел задать пару вопросов знающим людям что будет лучше?
1 can_hit
C++:
bool can_hit_hitbox(const Vector start, const Vector end, studiohdr_t* hdr, int box, player_t* player, adjust_data* record)
{
    studiohdr_t* pStudioModel = m_modelinfo()->GetStudioModel(player->GetModel());
    mstudiohitboxset_t* set = pStudioModel->pHitboxSet(0);

    if (!set)
        return false;

    mstudiobbox_t* studio_box = set->pHitbox(box);
    if (!studio_box)
        return false;

    if (!record)
        return false;

    Vector min, max;

    const auto is_capsule = studio_box->radius != -1.f;

    if (is_capsule)
    {
        math::vector_transform(studio_box->bbmin, record->matrixes_data.main[studio_box->bone], min);
        math::vector_transform(studio_box->bbmax, record->matrixes_data.main[studio_box->bone], max);
        const auto dist = math::segment_to_segment(start, end, min, max);

        if (dist < studio_box->radius)
            return true;
    }
    else
    {
        adjust_data backup_data{};

        record->adjust_player();

        Ray_t ray;
        ray.Init(start, end);

        trace_t tr;
        m_trace()->ClipRayToEntity(ray, MASK_SHOT | CONTENTS_GRATE, player, &tr);

        if (auto ent = tr.hit_entity; ent)
        {
            if (ent == player)
                return true;
        }

        backup_data.adjust_player();
        return false;
    }

    return false;
}
2 can_hit
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)
{
    auto model = e->GetModel();

    if (!model)
        return false;

    auto studio_model = m_modelinfo()->GetStudioModel(model);

    if (!studio_model)
        return false;

    auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());

    if (!studio_set)
        return false;

    auto studio_hitbox = studio_set->pHitbox(hitbox);

    if (!studio_hitbox)
        return false;

    CGameTrace trace;
    Ray_t ray;

    ray.Init(start, end);

    return clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;;
}
3 can_hit
C++:
bool aim::hitbox_intersection(player_t* e, matrix3x4_t* matrix, int hitbox, const Vector& start, const Vector& end)

{

    auto model = e->GetModel();



    if (!model)

        return false;



    auto studio_model = m_modelinfo()->GetStudioModel(model);



    if (!studio_model)

        return false;



    auto studio_set = studio_model->pHitboxSet(e->m_nHitboxSet());



    if (!studio_set)

        return false;



    auto studio_hitbox = studio_set->pHitbox(hitbox);



    if (!studio_hitbox)

        return false;



    Vector min, max;



    const auto is_capsule = studio_hitbox->radius != -1.f;



    if (is_capsule)

    {

        math::vector_transform(studio_hitbox->bbmin, matrix[studio_hitbox->bone], min);

        math::vector_transform(studio_hitbox->bbmax, matrix[studio_hitbox->bone], max);

        const auto dist = math::segment_to_segment(start, end, min, max);



        if (dist < studio_hitbox->radius)

            return true;

    }

    else

    {

        math::vector_transform(math::vector_rotate(studio_hitbox->bbmin, studio_hitbox->rotation), matrix[studio_hitbox->bone], min);

        math::vector_transform(math::vector_rotate(studio_hitbox->bbmax, studio_hitbox->rotation), matrix[studio_hitbox->bone], max);



        math::vector_i_transform(start, matrix[studio_hitbox->bone], min);

        math::vector_i_rotate(end, matrix[studio_hitbox->bone], max);



        if (math::intersect_line_with_bb(min, max, studio_hitbox->bbmin, studio_hitbox->bbmax))

            return true;

    }

    return false;

}
1 способ у меня не внушает доверия, 2 мне нравится, 3 50/50, но что из этого лучше, и какая есть лучшая калькуляция хитшанса
Пожалуйста, авторизуйтесь для просмотра ссылки.
можешь ребилднуть, а можешь вызывать напрямую
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
капец парень а может ты скинешь код из актуальной версии игры? а не из исходника 17 года

да и для интерсекции максимальное количество сидов это 255
для трейсов это 128
Я вижу ты слишком гений👽.
Тогда боюсь спросить смысл тебе 255" " сидов когда ты 128 лучшей отправляешь.
Ты еще скажи что максимальное кол-во костей в игре 128.
 
Пользователь
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
272
Реакции[?]
42
Поинты[?]
2K
Пожалуйста, авторизуйтесь для просмотра ссылки.
убери local->punch_angle( ) * 2.f и всё этого тебе хватит
спастить хитшанс по недогайду соуфива я сам смогу, но мне надо нечто большее с can_hit я определился (спасибо всем кто подсказывал), мне нужна подсказка насчет калькуляции как калькулировать хитшанс с
clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;
спасибо всем кто наведет на правильную мысль
 
kitty.
Пользователь
Статус
Оффлайн
Регистрация
17 Окт 2021
Сообщения
283
Реакции[?]
111
Поинты[?]
17K
спастить хитшанс по недогайду соуфива я сам смогу, но мне надо нечто большее с can_hit я определился (спасибо всем кто подсказывал), мне нужна подсказка насчет калькуляции как калькулировать хитшанс с
clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;
спасибо всем кто наведет на правильную мысль
Я тебя только тупым назвать могу, ПОЛУЧАЕШЬ МЕСТО КУДА ПОЛЕТИТ ПУЛЯ
Пожалуйста, авторизуйтесь для просмотра ссылки.

ИТЕРИРУЕШЬ ВСЕ ВАРИАЦИИ СПРИДА, ДЕЛАЕШЬ ЛУЧ ОТ ТВОЕГО EYE_POS ДО МЕСТА КУДА ПОЛЕТИТ ПУЛЯ ИСПОЛЬЗУЕШЬ CLIP_RAY_TO_ENTITY ИЛИ CLIP_RAY_TO_HITBOX ИЛИ ХИТБОКС ИНТЕРСЕКЦИЮ И ВСЁ БЛЯТЬ ТАКИМ ОБРАЗОМ ПРОВЕРЯЕШЬ ПЕРЕСЕКАЕТ ЛИ ЛУЧ ВРАГА В МЕСТЕ КУДА ТЫ СТРЕЛЯЕШЬ ИЛИ НЕТ

ТВОИ ЕБУЧИЕ CAN_HIT ЭТО И ЕСТЬ CLIP_RAY_TO_ENTITY | CLIP_RAY_TO_HITBOX | HITBOX_INTERSECTION
m_trace()->ClipRayToEntity(ray, MASK_SHOT | CONTENTS_GRATE, player, &tr); if (auto ent = tr.hit_entity; ent) { if (ent == player) return true; }
бля что же это, наверное clip_ray_to_entity, который и так используется в хитшансах для получения информации о том пересекает ли луч врага в место куда ты стреляешь или нет

clip_ray_to_hitbox(ray, studio_hitbox, matrix[studio_hitbox->bone], trace) >= 0;;
бля clip_ray_to_hitbox наверное это что-то сильно отличающееся от clip_ray_to_entity, ты ведь луч этот также не проверяешь на то пересекает ли он хитбокс врага или нет
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
21 Авг 2022
Сообщения
8
Реакции[?]
6
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
21 Авг 2022
Сообщения
8
Реакции[?]
6
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
почему вронг то затупень на символе если это и есть ты
в своей пасточке на супримаси юзаешь такой же метод емае
у меня все сделано как в рифке
и в мясе, и в фт 2018
как ты понимаешь оба стреляют по ногам
если у тебя кривая матчасть, это не значит что интерсекция на конечности юзлесс
алсо можешь дальше сидеть на трейсах и наслаждаться крутым фпсом
 
Сверху Снизу