Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Hitchance 2

  • Автор темы Автор темы bot9ra
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
Эксперт
Эксперт
Статус
Оффлайн
Регистрация
8 Авг 2018
Сообщения
2,231
Реакции
631
Код:
Expand Collapse Copy
bool HitChance(C_BasePlayer* pEnt, C_BaseCombatWeapon* pWeapon, QAngle Angle, int chance, CUserCmd* cmd)
{
    int traces_hit = 0;
    auto local = g_LocalPlayer;
    if (!local)
        return false;

    Vector forward, right, up;
    const Vector eye_position = local->GetEyePos();
    Math::AngleVectors(Angle, forward, right, up); // maybe add an option to not account for punch.
    int cNeededHits = static_cast<int>(256.f * (chance / 100.f));

    auto weapon = local->m_hActiveWeapon();
    if (!weapon)
        return false;

    if (g_Options.rage_hitchance <= 0)
        return true;

    c_prediction_system::Get().repredict(g_LocalPlayer, cmd);
    float weapon_spread = weapon->GetSpread();
    float weapon_cone = weapon->GetInaccuracy();

    const auto get_bullet_location = [&](int seed) {
        RandomSeed(seed + 1);
        float a = Math::RandomFloat(0.f, 1.f);
        float b = Math::RandomFloat(0.f, 2.f * M_PI);
        float c = Math::RandomFloat(0.f, 1.f);
        float d = Math::RandomFloat(0.f, 2.f * M_PI);
        if (pWeapon->m_Item().m_iItemDefinitionIndex() == WEAPON_REVOLVER)
        {
            a = 1.f - a * a;
            c = 1.f - c * c;
        }
        const float generated_spread = a * weapon_spread;
        const float generated_cone = c * weapon_cone;

        const Vector spread = Vector(
            std::cos(b) * generated_spread + std::cos(d) * generated_cone,
            std::sin(b) * generated_spread + std::sin(d) * generated_cone,
            0.f
        );

        return Vector(forward + right * -spread.x + up * -spread.y).Normalized();
    };

    const auto round_acc = [](const float accuracy) { return roundf(accuracy * 1000.f) / 1000.f; };

    const auto sniper = weapon->m_Item().m_iItemDefinitionIndex() == WEAPON_AWP || weapon->m_Item().m_iItemDefinitionIndex() == WEAPON_G3SG1
        || weapon->m_Item().m_iItemDefinitionIndex() == WEAPON_SCAR20 || weapon->m_Item().m_iItemDefinitionIndex() == WEAPON_SSG08;

    for (int i = 1; i <= 255; i++) {
        QAngle spread_angle;
        Vector bullet_end;
       
        Math::VectorAngles(get_bullet_location(i), spread_angle);
        Math::AngleVectors(Angle - (spread_angle - Angle), bullet_end);

        trace_t trace;
        Ray_t ray;
        ray.Init(eye_position, eye_position + bullet_end * weapon->GetCSWeaponData()->flRange);

        g_EngineTrace->ClipRayToEntity(ray, MASK_SHOT, pEnt, &trace);

        if (trace.hit_entity == pEnt)
            ++traces_hit;

        if (traces_hit >= static_cast<int>(chance * 2.55f))
            return true;
    }
    return false;  
}
А так же код рифка есть, но это не важно пока, он кстати так же работает как ниже
Проблема в том, что при хитшансе 100 я стреляю почти ноускопами со скара или скаута и бывает обоймами миссаю, код правильный, так что ничего не могу сделать. В чём проблема?
 
Пожалуйста, авторизуйтесь для просмотра ссылки.
как пофиксить:
1. 150 заменить на 255 ( всего 255 вариантов разброса )
2. RandomFloat использовать из vstdlib ( используется игрой )
3. RandomSeed( i + 1 ) в цикле (
4. перенести UpdateAccuracyPenalty в Engine Prediction
если не пофиксишь - хитшанс будет просто очень не точным

можно еще вот тут глянуть -
Пожалуйста, авторизуйтесь для просмотра ссылки.

только не стоит компенсировать punch_angle в углах, это просто не надо делать
255 есть
Рандомфлоат из встдлиб
Рандомсид есть
UpdateAccuracyPenalty в преде
 
int cNeededHits = static_cast<int>(256.f * (chance / 100.f));
if (traces_hit >= static_cast<int>(chance * 2.55f))

:seemsgood:

g_EngineTrace->ClipRayToEntity(ray, MASK_SHOT, pEnt, &trace);
вальве интерсекция для проверки хита использует матрицу костей из кэша
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
тебе надо форсить валидность этого кэша
( так то это надо делать всегда если ты делаешь бэктрек )

for (int i = 1; i <= 255; i++)
i = 0

Math::VectorAngles(get_bullet_location(i), spread_angle); Math::AngleVectors(Angle - (spread_angle - Angle), bullet_end);
найс, имея уже готовое направление с разбросом переводишь его в углы ( бтв, тут как раз и есть ошибка )

хуета, фикси все что сверху пометил
алсо, round_acc работает идеально, зря вырезал

P.S. совет еще лучше - кодить научись ок да
 
:seemsgood:


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


i = 0


найс, имея уже готовое направление с разбросом переводишь его в углы ( бтв, тут как раз и есть ошибка )

хуета, фикси все что сверху пометил
алсо, round_acc работает идеально, зря вырезал

P.S. совет еще лучше - кодить научись ок да
Я просто из 2 сурсов пастил:seemsgood:
Взял с гладиатора, поифксил по твоим советам, стало ещё хуже, так что вот
То есть, стреляю так же ноускопами, но когда я далеко стою, то вообще не стреляет
C++:
Expand Collapse Copy
bool HitChance(C_BasePlayer* pEnt, C_BaseCombatWeapon* pWeapon, QAngle Angle, int chance, CUserCmd* cmd)
{
    int traces_hit = 0;
    auto local = g_LocalPlayer;
    if (!local)
        return false;

    Vector forward, right, up;
    const Vector eye_position = local->GetEyePos();
    Math::AngleVectors(Angle, forward, right, up); // maybe add an option to not account for punch.
    int cNeededHits = static_cast<int>(256.f * (chance / 100.f));

    auto weapon = local->m_hActiveWeapon();
    if (!weapon)
        return false;

    if (g_Options.rage_hitchance <= 0)
        return true;

    c_prediction_system::Get().repredict(g_LocalPlayer, cmd);
    float weap_spread = weapon->GetSpread();
    float weap_inaccuracy = weapon->GetInaccuracy();

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

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

        if (weapon->m_Item().m_iItemDefinitionIndex() == WEAPON_REVOLVER)
        {
            a = 1.f - a * a;
            c = 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();

        QAngle viewAnglesSpread;
        Math::VectorAngles(direction, up, viewAnglesSpread);
        Math::Normalize3(viewAnglesSpread);

        Vector viewForward;
        Math::AngleVectors(viewAnglesSpread, viewForward);
        viewForward.NormalizeInPlace();

        viewForward = eye_position + (viewForward * weapon->GetCSWeaponData()->flRange);

        trace_t tr;
        Ray_t ray;

        ray.Init(eye_position, viewForward);
        g_EngineTrace->ClipRayToEntity(ray, MASK_SHOT, pEnt, &tr);

        if (tr.hit_entity == pEnt)
            ++traces_hit;

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

        if ((256 - i + traces_hit) < cNeededHits)
            return false;
    }
    return false;
}
Да и не в матрице дело, такой же хитшанс в гладиаторе нормально работает
 
Последнее редактирование:
Да и не в матрице дело, такой же хитшанс в гладиаторе нормально работает
нахуя ты направление со спредом переводишь в углы?
как всегда хуйню сделал, переделывай
правильно:
Код:
Expand Collapse Copy
viewForward = eye_position + (direction * weapon->GetCSWeaponData()->flRange);

c_prediction_system::Get().repredict(g_LocalPlayer, cmd);
зачем
 
нахуя ты направление со спредом переводишь в углы?
как всегда хуйню сделал, переделывай
правильно:
Код:
Expand Collapse Copy
viewForward = eye_position + (direction * weapon->GetCSWeaponData()->flRange);


зачем
В репредикте UpdateAccuracyPenalty, я если поменяю, не изменится ничего
Да и всм я сделал, это кодер гладиатора:FailFish:
Upd: После твоего фикса НИЧЕГО НЕ ИЗМЕНИЛОСЬ, ПРЯМ НИЧЕГО
А не, теперь когда далеко, я стреляю, вообщем, мы вернулись к хитшансу который работает так как выше
 
Крч, дело в чудесном предикшене рифка(нет), можете закрывать тему
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу