/del

Статус
В этой теме нельзя размещать новые ответы.
kitty.
Пользователь
Статус
Оффлайн
Регистрация
17 Окт 2021
Сообщения
282
Реакции[?]
111
Поинты[?]
17K
капец доброй ночи всем! я немного удивлен, но некоторые даже запись рекордов без траблов сделать не могут, паэтаму вашиму внеманию придставляю простейшую реализацию данного чуда ->
C++:
#pragma once

class c_lag_record {
public:
    c_cs_player* m_player;
    int m_index;

    bool is_dormant;
    bool is_immune;

    vec3_t m_origin;
    vec3_t m_abs_origin;

    vec3_t m_velocity;
    vec3_t m_anim_velocity;

    vec3_t m_obb_min;
    vec3_t m_obb_max;

    float m_sim_time;
    float m_duck_amount;
    float m_lby;

    qangle_t m_eye_angles;
    qangle_t m_abs_angles;
    qangle_t m_rotation;

    anim_layers_t m_layers;
    pose_params_t m_poses;

    matrix3x4_t m_bones[128];

    int m_anim_delay;

    bit_flag_t<uint32_t> m_flags;

    c_lag_record(c_cs_player* player, bool build = true) {
        if (!player || !player->is_alive())
            return;

        m_player = player;
        m_index = player->get_index();

        is_dormant = m_player->is_dormant();
        is_immune = m_player->is_immune();

        m_origin = m_player->get_origin();
        m_abs_origin = m_player->get_abs_origin();

        m_velocity = m_player->get_velocity();

        m_obb_min = m_player->get_collideable()->obb_mins();
        m_obb_max = m_player->get_collideable()->obb_maxs();

        m_sim_time = m_player->get_sim_time();
        m_duck_amount = m_player->get_duck_amount();
        m_lby = m_player->get_lby();

        m_eye_angles = m_player->get_eye_angles();
        m_abs_angles = m_player->get_abs_angles();
        m_rotation = m_player->get_rotation();

        m_flags = m_player->get_flags();

        m_anim_delay = TIME_TO_TICKS(m_player->get_sim_time() - m_player->get_old_sim_time());

        memcpy(m_layers.data(), m_player->get_anim_layers().data(), sizeof(anim_layer_t) * 15);
        memcpy(m_poses.data(), m_player->get_pose_params().data(), sizeof(float) * 24);

        if (build)
            memcpy(m_bones, m_player->get_bone_cache()->m_cached_bones, sizeof(matrix3x4_t) * m_player->get_bone_cache()->m_cached_bones_count);
    }

    bool is_valid() {
        if (!this)
            return false;

        auto nci = interfaces::m_engine->get_net_channel_info();

        if (!m_player)
            return false;

        if (is_dormant)
            return false;

        if (!nci)
            return false;

        auto correct = math::clamp(nci->get_latency(FLOW_INCOMING) + nci->get_latency(FLOW_OUTGOING) + get_lerp_time(), 0.f, 0.2f);

        auto delta_time = correct - (interfaces::m_global_vars->m_cur_time - m_sim_time);

        if (std::fabsf(delta_time) < 0.2f)
            return true;

        return false;
    }
};

class c_lag_comp : public c_singleton<c_lag_comp> {
public:
    void on_frame_stage(e_client_frame_stage stage);
    void update_animations(c_cs_player* player, c_lag_record* record);
};

extern std::array<std::deque<c_lag_record>, 65> m_records;

#define lag_comp c_lag_comp::instance()

C++:
#include "../features.h"

std::array<std::deque<c_lag_record>, 65> m_records;

void c_lag_comp::on_frame_stage(e_client_frame_stage stage) {
    if (stage != FRAME_NET_UPDATE_END)
        return;

    for (auto i = 0; i < interfaces::m_global_vars->m_max_clients; i++) {
        auto player = reinterpret_cast<c_cs_player*>(interfaces::m_entity_list->get_client_entity(i));

        if (!player || !player->is_alive() || !player->is_player() || player == globals::m_local || player->is_dormant())
            continue;

        auto update = m_records.at(i).empty() || (!m_records.at(i).empty() && player->get_sim_time() > m_records.at(i).front().m_sim_time);

        if (update) {
            m_records.at(i).emplace_front(c_lag_record(player, false));

            auto record = &m_records.at(i).front();

            update_animations(player, record);

            player->setup_bones(record->m_bones, 128, BONE_FLAG_USED_BY_ANYTHING, player->get_sim_time()); // change on your rebuild setup bones p.s you can move it to update_animations
        }

        if (m_records.at(i).size() > 32)
            m_records.at(i).pop_back(); // resize(32) .. but cringe(
    }
}

void c_lag_comp::update_animations(c_cs_player* player, c_lag_record* record) {
    // ... do your stuff
}

код написан на wok v2 sdk так что можете это спастить и вызвать для проверки работоспособности с помощью деббагера


написано за полчаса:fearful:
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Похожие темы
Сверху Снизу