Вопрос Что делает данная функция и как её юзать?

Пользователь
Статус
Оффлайн
Регистрация
20 Мар 2020
Сообщения
166
Реакции[?]
41
Поинты[?]
0
Вопрос в шапке.
Вызывается функция в этом куске.
C++:
const auto simtime_delta = e->m_flSimulationTime() - e->m_flOldSimulationTime();
    const auto choked_ticks = ((simtime_delta / m_globals()->m_intervalpertick) + 0.5);
    const auto simulation_tick_delta = choked_ticks - 2;
    const auto delta_ticks = (std::clamp(TIME_TO_TICKS(m_engine()->GetNetChannelInfo()->GetLatency(1) + m_engine()->GetNetChannelInfo()->GetLatency(0)) + m_globals()->m_tickcount - TIME_TO_TICKS(e->m_flSimulationTime() + util::get_interpolation()), 0, 100)) - simulation_tick_delta;

    if (delta_ticks > 0 && records->size() >= 2)
    {
        auto ticks_left = static_cast<int>(simulation_tick_delta);

        ticks_left = std::clamp(ticks_left, 1, 10);

        do
        {
            auto data_origin = record->origin;
            auto data_velocity = record->velocity;
            auto data_flags = record->flags;

            extrapolate(e, data_origin, data_velocity, data_flags, !(e->m_fFlags() & FL_ONGROUND));

            record->simulation_time += m_globals()->m_intervalpertick;
            record->origin = data_origin;
            record->velocity = data_velocity;
            --ticks_left;
        } while (ticks_left > 0);
    }
А вот и сама функция

C++:
void extrapolate(player_t* player, Vector& origin, Vector& velocity, int& flags, bool wasonground)
{
    static auto sv_gravity = m_cvar()->FindVar(crypt_str("sv_gravity"));
    static auto sv_jump_impulse = m_cvar()->FindVar(crypt_str("sv_jump_impulse"));

    if (!(flags & FL_ONGROUND))
        velocity.z -= (m_globals()->m_frametime * sv_gravity->GetFloat());
    else if (wasonground)
        velocity.z = sv_jump_impulse->GetFloat();

    const Vector mins = player->GetCollideable()->OBBMins();
    const Vector max = player->GetCollideable()->OBBMaxs();

    const Vector src = origin;
    Vector end = src + (velocity * m_globals()->m_frametime);

    Ray_t ray;
    ray.Init(src, end, mins, max);

    trace_t trace;
    CTraceFilter filter;
    filter.pSkip = (void*)(player);

    m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);

    if (trace.fraction != 1.f)
    {
        for (int i = 0; i < 2; i++)
        {
            velocity -= trace.plane.normal * velocity.Dot(trace.plane.normal);

            const float dot = velocity.Dot(trace.plane.normal);
            if (dot < 0.f)
            {
                velocity.x -= dot * trace.plane.normal.x;
                velocity.y -= dot * trace.plane.normal.y;
                velocity.z -= dot * trace.plane.normal.z;
            }

            end = trace.endpos + (velocity * (m_globals()->m_intervalpertick * (1.f - trace.fraction)));

            ray.Init(trace.endpos, end, mins, max);
            m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);

            if (trace.fraction == 1.f)
                break;
        }
    }

    origin = trace.endpos;
    end = trace.endpos;
    end.z -= 2.f;

    ray.Init(origin, end, mins, max);
    m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);

    flags &= ~(1 << 0);

    if (trace.DidHit() && trace.plane.normal.z > 0.7f)
        flags |= (1 << 0);
}
 
Начинающий
Статус
Оффлайн
Регистрация
18 Янв 2022
Сообщения
1
Реакции[?]
0
Поинты[?]
0
Extrapolates player for each ( choked tick - 2 ) in animation fix. Most of it is wrong tho.
 
Сверху Снизу