Гайд ThirdPerson collision fix

Псевдоадмин
Администратор
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
183
Реакции[?]
635
Поинты[?]
78K
Даю пасту копипасту ибо мне оно нах не надо:kappa:

Оффсеты должны быть валидные

Cam_Think hook
Пожалуйста, авторизуйтесь для просмотра ссылки.


TraceHull
Пожалуйста, авторизуйтесь для просмотра ссылки.


Извиняюсь за код :(

Это концепт. Есть метод сделать лучше :confused: так шо вот





 
bruh
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
1,299
Реакции[?]
365
Поинты[?]
0
Резерв на случай удаления с хастебина
Код:
void __stdcall hkCAM_Think()
{
    static auto ofunc = input_hook.get_original<CAMThink>(31);
    static auto cam_collision_cvar = g_CVar->FindVar("cam_collision");
        
    if (cam_collision_cvar->GetInt())
        cam_collision_cvar->InternalSetIntValue(0);

    *(bool*)((DWORD)g_Input + 0xA5) = true;

    ofunc(g_Input);
        
    //manual collision
    if (g_LocalPlayer)
    {
        Vector vecForward;
        Vector vecOrigin = g_LocalPlayer->GetRenderOrigin();
        vecOrigin += g_LocalPlayer->m_vecViewOffset();

        Math::AngleVectors(QAngle((*(float*)((DWORD)g_Input + 0xA8)), (*(float*)((DWORD)g_Input + 0xAC)), *(float*)((DWORD)g_Input + 0xB0)), vecForward);

        trace_t trace;

        Utils::UTIL_TraceHull(vecOrigin, vecOrigin - (vecForward * 130), Vector(-6, -6, -6), Vector(6, 6, 6), MASK_SOLID, g_LocalPlayer, &trace);

            *(float*)((DWORD)g_Input + 0xB0) = 120;

        if (trace.fraction < 1 && !trace.hit_entity->GetBaseEntity()->IsPlayer())
        {
            float result = *(float*)((DWORD)g_Input + 0xB0) *= trace.fraction;
        
            *(float*)((DWORD)g_Input + 0xB0) = result;

            if (result < 32)
            *(bool*)((DWORD)g_Input + 0xA5) = false;

            if(result > 120)
            *(float*)((DWORD)g_Input + 0xB0) = 120;

        }
    }
}
Код:
void UTIL_TraceHull(Vector &vecAbsStart, Vector &vecAbsEnd, Vector &hullMin, Vector &hullMax, unsigned int mask, IHandleEntity *ignore, trace_t *ptr)
{
    Ray_t ray;
    ray.Init(vecAbsStart, vecAbsEnd, hullMin, hullMax);
    CTraceFilter traceFilter;
    
    traceFilter.pSkip = ignore;

    g_EngineTrace->TraceRay(ray, mask, &traceFilter, ptr);
}
 
Сверху Снизу