#include "include/hooks.h" #include "include/sdk.h" #include "include/globals.h" #include "include/util.h" #include "include/cvars.h" #include "include/detour.h" /* 8dcc/detour-lib */ #include "features/features.h" /* bhop(), esp(), etc. */ /* Normal VMT hooks */ DECL_HOOK(CL_CreateMove); DECL_HOOK(HUD_Redraw); DECL_HOOK(StudioRenderModel); /* OpenGL hooks */ DECL_HOOK(glColor4f); /* Detour hooks */ static detour_data_t detour_data_clmove; DECL_DETOUR_TYPE(void, clmove_type); DECL_HOOK(CL_Move); /*----------------------------------------------------------------------------*/ bool hooks_init(void) { /* VMT hooking */ HOOK(i_client, CL_CreateMove); HOOK(i_client, HUD_Redraw); HOOK(i_studiomodelrenderer, StudioRenderModel); /* OpenGL hooks */ GL_HOOK(glColor4f); /* Detour hooks */ void* clmove_ptr = dlsym(hw, "CL_Move"); if (!clmove_ptr) return false; /* Initialize detour_data_clmove struct for detour, and add the hook */ detour_init(&detour_data_clmove, clmove_ptr, (void*)h_CL_Move); detour_add(&detour_data_clmove); return true; } void hooks_restore(void) { detour_del(&detour_data_clmove); } /*----------------------------------------------------------------------------*/ void h_CL_CreateMove(float frametime, usercmd_t* cmd, int active) { ORIGINAL(CL_CreateMove, frametime, cmd, active); vec3_t old_angles = cmd->viewangles; /* Declared in globals.c */ localplayer = i_engine->GetLocalPlayer(); bhop(cmd); aimbot(cmd); correct_movement(cmd, old_angles); vec_clamp(cmd->viewangles); } /*----------------------------------------------------------------------------*/ int h_HUD_Redraw(float time, int intermission) { int ret = ORIGINAL(HUD_Redraw, time, intermission); /* Watermark */ engine_draw_text(5, 5, "8dcc/hl-cheat", (rgb_t){ 255, 255, 255 }); esp(); custom_crosshair(); return ret; } /*----------------------------------------------------------------------------*/ void h_StudioRenderModel(void* this_ptr) { if (!chams(this_ptr)) ORIGINAL(StudioRenderModel, this_ptr); } /*----------------------------------------------------------------------------*/ void h_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { /* This visible_mode variable is changed inside the chams() function, which * is called from the StudioRenderModel hook. * * Depending on the type of entity we are trying to render from there, and * depending on its visibility, we change this visible_mode variable. */ switch (visible_mode) { case ENEMY_VISIBLE: r = 0.40f; g = 0.73f; b = 0.41f; break; case ENEMY_NOT_VISIBLE: r = 0.90f; g = 0.07f; b = 0.27f; break; case FRIEND_VISIBLE: r = 0.16f; g = 0.71f; b = 0.96f; break; case FRIEND_NOT_VISIBLE: r = 0.10f; g = 0.20f; b = 0.70f; break; case HANDS: /* Multiply by original func parameters for non-flat chams. * Credits: @oxiKKK */ r *= 0.94f; g *= 0.66f; b *= 0.94f; break; default: case NONE: break; } ORIGINAL(glColor4f, r, g, b, a); } /*----------------------------------------------------------------------------*/ void h_CL_Move() { if (cv_clmove->value != 0) { for (int i = 0; i < (int)cv_clmove->value; i++) CALL_ORIGINAL(detour_data_clmove, clmove_type); } CALL_ORIGINAL(detour_data_clmove, clmove_type); }