Compare commits
	
		
			54 Commits
		
	
	
		
			release2
			...
			21d9cac264
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 21d9cac264 | ||
|  | 8a5b96505b | ||
|  | 72dc42006f | ||
|  | 1c4bc57713 | ||
|  | d9339d0d5a | ||
|  | 44e5dc34c0 | ||
|  | 17b4e4e3a3 | ||
|  | 0b0664e4cf | ||
|  | d3b6c64003 | ||
|  | f93a21ce16 | ||
|  | 87208744e1 | ||
|  | f7fc075c4a | ||
|  | f26da3e84f | ||
|  | e440b15a9d | ||
|  | 1d99e0758a | ||
|  | 9a109b3882 | ||
|  | 36459f0d6a | ||
|  | 3bd0fe52da | ||
|  | 88bdad24b1 | ||
|  | a898563249 | ||
|  | 2401ecf71e | ||
| 4b54871340 | |||
|  | a09d80fbfa | ||
|  | 7fc0a14ae6 | ||
|  | 7239d610a8 | ||
|  | 3aaf7c8346 | ||
|  | a5234c16a3 | ||
|  | f38678d727 | ||
|  | e43cea56f8 | ||
|  | c5e985bc42 | ||
|  | c1ff555e17 | ||
|  | b7bac66484 | ||
|  | a688d94e9d | ||
|  | deccfca8e3 | ||
|  | b29f71e597 | ||
|  | c7ee48dfa6 | ||
|  | a7b30ca7f8 | ||
|  | 1f3e531610 | ||
|  | 0e7f955c7d | ||
|  | f0485a3f36 | ||
|  | 02888c1158 | ||
|  | b9851de177 | ||
|  | 56f8ae79d7 | ||
|  | f9db9ff1b6 | ||
|  | 29a40f63da | ||
|  | b7c6e74dd4 | ||
|  | 510243c46d | ||
|  | fb6ed02dd4 | ||
|  | 42a7961142 | ||
|  | da6cf86910 | ||
|  | 3414d131f4 | ||
|  | 83278b9983 | ||
|  | 4bb21a4ca6 | ||
|  | 51c302f492 | 
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ INCLUDES=-Isrc/include/sdk/common -Isrc/include/sdk/public -Isrc/include/sdk/pm_ | |||||||
| CFLAGS=-Wall -Wextra -Wno-write-strings -m32 -fPIC $(INCLUDES) | CFLAGS=-Wall -Wextra -Wno-write-strings -m32 -fPIC $(INCLUDES) | ||||||
| LDFLAGS=-lm | LDFLAGS=-lm | ||||||
|  |  | ||||||
| OBJS=obj/main.c.o obj/globals.c.o obj/cvars.c.o obj/hooks.c.o obj/detour.c.o obj/util.c.o obj/features/movement.c.o obj/features/esp.c.o obj/features/chams.c.o obj/features/aim.c.o obj/features/misc.c.o | OBJS=obj/main.c.o obj/globals.c.o obj/cvars.c.o obj/hooks.c.o obj/detour.c.o obj/util.c.o obj/features/movement.c.o obj/features/anti_aim.c.o obj/features/namechanger.c.o obj/features/esp.c.o obj/features/chams.c.o obj/features/aim.c.o obj/features/misc.c.o obj/game_detection.c.o | ||||||
| BIN=libhlcheat.so | BIN=libhlcheat.so | ||||||
|  |  | ||||||
| .PHONY: clean all inject | .PHONY: clean all inject | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								README.org
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								README.org
									
									
									
									
									
								
							| @@ -1,14 +1,21 @@ | |||||||
| #+title: Half-Life cheat | #+title: Half-Life cheat (Original author: [[https://github.com/8dcc/][8dcc]]) | ||||||
| #+options: toc:nil | #+options: toc:nil | ||||||
| #+startup: showeverything | #+startup: showeverything | ||||||
| #+author: 8dcc | #+author: Wizzard | ||||||
|  |  | ||||||
| *Linux cheat for Half-Life 1 (and goldsrc).* | *Linux cheat for goldsrc games.* | ||||||
|  |  | ||||||
| #+TOC: headlines 2 | #+TOC: headlines 2 | ||||||
|  |  | ||||||
| * Description | * Description | ||||||
| Simple linux cheat for Half-Life 1 (and most /goldsrc/ games) made in C. | Simple linux cheat for most goldsrc games, made in C. | ||||||
|  |  | ||||||
|  | Supported games: | ||||||
|  | - [[https://store.steampowered.com/app/70/HalfLife/][Half-Life 1]] | ||||||
|  | - [[https://store.steampowered.com/app/10/CounterStrike/][Counter-Strike 1.6]] | ||||||
|  | - [[https://store.steampowered.com/app/20/Team_Fortress_Classic/][Team Fortress Classic]] | ||||||
|  | - [[https://store.steampowered.com/app/30/Day_of_Defeat/][Day of Defeat]] | ||||||
|  | - [[https://store.steampowered.com/app/40/Deathmatch_Classic/][Deathmatch Classic]] | ||||||
|  |  | ||||||
| This project was heavily inspired by [[https://github.com/UnkwUsr/hlhax][UnkwUsr/hlhax]], and would not have been | This project was heavily inspired by [[https://github.com/UnkwUsr/hlhax][UnkwUsr/hlhax]], and would not have been | ||||||
| possible without his help. Make sure to check out his repo too. | possible without his help. Make sure to check out his repo too. | ||||||
| @@ -17,36 +24,46 @@ Also make sure to check out [[https://github.com/deboogerxyz/ahc][deboogerxyz/ah | |||||||
|  |  | ||||||
| * Features | * Features | ||||||
|  |  | ||||||
| | Feature    | Command       | Values (0..n)          | | | Feature    | Command                | Values                | | ||||||
| |------------+---------------+------------------------| | |------------|------------------------|-----------------------| | ||||||
| | Bhop       | =cv_bhop=       | off/on                 | | | Bhop       | =dz_movement_bhop=     | off/on                | | ||||||
| | Autostrafe | =cv_autostrafe= | off/rage/legit         | | | Autostrafe | =dz_movement_autostrafe= | off/rage/legit        | | ||||||
| | Aimbot     | =cv_aimbot=     | off/fov*               | | | Aimbot     | =dz_aim_aimbot=        | off/fov               | | ||||||
| | ESP        | =cv_esp=        | off/3d-box/name/all    | | | Autoshoot  | =dz_aim_autoshoot=     | off/on                | | ||||||
| | Chams      | =cv_chams=      | off/players/hands/all* | | | ESP        | =dz_visuals_esp=       | off/3d-box/name/all   | | ||||||
| | Crosshair  | =cv_crosshair=  | off/length             | | | Chams      | =dz_visuals_chams=     | off/players/hands/all | | ||||||
| | Tracers    | =cv_tracers=    | off/on*                | | | Crosshair  | =dz_visuals_crosshair= | off/length            | | ||||||
|  | | Tracers    | =dz_visuals_tracers=   | off/on                | | ||||||
|  | | Namechanger| =dz_misc_namechanger=  | off/team/enemy/all    | | ||||||
|  |  | ||||||
| #+begin_quote | #+begin_quote | ||||||
| *Note:* Aimbot FOV goes from 0 (off) to 180 (all enemies) | *Note:* Aimbot FOV goes from 0 (off) to 180 (all enemies) | ||||||
| #+end_quote | #+end_quote | ||||||
|  |  | ||||||
|  | #+begin_quote | ||||||
|  | *Note:* If =dz_autoshoot= is enabled, and =dz_aimbot= is enabled, it will stop | ||||||
|  | attacking if there is no visible target. | ||||||
|  | #+end_quote | ||||||
|  |  | ||||||
| #+begin_quote | #+begin_quote | ||||||
| *Note:* Chams color can be changed from the =h_glColor4f()= function inside | *Note:* Chams color can be changed from the =h_glColor4f()= function inside | ||||||
| [[https://github.com/8dcc/hl-cheat/blob/main/src/hooks.c][src/hooks.c]]. Since this cheat is not hard to compile, I rather have less | [[https://git.deadzone.lol/Wizzard/goldsource-cheat/src/branch/main/src/hooks.c][src/hooks.c]]. Since this cheat is not hard to compile, I rather have less | ||||||
| console variables than more customization at runtime. | console variables than more customization at runtime. | ||||||
| #+end_quote | #+end_quote | ||||||
|  |  | ||||||
| #+begin_quote | #+begin_quote | ||||||
| *Note:* Bullet tracer color, width and time can be changed at the bottom of the | *Note:* Bullet tracer color, width and time can be changed at the bottom of the | ||||||
| =bullet_tracers()= function inside [[https://github.com/8dcc/hl-cheat/blob/main/src/features/misc.c][src/features/misc.c]]. See previous chams note. | =bullet_tracers()= function inside [[https://git.deadzone.lol/Wizzard/goldsource-cheat/src/branch/main/src/features/misc.c][src/features/misc.c]]. See previous chams note. | ||||||
|  | #+end_quote | ||||||
|  |  | ||||||
|  | #+begin_quote | ||||||
|  | *Note:* You can disable the watermark with dz_watermark 0 | ||||||
| #+end_quote | #+end_quote | ||||||
|  |  | ||||||
| * Building | * Building | ||||||
| #+begin_src console | #+begin_src console | ||||||
| $ git clone --recurse-submodules https://github.com/8dcc/hl-cheat | $ git clone --recurse-submodules https://git.deadzone.lol/Wizzard/goldsource-cheat | ||||||
| $ cd hl-cheat | $ cd goldsource-cheat | ||||||
| $ make | $ make | ||||||
| ... | ... | ||||||
| #+end_src | #+end_src | ||||||
| @@ -55,7 +72,7 @@ Note that you will need to clone with =--recurse-submodules= for the sdk. If you | |||||||
| have already cloned it, you can just: | have already cloned it, you can just: | ||||||
|  |  | ||||||
| #+begin_src console | #+begin_src console | ||||||
| $ cd hl-cheat | $ cd goldsource-cheat | ||||||
| $ git submodule update --init --recursive | $ git submodule update --init --recursive | ||||||
| #+end_src | #+end_src | ||||||
|  |  | ||||||
| @@ -68,5 +85,5 @@ $ ./injector.sh | |||||||
|  |  | ||||||
| ... | ... | ||||||
|  |  | ||||||
| hl-cheat loaded! | goldsource-cheat loaded! | ||||||
| #+end_src | #+end_src | ||||||
|   | |||||||
| @@ -30,7 +30,7 @@ if [ "$1" == "unload" ]; then | |||||||
| fi | fi | ||||||
|  |  | ||||||
| if grep -q "$libpath" "/proc/$pid/maps"; then | if grep -q "$libpath" "/proc/$pid/maps"; then | ||||||
|     echo -e "hl-cheat already loaded. Reloading...\n"; |     echo -e "goldsource-cheat already loaded. Reloading...\n"; | ||||||
|  |  | ||||||
|     # 0x2 -> RTLD_NOW |     # 0x2 -> RTLD_NOW | ||||||
|     # 0x6 -> RTLD_LAZY | RTLD_NOLOAD |     # 0x6 -> RTLD_LAZY | RTLD_NOLOAD | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								src/cvars.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/cvars.c
									
									
									
									
									
								
							| @@ -2,25 +2,50 @@ | |||||||
| #include "include/cvars.h" | #include "include/cvars.h" | ||||||
| #include "include/sdk.h" | #include "include/sdk.h" | ||||||
| #include "include/globals.h" | #include "include/globals.h" | ||||||
|  | #include "include/game_detection.h" | ||||||
|  |  | ||||||
|  | DECL_CVAR(movement_bhop); | ||||||
|  | DECL_CVAR(movement_autostrafe); | ||||||
|  | DECL_CVAR(aim_aimbot); | ||||||
|  | DECL_CVAR(aim_autoshoot); | ||||||
|  | DECL_CVAR(visuals_esp); | ||||||
|  | DECL_CVAR(visuals_chams); | ||||||
|  | DECL_CVAR(visuals_crosshair); | ||||||
|  | DECL_CVAR(visuals_tracers); | ||||||
|  | DECL_CVAR(movement_clmove); | ||||||
|  | DECL_CVAR(watermark); | ||||||
|  | DECL_CVAR(watermark_rainbow); | ||||||
|  | DECL_CVAR(aim_aimbot_silent); | ||||||
|  | DECL_CVAR(visuals_friendly); | ||||||
|  | DECL_CVAR(movement_antiaim); | ||||||
|  | DECL_CVAR(movement_antiaim_view); | ||||||
|  | DECL_CVAR(movement_fakeduck); | ||||||
|  | DECL_CVAR(misc_namechanger); | ||||||
|  | DECL_CVAR(misc_namechanger_speed); | ||||||
|  |  | ||||||
| DECL_CVAR(bhop); |  | ||||||
| DECL_CVAR(autostrafe); |  | ||||||
| DECL_CVAR(aimbot); |  | ||||||
| DECL_CVAR(esp); |  | ||||||
| DECL_CVAR(chams); |  | ||||||
| DECL_CVAR(crosshair); |  | ||||||
| DECL_CVAR(tracers); |  | ||||||
| DECL_CVAR(clmove); |  | ||||||
|  |  | ||||||
| bool cvars_init(void) { | bool cvars_init(void) { | ||||||
|     REGISTER_CVAR(bhop, 1); |     REGISTER_CVAR(movement_bhop, 1); | ||||||
|     REGISTER_CVAR(autostrafe, 0); |     REGISTER_CVAR(movement_autostrafe, 1); | ||||||
|     REGISTER_CVAR(aimbot, 0); |     REGISTER_CVAR(aim_aimbot, 0); | ||||||
|     REGISTER_CVAR(esp, 3); |     REGISTER_CVAR(aim_autoshoot, 0); /* Only works with aimbot enabled */ | ||||||
|     REGISTER_CVAR(chams, 1); |     REGISTER_CVAR(visuals_esp, 3); | ||||||
|     REGISTER_CVAR(crosshair, 0); |     REGISTER_CVAR(visuals_chams, 1); | ||||||
|     REGISTER_CVAR(tracers, 0); |     REGISTER_CVAR(visuals_crosshair, 0); | ||||||
|     REGISTER_CVAR(clmove, 0); |     REGISTER_CVAR(movement_clmove, 0); | ||||||
|  |     REGISTER_CVAR(watermark, 1); | ||||||
|  |     REGISTER_CVAR(watermark_rainbow, 1); | ||||||
|  |     REGISTER_CVAR(aim_aimbot_silent, 1); | ||||||
|  |     REGISTER_CVAR(visuals_friendly, 0); | ||||||
|  |     REGISTER_CVAR(movement_antiaim, 0); | ||||||
|  |     REGISTER_CVAR(movement_antiaim_view, 0); | ||||||
|  |     REGISTER_CVAR(movement_fakeduck, 0); | ||||||
|  |     REGISTER_CVAR(misc_namechanger, 0); | ||||||
|  |     REGISTER_CVAR(misc_namechanger_speed, 10); | ||||||
|  |     if (IsCS16()) { | ||||||
|  |     REGISTER_CVAR(visuals_tracers, 0); | ||||||
|  |     } else { | ||||||
|  |     REGISTER_CVAR(visuals_tracers, 1); | ||||||
|  |     } | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,37 +1,36 @@ | |||||||
|  |  | ||||||
| #include <math.h> | #include <math.h> | ||||||
|  | #include <cfloat> | ||||||
|  |  | ||||||
| #include "features.h" | #include "features.h" | ||||||
| #include "../include/sdk.h" | #include "../include/sdk.h" | ||||||
| #include "../include/cvars.h" | #include "../include/cvars.h" | ||||||
| #include "../include/util.h" | #include "../include/util.h" | ||||||
|  | #include "../include/game_detection.h" | ||||||
|  |  | ||||||
| /* Game units to add to the entity origin to get the head */ | /* Game units to add to the entity origin to get the head */ | ||||||
| #define HEAD_OFFSET 0.8f | #define HL1_HEAD_OFFSET 25.f | ||||||
|  | #define CS16_HEAD_OFFSET 22.f | ||||||
|  | #define CS16_HORIZONTAL_OFFSET 8.0f | ||||||
|  | #define DOD_HEAD_OFFSET 22.f | ||||||
|  | #define DOD_HORIZONTAL_OFFSET 8.0f | ||||||
|  |  | ||||||
| /* Scale factor for aim punch */ | /* Scale factor for aim punch */ | ||||||
| #define AIM_PUNCH_MULT 2 | #define AIM_PUNCH_MULT 2 | ||||||
|  |  | ||||||
|  | static float vec_length(vec3_t v) { | ||||||
|  |     return sqrt(v.x * v.x + v.y * v.y + v.z * v.z); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static bool is_visible(vec3_t start, vec3_t end) { | static bool is_visible(vec3_t start, vec3_t end) { | ||||||
|     /* Syntax: PM_TraceLine(start, end, flags, usehulll, ignore_pe); */ |     pmtrace_t* tr = i_engine->PM_TraceLine(start, end, PM_TRACELINE_PHYSENTSONLY, 2, -1); | ||||||
|     pmtrace_t* tr = |     if (tr->ent <= 0) return false; | ||||||
|       i_engine->PM_TraceLine(start, end, PM_TRACELINE_PHYSENTSONLY, 2, -1); |  | ||||||
|  |  | ||||||
|     /* We didn't hit a valid entity */ |  | ||||||
|     if (tr->ent <= 0) |  | ||||||
|         return false; |  | ||||||
|  |  | ||||||
|     /* Get entity index from physents, check if we can't get a valid player */ |  | ||||||
|     const int ent_idx = i_pmove->physents[tr->ent].info; |     const int ent_idx = i_pmove->physents[tr->ent].info; | ||||||
|     if (!get_player(ent_idx)) |     return get_player(ent_idx) != NULL; | ||||||
|         return false; |  | ||||||
|  |  | ||||||
|     /* We hit a valid player */ |  | ||||||
|     return true; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static vec3_t get_closest_delta(vec3_t viewangles) { | static vec3_t get_closest_delta(vec3_t viewangles) { | ||||||
|     /* Compensate aim punch. We get g_punchAngles from CalcRefdef hook */ |     // Compensate for aim punch | ||||||
|     viewangles.x += g_punchAngles.x * AIM_PUNCH_MULT; |     viewangles.x += g_punchAngles.x * AIM_PUNCH_MULT; | ||||||
|     viewangles.y += g_punchAngles.y * AIM_PUNCH_MULT; |     viewangles.y += g_punchAngles.y * AIM_PUNCH_MULT; | ||||||
|     viewangles.z += g_punchAngles.z * AIM_PUNCH_MULT; |     viewangles.z += g_punchAngles.z * AIM_PUNCH_MULT; | ||||||
| @@ -40,36 +39,55 @@ static vec3_t get_closest_delta(vec3_t viewangles) { | |||||||
|     i_engine->pEventAPI->EV_LocalPlayerViewheight(view_height); |     i_engine->pEventAPI->EV_LocalPlayerViewheight(view_height); | ||||||
|     vec3_t local_eyes = vec_add(localplayer->origin, view_height); |     vec3_t local_eyes = vec_add(localplayer->origin, view_height); | ||||||
|  |  | ||||||
|     /* These 2 vars are used to store the best target across iterations. |     float min_distance = FLT_MAX;  // For tracking the closest player | ||||||
|      * NOTE: The default value of best_fov will be the aimbot fov */ |     float best_fov = dz_aim_aimbot->value; | ||||||
|     float best_fov    = cv_aimbot->value; |  | ||||||
|     vec3_t best_delta = { 0, 0, 0 }; |     vec3_t best_delta = { 0, 0, 0 }; | ||||||
|  |  | ||||||
|     for (int i = 1; i <= i_engine->GetMaxClients(); i++) { |     for (int i = 1; i <= i_engine->GetMaxClients(); i++) { | ||||||
|         cl_entity_t* ent = get_player(i); |         cl_entity_t* ent = get_player(i); | ||||||
|  |  | ||||||
|         if (!is_alive(ent) || is_friend(ent)) |         if (!is_alive(ent) || is_friend(ent)) { | ||||||
|             continue; |             continue; // Skip if not alive or is a friend | ||||||
|  |         } | ||||||
|  |  | ||||||
|         /* TODO: Get bones origin instead of calculating from ent origin */ |         vec3_t head_pos = ent->origin; | ||||||
|         const vec3_t head_pos = vec_add(ent->origin, vec3(0, 0, HEAD_OFFSET)); |  | ||||||
|         if (!is_visible(local_eyes, head_pos)) /* We can't see player */ |         if (ent->curstate.usehull != 1) {  // Not crouched | ||||||
|             continue; |             if (IsCS16()) { | ||||||
|  |                 head_pos.z += CS16_HEAD_OFFSET; | ||||||
|  |                 head_pos.x += CS16_HORIZONTAL_OFFSET; | ||||||
|  |             } else if (IsDayOfDefeat()) { | ||||||
|  |                 head_pos.z += DOD_HEAD_OFFSET; | ||||||
|  |                 head_pos.x += DOD_HORIZONTAL_OFFSET; | ||||||
|  |             } else { | ||||||
|  |                 head_pos.z += HL1_HEAD_OFFSET; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |          | ||||||
|  |         float distance = vec_length(vec_sub(ent->origin, local_eyes)); | ||||||
|  |         if (distance > min_distance) { | ||||||
|  |             continue; // Skip players that are further than the current closest target | ||||||
|  |         } | ||||||
|  |  | ||||||
|         const vec3_t enemy_angle = vec_to_ang(vec_sub(head_pos, local_eyes)); |         const vec3_t enemy_angle = vec_to_ang(vec_sub(head_pos, local_eyes)); | ||||||
|         const vec3_t delta       = vec_sub(enemy_angle, viewangles); |         const vec3_t delta = vec_sub(enemy_angle, viewangles); | ||||||
|         vec_norm(delta); |         vec_norm(delta); | ||||||
|  |  | ||||||
|         float fov = hypotf(delta.x, delta.y); |         float fov = hypotf(delta.x, delta.y); | ||||||
|         if (fov > 360.0f) { |         if (fov > 360.0f) { | ||||||
|             fov = remainderf(fov, 360.0f); |             fov = remainderf(fov, 360.0f); | ||||||
|             if (fov > 180.0f) |         } | ||||||
|                 fov = 360.0f - fov; |         if (fov > 180.0f) { | ||||||
|  |             fov = 360.0f - fov; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (fov < best_fov) { |         // Only check visibility for potential targets | ||||||
|  |         if (fov < best_fov && is_visible(local_eyes, head_pos)) { | ||||||
|             best_fov = fov; |             best_fov = fov; | ||||||
|             vec_copy(best_delta, delta); |             vec_copy(best_delta, delta); | ||||||
|  |             min_distance = distance;  // Update the closest target's distance | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -77,25 +95,48 @@ static vec3_t get_closest_delta(vec3_t viewangles) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void aimbot(usercmd_t* cmd) { | void aimbot(usercmd_t* cmd) { | ||||||
|     if (!CVAR_ON(aimbot) || !(cmd->buttons & IN_ATTACK)) |     static bool shouldShootNextFrame = false;  // If you're not using this variable, you can remove it. | ||||||
|  |     static bool hasAdjustedView = false; | ||||||
|  |  | ||||||
|  |     if (!CVAR_ON(aim_aimbot) || !can_shoot()) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     /* Calculate delta with the engine viewangles, not with the cmd ones */ |  | ||||||
|     vec3_t engine_viewangles; |     vec3_t engine_viewangles; | ||||||
|     i_engine->GetViewAngles(engine_viewangles); |     i_engine->GetViewAngles(engine_viewangles); | ||||||
|  |  | ||||||
|     /* TODO: Add setting for lowest health */ |  | ||||||
|     vec3_t best_delta = get_closest_delta(engine_viewangles); |     vec3_t best_delta = get_closest_delta(engine_viewangles); | ||||||
|     if (!vec_is_zero(best_delta)) { |  | ||||||
|         /* NOTE: We can divide the best delta here to add smoothing */ |  | ||||||
|  |  | ||||||
|  |     if (!vec_is_zero(best_delta)) { | ||||||
|  |         /* | ||||||
|  |         if (!lastShotHit) { | ||||||
|  |             // If the last shot missed, adjust the angle slightly | ||||||
|  |             // This is a simple approach and might need further tweaking | ||||||
|  |             best_delta.y += 0.5f;  // Adjust yaw slightly | ||||||
|  |         } | ||||||
|  |         */ | ||||||
|         engine_viewangles.x += best_delta.x; |         engine_viewangles.x += best_delta.x; | ||||||
|         engine_viewangles.y += best_delta.y; |         engine_viewangles.y += best_delta.y; | ||||||
|         engine_viewangles.z += best_delta.z; |         engine_viewangles.z += best_delta.z; | ||||||
|  |  | ||||||
|  |         if (CVAR_ON(aim_aimbot_silent)) { | ||||||
|  |             vec_copy(cmd->viewangles, engine_viewangles); | ||||||
|  |             if (cmd->buttons & IN_ATTACK) { | ||||||
|  |                 cmd->buttons |= IN_ATTACK; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             if (cmd->buttons & IN_ATTACK) {   | ||||||
|  |                 if (hasAdjustedView) { | ||||||
|  |                     hasAdjustedView = false; // Reset flag | ||||||
|  |                 } else { | ||||||
|  |                     i_engine->SetViewAngles(engine_viewangles); | ||||||
|  |                     hasAdjustedView = true; | ||||||
|  |                     cmd->buttons &= ~IN_ATTACK; // Defer the shot to the next frame | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } else if (CVAR_ON(aim_autoshoot) && (cmd->buttons & IN_ATTACK)) { | ||||||
|  |         cmd->buttons &= ~IN_ATTACK; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vec_copy(cmd->viewangles, engine_viewangles); |  | ||||||
|  |  | ||||||
|     /* NOTE: Uncomment to disable silent aim */ |  | ||||||
|     /* i_engine->SetViewAngles(engine_viewangles); */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										100
									
								
								src/features/anti_aim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/features/anti_aim.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | #include <math.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <X11/Xlib.h> | ||||||
|  | #include <X11/keysym.h> | ||||||
|  |  | ||||||
|  | #include "features.h" | ||||||
|  | #include "../include/sdk.h" | ||||||
|  | #include "../include/cvars.h" | ||||||
|  | #include "../include/util.h" | ||||||
|  |  | ||||||
|  | float random_float(float min, float max) { | ||||||
|  |     return (max - min) * ((float)rand() / (float)RAND_MAX) + min; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool isSpacebarPressed() { | ||||||
|  |     Display* display = XOpenDisplay(NULL); | ||||||
|  |     if (!display) { | ||||||
|  |         return false;  // Could not open the display, assume not pressed | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     char keys_return[32]; | ||||||
|  |     XQueryKeymap(display, keys_return); | ||||||
|  |     KeyCode kc = XKeysymToKeycode(display, XK_space); | ||||||
|  |     bool pressed = (keys_return[kc >> 3] & (1 << (kc & 7))) != 0; | ||||||
|  |  | ||||||
|  |     XCloseDisplay(display); | ||||||
|  |     return pressed; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void anti_aim(usercmd_t* cmd) { | ||||||
|  |     if (cmd->buttons & IN_ATTACK || cmd->buttons & IN_USE) { | ||||||
|  |         if (cmd->buttons & IN_ATTACK) { | ||||||
|  |             i_engine->pfnClientCmd("echo \"Attack detected. Spinbot stopped.\""); | ||||||
|  |         } else if (cmd->buttons & IN_USE) { | ||||||
|  |             i_engine->pfnClientCmd("echo \"Use key detected. Spinbot stopped.\""); | ||||||
|  |         } | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!CVAR_ON(movement_antiaim)) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (!is_alive(localplayer)) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     vec3_t view_angles; | ||||||
|  |     i_engine->GetViewAngles(view_angles); | ||||||
|  |  | ||||||
|  |     static bool lbyBreak = false; | ||||||
|  |     if (lbyBreak) { | ||||||
|  |         view_angles.y += 120.0f; | ||||||
|  |     } | ||||||
|  |     lbyBreak = !lbyBreak; | ||||||
|  |  | ||||||
|  |     static bool flipPitch = false; | ||||||
|  |     if (flipPitch) { | ||||||
|  |         view_angles.x = 89.0f; | ||||||
|  |     } else { | ||||||
|  |         view_angles.x = -89.0f; | ||||||
|  |     } | ||||||
|  |     flipPitch = !flipPitch; | ||||||
|  |  | ||||||
|  |     view_angles.y += 30.0f; | ||||||
|  |      | ||||||
|  |     bool isBunnyHopping = cmd->buttons & IN_JUMP; | ||||||
|  |     bool isStationary = (cmd->forwardmove == 0.0f && cmd->sidemove == 0.0f); | ||||||
|  |      | ||||||
|  |     // This shit busted right now | ||||||
|  |     if (CVAR_ON(movement_fakeduck) && (isStationary || isBunnyHopping || isSpacebarPressed())) { | ||||||
|  |         static int duckCounter = 0; | ||||||
|  |         if (duckCounter < 2) { | ||||||
|  |             cmd->buttons |= IN_DUCK; | ||||||
|  |         } else if (duckCounter < 4) { | ||||||
|  |             cmd->buttons &= ~IN_DUCK; | ||||||
|  |         } else { | ||||||
|  |             duckCounter = 0; | ||||||
|  |         } | ||||||
|  |         duckCounter++; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (view_angles.y > 180.0f) view_angles.y -= 360.0f; | ||||||
|  |     if (view_angles.y < -180.0f) view_angles.y += 360.0f; | ||||||
|  |  | ||||||
|  |     if (CVAR_ON(movement_antiaim_view)) { | ||||||
|  |         i_engine->SetViewAngles(view_angles); | ||||||
|  |         i_engine->pfnClientCmd("echo \"Set view angles directly using movement_antiaim_view.\""); | ||||||
|  |     } else { | ||||||
|  |         vec_copy(cmd->viewangles, view_angles); | ||||||
|  |         i_engine->pfnClientCmd("echo \"Set view angles silently.\""); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     static float last_log_time = 0.0f; | ||||||
|  |     if (cmd->msec - last_log_time >= 5000.0f) { | ||||||
|  |         i_engine->pfnClientCmd("echo \"Advanced Anti-Aim has adjusted view angles.\""); | ||||||
|  |         last_log_time = cmd->msec; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -15,7 +15,7 @@ enum chams_settings { | |||||||
| visible_flags visible_mode; | visible_flags visible_mode; | ||||||
|  |  | ||||||
| bool chams(void* this_ptr) { | bool chams(void* this_ptr) { | ||||||
|     const int setting = cv_chams->value == 5.0f ? 7 : cv_chams->value; |     const int setting = dz_visuals_chams->value == 5.0f ? 7 : dz_visuals_chams->value; | ||||||
|     if (setting == DISABLED) |     if (setting == DISABLED) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
| @@ -39,6 +39,10 @@ bool chams(void* this_ptr) { | |||||||
|  |  | ||||||
|     const bool friendly = is_friend(ent); |     const bool friendly = is_friend(ent); | ||||||
|  |  | ||||||
|  |     // Check if the player is friendly and if visuals_friendly is 0 | ||||||
|  |     if (friendly && dz_visuals_friendly->value == 0) | ||||||
|  |         return false;  // Do not render chams for friendlies | ||||||
|  |  | ||||||
|     /* If we got here it means we are rendering a valid player */ |     /* If we got here it means we are rendering a valid player */ | ||||||
|     glDisable(GL_TEXTURE_2D); |     glDisable(GL_TEXTURE_2D); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,8 +4,9 @@ | |||||||
| #include "../include/globals.h" | #include "../include/globals.h" | ||||||
| #include "../include/cvars.h" | #include "../include/cvars.h" | ||||||
| #include "../include/util.h" | #include "../include/util.h" | ||||||
|  | #include "../include/game_detection.h" | ||||||
|  |  | ||||||
| /* For cv_esp */ | /* For dz_esp */ | ||||||
| enum esp_values { | enum esp_values { | ||||||
|     ESP_OFF  = 0, |     ESP_OFF  = 0, | ||||||
|     ESP_BOX  = 1, |     ESP_BOX  = 1, | ||||||
| @@ -98,38 +99,36 @@ static bool gl_draw2dbox(vec3_t o, int bh) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void esp(void) { | void esp(void) { | ||||||
|     const int setting = (int)cv_esp->value; |     const int setting = (int)dz_visuals_esp->value; | ||||||
|     if (setting == ESP_OFF) |     if (setting == ESP_OFF) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     /* Iterate all clients */ |  | ||||||
|     for (int i = 1; i <= i_engine->GetMaxClients(); i++) { |     for (int i = 1; i <= i_engine->GetMaxClients(); i++) { | ||||||
|         cl_entity_t* ent = get_player(i); |         cl_entity_t* ent = get_player(i); | ||||||
|  |  | ||||||
|         if (!valid_player(ent) || !is_alive(ent) || vec_is_zero(ent->origin)) |         if (!valid_player(ent) || !is_alive(ent) || vec_is_zero(ent->origin)) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
|         const int bh = (ent->curstate.usehull == 1) ? 44 : 70; |         if (is_friend(ent) && dz_visuals_friendly->value == 0) | ||||||
|         /* const int bw = 25; */ |             continue; | ||||||
|  |  | ||||||
|  |         int bh = 70; | ||||||
|  |         if (IsDayOfDefeat()) { | ||||||
|  |             bh = 76; | ||||||
|  |         } else if (ent->curstate.usehull == 1) { | ||||||
|  |             bh = 44; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         /* If ESP_BOX is enabled, draw it. If it returns false, continue */ |  | ||||||
|         if (setting & ESP_BOX && !gl_draw2dbox(ent->origin, bh)) |         if (setting & ESP_BOX && !gl_draw2dbox(ent->origin, bh)) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
|         /* Rest of the loop is for name esp, if var is not enabled, continue */ |  | ||||||
|         if (!(setting & ESP_NAME)) |         if (!(setting & ESP_NAME)) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
|         /* Draw name on top of the player. */ |         vec3_t name_pos = vec3(ent->origin.x, ent->origin.y, ent->origin.z + bh + 5); | ||||||
|         vec3_t top = vec3(ent->origin.x, ent->origin.y, ent->origin.z + bh); |         vec2_t s_name_pos; | ||||||
|         vec2_t s_top; |         if (world_to_screen(name_pos, s_name_pos)) { | ||||||
|  |             engine_draw_text(s_name_pos[0] - 5, s_name_pos[1] - 2, get_name(ent->index), (rgb_t){ 255, 255, 255 }); | ||||||
|         if (!world_to_screen(top, s_top)) |         } | ||||||
|             continue; |  | ||||||
|  |  | ||||||
|         /* TODO: Instead of -5px, center the player name to the player origin. |  | ||||||
|          *       I don't know how to get the text size before rendering. */ |  | ||||||
|         engine_draw_text(s_top[0] - 5, s_top[1] - 2, get_name(ent->index), |  | ||||||
|                          (rgb_t){ 255, 255, 255 }); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,4 +33,10 @@ void aimbot(usercmd_t* cmd); | |||||||
| void custom_crosshair(void); | void custom_crosshair(void); | ||||||
| void bullet_tracers(usercmd_t* cmd); | void bullet_tracers(usercmd_t* cmd); | ||||||
|  |  | ||||||
|  | /* src/features/namechanger.c */ | ||||||
|  | void check_namechanger_mode_and_execute(usercmd_t* cmd); | ||||||
|  |  | ||||||
|  | /* src/features/anti_aim.c */ | ||||||
|  | void anti_aim(usercmd_t* cmd); | ||||||
|  |  | ||||||
| #endif /* FEATURES_H_ */ | #endif /* FEATURES_H_ */ | ||||||
| @@ -4,9 +4,10 @@ | |||||||
| #include "../include/globals.h" | #include "../include/globals.h" | ||||||
| #include "../include/cvars.h" | #include "../include/cvars.h" | ||||||
| #include "../include/util.h" | #include "../include/util.h" | ||||||
|  | #include "../include/game_detection.h" | ||||||
|  |  | ||||||
| void custom_crosshair(void) { | void custom_crosshair(void) { | ||||||
|     if (!CVAR_ON(crosshair)) |     if (!CVAR_ON(visuals_crosshair)) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     /* Get window size, and then the center. */ |     /* Get window size, and then the center. */ | ||||||
| @@ -14,7 +15,7 @@ void custom_crosshair(void) { | |||||||
|     int my = game_info->m_height / 2; |     int my = game_info->m_height / 2; | ||||||
|  |  | ||||||
|     /* The real length is sqrt(2 * (len^2)) */ |     /* The real length is sqrt(2 * (len^2)) */ | ||||||
|     const int len   = cv_crosshair->value; |     const int len   = dz_visuals_crosshair->value; | ||||||
|     const int gap   = 1; |     const int gap   = 1; | ||||||
|     const float w   = 1; |     const float w   = 1; | ||||||
|     const rgb_t col = { 255, 255, 255 }; |     const rgb_t col = { 255, 255, 255 }; | ||||||
| @@ -30,10 +31,20 @@ void custom_crosshair(void) { | |||||||
|     gl_drawline(mx + gap, my + gap, mx + gap + len, my + gap + len, w, col); |     gl_drawline(mx + gap, my + gap, mx + gap + len, my + gap + len, w, col); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | weapon_data_t g_currentWeapon; | ||||||
|  | static double lastTracerTime = 0; | ||||||
|  |      | ||||||
| void bullet_tracers(usercmd_t* cmd) { | void bullet_tracers(usercmd_t* cmd) { | ||||||
|     /* Only draw if we are holding attack and we can shoot */ |     /* Only draw if we are holding attack and we can shoot */ | ||||||
|     if (!CVAR_ON(tracers) || !(cmd->buttons & IN_ATTACK) || !can_shoot()) |     if (!CVAR_ON(visuals_tracers) || !(cmd->buttons & IN_ATTACK) || !can_shoot() || !is_alive(localplayer)) | ||||||
|         return; |         return; | ||||||
|  |     /* Dirty temp fix for tracers being spammed in CS1.6 */ | ||||||
|  |     if (IsCS16() && (g_flCurrentTime - lastTracerTime < 0.5)) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (IsCS16()) { | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* Get player eye pos, start of tracer */ |     /* Get player eye pos, start of tracer */ | ||||||
|     vec3_t view_height; |     vec3_t view_height; | ||||||
| @@ -54,4 +65,6 @@ void bullet_tracers(usercmd_t* cmd) { | |||||||
|     const float w    = 0.8; |     const float w    = 0.8; | ||||||
|     const float time = 2; |     const float time = 2; | ||||||
|     draw_tracer(local_eyes, end, (rgb_t){ 66, 165, 245 }, 1, w, time); |     draw_tracer(local_eyes, end, (rgb_t){ 66, 165, 245 }, 1, w, time); | ||||||
|  |     lastTracerTime = g_flCurrentTime; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ static void autostrafe_legit(usercmd_t* cmd) { | |||||||
|  *   https://github.com/deboogerxyz/ahc/blob/0492646e28dd7234a8cd431d37b152dc18a21b04/ahc.c#L201 |  *   https://github.com/deboogerxyz/ahc/blob/0492646e28dd7234a8cd431d37b152dc18a21b04/ahc.c#L201 | ||||||
|  *   https://github.com/NullHooks/NullHooks/blob/535351569ca599cadd21a286d88098b6dc057a46/src/core/features/movement/bhop.cpp#L73 |  *   https://github.com/NullHooks/NullHooks/blob/535351569ca599cadd21a286d88098b6dc057a46/src/core/features/movement/bhop.cpp#L73 | ||||||
|  */ |  */ | ||||||
|  | static const float DEG2RAD_CACHED = M_PI / 180.0f; | ||||||
|  |  | ||||||
| static void autostrafe_rage(usercmd_t* cmd) { | static void autostrafe_rage(usercmd_t* cmd) { | ||||||
|     if (i_pmove->movetype != MOVETYPE_WALK) |     if (i_pmove->movetype != MOVETYPE_WALK) | ||||||
|         return; |         return; | ||||||
| @@ -31,7 +33,7 @@ static void autostrafe_rage(usercmd_t* cmd) { | |||||||
|     /* TODO: Get at runtime */ |     /* TODO: Get at runtime */ | ||||||
|     const float sv_airaccelerate = 10.0f; |     const float sv_airaccelerate = 10.0f; | ||||||
|     const float sv_maxspeed      = 320.0f; |     const float sv_maxspeed      = 320.0f; | ||||||
|     const float cl_forwardspeed  = 400.0f; |     const float cl_forwardspeed  = 425.0f; | ||||||
|     const float cl_sidespeed     = 400.0f; |     const float cl_sidespeed     = 400.0f; | ||||||
|  |  | ||||||
|     float speed = vec_len2d(i_pmove->velocity); |     float speed = vec_len2d(i_pmove->velocity); | ||||||
| @@ -48,24 +50,22 @@ static void autostrafe_rage(usercmd_t* cmd) { | |||||||
|  |  | ||||||
|     float best_delta = acosf(term); |     float best_delta = acosf(term); | ||||||
|  |  | ||||||
|     /* Use engine viewangles in case we do something nasty with cmd's angles */ |  | ||||||
|     vec3_t viewangles; |     vec3_t viewangles; | ||||||
|     i_engine->GetViewAngles(viewangles); |     i_engine->GetViewAngles(viewangles); | ||||||
|  |  | ||||||
|     /* Get our desired angles and delta */ |     float yaw = viewangles.y * DEG2RAD_CACHED; | ||||||
|     float yaw        = DEG2RAD(viewangles.y); |     float vel_dir = atan2f(i_pmove->velocity.y, i_pmove->velocity.x) - yaw; | ||||||
|     float vel_dir    = atan2f(i_pmove->velocity.y, i_pmove->velocity.x) - yaw; |  | ||||||
|     float target_ang = atan2f(-cmd->sidemove, cmd->forwardmove); |     float target_ang = atan2f(-cmd->sidemove, cmd->forwardmove); | ||||||
|     float delta      = angle_delta_rad(vel_dir, target_ang); |     float delta = angle_delta_rad(vel_dir, target_ang); | ||||||
|  |  | ||||||
|     float movedir = delta < 0 ? vel_dir + best_delta : vel_dir - best_delta; |     float movedir = delta < 0 ? vel_dir + best_delta : vel_dir - best_delta; | ||||||
|  |  | ||||||
|     cmd->forwardmove = cosf(movedir) * cl_forwardspeed; |     cmd->forwardmove = cosf(movedir) * cl_forwardspeed; | ||||||
|     cmd->sidemove    = -sinf(movedir) * cl_sidespeed; |     cmd->sidemove = -sinf(movedir) * cl_sidespeed; | ||||||
| } | } | ||||||
|  |  | ||||||
| void bhop(usercmd_t* cmd) { | void bhop(usercmd_t* cmd) { | ||||||
|     if (!CVAR_ON(bhop) || i_pmove->movetype != MOVETYPE_WALK) |     if (!CVAR_ON(movement_bhop) || i_pmove->movetype != MOVETYPE_WALK) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     static bool was_in_air = false; |     static bool was_in_air = false; | ||||||
| @@ -82,7 +82,7 @@ void bhop(usercmd_t* cmd) { | |||||||
|  |  | ||||||
|     /* Autostrafe if enabled. Check if we are in the air and holding space. */ |     /* Autostrafe if enabled. Check if we are in the air and holding space. */ | ||||||
|     if (is_jumping) { |     if (is_jumping) { | ||||||
|         switch ((int)cv_autostrafe->value) { |         switch ((int)dz_movement_autostrafe->value) { | ||||||
|             case 1: |             case 1: | ||||||
|                 autostrafe_rage(cmd); |                 autostrafe_rage(cmd); | ||||||
|                 break; |                 break; | ||||||
| @@ -101,18 +101,15 @@ void bhop(usercmd_t* cmd) { | |||||||
|  *   https://github.com/deboogerxyz/ahc/blob/0492646e28dd7234a8cd431d37b152dc18a21b04/ahc.c#L377 |  *   https://github.com/deboogerxyz/ahc/blob/0492646e28dd7234a8cd431d37b152dc18a21b04/ahc.c#L377 | ||||||
|  */ |  */ | ||||||
| void correct_movement(usercmd_t* cmd, vec3_t old_angles) { | void correct_movement(usercmd_t* cmd, vec3_t old_angles) { | ||||||
|     float old_y = old_angles.y + (old_angles.y < 0 ? 360 : 0); |     float delta_y = fmodf(cmd->viewangles.y - old_angles.y + 540.0f, 360.0f) - 180.0f; // Normalized delta in [-180, 180) | ||||||
|     float new_y = cmd->viewangles.y + (cmd->viewangles.y < 0 ? 360 : 0); |  | ||||||
|     float delta = (new_y < old_y) ? fabsf(new_y - old_y) |  | ||||||
|                                   : 360 - fabsf(new_y - old_y); |  | ||||||
|      |      | ||||||
|     delta = 360 - delta; |     float delta_rad = delta_y * DEG2RAD_CACHED; | ||||||
|  |     float delta_cos = cosf(delta_rad); | ||||||
|  |     float delta_sin = sinf(delta_rad); | ||||||
|  |  | ||||||
|     float forward = cmd->forwardmove; |     float forward = cmd->forwardmove; | ||||||
|     float side    = cmd->sidemove; |     float side = cmd->sidemove; | ||||||
|  |  | ||||||
|     cmd->forwardmove = |     cmd->forwardmove = delta_cos * forward - delta_sin * side; | ||||||
|       cos(DEG2RAD(delta)) * forward + cos(DEG2RAD(delta + 90)) * side; |     cmd->sidemove = delta_sin * forward + delta_cos * side; | ||||||
|     cmd->sidemove = |  | ||||||
|       sin(DEG2RAD(delta)) * forward + sin(DEG2RAD(delta + 90)) * side; |  | ||||||
| } | } | ||||||
							
								
								
									
										100
									
								
								src/features/namechanger.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/features/namechanger.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | #include <stdint.h> | ||||||
|  | #include <cstring> | ||||||
|  | #include <algorithm> | ||||||
|  | #include <vector> | ||||||
|  | #include "features.h" | ||||||
|  | #include "../include/globals.h" | ||||||
|  | #include "../include/cvars.h" | ||||||
|  | #include "../include/util.h" | ||||||
|  | #include "../include/game_detection.h" | ||||||
|  |  | ||||||
|  | static int change_counter = 0; | ||||||
|  | #define NAME_CHANGE_INTERVAL 10 | ||||||
|  |  | ||||||
|  | static int last_name_idx = -1; | ||||||
|  |  | ||||||
|  | void change_name(const char* new_name) { | ||||||
|  |     if (!new_name) return; | ||||||
|  |  | ||||||
|  |     char command[256]; | ||||||
|  |     snprintf(command, sizeof(command), "name \"%s\u0315 \"", new_name); | ||||||
|  |     i_engine->pfnClientCmd(command); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<char*> get_valid_names(bool (*filter)(cl_entity_t*)) { | ||||||
|  |     int max_players = 32; | ||||||
|  |     std::vector<char*> valid_names; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < max_players; i++) { | ||||||
|  |         cl_entity_t* ent = get_player(i); | ||||||
|  |         if (!ent) continue; | ||||||
|  |  | ||||||
|  |         if (!filter || filter(ent)) { | ||||||
|  |             valid_names.push_back(get_name(i)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return valid_names; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void change_name_from_list(std::vector<char*>& names) { | ||||||
|  |     if (names.empty()) return; | ||||||
|  |  | ||||||
|  |     last_name_idx = (last_name_idx + 1) % names.size(); | ||||||
|  |  | ||||||
|  |     char* name = names[last_name_idx]; | ||||||
|  |     if (name) { | ||||||
|  |         change_name(name); | ||||||
|  |         printf("Changing name to: %s\n", name); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void change_name_teammates() { | ||||||
|  |     auto names = get_valid_names(is_friend); | ||||||
|  |     std::random_shuffle(names.begin(), names.end()); | ||||||
|  |     change_name_from_list(names); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void change_name_enemies() { | ||||||
|  |     auto names = get_valid_names([](cl_entity_t* ent) -> bool { | ||||||
|  |         return !is_friend(ent); | ||||||
|  |     }); | ||||||
|  |     std::random_shuffle(names.begin(), names.end()); | ||||||
|  |     change_name_from_list(names); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void change_name_all_players() { | ||||||
|  |     auto names = get_valid_names(nullptr); | ||||||
|  |     std::random_shuffle(names.begin(), names.end()); | ||||||
|  |     change_name_from_list(names); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void change_name_based_on_mode(usercmd_t* cmd) { | ||||||
|  |     if (!CVAR_ON(misc_namechanger)) return; | ||||||
|  |  | ||||||
|  |     if (++change_counter < dz_misc_namechanger_speed->value) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     change_counter = 0; | ||||||
|  |  | ||||||
|  |     switch ((int)dz_misc_namechanger->value) { | ||||||
|  |         case 1: | ||||||
|  |             change_name_teammates(); | ||||||
|  |             break; | ||||||
|  |         case 2: | ||||||
|  |             change_name_enemies(); | ||||||
|  |             break; | ||||||
|  |         case 3: | ||||||
|  |             change_name_all_players(); | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void check_namechanger_mode_and_execute(usercmd_t* cmd) { | ||||||
|  |     if (!CVAR_ON(misc_namechanger)) return; | ||||||
|  |  | ||||||
|  |     change_name_based_on_mode(cmd); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								src/game_detection.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/game_detection.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | #include "include/game_detection.h" | ||||||
|  | #include <string.h>  | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | static GameType current_game = GAME_UNKNOWN; | ||||||
|  |  | ||||||
|  | GameType get_current_game(void) { | ||||||
|  |     if (current_game != GAME_UNKNOWN) { | ||||||
|  |         return current_game; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     FILE *fp = fopen("/proc/self/cmdline", "r"); | ||||||
|  |     if (fp) { | ||||||
|  |         char buf[1024]; | ||||||
|  |         size_t size = fread(buf, sizeof(char), sizeof(buf) - 1, fp); | ||||||
|  |         fclose(fp); | ||||||
|  |  | ||||||
|  |         if (size > 0) { | ||||||
|  |             buf[size] = '\0'; | ||||||
|  |  | ||||||
|  |             char *gameTypeToken = NULL; | ||||||
|  |             char *steamToken = NULL; | ||||||
|  |  | ||||||
|  |             int tokensFound = 0; | ||||||
|  |  | ||||||
|  |             for (char *token = buf; token < buf + size; token += strlen(token) + 1) { | ||||||
|  |                 tokensFound++; | ||||||
|  |  | ||||||
|  |                 if (strcmp(token, "-game") == 0) { | ||||||
|  |                     gameTypeToken = token + strlen(token) + 1; | ||||||
|  |                 } else if (strcmp(token, "-steam") == 0) { | ||||||
|  |                     steamToken = token; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (gameTypeToken) { | ||||||
|  |                 if (strcmp(gameTypeToken, "cstrike") == 0) { | ||||||
|  |                     current_game = GAME_CS16; | ||||||
|  |                 } else if (strcmp(gameTypeToken, "dod") == 0) { | ||||||
|  |                     current_game = GAME_DAY_OF_DEFEAT; | ||||||
|  |                 } else if (strcmp(gameTypeToken, "dmc") == 0) { | ||||||
|  |                     current_game = GAME_DMC;     | ||||||
|  |                 } else if (strcmp(gameTypeToken, "tfc") == 0) { | ||||||
|  |                     current_game = GAME_TFC; | ||||||
|  |                 } | ||||||
|  |             } else if (steamToken && tokensFound == 2) { | ||||||
|  |                 // If only `-steam` is found and no `-game`, with only two tokens, assume it's Half-Life 1 | ||||||
|  |                 current_game = GAME_HALFLIFE; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return current_game; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int IsCS16(void) { | ||||||
|  |     return get_current_game() == GAME_CS16; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int IsHalfLife(void) { | ||||||
|  |     return get_current_game() == GAME_HALFLIFE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int IsDayOfDefeat(void) { | ||||||
|  |     return get_current_game() == GAME_DAY_OF_DEFEAT; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int IsTFC(void) { | ||||||
|  |     return get_current_game() == GAME_TFC; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int IsDeathmatchClassic(void) { | ||||||
|  |     return get_current_game() == GAME_DMC; | ||||||
|  | } | ||||||
| @@ -10,7 +10,13 @@ | |||||||
|  |  | ||||||
| game_id this_game_id = HL; | game_id this_game_id = HL; | ||||||
| vec3_t g_punchAngles = { 0, 0, 0 }; | vec3_t g_punchAngles = { 0, 0, 0 }; | ||||||
|  |  | ||||||
|  | /* Weapon info */ | ||||||
| float g_flNextAttack = 0.f, g_flNextPrimaryAttack = 0.f; | float g_flNextAttack = 0.f, g_flNextPrimaryAttack = 0.f; | ||||||
|  | int g_iClip = 0; | ||||||
|  |  | ||||||
|  | double g_flCurrentTime = 0.0; | ||||||
|  |  | ||||||
|  |  | ||||||
| void* hw; | void* hw; | ||||||
| void** h_client; | void** h_client; | ||||||
| @@ -39,13 +45,13 @@ bool globals_init(void) { | |||||||
|      */ |      */ | ||||||
|     hw = dlopen("hw.so", RTLD_LAZY | RTLD_NOLOAD); |     hw = dlopen("hw.so", RTLD_LAZY | RTLD_NOLOAD); | ||||||
|     if (!hw) { |     if (!hw) { | ||||||
|         printf("hl-cheat: globals_init: can't open hw.so\n"); |         printf("goldsource-cheat: globals_init: can't open hw.so\n"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     h_client = (void**)dlsym(hw, "hClientDLL"); |     h_client = (void**)dlsym(hw, "hClientDLL"); | ||||||
|     if (!h_client) { |     if (!h_client) { | ||||||
|         printf("hl-cheat: globals_init: can't find hClientDLL\n"); |         printf("goldsource-cheat: globals_init: can't find hClientDLL\n"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -64,12 +70,12 @@ bool globals_init(void) { | |||||||
|  |  | ||||||
|     if (!i_engine || !i_client || !i_pmove || !i_enginestudio || |     if (!i_engine || !i_client || !i_pmove || !i_enginestudio || | ||||||
|         !i_studiomodelrenderer || !game_info) { |         !i_studiomodelrenderer || !game_info) { | ||||||
|         printf("hl-cheat: globals_init: couldn't load some symbols\n"); |         printf("goldsource-cheat: globals_init: couldn't load some symbols\n"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!protect_addr(i_studiomodelrenderer, PROT_READ | PROT_WRITE)) { |     if (!protect_addr(i_studiomodelrenderer, PROT_READ | PROT_WRITE)) { | ||||||
|         printf("hl-cheat: globals_init: couldn't unprotect address of SMR\n"); |         printf("goldsource-cheat: globals_init: couldn't unprotect address of SMR\n"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								src/hooks.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								src/hooks.c
									
									
									
									
									
								
							| @@ -64,6 +64,8 @@ void h_CL_CreateMove(float frametime, usercmd_t* cmd, int active) { | |||||||
|     bhop(cmd); |     bhop(cmd); | ||||||
|     aimbot(cmd); |     aimbot(cmd); | ||||||
|     bullet_tracers(cmd); |     bullet_tracers(cmd); | ||||||
|  |     anti_aim(cmd); | ||||||
|  |     check_namechanger_mode_and_execute(cmd); | ||||||
|  |  | ||||||
|     correct_movement(cmd, old_angles); |     correct_movement(cmd, old_angles); | ||||||
|     vec_clamp(cmd->viewangles); |     vec_clamp(cmd->viewangles); | ||||||
| @@ -71,11 +73,31 @@ void h_CL_CreateMove(float frametime, usercmd_t* cmd, int active) { | |||||||
|  |  | ||||||
| /*----------------------------------------------------------------------------*/ | /*----------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | 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 h_HUD_Redraw(float time, int intermission) { | ||||||
|     int ret = ORIGINAL(HUD_Redraw, time, intermission); |     int ret = ORIGINAL(HUD_Redraw, time, intermission); | ||||||
|  |  | ||||||
|     /* Watermark */ |     if (dz_watermark->value) { | ||||||
|     engine_draw_text(5, 5, "8dcc/hl-cheat", (rgb_t){ 255, 255, 255 }); |         /* 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(); |     esp(); | ||||||
|     custom_crosshair(); |     custom_crosshair(); | ||||||
| @@ -106,11 +128,14 @@ void h_HUD_PostRunCmd(struct local_state_s* from, struct local_state_s* to, | |||||||
|                       unsigned int random_seed) { |                       unsigned int random_seed) { | ||||||
|     ORIGINAL(HUD_PostRunCmd, from, to, cmd, runfuncs, time, random_seed); |     ORIGINAL(HUD_PostRunCmd, from, to, cmd, runfuncs, time, random_seed); | ||||||
|  |  | ||||||
|  |     g_flCurrentTime = time; | ||||||
|  |  | ||||||
|     /* Store attack information to check if we can shoot */ |     /* Store attack information to check if we can shoot */ | ||||||
|     if (runfuncs) { |     if (runfuncs) { | ||||||
|         g_flNextAttack = to->client.m_flNextAttack; |         g_flNextAttack = to->client.m_flNextAttack; | ||||||
|         g_flNextPrimaryAttack = |         g_flNextPrimaryAttack = | ||||||
|           to->weapondata[to->client.m_iId].m_flNextPrimaryAttack; |           to->weapondata[to->client.m_iId].m_flNextPrimaryAttack; | ||||||
|  |         g_iClip = to->weapondata[to->client.m_iId].m_iClip; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -161,8 +186,8 @@ void h_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { | |||||||
| /*----------------------------------------------------------------------------*/ | /*----------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
| void h_CL_Move() { | void h_CL_Move() { | ||||||
|     if (cv_clmove->value != 0) { |     if (dz_movement_clmove->value != 0) { | ||||||
|         for (int i = 0; i < (int)cv_clmove->value; i++) |         for (int i = 0; i < (int)dz_movement_clmove->value; i++) | ||||||
|             CALL_ORIGINAL(detour_data_clmove, clmove_type); |             CALL_ORIGINAL(detour_data_clmove, clmove_type); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| #include "sdk.h" | #include "sdk.h" | ||||||
| #include "globals.h" | #include "globals.h" | ||||||
|  |  | ||||||
| #define CVAR_PREFIX  "cv_" | #define CVAR_PREFIX  "dz_" | ||||||
| #define CVAR_HACK_ID 0x4000 /* (1<<14) One that is not in use by the game */ | #define CVAR_HACK_ID 0x4000 /* (1<<14) One that is not in use by the game */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -16,28 +16,39 @@ | |||||||
|  * |  * | ||||||
|  * prefix | meaning |  * prefix | meaning | ||||||
|  * -------+------------------------------- |  * -------+------------------------------- | ||||||
|  * cv_*   | cvar variable |  * dz_*   | cvar variable | ||||||
|  */ |  */ | ||||||
| #define DECL_CVAR(name) cvar_t* cv_##name = NULL; | #define DECL_CVAR(name) cvar_t* dz_##name = NULL; | ||||||
|  |  | ||||||
| #define DECL_CVAR_EXTERN(name) extern cvar_t* cv_##name; | #define DECL_CVAR_EXTERN(name) extern cvar_t* dz_##name; | ||||||
|  |  | ||||||
| #define REGISTER_CVAR(name, value) \ | #define REGISTER_CVAR(name, value) \ | ||||||
|     cv_##name =                    \ |     dz_##name =                    \ | ||||||
|       i_engine->pfnRegisterVariable(CVAR_PREFIX #name, #value, CVAR_HACK_ID); |       i_engine->pfnRegisterVariable(CVAR_PREFIX #name, #value, CVAR_HACK_ID); | ||||||
|  |  | ||||||
| #define CVAR_ON(name) (cv_##name->value != 0.0f) | #define CVAR_ON(name) (dz_##name->value != 0.0f) | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------------*/ | /*----------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
| DECL_CVAR_EXTERN(bhop); | DECL_CVAR_EXTERN(movement_bhop); | ||||||
| DECL_CVAR_EXTERN(autostrafe); | DECL_CVAR_EXTERN(movement_autostrafe); | ||||||
| DECL_CVAR_EXTERN(aimbot); | DECL_CVAR_EXTERN(aim_aimbot); | ||||||
| DECL_CVAR_EXTERN(esp); | DECL_CVAR_EXTERN(aim_autoshoot); | ||||||
| DECL_CVAR_EXTERN(chams); | DECL_CVAR_EXTERN(visuals_esp); | ||||||
| DECL_CVAR_EXTERN(crosshair); | DECL_CVAR_EXTERN(visuals_chams); | ||||||
| DECL_CVAR_EXTERN(tracers); | DECL_CVAR_EXTERN(visuals_crosshair); | ||||||
| DECL_CVAR_EXTERN(clmove); | DECL_CVAR_EXTERN(visuals_tracers); | ||||||
|  | DECL_CVAR_EXTERN(movement_clmove); | ||||||
|  | DECL_CVAR_EXTERN(watermark); | ||||||
|  | DECL_CVAR_EXTERN(watermark_rainbow); | ||||||
|  | DECL_CVAR_EXTERN(aim_aimbot_silent); | ||||||
|  | DECL_CVAR_EXTERN(visuals_friendly); | ||||||
|  | DECL_CVAR_EXTERN(movement_antiaim); | ||||||
|  | DECL_CVAR_EXTERN(movement_antiaim_view); | ||||||
|  | DECL_CVAR_EXTERN(movement_fakeduck); | ||||||
|  | DECL_CVAR_EXTERN(misc_namechanger) | ||||||
|  | DECL_CVAR_EXTERN(misc_namechanger_speed) | ||||||
|  |  | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------------*/ | /*----------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								src/include/game_detection.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/include/game_detection.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | #ifndef _GAME_DETECT_H_ | ||||||
|  | #define _GAME_DETECT_H_ | ||||||
|  |  | ||||||
|  | typedef enum { | ||||||
|  |     GAME_UNKNOWN = 0, | ||||||
|  |     GAME_HALFLIFE, | ||||||
|  |     GAME_CS16, | ||||||
|  |     GAME_TFC, | ||||||
|  |     GAME_DAY_OF_DEFEAT, | ||||||
|  |     GAME_DMC | ||||||
|  | } GameType; | ||||||
|  |  | ||||||
|  | GameType get_current_game(void); | ||||||
|  | int IsCS16(void); | ||||||
|  | int IsHalfLife(void); | ||||||
|  | int IsDayOfDefeat(void); | ||||||
|  | int IsTFC(void); | ||||||
|  | int IsDeathmatchClassic(void); | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -36,6 +36,8 @@ enum game_id { | |||||||
| extern game_id this_game_id; | extern game_id this_game_id; | ||||||
| extern vec3_t g_punchAngles; | extern vec3_t g_punchAngles; | ||||||
| extern float g_flNextAttack, g_flNextPrimaryAttack; | extern float g_flNextAttack, g_flNextPrimaryAttack; | ||||||
|  | extern int g_iClip; | ||||||
|  | extern double g_flCurrentTime; | ||||||
|  |  | ||||||
| extern void* hw; | extern void* hw; | ||||||
| extern void** h_client; /* hClientDLL hander */ | extern void** h_client; /* hClientDLL hander */ | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| #define MAIN_H_ | #define MAIN_H_ | ||||||
|  |  | ||||||
| void load(void); | void load(void); | ||||||
|  | void unload(void); | ||||||
| void self_unload(void); | void self_unload(void); | ||||||
|  |  | ||||||
| #endif /* MAIN_H_ */ | #endif /* MAIN_H_ */ | ||||||
|   | |||||||
| @@ -36,7 +36,6 @@ bool valid_player(cl_entity_t* ent); | |||||||
| bool is_friend(cl_entity_t* ent); | bool is_friend(cl_entity_t* ent); | ||||||
| bool can_shoot(void); | bool can_shoot(void); | ||||||
| char* get_name(int ent_idx); | char* get_name(int ent_idx); | ||||||
| game_id get_cur_game(void); |  | ||||||
| vec3_t vec3(float x, float y, float z); | vec3_t vec3(float x, float y, float z); | ||||||
| vec3_t vec_add(vec3_t a, vec3_t b); | vec3_t vec_add(vec3_t a, vec3_t b); | ||||||
| vec3_t vec_sub(vec3_t a, vec3_t b); | vec3_t vec_sub(vec3_t a, vec3_t b); | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -8,44 +8,88 @@ | |||||||
| #include "include/cvars.h" | #include "include/cvars.h" | ||||||
| #include "include/hooks.h" | #include "include/hooks.h" | ||||||
| #include "include/util.h" | #include "include/util.h" | ||||||
|  | #include "include/game_detection.h" | ||||||
|  |  | ||||||
| static bool loaded = false; | static bool loaded = false; | ||||||
|  |  | ||||||
| __attribute__((constructor)) /* Entry point when injected */ | __attribute__((constructor)) /* Entry point when injected */ | ||||||
| void load(void) { | void load(void) { | ||||||
|     printf("hl-cheat injected!\n"); |     printf("goldsource-cheat injected!\n"); | ||||||
|  |  | ||||||
|     /* Initialize globals/interfaces */ |     /* Initialize globals/interfaces */ | ||||||
|     if (!globals_init()) { |     if (!globals_init()) { | ||||||
|         fprintf(stderr, "hl-cheat: load: error loading globals, aborting\n"); |         fprintf(stderr, "goldsource-cheat: load: error loading globals, aborting\n"); | ||||||
|         self_unload(); |         self_unload(); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Create cvars for settings */ |     /* Create cvars for settings */ | ||||||
|     if (!cvars_init()) { |     if (!cvars_init()) { | ||||||
|         fprintf(stderr, "hl-cheat: load: error creating cvars, aborting\n"); |         fprintf(stderr, "goldsource-cheat: load: error creating cvars, aborting\n"); | ||||||
|         self_unload(); |         self_unload(); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Hook functions */ |     /* Hook functions */ | ||||||
|     if (!hooks_init()) { |     if (!hooks_init()) { | ||||||
|         fprintf(stderr, "hl-cheat: load: error hooking functions, aborting\n"); |         fprintf(stderr, "goldsource-cheat: load: error hooking functions, aborting\n"); | ||||||
|         self_unload(); |         self_unload(); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Get game version after injecting */ |     /* Get game version after injecting */ | ||||||
|     this_game_id = get_cur_game(); |  | ||||||
|  |  | ||||||
|     i_engine->pfnClientCmd("echo \"hl-cheat loaded successfully!\""); |     if (IsCS16()) { | ||||||
|  |         i_engine->pfnClientCmd("play 'sound/radio/go.wav'"); | ||||||
|  |     } | ||||||
|  |     else if (IsDayOfDefeat()) { | ||||||
|  |         i_engine->pfnClientCmd("play 'sound/player/gersniper.wav'"); | ||||||
|  |     } | ||||||
|  |     else if (IsTFC()) { | ||||||
|  |         i_engine->pfnClientCmd("play 'sound/misc/party2.wav'"); | ||||||
|  |     } | ||||||
|  |     else if (IsDeathmatchClassic()) { | ||||||
|  |         i_engine->pfnClientCmd("play 'sound/items/suit.wav'"); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         i_engine->pfnClientCmd("play 'valve/sound/vox/suit.wav'"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     i_engine->pfnClientCmd("echo \"goldsource-cheat loaded successfully!\""); | ||||||
|  |     i_engine->pfnClientCmd("echo \"Deadzone rulez!\""); | ||||||
|  |     i_engine->pfnClientCmd("echo \"https://git.deadzone.lol/Wizzard/goldsource-cheat\""); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     GameType game = get_current_game(); | ||||||
|  |     switch(game) { | ||||||
|  |         case GAME_HALFLIFE: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Half-Life 1\""); | ||||||
|  |             break; | ||||||
|  |         case GAME_CS16: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Counter-Strike 1.6\""); | ||||||
|  |             break; | ||||||
|  |         case GAME_DAY_OF_DEFEAT: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Day of Defeat\""); | ||||||
|  |             break; | ||||||
|  |         case GAME_TFC: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Team Fortress Classic\""); | ||||||
|  |             break; | ||||||
|  |         case GAME_DMC: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Deathmatch Classic\""); | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             i_engine->pfnClientCmd("echo \"Detected Game: Unknown Game\""); | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return; | ||||||
|  |  | ||||||
|     loaded = true; |     loaded = true; | ||||||
| } | } | ||||||
|  |  | ||||||
| __attribute__((destructor)) /* Entry point when unloaded */ | __attribute__((destructor)) /* Entry point when unloaded */ | ||||||
| void unload() { | void unload(void) { | ||||||
|     if (loaded) { |     if (loaded) { | ||||||
|         /* TODO: Remove our cvars */ |         /* TODO: Remove our cvars */ | ||||||
|  |  | ||||||
| @@ -55,7 +99,7 @@ void unload() { | |||||||
|         GL_UNHOOK(glColor4f); /* Manually restore OpenGL hooks here */ |         GL_UNHOOK(glColor4f); /* Manually restore OpenGL hooks here */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     printf("hl-cheat unloaded.\n\n"); |     printf("goldsource-cheat unloaded.\n\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void self_unload(void) { | void self_unload(void) { | ||||||
|   | |||||||
							
								
								
									
										65
									
								
								src/util.c
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								src/util.c
									
									
									
									
									
								
							| @@ -9,6 +9,7 @@ | |||||||
| #include "include/util.h" | #include "include/util.h" | ||||||
| #include "include/sdk.h" | #include "include/sdk.h" | ||||||
| #include "include/globals.h" | #include "include/globals.h" | ||||||
|  | #include "include/game_detection.h" | ||||||
|  |  | ||||||
| cl_entity_t* get_player(int ent_idx) { | cl_entity_t* get_player(int ent_idx) { | ||||||
|     if (ent_idx < 0 || ent_idx > 32) |     if (ent_idx < 0 || ent_idx > 32) | ||||||
| @@ -35,36 +36,31 @@ bool is_friend(cl_entity_t* ent) { | |||||||
|     if (!ent) |     if (!ent) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     /* Check the current game because this method only works for some games */ |     GameType game = get_current_game(); | ||||||
|     switch (this_game_id) { |      | ||||||
|         case TF: { |     switch (game) { | ||||||
|  |         case GAME_TFC: { | ||||||
|             extra_player_info_t* info = (extra_player_info_t*)player_extra_info; |             extra_player_info_t* info = (extra_player_info_t*)player_extra_info; | ||||||
|  |             return info[ent->index].teamnumber == info[localplayer->index].teamnumber; | ||||||
|             return info[ent->index].teamnumber == |  | ||||||
|                    info[localplayer->index].teamnumber; |  | ||||||
|         } |         } | ||||||
|         case CS: { |         case GAME_CS16: { | ||||||
|             extra_player_info_cs_t* info = |             extra_player_info_cs_t* info = (extra_player_info_cs_t*)player_extra_info; | ||||||
|               (extra_player_info_cs_t*)player_extra_info; |             return info[ent->index].teamnumber == info[localplayer->index].teamnumber; | ||||||
|  |  | ||||||
|             return info[ent->index].teamnumber == |  | ||||||
|                    info[localplayer->index].teamnumber; |  | ||||||
|         } |         } | ||||||
|         case DOD: { |         case GAME_DAY_OF_DEFEAT: { | ||||||
|             extra_player_info_dod_t* info = |             extra_player_info_dod_t* info = (extra_player_info_dod_t*)player_extra_info; | ||||||
|               (extra_player_info_dod_t*)player_extra_info; |             return info[ent->index].teamnumber == info[localplayer->index].teamnumber; | ||||||
|  |  | ||||||
|             return info[ent->index].teamnumber == |  | ||||||
|                    info[localplayer->index].teamnumber; |  | ||||||
|         } |         } | ||||||
|         case HL: |         case GAME_HALFLIFE: | ||||||
|  |         case GAME_DMC: | ||||||
|         default: |         default: | ||||||
|             return false; |             return false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| bool can_shoot(void) { | bool can_shoot(void) { | ||||||
|     return g_flNextAttack <= 0.0f && g_flNextPrimaryAttack <= 0.0f; |     return g_iClip > 0 && g_flNextAttack <= 0.0f && | ||||||
|  |            g_flNextPrimaryAttack <= 0.0f; | ||||||
| } | } | ||||||
|  |  | ||||||
| char* get_name(int ent_idx) { | char* get_name(int ent_idx) { | ||||||
| @@ -74,26 +70,6 @@ char* get_name(int ent_idx) { | |||||||
|     return info.name; |     return info.name; | ||||||
| } | } | ||||||
|  |  | ||||||
| game_id get_cur_game(void) { |  | ||||||
|     typedef void (*COM_ParseDirectoryFromCmd_t)(const char*, char*, int, |  | ||||||
|                                                 const char*); |  | ||||||
|     COM_ParseDirectoryFromCmd_t COM_ParseDirectoryFromCmd = |  | ||||||
|       (COM_ParseDirectoryFromCmd_t)dlsym(hw, "COM_ParseDirectoryFromCmd"); |  | ||||||
|  |  | ||||||
|     char game[FILENAME_MAX]; |  | ||||||
|     COM_ParseDirectoryFromCmd("-game", game, sizeof(game), "valve"); |  | ||||||
|  |  | ||||||
|     /* Get the current game we are playing */ |  | ||||||
|     if (game[0] == 'c' && game[1] == 's') /* cstrike */ |  | ||||||
|         return CS; |  | ||||||
|     else if (*game == 'd') /* dod */ |  | ||||||
|         return DOD; |  | ||||||
|     else if (*game == 't') /* tfc */ |  | ||||||
|         return TF; |  | ||||||
|     else |  | ||||||
|         return HL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| vec3_t vec3(float x, float y, float z) { | vec3_t vec3(float x, float y, float z) { | ||||||
|     vec3_t ret; |     vec3_t ret; | ||||||
|  |  | ||||||
| @@ -187,10 +163,15 @@ bool world_to_screen(vec3_t vec, vec2_t screen) { | |||||||
|     scr_inf.iSize = sizeof(SCREENINFO); |     scr_inf.iSize = sizeof(SCREENINFO); | ||||||
|     i_engine->pfnGetScreenInfo(&scr_inf); |     i_engine->pfnGetScreenInfo(&scr_inf); | ||||||
|  |  | ||||||
|     /* If within bounds, transform to screen scale */ |  | ||||||
|     if (screen[0] < 1 && screen[1] < 1 && screen[0] > -1 && screen[1] > -1) { |     if (screen[0] < 1 && screen[1] < 1 && screen[0] > -1 && screen[1] > -1) { | ||||||
|  |     if (IsDayOfDefeat()) { | ||||||
|  |         printf("Before transformation: %f, %f, Depth: %f\n", screen[0], screen[1], screen[2]); | ||||||
|  |         screen[0] = ((screen[0] + 1) * 0.5) * scr_inf.iWidth; | ||||||
|  |         screen[1] = ((1 - screen[1]) * 0.5) * scr_inf.iHeight;     | ||||||
|  |     } else { | ||||||
|         screen[0] = screen[0] * (scr_inf.iWidth / 2) + (scr_inf.iWidth / 2); |         screen[0] = screen[0] * (scr_inf.iWidth / 2) + (scr_inf.iWidth / 2); | ||||||
|         screen[1] = -screen[1] * (scr_inf.iHeight / 2) + (scr_inf.iHeight / 2); |         screen[1] = -screen[1] * (scr_inf.iHeight / 2) + (scr_inf.iHeight / 2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| @@ -270,7 +251,7 @@ bool protect_addr(void* ptr, int new_flags) { | |||||||
|     int pgsz = getpagesize(); |     int pgsz = getpagesize(); | ||||||
|  |  | ||||||
|     if (mprotect(p, pgsz, new_flags) == -1) { |     if (mprotect(p, pgsz, new_flags) == -1) { | ||||||
|         printf("hl-cheat: error protecting %p\n", ptr); |         printf("goldsource-cheat: error protecting %p\n", ptr); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user