2023-07-20 11:44:04 -04:00
|
|
|
|
|
|
|
#include "include/hooks.h"
|
|
|
|
#include "include/sdk.h"
|
|
|
|
#include "include/globals.h"
|
2023-07-24 04:15:03 -04:00
|
|
|
#include "include/util.h"
|
2023-07-25 14:36:44 -04:00
|
|
|
#include "include/detour.h" /* 8dcc/detour-lib */
|
2023-07-20 11:44:04 -04:00
|
|
|
|
2023-07-22 10:23:15 -04:00
|
|
|
/* bhop(), esp(), etc. */
|
|
|
|
#include "features/features.h"
|
2023-07-20 17:21:01 -04:00
|
|
|
|
2023-07-20 11:44:04 -04:00
|
|
|
DECL_HOOK(CL_CreateMove);
|
2023-07-21 09:42:01 -04:00
|
|
|
DECL_HOOK(HUD_Redraw);
|
2023-07-24 10:17:57 -04:00
|
|
|
DECL_HOOK(StudioRenderModel);
|
2023-07-20 11:44:04 -04:00
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
DECL_HOOK(glColor4f);
|
|
|
|
|
2023-07-25 14:36:44 -04:00
|
|
|
/* For detour hooking CL_Move */
|
|
|
|
static detour_data_t clmove_data;
|
|
|
|
DECL_DETOUR_TYPE(void, clmove);
|
|
|
|
DECL_HOOK(CL_Move);
|
|
|
|
|
2023-07-20 11:44:04 -04:00
|
|
|
bool hooks_init(void) {
|
2023-07-20 14:25:49 -04:00
|
|
|
HOOK(i_client, CL_CreateMove);
|
2023-07-21 09:42:01 -04:00
|
|
|
HOOK(i_client, HUD_Redraw);
|
2023-07-24 10:17:57 -04:00
|
|
|
HOOK(i_studiomodelrenderer, StudioRenderModel);
|
2023-07-20 11:44:04 -04:00
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
GL_HOOK(glColor4f);
|
|
|
|
|
2023-07-25 14:36:44 -04:00
|
|
|
void* clmove_ptr = dlsym(hw, "CL_Move");
|
|
|
|
if (!clmove_ptr)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
/* Initialize clmove_data struct for detour, and add the hook */
|
|
|
|
detour_init(&clmove_data, clmove_ptr, (void*)h_CL_Move);
|
|
|
|
detour_add(&clmove_data);
|
|
|
|
|
2023-07-20 11:44:04 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2023-07-25 14:36:44 -04:00
|
|
|
void hooks_restore(void) {
|
|
|
|
detour_del(&clmove_data);
|
|
|
|
}
|
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
2023-07-20 11:44:04 -04:00
|
|
|
void h_CL_CreateMove(float frametime, usercmd_t* cmd, int active) {
|
|
|
|
ORIGINAL(CL_CreateMove, frametime, cmd, active);
|
2023-07-20 17:21:01 -04:00
|
|
|
|
2023-07-23 09:50:01 -04:00
|
|
|
vec3_t old_angles = cmd->viewangles;
|
|
|
|
|
2023-07-20 17:30:44 -04:00
|
|
|
/* Declared in globals.c */
|
|
|
|
localplayer = i_engine->GetLocalPlayer();
|
|
|
|
|
2023-07-20 17:21:01 -04:00
|
|
|
bhop(cmd);
|
2023-07-23 09:50:01 -04:00
|
|
|
|
|
|
|
correct_movement(cmd, old_angles);
|
2023-07-24 04:15:03 -04:00
|
|
|
vec_clamp(cmd->viewangles);
|
2023-07-20 11:44:04 -04:00
|
|
|
}
|
2023-07-21 09:42:01 -04:00
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
2023-07-21 09:42:01 -04:00
|
|
|
int h_HUD_Redraw(float time, int intermission) {
|
|
|
|
int ret = ORIGINAL(HUD_Redraw, time, intermission);
|
|
|
|
|
|
|
|
/* Watermark */
|
|
|
|
i_engine->pfnDrawSetTextColor(1, 1, 1);
|
|
|
|
i_engine->pfnDrawConsoleString(5, 5, "8dcc/hl-cheat");
|
|
|
|
|
2023-07-23 09:54:56 -04:00
|
|
|
#ifdef DEBUG
|
2023-07-22 10:06:18 -04:00
|
|
|
char pos[100];
|
|
|
|
sprintf(pos, "x: %f, y: %f, z: %f", localplayer->origin[0],
|
|
|
|
localplayer->origin[1], localplayer->origin[2]);
|
|
|
|
|
|
|
|
i_engine->pfnDrawSetTextColor(1, 1, 1);
|
|
|
|
i_engine->pfnDrawConsoleString(5, 20, pos);
|
2023-07-23 09:54:56 -04:00
|
|
|
#endif
|
2023-07-22 10:06:18 -04:00
|
|
|
|
|
|
|
esp();
|
|
|
|
|
2023-07-21 09:42:01 -04:00
|
|
|
return ret;
|
|
|
|
}
|
2023-07-24 10:17:57 -04:00
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
2023-07-24 10:17:57 -04:00
|
|
|
void h_StudioRenderModel(void* this_ptr) {
|
2023-07-24 11:03:22 -04:00
|
|
|
if (!chams(this_ptr))
|
|
|
|
ORIGINAL(StudioRenderModel, this_ptr);
|
2023-07-24 10:17:57 -04:00
|
|
|
}
|
2023-07-25 08:20:38 -04:00
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
void h_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
|
2023-07-25 08:46:37 -04:00
|
|
|
/* 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 VISIBLE:
|
|
|
|
r = 0.40f;
|
|
|
|
g = 0.73f;
|
|
|
|
b = 0.41f;
|
|
|
|
break;
|
|
|
|
case NOT_VISIBLE:
|
|
|
|
r = 0.90f;
|
|
|
|
g = 0.07f;
|
|
|
|
b = 0.27f;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
case NONE:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-07-25 08:20:38 -04:00
|
|
|
ORIGINAL(glColor4f, r, g, b, a);
|
|
|
|
}
|
2023-07-25 14:36:44 -04:00
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
void h_CL_Move() {
|
|
|
|
/* printf("Hello from CL_Move!\n"); */
|
|
|
|
CALL_ORIGINAL(clmove_data, clmove);
|
|
|
|
}
|