Вопрос Grenade Prediction with dmg calculation

Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
в шапке. Пытался сделать сам но работало через одно место.
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,970
Реакции[?]
958
Поинты[?]
19K
ну я про локальные нейды чтобы пихнуть это в в варнинг.
Код:
inline float CSGO_Armores(float flDamage, int ArmorValue) {
    float flArmorRatio = 0.5f;
    float flArmorBonus = 0.5f;
    if (ArmorValue > 0) {
        float flNew = flDamage * flArmorRatio;
        float flArmor = (flDamage - flNew) * flArmorBonus;

        if (flArmor > static_cast<float>(ArmorValue)) {
            flArmor = static_cast<float>(ArmorValue) * (1.f / flArmorBonus);
            flNew = flDamage - flArmor;
        }

        flDamage = flNew;
    }
    return flDamage;
}



position = nade_drop_position;
CTraceFilter filter;
        int end_damage = 0; int fire_dist = 0;
        std::pair <float, player_t*> target{ 0.f, nullptr };
        for (int i{ 0 }; i < m_globals()->m_maxclients; ++i) {
            player_t* player = (player_t*)m_entitylist()->GetClientEntity(i);
            if (!player) //-V704
                continue;

            if (!player->is_player())
                continue;

            if (!player->is_alive())
                continue;

            if (player->IsDormant() )
                continue;

            // get center of mass for player.
            auto origin = player->m_vecOrigin();
            auto collideable = player->GetCollideable();

            auto min = collideable->OBBMins() + origin;
            auto max = collideable->OBBMaxs() + origin;

            auto center = min + (max - min) * 0.5f;

            // get delta between center of mass and final nade pos.
            auto delta = center - position;

            if (he_nade) {

                // is within damage radius?
                if (delta.Length() > 350.f)
                    continue;

                Ray_t ray;
                Vector NadeScreen;
                math::world_to_screen(position, NadeScreen);

                // main hitbox, that takes damage
                Vector vPelvis = player->hitbox_position(HITBOX_PELVIS);
                ray.Init(position, vPelvis);
                trace_t ptr;
                m_trace()->TraceRay(ray, MASK_SHOT, &filter, &ptr);
                //trace to it

                if (ptr.hit_entity == player) {
                    Vector PelvisScreen;

                    math::world_to_screen(vPelvis, PelvisScreen);

                    // some magic values by VaLvO
                    static float a = 105.0f;
                    static float b = 25.0f;
                    static float c = 140.0f;

                    float d = ((delta.Length() - b) / c);
                    float flDamage = a * exp(-d * d);

                    auto dmg = max(static_cast<int>(ceilf(CSGO_Armores(flDamage, player->m_ArmorValue()))), 0);

                    dmg = min(dmg, (player->m_ArmorValue() > 0) ? 57 : 100);
                    if (dmg > target.first) {
                        target.first = dmg;
                        target.second = player;
                    }
                    end_damage = dmg;
                }
            }
        }
        
        target.first = твой дамаг
target.second = тот кому ты дамаг нанесёшь
 
Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
Код:
inline float CSGO_Armores(float flDamage, int ArmorValue) {
    float flArmorRatio = 0.5f;
    float flArmorBonus = 0.5f;
    if (ArmorValue > 0) {
        float flNew = flDamage * flArmorRatio;
        float flArmor = (flDamage - flNew) * flArmorBonus;

        if (flArmor > static_cast<float>(ArmorValue)) {
            flArmor = static_cast<float>(ArmorValue) * (1.f / flArmorBonus);
            flNew = flDamage - flArmor;
        }

        flDamage = flNew;
    }
    return flDamage;
}



position = nade_drop_position;
CTraceFilter filter;
        int end_damage = 0; int fire_dist = 0;
        std::pair <float, player_t*> target{ 0.f, nullptr };
        for (int i{ 0 }; i < m_globals()->m_maxclients; ++i) {
            player_t* player = (player_t*)m_entitylist()->GetClientEntity(i);
            if (!player) //-V704
                continue;

            if (!player->is_player())
                continue;

            if (!player->is_alive())
                continue;

            if (player->IsDormant() )
                continue;

            // get center of mass for player.
            auto origin = player->m_vecOrigin();
            auto collideable = player->GetCollideable();

            auto min = collideable->OBBMins() + origin;
            auto max = collideable->OBBMaxs() + origin;

            auto center = min + (max - min) * 0.5f;

            // get delta between center of mass and final nade pos.
            auto delta = center - position;

            if (he_nade) {

                // is within damage radius?
                if (delta.Length() > 350.f)
                    continue;

                Ray_t ray;
                Vector NadeScreen;
                math::world_to_screen(position, NadeScreen);

                // main hitbox, that takes damage
                Vector vPelvis = player->hitbox_position(HITBOX_PELVIS);
                ray.Init(position, vPelvis);
                trace_t ptr;
                m_trace()->TraceRay(ray, MASK_SHOT, &filter, &ptr);
                //trace to it

                if (ptr.hit_entity == player) {
                    Vector PelvisScreen;

                    math::world_to_screen(vPelvis, PelvisScreen);

                    // some magic values by VaLvO
                    static float a = 105.0f;
                    static float b = 25.0f;
                    static float c = 140.0f;

                    float d = ((delta.Length() - b) / c);
                    float flDamage = a * exp(-d * d);

                    auto dmg = max(static_cast<int>(ceilf(CSGO_Armores(flDamage, player->m_ArmorValue()))), 0);

                    dmg = min(dmg, (player->m_ArmorValue() > 0) ? 57 : 100);
                    if (dmg > target.first) {
                        target.first = dmg;
                        target.second = player;
                    }
                    end_damage = dmg;
                }
            }
        }
        
        target.first = твой дамаг
target.second = тот кому ты дамаг нанесёшь
я как раз таким способом и делал, как итог краш.

UPD: а нет, я проверял с помощью самого противника и гранаты. Попробую, спасибо
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,970
Реакции[?]
958
Поинты[?]
19K
я как раз таким способом и делал, как итог краш.

UPD: а нет, я проверял с помощью самого противника и гранаты. Попробую, спасибо
кста, для локал предикта, ты можешь для всех ближайших челов дамаг просчитывать, для этого можешь через std::map сделать target
like this:
std::map <float, player_t*> target{ 0.f, nullptr };
 
Сверху Снизу