Вопрос Crash get spawn time

coder of the year
Участник
Статус
Оффлайн
Регистрация
13 Мар 2019
Сообщения
886
Реакции[?]
266
Поинты[?]
4K
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2019
Сообщения
105
Реакции[?]
8
Поинты[?]
3K
kitty.
Пользователь
Статус
Оффлайн
Регистрация
17 Окт 2021
Сообщения
282
Реакции[?]
111
Поинты[?]
17K
ТЫ ОПЯТЬ обосрался едрид мадрид, то что ты добавил apply_record не значит что в твою сущность что-то запишется, ведь опять же нету аргумента, который и будет передавать энтити которого ты нашёл с помощью get_clienty_entity в твой рекорд, а ещё я не удивлюсь если ты юзаешь player из структуры для рекордов, ведь по факту у тебя всегда player будет равен nullptr

у тебя что-то типа такого видимо:


C++:
class m_record {

public:



c_cs_player* player;



void on_frame_stage();

}
или же ты в другом классе создал пустого player

самый страшный вариант это то что ты добавил apply_record потому что спастил всё из лв, в котором player находится также с помощью get_client_entity(index) в valid() функции, а index'у то и взяться неоткуда:frowning::grin:

я тебе щас напишу простейшую систему записи рекордов, ток визуалку скачаю:confounded:
 
Последнее редактирование:
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) {
        if (!player || !player->is_alive())
            return;

        m_player = player;

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

        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();

        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);

        memcpy(m_bones, m_player->get_bone_cache()->m_cached_bones, sizeof(matrix3x4_t) * m_player->get_bone_cache()->m_cached_bones_count); // снеси эту хуйню либо добавь в проверку и сторь уже адекватно ребилднутый кости в ребилднутом setup_bones((((
    }
};

class c_record_system : public c_singleton<c_record_system> {
public:
    void on_frame_stage(e_client_frame_stage stage);

    void update_animations(c_lag_record* record);
};

extern std::array<std::deque<c_lag_record>, 64u> m_records;

#define record_system c_record_system::instance()

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

std::array<std::deque<c_lag_record>, 64u> m_records;

void c_record_system::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));

            // всё ура теперь всё правильно засторилось, используй плеера либо из рекорда( m_records.at(i).front().m_player) либо player из цикла

            update_animations(&m_records.at(i).front());

            m_records.at(i).front().m_player->setup_bones(nullptr, 128, BONE_FLAG_USED_BY_ANYTHING, m_records.at(i).front().m_player->get_sim_time());
        }

        while (m_records.at(i).size() > 32)
            m_records.at(i).pop_back();
    }
}

void c_record_system::update_animations(c_lag_record* record) {

}

под wokv2 sdk, работоспособность проверена
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
13 Дек 2018
Сообщения
251
Реакции[?]
63
Поинты[?]
3K
вот простейшая система записи рекордов, добавил пару комментов, спасти себе и добавляй уже свою хрень поверх
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) {
        if (!player || !player->is_alive())
            return;

        m_player = player;

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

        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();

        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);

        memcpy(m_bones, m_player->get_bone_cache()->m_cached_bones, sizeof(matrix3x4_t) * m_player->get_bone_cache()->m_cached_bones_count); // снеси эту хуйню либо добавь в проверку и сторь уже адекватно ребилднутый кости в ребилднутом setup_bones((((
    }
};

class c_record_system : public c_singleton<c_record_system> {
public:
    void on_frame_stage(e_client_frame_stage stage);

    void update_animations(c_lag_record* record);
};

extern std::array<std::deque<c_lag_record>, 64u> m_records;

#define record_system c_record_system::instance()

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

std::array<std::deque<c_lag_record>, 64u> m_records;

void c_record_system::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));

            // всё ура теперь всё правильно засторилось, используй плеера либо из рекорда( m_records.at(i).front().m_player) либо player из цикла

            update_animations(&m_records.at(i).front());

            m_records.at(i).front().m_player->setup_bones(nullptr, 128, BONE_FLAG_USED_BY_ANYTHING, m_records.at(i).front().m_player->get_sim_time());
        }

        while (m_records.at(i).size() > 32)
            m_records.at(i).pop_back();
    }
}

void c_record_system::update_animations(c_lag_record* record) {

}

под wokv2 sdk, работоспособность проверена
у меня тоже самое что ты кинул, я просто слеп и не прочитал, что player null, наверное надо быть вниматнльнее)
 
kitty.
Пользователь
Статус
Оффлайн
Регистрация
17 Окт 2021
Сообщения
282
Реакции[?]
111
Поинты[?]
17K
у меня тоже самое что ты кинул
Я чёт не вижу на скрине похожего
у меня тоже самое что ты кинул, я просто слеп и не прочитал, что player null, наверное надо быть вниматнльнее)
кстати челик чё ты кринжуешь, ведь в c_anim_state уже есть reset (reset_anim_state) :coldsweat::confounded:

p.s мне страшно представлять что там на публику выйдет :coldsweat:
 
Последнее редактирование:
Сверху Снизу