195 lines
5.3 KiB
C
195 lines
5.3 KiB
C
|
|
#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);
|
|
DECL_HOOK(CalcRefdef);
|
|
DECL_HOOK(HUD_PostRunCmd);
|
|
|
|
/* 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);
|
|
HOOK(i_client, CalcRefdef);
|
|
HOOK(i_client, HUD_PostRunCmd);
|
|
|
|
/* 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);
|
|
bullet_tracers(cmd);
|
|
|
|
correct_movement(cmd, old_angles);
|
|
vec_clamp(cmd->viewangles);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
rgb_t rainbow_color(float time) {
|
|
const float frequency = 0.1f;
|
|
|
|
unsigned char r = (sin(frequency * time + 0) * 127.5f + 127.5f);
|
|
unsigned char g = (sin(frequency * time + 2.0f) * 127.5f + 127.5f);
|
|
unsigned char b = (sin(frequency * time + 4.0f) * 127.5f + 127.5f);
|
|
|
|
return (rgb_t){ r, g, b };
|
|
}
|
|
|
|
int h_HUD_Redraw(float time, int intermission) {
|
|
int ret = ORIGINAL(HUD_Redraw, time, intermission);
|
|
|
|
if (dz_watermark->value) {
|
|
/* Determine the color for the watermark */
|
|
rgb_t color;
|
|
|
|
if (dz_watermark_rainbow->value) {
|
|
color = rainbow_color(time);
|
|
} else {
|
|
color = (rgb_t){ 0, 255, 255 }; // default color
|
|
}
|
|
|
|
/* Watermark */
|
|
engine_draw_text(5, 5, "https://git.deadzone.lol/Wizzard/goldsource-cheat", color);
|
|
}
|
|
|
|
esp();
|
|
custom_crosshair();
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
void h_StudioRenderModel(void* this_ptr) {
|
|
if (!chams(this_ptr))
|
|
ORIGINAL(StudioRenderModel, this_ptr);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
void h_CalcRefdef(ref_params_t* params) {
|
|
/* Store punch angles for CreateMove */
|
|
vec_copy(g_punchAngles, params->punchangle);
|
|
|
|
ORIGINAL(CalcRefdef, params);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
void h_HUD_PostRunCmd(struct local_state_s* from, struct local_state_s* to,
|
|
struct usercmd_s* cmd, int runfuncs, double time,
|
|
unsigned int random_seed) {
|
|
ORIGINAL(HUD_PostRunCmd, from, to, cmd, runfuncs, time, random_seed);
|
|
|
|
g_flCurrentTime = time;
|
|
|
|
/* Store attack information to check if we can shoot */
|
|
if (runfuncs) {
|
|
g_flNextAttack = to->client.m_flNextAttack;
|
|
g_flNextPrimaryAttack =
|
|
to->weapondata[to->client.m_iId].m_flNextPrimaryAttack;
|
|
g_iClip = to->weapondata[to->client.m_iId].m_iClip;
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
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 (dz_clmove->value != 0) {
|
|
for (int i = 0; i < (int)dz_clmove->value; i++)
|
|
CALL_ORIGINAL(detour_data_clmove, clmove_type);
|
|
}
|
|
|
|
CALL_ORIGINAL(detour_data_clmove, clmove_type);
|
|
}
|