Вопрос Правильный анимфикс

Статус
В этой теме нельзя размещать новые ответы.
Пользователь
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
272
Реакции[?]
42
Поинты[?]
2K
было куча тем и прочей залупы но чтоб полностью разобраться я хочу сделать его тут на примере лв
C++:
void lagcompensation::update_player_animations(player_t* e)
{
    auto animstate = e->get_animation_state();

    if (!animstate)
        return;

    player_info_t player_info;

    if (!m_engine()->GetPlayerInfo(e->EntIndex(), &player_info))
        return;

    auto records = &player_records[e->EntIndex()]; //-V826

    if (records->empty())
        return;

    adjust_data* previous_record = nullptr;

    if (records->size() >= 2)
        previous_record = &records->at(1);

    auto record = &records->front();

    AnimationLayer animlayers[13];

    memcpy(animlayers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
    std::memcpy(record->layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    //std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));

    //UpdateResolverLayer(e, 1, matrix3x4_t * m_pMatrix);

    auto backup_lower_body_yaw_target = e->m_flLowerBodyYawTarget();
    auto backup_duck_amount = e->m_flDuckAmount();
    auto backup_flags = e->m_fFlags();
    auto backup_eflags = e->m_iEFlags();
    auto backup_absorigin = e->GetAbsOrigin();
    auto backup_absangles = e->GetAbsAngles();

    auto backup_curtime = m_globals()->m_curtime; //-V807
    auto backup_frametime = m_globals()->m_frametime;
    auto backup_realtime = m_globals()->m_realtime;
    auto backup_framecount = m_globals()->m_framecount;
    auto backup_tickcount = m_globals()->m_tickcount;
    auto backup_interpolation_amount = m_globals()->m_interpolation_amount;

    m_globals()->m_curtime = e->m_flSimulationTime();
    m_globals()->m_frametime = m_globals()->m_intervalpertick;
    e->GetAbsOrigin();
    e->GetAbsAngles();
    if (previous_record)
    {
        const auto weapon = e->m_hActiveWeapon()->get_csweapon_info();

        if (record->flags & FL_ONGROUND
            && m_globals()->m_intervalpertick >= 1) {
            const auto average_speed = record->velocity.Length2D();
            if (average_speed > 0.1f) {
                const auto alive_loop_weight = record->layers[11].m_flWeight;
                if (alive_loop_weight > 0.f
                    && alive_loop_weight < 1.f) {
                    const auto unk = (1.f - alive_loop_weight) * 0.35f;
                    if (unk > 0.f
                        && unk < 1.f) {
                        const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;
                        const auto modifier = ((unk + 0.55f) * max_speed) / average_speed;

                        record->velocity.x *= modifier;
                        record->velocity.y *= modifier;
                    }
                }

                record->velocity.z = 0.f;
            }
        }

        auto i = 1;
        if (!(record->layers[6].m_flCycle == 0.0f || previous_record->layers[6].m_flCycle == 0.0f) && record->velocity.Length2D() <= 1.1f)
        {
            record->velocity.x = (i & 1 ? -1.1f : 1.1f);
            record->velocity.y = 0.f;
            record->velocity.z = 0.f;
        }
        auto speed = record->velocity.Length2D();
        if (record->velocity.Length2D() > (speed * 0.52f) && previous_record->velocity.Length2D() > (speed * 0.52f)
            || record->velocity.Length2D() <= (speed * 0.52f) && previous_record->velocity.Length2D() <= (speed * 0.52f))
        {
            auto manually_calculated = animstate->m_flStopToFullRunningFraction;
            manually_calculated += (record->velocity.Length2D() > (speed * 0.52f) ? (2.f * animstate->m_flUpdateTimeDelta) : -(2.f * animstate->m_flUpdateTimeDelta));

            manually_calculated = math::clamp(manually_calculated, 0, 1);

            if (abs(manually_calculated - animstate->m_flStopToFullRunningFraction) >= 0.1f)// {
                e->get_animation_state()->m_flStopToFullRunningFraction = manually_calculated;
        }
        if (abs(record->velocity.x) < 0.001f)
            record->velocity.x = 0.0f;
        if (abs(record->velocity.y) < 0.001f)
            record->velocity.y = 0.0f;
        if (abs(record->velocity.z) < 0.001f)
            record->velocity.z = 0.0f;
        if (_fdtest(&record->velocity.x) > 0
            || _fdtest(&record->velocity.y) > 0
            || _fdtest(&record->velocity.z) > 0)
            record->velocity.Zero();
        e->get_animation_state()->m_flFeetCycle /*= record.feet_cycle*/ = animlayers[6].m_flCycle;
    }


    e->m_iEFlags() &= ~0x1800;

    if (e->m_fFlags() & FL_ONGROUND && e->m_vecVelocity().Length() > 0.0f && animlayers[6].m_flWeight <= 0.0f)
        e->m_vecVelocity().Zero();

    e->m_vecAbsVelocity() = e->m_vecVelocity();
    e->m_bClientSideAnimation() = true;

    if (is_dormant[e->EntIndex()])
    {
        is_dormant[e->EntIndex()] = false;

        if (e->m_fFlags() & FL_ONGROUND)
        {
            animstate->m_bOnGround = true;
            animstate->m_bInHitGroundAnimation = false;
        }

        animstate->time_since_in_air() = 0.0f;
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
    }

    auto updated_animations = false;

    c_baseplayeranimationstate state;
    memcpy(&state, animstate, sizeof(c_baseplayeranimationstate));

    if (previous_record)
    {
        memcpy(e->get_animlayers(), previous_record->layers, e->animlayer_count() * sizeof(AnimationLayer));

        auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;

        if (ticks_chocked > 1)
        {
            auto land_time = 0.0f;
            auto land_in_cycle = false;
            auto is_landed = false;
            auto on_ground = false;

            if (animlayers[4].m_flCycle < 0.5f && (!(e->m_fFlags() & FL_ONGROUND) || !(previous_record->flags & FL_ONGROUND)))
            {
                land_time = e->m_flSimulationTime() - animlayers[4].m_flPlaybackRate * animlayers[4].m_flCycle;
                land_in_cycle = land_time >= previous_record->simulation_time;
            }

            auto duck_amount_per_tick = (e->m_flDuckAmount() - previous_record->duck_amount) / ticks_chocked;

            for (auto i = 0; i < ticks_chocked; ++i)
            {
                

                auto simulated_time = previous_record->simulation_time + TICKS_TO_TIME(i);

                if (duck_amount_per_tick) //-V550
                    e->m_flDuckAmount() = previous_record->duck_amount + duck_amount_per_tick * (float)i;

                on_ground = e->m_fFlags() & FL_ONGROUND;

                if (land_in_cycle && !is_landed)
                {
                    if (land_time <= simulated_time)
                    {
                        is_landed = true;
                        on_ground = true;
                    }
                    else
                        on_ground = previous_record->flags & FL_ONGROUND;
                }

                if (on_ground)
                    e->m_fFlags() |= FL_ONGROUND;
                else
                    e->m_fFlags() &= ~FL_ONGROUND;

                auto simulated_ticks = TIME_TO_TICKS(simulated_time);

                m_globals()->m_realtime = simulated_time;
                m_globals()->m_curtime = simulated_time;
                m_globals()->m_framecount = simulated_ticks;
                m_globals()->m_tickcount = simulated_ticks;
                m_globals()->m_interpolation_amount = 0.0f;

                g_ctx.globals.updating_animation = true;
                e->update_clientside_animation();
                g_ctx.globals.updating_animation = false;

                m_globals()->m_realtime = backup_realtime;
                m_globals()->m_curtime = backup_curtime;
                m_globals()->m_framecount = backup_framecount;
                m_globals()->m_tickcount = backup_tickcount;
                m_globals()->m_interpolation_amount = backup_interpolation_amount;

                updated_animations = true;
            }
        }
    }

    if (!updated_animations)
    {
        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;
    }

    memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));

    auto setup_matrix = [&](player_t* e, AnimationLayer* layers, const int& matrix) -> void
    {
        e->invalidate_physics_recursive(8);

        AnimationLayer backup_layers[13];
        memcpy(backup_layers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));

        memcpy(e->get_animlayers(), layers, e->animlayer_count() * sizeof(AnimationLayer));

        switch (matrix)
        {
        case MAIN:
            e->setup_bones_fixed(record->matrixes_data.main, BONE_USED_BY_ANYTHING);
            break;
        case NONE:
            e->setup_bones_fixed(record->matrixes_data.zero, BONE_USED_BY_HITBOX);
            break;
        case FIRST:
            e->setup_bones_fixed(record->matrixes_data.first, BONE_USED_BY_HITBOX);
            break;
        case SECOND:
            e->setup_bones_fixed(record->matrixes_data.second, BONE_USED_BY_HITBOX);
            break;
        }

        memcpy(e->get_animlayers(), backup_layers, e->animlayer_count() * sizeof(AnimationLayer));
    };

#if RELEASE
    if (!player_info.fakeplayer && g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled) //-V807
#else
    if (g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled)
#endif
    {
        auto v48 = 0.f;

        float v49 = ((animstate->m_flStopToFullRunningFraction * -0.30000001) - 0.19999999) * v48;

        float flYawModifier = v49 + 1.0;

        float back = math::calculate_angle(g_ctx.local()->m_vecOrigin(), e->m_vecOrigin()).y;
        float flMaxBodyYaw = *(float*)(uintptr_t(animstate) + 0x338) * flYawModifier;
        float flMinBodyYaw = *(float*)(uintptr_t(animstate) + 0x334) * flYawModifier;
        /*float flMinBodyYaw = flYawModifier * -e->get_max_desync_delta();
        float flMaxBodyYaw = flYawModifier * e->get_max_desync_delta();*/

        animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()]; //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        previous_goal_feet_yaw[e->EntIndex()] = animstate->m_flGoalFeetYaw;
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y); //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[0], NONE);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[0], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[0]);
    

        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[1], FIRST);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[1], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[1]);
    
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[2], SECOND);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[2], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //    e->copy_animlayers(player_resolver[e->EntIndex()].layers[2]);

        player_resolver[e->EntIndex()].initialize(e, record, previous_goal_feet_yaw[e->EntIndex()], e->m_angEyeAngles().x);
        player_resolver[e->EntIndex()].resolve_yaw();

        if (g_cfg.player_list.low_delta[e->EntIndex()])
        {
            switch (record->side)
            {
            case RESOLVER_FIRST:
                record->side = RESOLVER_LOW_FIRST;
                break;
            case RESOLVER_SECOND:
                record->side = RESOLVER_LOW_SECOND;
                break;
            case RESOLVER_LOW_FIRST:
                record->side = RESOLVER_FIRST;
                break;
            case RESOLVER_LOW_SECOND:
                record->side = RESOLVER_SECOND;
                break;
            }
        }

        switch (record->side)
        {
        case RESOLVER_ORIGINAL:
            animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()];
            break;
        case RESOLVER_ZERO:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        case RESOLVER_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);
            break;
        case RESOLVER_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);
            break;
        case RESOLVER_LOW_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(back);
            break;
        case RESOLVER_LOW_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        }

        e->m_angEyeAngles().x = player_resolver[e->EntIndex()].resolve_pitch();
    }

    g_ctx.globals.updating_animation = true;
    e->update_clientside_animation();
    g_ctx.globals.updating_animation = false;

    setup_matrix(e, animlayers, MAIN);
    memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.main, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));

    m_globals()->m_curtime = backup_curtime;
    m_globals()->m_frametime = backup_frametime;

    e->m_flLowerBodyYawTarget() = backup_lower_body_yaw_target;
    e->m_flDuckAmount() = backup_duck_amount;
    e->m_fFlags() = backup_flags;
    e->m_iEFlags() = backup_eflags;
    e->set_abs_origin(backup_absorigin);
    e->set_abs_angles(backup_absangles);

    memcpy(e->get_animlayers(), animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    record->store_data(e, false);

    if (e->m_flSimulationTime() < e->m_flOldSimulationTime())
        record->invalid = true;
}
укажите на ошибки, хочу понять в чем проблема, что изменить, что добавить?
 
Модератор форума
Пользователь
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
376
Реакции[?]
148
Поинты[?]
0
я надеюсь ты понимаешь, что аним фикс валв функция??
я надеюсь ты понимаешь что вальве лагкомпенсация ломается при использовании фейклагов и антиаимов, и ее нужно ребилдить для исправления данных??
 
Модератор форума
Пользователь
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
376
Реакции[?]
148
Поинты[?]
0
анимфикс в читах именно этим и занимается. Если не дошло, то давай разбрем это слово по составу anim - анимации игры и данные для ее построения, fix - фикс этих данных, потому что они приходят на клиент не верными по разным причинам. Вопросы?
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
было куча тем и прочей залупы но чтоб полностью разобраться я хочу сделать его тут на примере лв
C++:
void lagcompensation::update_player_animations(player_t* e)
{
    auto animstate = e->get_animation_state();

    if (!animstate)
        return;

    player_info_t player_info;

    if (!m_engine()->GetPlayerInfo(e->EntIndex(), &player_info))
        return;

    auto records = &player_records[e->EntIndex()]; //-V826

    if (records->empty())
        return;

    adjust_data* previous_record = nullptr;

    if (records->size() >= 2)
        previous_record = &records->at(1);

    auto record = &records->front();

    AnimationLayer animlayers[13];

    memcpy(animlayers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
    std::memcpy(record->layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    //std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));

    //UpdateResolverLayer(e, 1, matrix3x4_t * m_pMatrix);

    auto backup_lower_body_yaw_target = e->m_flLowerBodyYawTarget();
    auto backup_duck_amount = e->m_flDuckAmount();
    auto backup_flags = e->m_fFlags();
    auto backup_eflags = e->m_iEFlags();
    auto backup_absorigin = e->GetAbsOrigin();
    auto backup_absangles = e->GetAbsAngles();

    auto backup_curtime = m_globals()->m_curtime; //-V807
    auto backup_frametime = m_globals()->m_frametime;
    auto backup_realtime = m_globals()->m_realtime;
    auto backup_framecount = m_globals()->m_framecount;
    auto backup_tickcount = m_globals()->m_tickcount;
    auto backup_interpolation_amount = m_globals()->m_interpolation_amount;

    m_globals()->m_curtime = e->m_flSimulationTime();
    m_globals()->m_frametime = m_globals()->m_intervalpertick;
    e->GetAbsOrigin();
    e->GetAbsAngles();
    if (previous_record)
    {
        const auto weapon = e->m_hActiveWeapon()->get_csweapon_info();

        if (record->flags & FL_ONGROUND
            && m_globals()->m_intervalpertick >= 1) {
            const auto average_speed = record->velocity.Length2D();
            if (average_speed > 0.1f) {
                const auto alive_loop_weight = record->layers[11].m_flWeight;
                if (alive_loop_weight > 0.f
                    && alive_loop_weight < 1.f) {
                    const auto unk = (1.f - alive_loop_weight) * 0.35f;
                    if (unk > 0.f
                        && unk < 1.f) {
                        const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;
                        const auto modifier = ((unk + 0.55f) * max_speed) / average_speed;

                        record->velocity.x *= modifier;
                        record->velocity.y *= modifier;
                    }
                }

                record->velocity.z = 0.f;
            }
        }

        auto i = 1;
        if (!(record->layers[6].m_flCycle == 0.0f || previous_record->layers[6].m_flCycle == 0.0f) && record->velocity.Length2D() <= 1.1f)
        {
            record->velocity.x = (i & 1 ? -1.1f : 1.1f);
            record->velocity.y = 0.f;
            record->velocity.z = 0.f;
        }
        auto speed = record->velocity.Length2D();
        if (record->velocity.Length2D() > (speed * 0.52f) && previous_record->velocity.Length2D() > (speed * 0.52f)
            || record->velocity.Length2D() <= (speed * 0.52f) && previous_record->velocity.Length2D() <= (speed * 0.52f))
        {
            auto manually_calculated = animstate->m_flStopToFullRunningFraction;
            manually_calculated += (record->velocity.Length2D() > (speed * 0.52f) ? (2.f * animstate->m_flUpdateTimeDelta) : -(2.f * animstate->m_flUpdateTimeDelta));

            manually_calculated = math::clamp(manually_calculated, 0, 1);

            if (abs(manually_calculated - animstate->m_flStopToFullRunningFraction) >= 0.1f)// {
                e->get_animation_state()->m_flStopToFullRunningFraction = manually_calculated;
        }
        if (abs(record->velocity.x) < 0.001f)
            record->velocity.x = 0.0f;
        if (abs(record->velocity.y) < 0.001f)
            record->velocity.y = 0.0f;
        if (abs(record->velocity.z) < 0.001f)
            record->velocity.z = 0.0f;
        if (_fdtest(&record->velocity.x) > 0
            || _fdtest(&record->velocity.y) > 0
            || _fdtest(&record->velocity.z) > 0)
            record->velocity.Zero();
        e->get_animation_state()->m_flFeetCycle /*= record.feet_cycle*/ = animlayers[6].m_flCycle;
    }


    e->m_iEFlags() &= ~0x1800;

    if (e->m_fFlags() & FL_ONGROUND && e->m_vecVelocity().Length() > 0.0f && animlayers[6].m_flWeight <= 0.0f)
        e->m_vecVelocity().Zero();

    e->m_vecAbsVelocity() = e->m_vecVelocity();
    e->m_bClientSideAnimation() = true;

    if (is_dormant[e->EntIndex()])
    {
        is_dormant[e->EntIndex()] = false;

        if (e->m_fFlags() & FL_ONGROUND)
        {
            animstate->m_bOnGround = true;
            animstate->m_bInHitGroundAnimation = false;
        }

        animstate->time_since_in_air() = 0.0f;
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
    }

    auto updated_animations = false;

    c_baseplayeranimationstate state;
    memcpy(&state, animstate, sizeof(c_baseplayeranimationstate));

    if (previous_record)
    {
        memcpy(e->get_animlayers(), previous_record->layers, e->animlayer_count() * sizeof(AnimationLayer));

        auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;

        if (ticks_chocked > 1)
        {
            auto land_time = 0.0f;
            auto land_in_cycle = false;
            auto is_landed = false;
            auto on_ground = false;

            if (animlayers[4].m_flCycle < 0.5f && (!(e->m_fFlags() & FL_ONGROUND) || !(previous_record->flags & FL_ONGROUND)))
            {
                land_time = e->m_flSimulationTime() - animlayers[4].m_flPlaybackRate * animlayers[4].m_flCycle;
                land_in_cycle = land_time >= previous_record->simulation_time;
            }

            auto duck_amount_per_tick = (e->m_flDuckAmount() - previous_record->duck_amount) / ticks_chocked;

            for (auto i = 0; i < ticks_chocked; ++i)
            {
               

                auto simulated_time = previous_record->simulation_time + TICKS_TO_TIME(i);

                if (duck_amount_per_tick) //-V550
                    e->m_flDuckAmount() = previous_record->duck_amount + duck_amount_per_tick * (float)i;

                on_ground = e->m_fFlags() & FL_ONGROUND;

                if (land_in_cycle && !is_landed)
                {
                    if (land_time <= simulated_time)
                    {
                        is_landed = true;
                        on_ground = true;
                    }
                    else
                        on_ground = previous_record->flags & FL_ONGROUND;
                }

                if (on_ground)
                    e->m_fFlags() |= FL_ONGROUND;
                else
                    e->m_fFlags() &= ~FL_ONGROUND;

                auto simulated_ticks = TIME_TO_TICKS(simulated_time);

                m_globals()->m_realtime = simulated_time;
                m_globals()->m_curtime = simulated_time;
                m_globals()->m_framecount = simulated_ticks;
                m_globals()->m_tickcount = simulated_ticks;
                m_globals()->m_interpolation_amount = 0.0f;

                g_ctx.globals.updating_animation = true;
                e->update_clientside_animation();
                g_ctx.globals.updating_animation = false;

                m_globals()->m_realtime = backup_realtime;
                m_globals()->m_curtime = backup_curtime;
                m_globals()->m_framecount = backup_framecount;
                m_globals()->m_tickcount = backup_tickcount;
                m_globals()->m_interpolation_amount = backup_interpolation_amount;

                updated_animations = true;
            }
        }
    }

    if (!updated_animations)
    {
        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;
    }

    memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));

    auto setup_matrix = [&](player_t* e, AnimationLayer* layers, const int& matrix) -> void
    {
        e->invalidate_physics_recursive(8);

        AnimationLayer backup_layers[13];
        memcpy(backup_layers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));

        memcpy(e->get_animlayers(), layers, e->animlayer_count() * sizeof(AnimationLayer));

        switch (matrix)
        {
        case MAIN:
            e->setup_bones_fixed(record->matrixes_data.main, BONE_USED_BY_ANYTHING);
            break;
        case NONE:
            e->setup_bones_fixed(record->matrixes_data.zero, BONE_USED_BY_HITBOX);
            break;
        case FIRST:
            e->setup_bones_fixed(record->matrixes_data.first, BONE_USED_BY_HITBOX);
            break;
        case SECOND:
            e->setup_bones_fixed(record->matrixes_data.second, BONE_USED_BY_HITBOX);
            break;
        }

        memcpy(e->get_animlayers(), backup_layers, e->animlayer_count() * sizeof(AnimationLayer));
    };

#if RELEASE
    if (!player_info.fakeplayer && g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled) //-V807
#else
    if (g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled)
#endif
    {
        auto v48 = 0.f;

        float v49 = ((animstate->m_flStopToFullRunningFraction * -0.30000001) - 0.19999999) * v48;

        float flYawModifier = v49 + 1.0;

        float back = math::calculate_angle(g_ctx.local()->m_vecOrigin(), e->m_vecOrigin()).y;
        float flMaxBodyYaw = *(float*)(uintptr_t(animstate) + 0x338) * flYawModifier;
        float flMinBodyYaw = *(float*)(uintptr_t(animstate) + 0x334) * flYawModifier;
        /*float flMinBodyYaw = flYawModifier * -e->get_max_desync_delta();
        float flMaxBodyYaw = flYawModifier * e->get_max_desync_delta();*/

        animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()]; //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        previous_goal_feet_yaw[e->EntIndex()] = animstate->m_flGoalFeetYaw;
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));
       
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y); //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[0], NONE);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[0], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[0]);
   

        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[1], FIRST);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[1], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[1]);
   
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[2], SECOND);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[2], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //    e->copy_animlayers(player_resolver[e->EntIndex()].layers[2]);

        player_resolver[e->EntIndex()].initialize(e, record, previous_goal_feet_yaw[e->EntIndex()], e->m_angEyeAngles().x);
        player_resolver[e->EntIndex()].resolve_yaw();

        if (g_cfg.player_list.low_delta[e->EntIndex()])
        {
            switch (record->side)
            {
            case RESOLVER_FIRST:
                record->side = RESOLVER_LOW_FIRST;
                break;
            case RESOLVER_SECOND:
                record->side = RESOLVER_LOW_SECOND;
                break;
            case RESOLVER_LOW_FIRST:
                record->side = RESOLVER_FIRST;
                break;
            case RESOLVER_LOW_SECOND:
                record->side = RESOLVER_SECOND;
                break;
            }
        }

        switch (record->side)
        {
        case RESOLVER_ORIGINAL:
            animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()];
            break;
        case RESOLVER_ZERO:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        case RESOLVER_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);
            break;
        case RESOLVER_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);
            break;
        case RESOLVER_LOW_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(back);
            break;
        case RESOLVER_LOW_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        }

        e->m_angEyeAngles().x = player_resolver[e->EntIndex()].resolve_pitch();
    }

    g_ctx.globals.updating_animation = true;
    e->update_clientside_animation();
    g_ctx.globals.updating_animation = false;

    setup_matrix(e, animlayers, MAIN);
    memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.main, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));

    m_globals()->m_curtime = backup_curtime;
    m_globals()->m_frametime = backup_frametime;

    e->m_flLowerBodyYawTarget() = backup_lower_body_yaw_target;
    e->m_flDuckAmount() = backup_duck_amount;
    e->m_fFlags() = backup_flags;
    e->m_iEFlags() = backup_eflags;
    e->set_abs_origin(backup_absorigin);
    e->set_abs_angles(backup_absangles);

    memcpy(e->get_animlayers(), animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    record->store_data(e, false);

    if (e->m_flSimulationTime() < e->m_flOldSimulationTime())
        record->invalid = true;
}
укажите на ошибки, хочу понять в чем проблема, что изменить, что добавить?
Ну разберу пару ошибок, ибо от анимфикс только хочется плакать.

C++:
 e->m_iEFlags() &= ~0x1800;]
Абсолютно неверно, мы здесь должны убирать флаг EFL_DIRTY_ABSVELOCITY (0x1000)
C++:
auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;
В этом участке кода достаточно будет сделать так:
C++:
auto m_iSimulationTicks = clamp(TIME_TO_TICKS(m_pRecord->m_flSimulationTime - m_pPreviousRecord->m_flSimulationTime), 0, 16);
C++:
e->GetAbsOrigin();
    e->GetAbsAngles();
Абсолютно ненужный участок кода, который ничего толком не сделает.

Думаю, основные свои ошибки ты понял.
 
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну разберу пару ошибок, ибо от анимфикс только хочется плакать.

C++:
 e->m_iEFlags() &= ~0x1800;]
Абсолютно неверно, мы здесь должны убирать флаг EFL_DIRTY_ABSVELOCITY (0x1000)
C++:
auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;
В этом участке кода достаточно будет сделать так:
C++:
auto m_iSimulationTicks = clamp(TIME_TO_TICKS(m_pRecord->m_flSimulationTime - m_pPreviousRecord->m_flSimulationTime), 0, 16);
C++:
e->GetAbsOrigin();
    e->GetAbsAngles();
Абсолютно ненужный участок кода, который ничего толком не сделает.

Думаю, основные свои ошибки ты понял.
только вот 16 тут не нужно потому что 16 нельзя отправить на сервер команду именно сервер просто возьмет и отклонит ее
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
только вот 16 тут не нужно потому что 16 нельзя отправить на сервер команду именно сервер просто возьмет и отклонит ее
В некоторых читах есть патч секций с этой проверкой, поэтому я и написал.
 
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Может быть, но в любом случае я использую в основном 15, я скинул ему ради примера, а ты решил докопаться.
я не докопался до тебя я просто тебе написал в том что ты не прав :flushed:
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
я не докопался до тебя я просто тебе написал в том что ты не прав :flushed:
Я просто не проверял, действительно ли этот патч работает так, как нужно и скинул пример ради изучения. Я тебе уже сказал, что использую в основном 15. 16 использовал в качестве теста, изменений особо не увидел.
 
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я просто не проверял, действительно ли этот патч работает так, как нужно и скинул пример ради изучения. Я тебе уже сказал, что использую в основном 15. 16 использовал в качестве теста, изменений особо не увидел.
изменений не будет вообще потому что 16 чокед командов сервер не даст чокнуть
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,953
Реакции[?]
954
Поинты[?]
16K
1648990606492.png
Не провильно( 0x1000 )

1648990677088.png
Зочем

1648990720408.png
Кривенький кусочек, альмирка расписал что на что поменять
 
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Посмотреть вложение 198345
Не провильно( 0x1000 )

Посмотреть вложение 198346
Зочем

Посмотреть вложение 198347
Кривенький кусочек, альмирка расписал что на что поменять
я не знаю зачем ты переписал такие же слова как и PasterAlmir только другой контекст
на счет кривого кусока тут все нормально кроме числа 31
 
Пользователь
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
272
Реакции[?]
42
Поинты[?]
2K
Ну разберу пару ошибок, ибо от анимфикс только хочется плакать.

C++:
 e->m_iEFlags() &= ~0x1800;]
Абсолютно неверно, мы здесь должны убирать флаг EFL_DIRTY_ABSVELOCITY (0x1000)
C++:
auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;
В этом участке кода достаточно будет сделать так:
C++:
auto m_iSimulationTicks = clamp(TIME_TO_TICKS(m_pRecord->m_flSimulationTime - m_pPreviousRecord->m_flSimulationTime), 0, 16);
C++:
e->GetAbsOrigin();
    e->GetAbsAngles();
Абсолютно ненужный участок кода, который ничего толком не сделает.

Думаю, основные свои ошибки ты понял.
спасибо, лучший ответ на данную тему, я бы еще хотел узнать про invalidate_bone_cache нужно ли его использовать?
и что на счет велосити фиксов, их лучше убрать или переделать?
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
спасибо, лучший ответ на данную тему, я бы еще хотел узнать про invalidate_bone_cache нужно ли его использовать?
Естественно, происходит аннулирование кэша костей и матрица собирается заново.
 
Забаненный
Статус
Оффлайн
Регистрация
27 Мар 2022
Сообщения
17
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
спасибо, лучший ответ на данную тему, я бы еще хотел узнать про invalidate_bone_cache нужно ли его использовать?
и что на счет велосити фиксов, их лучше убрать или переделать?
ну если ты не трогал в легендваре функцию
setup_bones_fixed то там уже используется invalidate_bone_cache
на счет велосити фиксов оставь на первое время
 
average usermode enjoyer
Участник
Статус
Оффлайн
Регистрация
9 Июл 2019
Сообщения
768
Реакции[?]
515
Поинты[?]
2K
было куча тем и прочей залупы но чтоб полностью разобраться я хочу сделать его тут на примере лв
C++:
void lagcompensation::update_player_animations(player_t* e)
{
    if (previous_record)
    {
        const auto weapon = e->m_hActiveWeapon()->get_csweapon_info();

        if (record->flags & FL_ONGROUND
            && m_globals()->m_intervalpertick >= 1) {
            const auto average_speed = record->velocity.Length2D();
            if (average_speed > 0.1f) {
                const auto alive_loop_weight = record->layers[11].m_flWeight;
                if (alive_loop_weight > 0.f
                    && alive_loop_weight < 1.f) {
                    const auto unk = (1.f - alive_loop_weight) * 0.35f;
                    if (unk > 0.f
                        && unk < 1.f) {
                        const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;
                        const auto modifier = ((unk + 0.55f) * max_speed) / average_speed;

                        record->velocity.x *= modifier;
                        record->velocity.y *= modifier;
                    }
                }

                record->velocity.z = 0.f;
            }
        }

            if (animlayers[4].m_flCycle < 0.5f && (!(e->m_fFlags() & FL_ONGROUND) || !(previous_record->flags & FL_ONGROUND)))
            {
                land_time = e->m_flSimulationTime() - animlayers[4].m_flPlaybackRate * animlayers[4].m_flCycle;
                land_in_cycle = land_time >= previous_record->simulation_time;
            }
}
укажите на ошибки, хочу понять в чем проблема, что изменить, что добавить?
я дико извиняюсь перед программистами выше, но при моих небольших знаниях я все же думаю что тс допустил некоторые ошибки в данных участках кода :\
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
я дико извиняюсь перед программистами выше, но при моих небольших знаниях я все же думаю что тс допустил некоторые ошибки в данных участках кода :\
Ты совершенно прав, но я указал на несколько моментов и сказал об этом заранее. Естественно ему самому дальше нужно подумать, что не так в его коде.
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2019
Сообщения
101
Реакции[?]
7
Поинты[?]
2K
было куча тем и прочей залупы но чтоб полностью разобраться я хочу сделать его тут на примере лв
C++:
void lagcompensation::update_player_animations(player_t* e)
{
    auto animstate = e->get_animation_state();

    if (!animstate)
        return;

    player_info_t player_info;

    if (!m_engine()->GetPlayerInfo(e->EntIndex(), &player_info))
        return;

    auto records = &player_records[e->EntIndex()]; //-V826

    if (records->empty())
        return;

    adjust_data* previous_record = nullptr;

    if (records->size() >= 2)
        previous_record = &records->at(1);

    auto record = &records->front();

    AnimationLayer animlayers[13];

    memcpy(animlayers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
    std::memcpy(record->layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    //std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));

    //UpdateResolverLayer(e, 1, matrix3x4_t * m_pMatrix);

    auto backup_lower_body_yaw_target = e->m_flLowerBodyYawTarget();
    auto backup_duck_amount = e->m_flDuckAmount();
    auto backup_flags = e->m_fFlags();
    auto backup_eflags = e->m_iEFlags();
    auto backup_absorigin = e->GetAbsOrigin();
    auto backup_absangles = e->GetAbsAngles();

    auto backup_curtime = m_globals()->m_curtime; //-V807
    auto backup_frametime = m_globals()->m_frametime;
    auto backup_realtime = m_globals()->m_realtime;
    auto backup_framecount = m_globals()->m_framecount;
    auto backup_tickcount = m_globals()->m_tickcount;
    auto backup_interpolation_amount = m_globals()->m_interpolation_amount;

    m_globals()->m_curtime = e->m_flSimulationTime();
    m_globals()->m_frametime = m_globals()->m_intervalpertick;
    e->GetAbsOrigin();
    e->GetAbsAngles();
    if (previous_record)
    {
        const auto weapon = e->m_hActiveWeapon()->get_csweapon_info();

        if (record->flags & FL_ONGROUND
            && m_globals()->m_intervalpertick >= 1) {
            const auto average_speed = record->velocity.Length2D();
            if (average_speed > 0.1f) {
                const auto alive_loop_weight = record->layers[11].m_flWeight;
                if (alive_loop_weight > 0.f
                    && alive_loop_weight < 1.f) {
                    const auto unk = (1.f - alive_loop_weight) * 0.35f;
                    if (unk > 0.f
                        && unk < 1.f) {
                        const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;
                        const auto modifier = ((unk + 0.55f) * max_speed) / average_speed;

                        record->velocity.x *= modifier;
                        record->velocity.y *= modifier;
                    }
                }

                record->velocity.z = 0.f;
            }
        }

        auto i = 1;
        if (!(record->layers[6].m_flCycle == 0.0f || previous_record->layers[6].m_flCycle == 0.0f) && record->velocity.Length2D() <= 1.1f)
        {
            record->velocity.x = (i & 1 ? -1.1f : 1.1f);
            record->velocity.y = 0.f;
            record->velocity.z = 0.f;
        }
        auto speed = record->velocity.Length2D();
        if (record->velocity.Length2D() > (speed * 0.52f) && previous_record->velocity.Length2D() > (speed * 0.52f)
            || record->velocity.Length2D() <= (speed * 0.52f) && previous_record->velocity.Length2D() <= (speed * 0.52f))
        {
            auto manually_calculated = animstate->m_flStopToFullRunningFraction;
            manually_calculated += (record->velocity.Length2D() > (speed * 0.52f) ? (2.f * animstate->m_flUpdateTimeDelta) : -(2.f * animstate->m_flUpdateTimeDelta));

            manually_calculated = math::clamp(manually_calculated, 0, 1);

            if (abs(manually_calculated - animstate->m_flStopToFullRunningFraction) >= 0.1f)// {
                e->get_animation_state()->m_flStopToFullRunningFraction = manually_calculated;
        }
        if (abs(record->velocity.x) < 0.001f)
            record->velocity.x = 0.0f;
        if (abs(record->velocity.y) < 0.001f)
            record->velocity.y = 0.0f;
        if (abs(record->velocity.z) < 0.001f)
            record->velocity.z = 0.0f;
        if (_fdtest(&record->velocity.x) > 0
            || _fdtest(&record->velocity.y) > 0
            || _fdtest(&record->velocity.z) > 0)
            record->velocity.Zero();
        e->get_animation_state()->m_flFeetCycle /*= record.feet_cycle*/ = animlayers[6].m_flCycle;
    }


    e->m_iEFlags() &= ~0x1800;

    if (e->m_fFlags() & FL_ONGROUND && e->m_vecVelocity().Length() > 0.0f && animlayers[6].m_flWeight <= 0.0f)
        e->m_vecVelocity().Zero();

    e->m_vecAbsVelocity() = e->m_vecVelocity();
    e->m_bClientSideAnimation() = true;

    if (is_dormant[e->EntIndex()])
    {
        is_dormant[e->EntIndex()] = false;

        if (e->m_fFlags() & FL_ONGROUND)
        {
            animstate->m_bOnGround = true;
            animstate->m_bInHitGroundAnimation = false;
        }

        animstate->time_since_in_air() = 0.0f;
        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
    }

    auto updated_animations = false;

    c_baseplayeranimationstate state;
    memcpy(&state, animstate, sizeof(c_baseplayeranimationstate));

    if (previous_record)
    {
        memcpy(e->get_animlayers(), previous_record->layers, e->animlayer_count() * sizeof(AnimationLayer));

        auto ticks_chocked = 1;
        auto simulation_ticks = TIME_TO_TICKS(e->m_flSimulationTime() - previous_record->simulation_time);

        if (simulation_ticks > 0 && simulation_ticks < 31)
            ticks_chocked = simulation_ticks;

        if (ticks_chocked > 1)
        {
            auto land_time = 0.0f;
            auto land_in_cycle = false;
            auto is_landed = false;
            auto on_ground = false;

            if (animlayers[4].m_flCycle < 0.5f && (!(e->m_fFlags() & FL_ONGROUND) || !(previous_record->flags & FL_ONGROUND)))
            {
                land_time = e->m_flSimulationTime() - animlayers[4].m_flPlaybackRate * animlayers[4].m_flCycle;
                land_in_cycle = land_time >= previous_record->simulation_time;
            }

            auto duck_amount_per_tick = (e->m_flDuckAmount() - previous_record->duck_amount) / ticks_chocked;

            for (auto i = 0; i < ticks_chocked; ++i)
            {
        

                auto simulated_time = previous_record->simulation_time + TICKS_TO_TIME(i);

                if (duck_amount_per_tick) //-V550
                    e->m_flDuckAmount() = previous_record->duck_amount + duck_amount_per_tick * (float)i;

                on_ground = e->m_fFlags() & FL_ONGROUND;

                if (land_in_cycle && !is_landed)
                {
                    if (land_time <= simulated_time)
                    {
                        is_landed = true;
                        on_ground = true;
                    }
                    else
                        on_ground = previous_record->flags & FL_ONGROUND;
                }

                if (on_ground)
                    e->m_fFlags() |= FL_ONGROUND;
                else
                    e->m_fFlags() &= ~FL_ONGROUND;

                auto simulated_ticks = TIME_TO_TICKS(simulated_time);

                m_globals()->m_realtime = simulated_time;
                m_globals()->m_curtime = simulated_time;
                m_globals()->m_framecount = simulated_ticks;
                m_globals()->m_tickcount = simulated_ticks;
                m_globals()->m_interpolation_amount = 0.0f;

                g_ctx.globals.updating_animation = true;
                e->update_clientside_animation();
                g_ctx.globals.updating_animation = false;

                m_globals()->m_realtime = backup_realtime;
                m_globals()->m_curtime = backup_curtime;
                m_globals()->m_framecount = backup_framecount;
                m_globals()->m_tickcount = backup_tickcount;
                m_globals()->m_interpolation_amount = backup_interpolation_amount;

                updated_animations = true;
            }
        }
    }

    if (!updated_animations)
    {
        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;
    }

    memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));

    auto setup_matrix = [&](player_t* e, AnimationLayer* layers, const int& matrix) -> void
    {
        e->invalidate_physics_recursive(8);

        AnimationLayer backup_layers[13];
        memcpy(backup_layers, e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));

        memcpy(e->get_animlayers(), layers, e->animlayer_count() * sizeof(AnimationLayer));

        switch (matrix)
        {
        case MAIN:
            e->setup_bones_fixed(record->matrixes_data.main, BONE_USED_BY_ANYTHING);
            break;
        case NONE:
            e->setup_bones_fixed(record->matrixes_data.zero, BONE_USED_BY_HITBOX);
            break;
        case FIRST:
            e->setup_bones_fixed(record->matrixes_data.first, BONE_USED_BY_HITBOX);
            break;
        case SECOND:
            e->setup_bones_fixed(record->matrixes_data.second, BONE_USED_BY_HITBOX);
            break;
        }

        memcpy(e->get_animlayers(), backup_layers, e->animlayer_count() * sizeof(AnimationLayer));
    };

#if RELEASE
    if (!player_info.fakeplayer && g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled) //-V807
#else
    if (g_ctx.local()->is_alive() && e->m_iTeamNum() != g_ctx.local()->m_iTeamNum() && !g_cfg.legitbot.enabled)
#endif
    {
        auto v48 = 0.f;

        float v49 = ((animstate->m_flStopToFullRunningFraction * -0.30000001) - 0.19999999) * v48;

        float flYawModifier = v49 + 1.0;

        float back = math::calculate_angle(g_ctx.local()->m_vecOrigin(), e->m_vecOrigin()).y;
        float flMaxBodyYaw = *(float*)(uintptr_t(animstate) + 0x338) * flYawModifier;
        float flMinBodyYaw = *(float*)(uintptr_t(animstate) + 0x334) * flYawModifier;
        /*float flMinBodyYaw = flYawModifier * -e->get_max_desync_delta();
        float flMaxBodyYaw = flYawModifier * e->get_max_desync_delta();*/

        animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()]; //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        previous_goal_feet_yaw[e->EntIndex()] = animstate->m_flGoalFeetYaw;
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].previous_layers, animlayers, e->animlayer_count() * sizeof(AnimationLayer));

        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y); //-V807

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[0], NONE);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[0], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[0]);


        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[1], FIRST);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[1], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //e->copy_animlayers(player_resolver[e->EntIndex()].layers[1]);

        animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);

        g_ctx.globals.updating_animation = true;
        e->update_clientside_animation();
        g_ctx.globals.updating_animation = false;

        setup_matrix(e, player_resolver[e->EntIndex()].resolver_layers[2], SECOND);
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        std::memcpy(player_resolver[e->EntIndex()].resolver_layers[2], animlayers, e->animlayer_count() * sizeof(AnimationLayer));
        //    e->copy_animlayers(player_resolver[e->EntIndex()].layers[2]);

        player_resolver[e->EntIndex()].initialize(e, record, previous_goal_feet_yaw[e->EntIndex()], e->m_angEyeAngles().x);
        player_resolver[e->EntIndex()].resolve_yaw();

        if (g_cfg.player_list.low_delta[e->EntIndex()])
        {
            switch (record->side)
            {
            case RESOLVER_FIRST:
                record->side = RESOLVER_LOW_FIRST;
                break;
            case RESOLVER_SECOND:
                record->side = RESOLVER_LOW_SECOND;
                break;
            case RESOLVER_LOW_FIRST:
                record->side = RESOLVER_FIRST;
                break;
            case RESOLVER_LOW_SECOND:
                record->side = RESOLVER_SECOND;
                break;
            }
        }

        switch (record->side)
        {
        case RESOLVER_ORIGINAL:
            animstate->m_flGoalFeetYaw = previous_goal_feet_yaw[e->EntIndex()];
            break;
        case RESOLVER_ZERO:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        case RESOLVER_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y + flMaxBodyYaw);
            break;
        case RESOLVER_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y - flMinBodyYaw);
            break;
        case RESOLVER_LOW_FIRST:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(back);
            break;
        case RESOLVER_LOW_SECOND:
            animstate->m_flGoalFeetYaw = math::normalize_yaw(e->m_angEyeAngles().y);
            break;
        }

        e->m_angEyeAngles().x = player_resolver[e->EntIndex()].resolve_pitch();
    }

    g_ctx.globals.updating_animation = true;
    e->update_clientside_animation();
    g_ctx.globals.updating_animation = false;

    setup_matrix(e, animlayers, MAIN);
    memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.main, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));

    m_globals()->m_curtime = backup_curtime;
    m_globals()->m_frametime = backup_frametime;

    e->m_flLowerBodyYawTarget() = backup_lower_body_yaw_target;
    e->m_flDuckAmount() = backup_duck_amount;
    e->m_fFlags() = backup_flags;
    e->m_iEFlags() = backup_eflags;
    e->set_abs_origin(backup_absorigin);
    e->set_abs_angles(backup_absangles);

    memcpy(e->get_animlayers(), animlayers, e->animlayer_count() * sizeof(AnimationLayer));
    record->store_data(e, false);

    if (e->m_flSimulationTime() < e->m_flOldSimulationTime())
        record->invalid = true;
}
укажите на ошибки, хочу понять в чем проблема, что изменить, что добавить?
Максимальная скорость мувмента, 260, замени это:

const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;

на это:

const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 260.f;

+ к этому измени это:

Код:
if (abs(record->velocity.x) < 0.001f)
    record->velocity.x = 0.0f;
if (abs(record->velocity.y) < 0.001f)
    record->velocity.y = 0.0f;
if (abs(record->velocity.z) < 0.001f)
    record->velocity.z = 0.0f;
на это:

Код:
if (fabsf(record->velocity.x) < .001f)
    record->velocity.x = 0.f;

if (fabsf(record->velocity.y) < .001f)
    ecord->velocity.y = 0.f;

if (fabsf(record->velocity.z) < .001f)
    record->velocity.z = 0.f;
Ты будешь получать, более точные флоат данные.

Ещё настоятельно рекомендую, взглядывать на ребилд стейта:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
 
Последнее редактирование:
  • Печально
Реакции: sove
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,089
Реакции[?]
386
Поинты[?]
40K
Максимальная скорость мувмента, 260, замени это:

const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 250.f;

на это:

const auto max_speed = weapon ? weapon->flMaxPlayerSpeed : 260.f;

+ к этому измени это:

Код:
if (abs(record->velocity.x) < 0.001f)
    record->velocity.x = 0.0f;
if (abs(record->velocity.y) < 0.001f)
    record->velocity.y = 0.0f;
if (abs(record->velocity.z) < 0.001f)
    record->velocity.z = 0.0f;
на это:

Код:
if (fabsf(record->velocity.x) < .001f)
    record->velocity.x = 0.f;

if (fabsf(record->velocity.y) < .001f)
    ecord->velocity.y = 0.f;

if (fabsf(record->velocity.z) < .001f)
    record->velocity.z = 0.f;
Ты будешь получать, более точные флоат данные.

Ещё настоятельно рекомендую, взглядывать на ребилд стейта:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
Вместо смены скоростей на хардкод значения можно получать их проще: m_flMaxSpeed()

Про это:
C++:
if (fabsf(record->velocity.x) < .001f)
    record->velocity.x = 0.f;

if (fabsf(record->velocity.y) < .001f)
    ecord->velocity.y = 0.f;

if (fabsf(record->velocity.z) < .001f)
    record->velocity.z = 0.f;
Эта часть в коде совершенно не нужна.
А вот на счёт ребилда анимстейта ты правильно сказал, но лучше чекнуть слитый сурс код кс.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу