Вопрос Лагает при использовании чамсов

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
28 Дек 2024
Сообщения
25
Реакции
0
До включения чамсов у меня 60-100 фпс, после проседает до 30 и ужастным фреймрейтом.
Вот чамсики

C++:
Expand Collapse Copy
struct CustomMaterial_t
{
    CStrongHandle<CMaterial2> pMaterial;
    CStrongHandle<CMaterial2> pMaterialInvisible;
};

static CustomMaterial_t arrMaterials[VISUAL_MATERIAL_MAX];

bool FEATURES::CHAMS::Initialize() {
    if (bInitialized)
        return bInitialized;

    arrMaterials[0] = CustomMaterial_t{
    .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatFlatVisible),
    .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatFlatInvisible)
    };

    arrMaterials[1] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatIlluminateVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatIlluminateInvisible)
    };

    arrMaterials[2] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatLatexVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatLatexInvisible)
    };

    arrMaterials[3] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGlowVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGlowInvisible)
    };

    arrMaterials[4] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGostVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGostInvisible)
    };

    arrMaterials[5] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatMetallicVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatMetallicInvisible)
    };

    arrMaterials[6] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGlassVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatGlassInvisible)
    };

    arrMaterials[7] = CustomMaterial_t{
        .pMaterial = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatNeonVisible),
        .pMaterialInvisible = CreateMaterial(_("materials/dev/primary_white.vmat"), szVMatNeonInvisible)
    };

    bInitialized = true;
    for (auto& [pMaterial, pMaterialInvisible] : arrMaterials) {
        if (pMaterial == nullptr || pMaterialInvisible == nullptr)
            bInitialized = false;
    }

    return bInitialized;
}

void FEATURES::CHAMS::Destroy() {
    for (auto& [pVisible, pInvisible] : arrMaterials) {
        if (pVisible)
            Interfaces::pResourceHandleUtils->DeleteResource(pVisible.pBinding);

        if (pInvisible)
            Interfaces::pResourceHandleUtils->DeleteResource(pInvisible.pBinding);
    }
}

CStrongHandle<CMaterial2> FEATURES::CHAMS::CreateMaterial(const char* szMaterialName, const char szVmatBuffer[]) {
    CKeyValues3* pKeyValues3 = CKeyValues3::CreateMaterialResource();
    pKeyValues3->LoadFromBuffer(szVmatBuffer);

    CStrongHandle<CMaterial2> pCustomMaterial = {};
    PatternManager.fnCreateMaterial(nullptr, &pCustomMaterial, szMaterialName, pKeyValues3, 0U, 1U);

    return pCustomMaterial;
}

void FEATURES::CHAMS::RenderChams(void* pAnimatableSceneObjectDesc, void* pDx11, CMeshData* arrMeshDraw, int nDataCount, void* pSceneView, void* pSceneLayer, void* pUnk, void* pUnk2) {
    const auto pOriginal = HookManager.hRenderObject.GetOriginal();

    if ((!CFG::bChams && !CFG::bArmsChams && !CFG::bWeaponChams) || !bInitialized || arrMeshDraw == nullptr || arrMeshDraw->pSceneAnimatableObject == nullptr)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    CBaseHandle hOwner = arrMeshDraw->pSceneAnimatableObject->hOwner;
    if (!hOwner.IsValid())
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    C_BaseEntity* pEntity = Interfaces::pGameResourceService->pGameEntitySystem->GetEntityByIndex(hOwner.GetEntryIndex()).as<C_BaseEntity*>();
    if (pEntity == nullptr)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    SchemaClassInfoData_t* pEntityInfo = pEntity->GetSchemaClassInfo();
    if (pEntityInfo == nullptr)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    if (STR::Compare(pEntityInfo->szName, "C_ViewmodelAttachmentModel")) {
        if (!CFG::bArmsChams) return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
        const CustomMaterial_t customMaterial = arrMaterials[CFG::nArmsChamsMat];

        arrMeshDraw->pMaterial = customMaterial.pMaterial;
        arrMeshDraw->colValue = Color_t(CFG::colArmsChamsColor.x, CFG::colArmsChamsColor.y, CFG::colArmsChamsColor.z, CFG::colArmsChamsColor.w);
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
    }

    if (STR::Compare(pEntityInfo->szName, "C_CSGOViewModel")) {
        if (!CFG::bWeaponChams) return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
        const CustomMaterial_t customMaterial = arrMaterials[CFG::nWeaponChamsMat];

        arrMeshDraw->pMaterial = customMaterial.pMaterial;
        arrMeshDraw->colValue = Color_t(CFG::colWeaponChamsColor.x, CFG::colWeaponChamsColor.y, CFG::colWeaponChamsColor.z, CFG::colWeaponChamsColor.w);
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
    }

    if (!STR::Compare(pEntityInfo->szName, "C_CSPlayerPawn") || !CFG::bChams)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    C_CSPlayerPawn* pPlayerPawn = reinterpret_cast<C_CSPlayerPawn*>(pEntity);
    if (pPlayerPawn == nullptr || (CFG::bChamsTeamCheck && HQVARS::pLocalPlayerPawn->GetTeam() == pPlayerPawn->GetTeam()) || pPlayerPawn->GetHealth() <= 0)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    const CustomMaterial_t customMaterial = arrMaterials[CFG::nChamsMaterial];

    // Invisible
    arrMeshDraw->pMaterial = customMaterial.pMaterialInvisible;
    arrMeshDraw->colValue = Color_t(CFG::colChamsInvisible.x, CFG::colChamsInvisible.y, CFG::colChamsInvisible.z, CFG::colChamsInvisible.w);
    pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    // Visible
    arrMeshDraw->pMaterial = customMaterial.pMaterial;
    arrMeshDraw->colValue = Color_t(CFG::colChamsVisible.x, CFG::colChamsVisible.y, CFG::colChamsVisible.z, CFG::colChamsVisible.w);
    pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    return;
}
Вот хук DrawObject'а
C++:
Expand Collapse Copy
void HQ_FASTCALL CHookManager::RenderObject(void* pAnimatableSceneObjectDesc, void* pDx11, CMeshData* arrMeshDraw, int nDataCount, void* pSceneView, void* pSceneLayer, void* pUnk, void* pUnk2) {
    const auto pOriginal = HookManager.hRenderObject.GetOriginal();

    if (!pEngineClient->IsConnected() || !pEngineClient->IsInGame())
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    if (HQVARS::pLocalPlayerController == nullptr || HQVARS::pLocalPlayerPawn == nullptr)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);

    FEATURES::CHAMS::RenderChams(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
}
 
слишком быстро анализирует и исключает nullptr и этим вызывает лаги сканив постоянно снова
 
слишком быстро анализирует и исключает nullptr и этим вызывает лаги сканив постоянно снова
Что порекомендуешь сделать? Разделить эту строку? Спасибо за ответ
C++:
Expand Collapse Copy
    if ((!CFG::bChams && !CFG::bArmsChams && !CFG::bWeaponChams) || !bInitialized || arrMeshDraw == nullptr || arrMeshDraw->pSceneAnimatableObject == nullptr)
        return pOriginal(pAnimatableSceneObjectDesc, pDx11, arrMeshDraw, nDataCount, pSceneView, pSceneLayer, pUnk, pUnk2);
 
Как будто ничего не поменялось :(
 
Не помогло, может ли это быть из-за CreateMove'а? Оптимизация тоже бы мне понадобилась, пока не понимаю
CreateMove code:
Expand Collapse Copy
bool HQ_FASTCALL CHookManager::CreateMove(CCSGOInput* pInput, int nSlot, CUserCmd* pUserCmd) {
    const auto pOriginal = HookManager.hCreateMove.GetOriginal();

    if (!pEngineClient->IsConnected() || !pEngineClient->IsInGame())
        return pOriginal(pInput, nSlot, pUserCmd);

    const int nLocalIndex = pEngineClient->GetLocalPlayer();
    CCSPlayerController* pLocalPlayerController = pGameResourceService->pGameEntitySystem->GetEntityByIndex(nLocalIndex).as<CCSPlayerController*>();
    if (!pLocalPlayerController)
        return pOriginal(pInput, nSlot, pUserCmd);

    CHandle<C_CSPlayerPawn> hLocalPlayerPawn =  pLocalPlayerController->GetPlayerPawnHandle();
    if (!hLocalPlayerPawn.IsValid())
        return pOriginal(pInput, nSlot, pUserCmd);

    const int nLocalPawnIndex = hLocalPlayerPawn.GetEntryIndex();
    C_CSPlayerPawn* pLocalPlayerPawn = pGameResourceService->pGameEntitySystem->GetEntityByIndex(nLocalPawnIndex).as<C_CSPlayerPawn*>();
    if (!pLocalPlayerPawn)
        return pOriginal(pInput, nSlot, pUserCmd);

    HQVARS::pLocalPlayerController = pLocalPlayerController;
    HQVARS::pLocalPlayerPawn = pLocalPlayerPawn;

    CMsgQAngle* pViewAngle = pUserCmd->csgoUserCmd.pBaseCmd->pViewAngles;
    if (pViewAngle == nullptr)
        return pOriginal(pInput, nSlot, pUserCmd);

    HQVARS::DATA::angValue = pViewAngle->angValue;

    FEATURES::MISC::BUNNYHOP::Run(pUserCmd);

    CRC::Save(pUserCmd->csgoUserCmd.pBaseCmd, pUserCmd);
    if (CRC::CalculateCRC(pUserCmd->csgoUserCmd.pBaseCmd))
        CRC::Apply(pUserCmd);

    return pOriginal(pInput, nSlot, pUserCmd);
}
 
Не помогло, может ли это быть из-за CreateMove'а? Оптимизация тоже бы мне понадобилась, пока не понимаю
CreateMove code:
Expand Collapse Copy
bool HQ_FASTCALL CHookManager::CreateMove(CCSGOInput* pInput, int nSlot, CUserCmd* pUserCmd) {
    const auto pOriginal = HookManager.hCreateMove.GetOriginal();

    if (!pEngineClient->IsConnected() || !pEngineClient->IsInGame())
        return pOriginal(pInput, nSlot, pUserCmd);

    const int nLocalIndex = pEngineClient->GetLocalPlayer();
    CCSPlayerController* pLocalPlayerController = pGameResourceService->pGameEntitySystem->GetEntityByIndex(nLocalIndex).as<CCSPlayerController*>();
    if (!pLocalPlayerController)
        return pOriginal(pInput, nSlot, pUserCmd);

    CHandle<C_CSPlayerPawn> hLocalPlayerPawn =  pLocalPlayerController->GetPlayerPawnHandle();
    if (!hLocalPlayerPawn.IsValid())
        return pOriginal(pInput, nSlot, pUserCmd);

    const int nLocalPawnIndex = hLocalPlayerPawn.GetEntryIndex();
    C_CSPlayerPawn* pLocalPlayerPawn = pGameResourceService->pGameEntitySystem->GetEntityByIndex(nLocalPawnIndex).as<C_CSPlayerPawn*>();
    if (!pLocalPlayerPawn)
        return pOriginal(pInput, nSlot, pUserCmd);

    HQVARS::pLocalPlayerController = pLocalPlayerController;
    HQVARS::pLocalPlayerPawn = pLocalPlayerPawn;

    CMsgQAngle* pViewAngle = pUserCmd->csgoUserCmd.pBaseCmd->pViewAngles;
    if (pViewAngle == nullptr)
        return pOriginal(pInput, nSlot, pUserCmd);

    HQVARS::DATA::angValue = pViewAngle->angValue;

    FEATURES::MISC::BUNNYHOP::Run(pUserCmd);

    CRC::Save(pUserCmd->csgoUserCmd.pBaseCmd, pUserCmd);
    if (CRC::CalculateCRC(pUserCmd->csgoUserCmd.pBaseCmd))
        CRC::Apply(pUserCmd);

    return pOriginal(pInput, nSlot, pUserCmd);
}
используй профилировщик производительности
 
даже если он проверку на хеш сделает, не сильно вырасти должно, ну не такие дичайшие просадки должны быть.
хеш ты калькулировать тоже из строки будешь? в чем тогда разница?

у тебя у энтити есть функции
IsPlayer/IsWeapon etc которые через виртуальные функции оверрайдятся для нужных классов и получение результата - дело всего пары инструкций.
так же если углубиться можно увидеть, что в глубине CEntityIdentity находится информация о классе и айди. можно сравнить его с нужным тебе. и это все ещё быстрее чем сравнивать строчки
 
хеш ты калькулировать тоже из строки будешь? в чем тогда разница?
калькуляция хеша, будет меньше времени исполнения занимать, да и пространства в дате под строки (т.к. исходная строка на компайл тайме будет хешироватся).
алсо за кс2 не шарю, поэтому предложил такой вариант.
 
хеш ты калькулировать тоже из строки будешь? в чем тогда разница?

у тебя у энтити есть функции
IsPlayer/IsWeapon etc которые через виртуальные функции оверрайдятся для нужных классов и получение результата - дело всего пары инструкций.
так же если углубиться можно увидеть, что в глубине CEntityIdentity находится информация о классе и айди. можно сравнить его с нужным тебе. и это все ещё быстрее чем сравнивать строчки
т.е. мне хэши юзать?
 
калькуляция хеша, будет меньше времени исполнения занимать, да и пространства в дате под строки (т.к. исходная строка на компайл тайме будет хешироватся).
алсо за кс2 не шарю, поэтому предложил такой вариант.
все зависит от длины строки

например сравнить строчку
"asdasdasdasdasdasdasdasdasdasd"
с "dsadsadsadsadsasdadsadsadsadsa"
будет быстрее чем собрать от первой строки хеш, и сверить с хешем второй строки который будет просчитан на компайл тайме

почему? у тебя в строке первые байты сразу не сходятся, значит мы скипаем и строка уже не будет совпадать
а в случае с хешем, нам сначала от всей строки нужно просчитать хеш(напомню тот же фнв побайтово будет это делать до нулл-терминатора), и после уже сравнить с тем что уже был просчитан на компиляции.

лучшим вариантом тут будет проверять что за энтити через виртуальные функции, или какие-то иные числовые значения которые в случае сурс2 доступны

так же есть хардкорный вариант, например в случае с
if (!STR::Compare(pEntityInfo->szName, "C_CSPlayerPawn") || !CFG::bChams)

сделать проверку такого вида:
Код:
Expand Collapse Copy
if(pEntityInfo->szName[0] == 'C' && pEntityInfo->szName[2] == 'C' && pEntityInfo->szName[4] == 'P' && pEntityInfo->szName[10] == 'P')

но все это зависит от компилятора и настроек
 
все зависит от длины строки

например сравнить строчку
"asdasdasdasdasdasdasdasdasdasd"
с "dsadsadsadsadsasdadsadsadsadsa"
будет быстрее чем собрать от первой строки хеш, и сверить с хешем второй строки который будет просчитан на компайл тайме

почему? у тебя в строке первые байты сразу не сходятся, значит мы скипаем и строка уже не будет совпадать
а в случае с хешем, нам сначала от всей строки нужно просчитать хеш(напомню тот же фнв побайтово будет это делать до нулл-терминатора), и после уже сравнить с тем что уже был просчитан на компиляции.

лучшим вариантом тут будет проверять что за энтити через виртуальные функции, или какие-то иные числовые значения которые в случае сурс2 доступны

так же есть хардкорный вариант, например в случае с


сделать проверку такого вида:
Код:
Expand Collapse Copy
if(pEntityInfo->szName[0] == 'C' && pEntityInfo->szName[2] == 'C' && pEntityInfo->szName[4] == 'P' && pEntityInfo->szName[10] == 'P')

но все это зависит от компилятора и настроек
Могу еще сказать, что лагает и без чамсов, предположительно из за CreateMove. Спасибо за ответ!
 
Назад
Сверху Снизу