Автоматическая последовательность анимации ножей

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2018
Сообщения
624
Реакции
133
Вроде как спастил, всё правильно прописал
И всё равно не работает, вот код и паттерны:

C++:
Expand Collapse Copy
void CSkins::RecvProxy_Viewmodel(CRecvProxyData *pData, void *pStruct, void *pOut)
{
    if (CGlobal::IsGameReady)
    {
        // Get the knife view model id's
        int default_t = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_default_t.mdl");
        int default_ct = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_default_ct.mdl");
        int iBayonet = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_bayonet.mdl");
        int iCSS = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_css.mdl");
        int iButterfly = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_butterfly.mdl");
        int iFlip = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_flip.mdl");
        int iGut = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_gut.mdl");
        int iKarambit = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_karam.mdl");
        int iM9Bayonet = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_m9_bay.mdl");
        int iHuntsman = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_tactical.mdl");
        int iFalchion = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_falchion_advanced.mdl");
        int iDagger = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_push.mdl");
        int iCord = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_cord.mdl");
        int iCanis = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_canis.mdl");
        int iUrsus = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_ursus.mdl");
        int iBowie = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_survival_bowie.mdl");
        int iGunGame = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_gg.mdl");
        int iNavaja = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_gypsy_jackknife.mdl");
        int iOutdoor = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_outdoor.mdl");
        int iStiletto = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_stiletto.mdl");
        int iTalon = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_widowmaker.mdl");
        int iSkeleton = I::ModelInfo()->GetModelIndex("models/weapons/v_knife_skeleton.mdl");

        CBaseEntity* pLocal = (CBaseEntity*)I::EntityList()->GetClientEntity(I::Engine()->GetLocalPlayer());
        if (pLocal)
        {
            bool IsTT = pLocal->GetTeam() == 2;
            int sel_mod = IsTT ? SelectedKnifeModelTT : SelectedKnifeModelCT;

            if (!pLocal->IsDead() && sel_mod && (
                pData->m_Value.m_Int == default_t ||
                pData->m_Value.m_Int == default_ct ||
                pData->m_Value.m_Int == iBayonet ||
                pData->m_Value.m_Int == iCSS ||
                pData->m_Value.m_Int == iFlip ||
                pData->m_Value.m_Int == iGunGame ||
                pData->m_Value.m_Int == iGut ||
                pData->m_Value.m_Int == iKarambit ||
                pData->m_Value.m_Int == iM9Bayonet ||
                pData->m_Value.m_Int == iHuntsman ||
                pData->m_Value.m_Int == iBowie ||
                pData->m_Value.m_Int == iButterfly ||
                pData->m_Value.m_Int == iFalchion ||
                pData->m_Value.m_Int == iDagger ||
                pData->m_Value.m_Int == iCord ||
                pData->m_Value.m_Int == iCanis ||
                pData->m_Value.m_Int == iUrsus ||
                pData->m_Value.m_Int == iNavaja ||
                pData->m_Value.m_Int == iOutdoor ||
                pData->m_Value.m_Int == iStiletto ||
                pData->m_Value.m_Int == iTalon ||
                pData->m_Value.m_Int == iSkeleton))
            {
                int sel_mod = IsTT ? SelectedKnifeModelTT : SelectedKnifeModelCT;
                int mdl_idx = GetKnifeModelIdx(sel_mod, IsTT);

                pData->m_Value.m_Int = mdl_idx;
            }
        }
    }
}

void remapping(CRecvProxyData* data, CBaseViewModel* entity)
{
    const auto pLocal = (CBaseEntity*)I::EntityList()->GetClientEntity(I::Engine()->GetLocalPlayer());

    if (!pLocal || pLocal->IsDead())
        return;

    const auto pOwner = I::EntityList()->GetClientEntityFromHandle((PVOID)entity->GetOwner());
    if (!pOwner)
        return;

    const auto pViewModel = I::EntityList()->GetClientEntityFromHandle((PVOID)entity->GetWeapon());
    if (!pViewModel)
        return;

    auto& sequence = data->m_Value.m_Int;

    int original_activity = entity->GetSequenceActivity(sequence);

    int new_activity = 1;
    int num = 0;

    for (size_t i = 0; i < 20; i++)
    {
        int temp_actitivity = entity->GetSequenceActivity(i);
        if (original_activity != -1 && original_activity == temp_actitivity || original_activity == -1 && temp_actitivity == 213)
        {
            new_activity = i;
            for (size_t t = 0; t < 4; t++)
                if (entity->GetSequenceActivity(i + t) == temp_actitivity)
                    num++;
            break;
        }
    }

    if (original_activity == -1 && new_activity == 1)
        new_activity = sequence;

    if (!num)
        sequence = new_activity;
    else
        sequence = random_sequence(new_activity, new_activity + num - 1);

    entity->SendViewModelMatchingSequence(sequence);
}

void Hook_SetViewModelSequence(const CRecvProxyData* const_data, void* structure, void* out)
{
    const auto data = const_cast<CRecvProxyData*>(const_data);
    const auto view_model = static_cast<CBaseViewModel*>(structure);

    remapping(data, view_model);

    fnSequenceProxyFn->GetTrampoline()(data, structure, out);
}



    for (ClientClass* pClass = I::Client()->GetAllClasses(); pClass; pClass = pClass->m_pNext)
    {
        if (!strcmp(pClass->m_pNetworkName, XorStr("CBaseViewModel")))
        {
            // Search for the 'm_nModelIndex' property.
            RecvTable* pClassTable = pClass->m_pRecvTable;

            for (int nIndex = 0; nIndex < pClassTable->m_nProps; nIndex++) {
                RecvProp* pProp = &pClassTable->m_pProps[nIndex];

                if (!pProp || strcmp(pProp->m_pVarName, XorStr("m_nSequence")))
                    continue;

                auto& pContext = cContext::GetInstance();
                pContext.ApplyDetour<RecvVarProxyFn>((RecvVarProxyFn)pProp->m_ProxyFn,
                    reinterpret_cast<RecvVarProxyFn>(
                        Hook_SetViewModelSequence),
                    &fnSequenceProxyFn);
                break;
            }
            break;
        }
    }
C++:
Expand Collapse Copy
    int IClientEntity::GetSequenceActivity(int sequence)
    {
        studiohdr_t* hdr = I::ModelInfo()->GetStudioModel(this->GetModel());

        if (!hdr)
            return -1;

        static auto GetSequenceActivity = reinterpret_cast<int(__fastcall*)(void*, studiohdr_t*, int)>(
            CSX::Memory::FindPatternV2(XorStr("client_panorama.dll"), XorStr("55 8B EC 53 8B 5D 08 56 8B F1 83")));

        return GetSequenceActivity(this, hdr, sequence);
    }
C++:
Expand Collapse Copy
    void CBaseViewModel::SendViewModelMatchingSequence(int Sequence)
    {
        VirtualFn(void)(PVOID, int);
        GetMethod<OriginalFn>(this, 246)(this, Sequence);
    }
 
Назад
Сверху Снизу