• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос AnimFix dead

Трахов
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции
87
Всем привет!
Недавно спастил анимфикс с LWK но столкнулся с одним приколом)
Если fps_max 0 то модельку начинает фликать.
Если fps_max 60 то происходит это (все время смотрит в лево)
dRYLxOW.png

Hxb3x9p.png

Дебажил дебажил так никчему и не пришел, прописал все что нужно было в create_move и fsn.

C++:
Expand Collapse Copy
void local_animations::run(EClientFrameStage stage)
{
    if (I::ClientState->m_nDeltaTick == -1) return;

    if (IPT::IsKeyDown(C::Get<int>(Vars.iFakeDuck)))
    {
        if (stage == FRAME_NET_UPDATE_END)
        {
            fake_server_update = false;

            if (G::pLocal->GetSimulationTime() != fake_simulation_time) //-V550 //-V807
            {
                fake_server_update = true;
                fake_simulation_time = G::pLocal->GetSimulationTime();
            }

            G::pLocal->get_animlayers()[3].flWeight = 0.0f;
            G::pLocal->get_animlayers()[3].flCycle = 0.0f;
            G::pLocal->get_animlayers()[12].flWeight = 0.0f;

            update_fake_animations();
        }
        else if (stage == FRAME_RENDER_START)
        {
            auto animstate = G::pLocal->GetAnimationState(); //-V807

            if (!animstate)
                return;

            real_server_update = false;

            if (G::pLocal->GetSimulationTime() != real_simulation_time) //-V550
            {
                real_server_update = true;
                real_simulation_time = G::pLocal->GetSimulationTime();
            }

            G::pLocal->get_animlayers()[3].flWeight = 0.0f;
            G::pLocal->get_animlayers()[3].flCycle = 0.0f;
            G::pLocal->get_animlayers()[12].flWeight = 0.0f;

            update_local_animations(animstate);
        }
    }
    else if (stage == FRAME_RENDER_START)
    {
        auto animstate = G::pLocal->GetAnimationState(); //-V807

        if (!animstate)
            return;

        real_server_update = false;
        fake_server_update = false;

        if (G::pLocal->GetSimulationTime() != real_simulation_time || G::pLocal->GetSimulationTime() != fake_simulation_time) //-V550
        {
            real_server_update = fake_server_update = true;
            real_simulation_time = fake_simulation_time = G::pLocal->GetSimulationTime();
        }

        G::pLocal->get_animlayers()[3].flWeight = 0.0f;
        G::pLocal->get_animlayers()[3].flCycle = 0.0f;
        G::pLocal->get_animlayers()[12].flWeight = 0.0f;

        update_fake_animations();
        update_local_animations(animstate);
    }
}

void local_animations::update_prediction_animations()
{
    auto alloc = !local_data.prediction_animstate;
    auto change = !alloc && handle != &G::pLocal->GetRefEHandle(); //-V807
    auto reset = !alloc && !change && G::pLocal->GetSpawnTime() != spawntime; //-V550

    if (change)
        I::MemAlloc->Free(local_data.prediction_animstate);

    if (reset)
    {
        utill::Reset(local_data.prediction_animstate);
        spawntime = G::pLocal->GetSpawnTime();
    }

    if (alloc || change)
    {
        local_data.prediction_animstate = (CCSGOPlayerAnimState*)I::MemAlloc->Alloc(sizeof(CCSGOPlayerAnimState));

        if (local_data.prediction_animstate)
            utill::Create(local_data.prediction_animstate, G::pLocal);

        handle = (CBaseHandle*)&G::pLocal->GetRefEHandle();
        spawntime = G::pLocal->GetSpawnTime();
    }

    if (!alloc && !change && !reset)
    {
        float pose_parameter[24]; //-V688
        memcpy(pose_parameter, &G::pLocal->GetPoseParameter(), 24 * sizeof(float));

        CAnimationLayer layers[15]; //-V688
        memcpy(layers, G::pLocal->get_animlayers(), G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));

        local_data.prediction_animstate->pEntity = G::pLocal;
        utill::Update(local_data.prediction_animstate, ZERO);

        G::pLocal->setup_bones_fixed(G::prediction_matrix, BONE_USED_BY_HITBOX);

        memcpy(&G::pLocal->GetPoseParameter(), pose_parameter, 24 * sizeof(float));
        memcpy(G::pLocal->get_animlayers(), layers, G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));
    }
}

void local_animations::update_fake_animations()
{
    auto alloc = !local_data.animstate;
    auto change = !alloc && handle != &G::pLocal->GetRefEHandle(); //-V807
    auto reset = !alloc && !change && G::pLocal->GetSpawnTime() != spawntime; //-V550

    if (change)
        I::MemAlloc->Free(local_data.animstate);

    if (reset)
    {
        utill::Reset(local_data.animstate);
        spawntime = G::pLocal->GetSpawnTime();
    }

    if (alloc || change)
    {
        local_data.animstate = (CCSGOPlayerAnimState*)I::MemAlloc->Alloc(sizeof(CCSGOPlayerAnimState));

        if (local_data.animstate)
            utill::Create(local_data.animstate, G::pLocal);

        handle = (CBaseHandle*)&G::pLocal->GetRefEHandle();
        spawntime = G::pLocal->GetSpawnTime();
    }

    if (!alloc && !change && !reset && fake_server_update)
    {
        float pose_parameter[24]; //-V688
        memcpy(pose_parameter, &G::pLocal->GetPoseParameter(), 24 * sizeof(float));

        CAnimationLayer layers[15]; //-V688
        memcpy(layers, G::pLocal->get_animlayers(), G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));

        auto backup_frametime = I::Globals->flFrameTime; //-V807
        auto backup_curtime = I::Globals->flCurrentTime;

        I::Globals->flFrameTime = I::Globals->flIntervalPerTick;
        I::Globals->flCurrentTime = G::pLocal->GetSimulationTime();

        local_data.animstate->pEntity = G::pLocal;
        utill::Update(local_data.animstate, local_animations::Get().local_data.fake_angles);

        local_data.animstate->bHitGroundAnimation = false;
        local_data.animstate->flHitGroundCycle = 0.0f;
        local_data.animstate->flHitGroundWeight = 1.0f;

        G::pLocal->setup_bones_fixed(G::fake_matrix, BONE_USED_BY_ANYTHING);
        //local_data.visualize_lag = g_cfg.player.visualize_lag;

        /*
        if (!local_data.visualize_lag)
        {
            for (auto& i : g_ctx.globals.fake_matrix)
            {
                i[0][3] -= G::pLocal->GetRenderOrigin().x; //-V807
                i[1][3] -= G::pLocal->GetRenderOrigin().y;
                i[2][3] -= G::pLocal->GetRenderOrigin().z;
            }
        }*/

        I::Globals->flFrameTime = backup_frametime;
        I::Globals->flCurrentTime = backup_curtime;

        memcpy(&G::pLocal->GetPoseParameter(), pose_parameter, 24 * sizeof(float));
        memcpy(G::pLocal->get_animlayers(), layers, G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));
    }
}

void local_animations::update_local_animations(CCSGOPlayerAnimState* animstate)
{
    if (tickcount != I::Globals->iTickCount) //-V550
    {
        tickcount = I::Globals->iTickCount;
        memcpy(layers, G::pLocal->get_animlayers(), G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer)); //-V807

        if (local_data.animstate)
            animstate->flDuckAmount = local_data.animstate->flDuckAmount;

        animstate->iLastUpdateFrame = 0;
        utill::Update(animstate, local_animations::Get().local_data.fake_angles);

        if (real_server_update)
        {
            abs_angles = animstate->flGoalFeetYaw;
            memcpy(pose_parameter, &G::pLocal->GetPoseParameter(), 24 * sizeof(float));
        }
    }
    else
        animstate->iLastUpdateFrame = I::Globals->iFrameCount;

    animstate->flGoalFeetYaw = CAntiAim::Get().condition(G::pCmd) ? abs_angles : local_animations::Get().local_data.real_angles.y;
    G::pLocal->SetAbsAngles((0.0f, abs_angles, 0.0f));

    memcpy(G::pLocal->get_animlayers(), layers, G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));
    memcpy(&G::pLocal->GetPoseParameter(), pose_parameter, 24 * sizeof(float));
}
 
Скрытое содержимое
ой....... яж вроде его удалил к херам собачим с прошлого анимфикса..........................
UPD: больше скажу, он даже в анимфиксе не используется "LWK"
 
ой....... яж вроде его удалил к херам собачим с прошлого анимфикса..........................
UPD: больше скажу, он даже в анимфиксе не используется "LWK"
А ты будь умнее и используй.
 
Вронг update client side animation скорее всего
 
Вронг update client side animation скорее всего
может быть из-за того что я не сетаю ViewAngles?

Код:
Expand Collapse Copy
I::Prediction()->SetLocalViewAngles(pCmd->angViewPoint);
I::Engine()->SetViewAngles(pCmd->angViewPoint);

я об этом
 
может быть из-за того что я не сетаю ViewAngles?

Код:
Expand Collapse Copy
I::Prediction()->SetLocalViewAngles(pCmd->angViewPoint);
I::Engine()->SetViewAngles(pCmd->angViewPoint);

я об этом
Нет, скорее всего это из-за того что ты испортил апдейт анимаций. Я пастил клиентсайт апдейт из vison, но там была другая тема, что аа просто не показывали(типо просто всегда были форвард)
 
Нет, скорее всего это из-за того что ты испортил апдейт анимаций. Я пастил клиентсайт апдейт из vison, но там была другая тема, что аа просто не показывали(типо просто всегда были форвард)
Методом проб и ошибок я выяснил что UpdateClientSideAnimation
1. Не работал
2. Не вызывался в локал фиксе (спасибо за технологии легендвар)
3. Теперь у меня много вопросов как он обновлял анимки в ЛВ а у меня нет XD
4. и все-же модельку иногда шейкает и смотрит она все время в права, и не важно включены АА или нет.

UPD: у меня в UpdateLocalAnimation есть переменная tickcount которая и должна обновлять анимки в определенное время, но есть мем) я забыл его обновлять) и он всегда будет равен 0. Да и сам способ не очень, сейчас проверю из-за него это иль нет.

UPD2: то что моделька смотрит в одну сторону я пофиксил, но при большом фпс все равно шейкает.

понять в чем проблема я так и не смогу, сегодня еще попробую.
 
Последнее редактирование:
Методом проб и ошибок я выяснил что UpdateClientSideAnimation
1. Не работал
2. Не вызывался в локал фиксе (спасибо за технологии легендвар)
3. Теперь у меня много вопросов как он обновлял анимки в ЛВ а у меня нет XD
4. и все-же модельку иногда шейкает и смотрит она все время в права, и не важно включены АА или нет.

UPD: у меня в UpdateLocalAnimation есть переменная tickcount которая и должна обновлять анимки в определенное время, но есть мем) я забыл его обновлять) и он всегда будет равен 0. Да и сам способ не очень, сейчас проверю из-за него это иль нет.

UPD2: то что моделька смотрит в одну сторону я пофиксил, но при большом фпс все равно шейкает.

понять в чем проблема я так и не смогу, сегодня еще попробую.
Ну проблему я тебе определил, дальше сам делай)
 
Ну проблему я тебе определил, дальше сам делай)
C++:
Expand Collapse Copy
bool fresh_tick()
{
    static int old_tick_count;

    if (old_tick_count != I::Globals->iTickCount)
    {
        old_tick_count = I::Globals->iTickCount;
        return true;
    }

    return false;
}

void local_animations::update_local_animations(CCSGOPlayerAnimState* animstate)
{
    //animstate->flLastUpdateIncrement = std::max(0.f, I::Globals->flCurrentTime - animstate->flLastUpdateTime);

    if (fresh_tick) //-V550
    {
        //I::Globals->iTickCount = tickcount;

        memcpy(layers, G::pLocal->get_animlayers(), G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer)); //-V807

        if (local_data.animstate)
            animstate->flDuckAmount = local_data.animstate->flDuckAmount;

        animstate->iLastUpdateFrame = 0;

        utill::Update(animstate, local_animations::Get().local_data.fake_angles);

        if (real_server_update)
        {
            abs_angles = animstate->flGoalFeetYaw;
            memcpy(pose_parameter, &G::pLocal->GetPoseParameter(), 24 * sizeof(float));
        }

        //!local_animations::Get().bNewTick();

    }
    else
        animstate->iLastUpdateFrame = I::Globals->iFrameCount;

    animstate->flGoalFeetYaw = CAntiAim::Get().condition(G::pCmd) ? abs_angles : local_animations::Get().local_data.real_angles.y;

    G::pLocal->SetAbsAngles(QAngle(0.0f, abs_angles, 0.0f));

    // copy animation layers.
    memcpy(G::pLocal->get_animlayers(), layers, G::pLocal->GetAnimationOverlaysCount() * sizeof(CAnimationLayer));

    // copy pose parameters.
    memcpy(&G::pLocal->GetPoseParameter(), pose_parameter, 24 * sizeof(float));
}

Я понял в чем проблема, проверка на per tick не правильно работает.
Пробовал много методов но ничего не смог найти нормального.
 
Назад
Сверху Снизу