This repository has been archived on 2023-09-02. You can view files and clone it, but cannot push or open issues or pull requests.
csh/cheat.py

448 lines
15 KiB
Python
Raw Normal View History

2023-03-30 23:19:17 +02:00
from win32api import GetAsyncKeyState
2023-03-31 04:08:21 +02:00
from win32con import EM_LINEINDEX, LOCKF_PHYSICAL_LOCK, VK_SPACE
2023-03-30 23:19:17 +02:00
2023-03-31 02:44:37 +02:00
from hack import Hack, sleep
2023-03-31 04:08:21 +02:00
from utils import Vec, angle_fixer, calculate_angle, hypot
2023-03-30 23:19:17 +02:00
class Cheat(Hack):
def __init__(self) -> None:
super().__init__()
self.cheats_list = [func for func in dir(self)
# Function
if callable(getattr(self, func))
# User defined
if not func.startswith("_")
# Hack loop
if not func == "hack_loop"
# Utils
if not func.startswith("find_")]
def bhop(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
# Get client
client = self.find_module("client")
# Get player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
def cheat():
# Pressing space bar
if not GetAsyncKeyState(VK_SPACE):
return
# Check if player is alive
if not mem.read_uint(local_player + offset["m_iHealth"]):
return
# Check if player on ground
if mem.read_uint(local_player + offset["m_fFlags"]) & (1 << 0):
mem.write_uint(client + offset["dwForceJump"], 5)
sleep(0.01)
mem.write_uint(client + offset["dwForceJump"], 4)
self.hack_loop(cheat)
def radar_hack(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
# Get module address
client = self.find_module("client")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
# Get local team
local_team = self.find_uint(local_player, offset["m_iTeamNum"])
def cheat():
# Loop all entities
2023-03-30 23:44:47 +02:00
for i in range(1, 32): # 0 is world
2023-03-30 23:19:17 +02:00
entity = mem.read_uint(
client + offset["dwEntityList"] + i * offset["entity_size"])
# Ignore if entity doesn't exist
if not entity:
continue
# Ignore allies
if mem.read_uint(entity + offset["m_iTeamNum"]) == local_team:
continue
2023-03-31 00:58:44 +02:00
# Ignore dormant
if mem.read_bool(entity + offset["m_bDormant"]):
continue
2023-03-30 23:19:17 +02:00
# Check if ennemy is alive
2023-03-31 03:38:40 +02:00
if mem.read_int(entity + offset["m_lifeState"]):
2023-03-30 23:19:17 +02:00
continue
mem.write_bool(entity + offset["m_bSpotted"], True)
self.hack_loop(cheat)
def glow(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
# Get module address
client = self.find_module("client")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
# Get local team
local_team = self.find_uint(local_player, offset["m_iTeamNum"])
# Get glow object manager
glow_obj_manager = self.find_uint(
client, offset["dwGlowObjectManager"])
def cheat():
# Loop all entities
2023-03-30 23:44:47 +02:00
for i in range(1, 32): # 0 is world
2023-03-30 23:19:17 +02:00
entity = mem.read_uint(
client + offset["dwEntityList"] + i * offset["entity_size"])
# Ignore if entity doesn't exist
if not entity:
continue
# Ignore allies
if mem.read_uint(entity + offset["m_iTeamNum"]) == local_team:
continue
2023-03-31 00:58:44 +02:00
# Ignore dormant
if mem.read_bool(entity + offset["m_bDormant"]):
continue
2023-03-30 23:19:17 +02:00
# Check if ennemy is alive
2023-03-31 03:38:40 +02:00
if mem.read_int(entity + offset["m_lifeState"]):
2023-03-30 23:19:17 +02:00
continue
# Space between values
i = mem.read_int(
entity + offset["m_iGlowIndex"]) * offset["glow_obj_size"]
# Change color glow
mem.write_float(glow_obj_manager + i + offset["glow_R"], 1.)
2023-03-30 23:44:47 +02:00
# mem.write_float(glow_obj_manager + i + offset["glow_G"], 0.)
# mem.write_float(glow_obj_manager + i + offset["glow_B"], 0.)
2023-03-30 23:19:17 +02:00
mem.write_float(glow_obj_manager + i + offset["glow_A"], 1.)
# Render when not visible
mem.write_bool(glow_obj_manager + i + offset["GOM_wall"], True)
# Render when visible
mem.write_bool(glow_obj_manager + i +
offset["GOM_visible"], True)
self.hack_loop(cheat)
def trigger(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
# Get module address
client = self.find_module("client")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
# Get local team
local_team = self.find_uint(local_player, offset["m_iTeamNum"])
def cheat():
# Pressing trigger key
if not GetAsyncKeyState(EM_LINEINDEX):
return
# Check if player is alive
if not mem.read_int(local_player + offset["m_iHealth"]):
return
# Get crosshair info about what we aiming at
crosshair_id = mem.read_int(
local_player + offset["m_iCrosshairId"])
# 0 is wall, +64 isn't a player
if (crosshair_id == 0) or (crosshair_id > 64):
return
# Get ennemy under crosshair
ennemy = mem.read_uint(
client + offset["dwEntityList"] + (crosshair_id - 1) * offset["entity_size"])
# Check if ennemy is alive
2023-03-31 04:07:36 +02:00
if mem.read_int(ennemy + offset["m_lifeState"]):
2023-03-30 23:19:17 +02:00
return
# Ignore allies
if mem.read_int(ennemy + offset["m_iTeamNum"]) == local_team:
return
# Shoot
mem.write_uint(client + offset["dwForceAttack"], 6)
sleep(0.2)
mem.write_uint(client + offset["dwForceAttack"], 4)
self.hack_loop(cheat)
def no_recoil(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
# Get module addresses
client = self.find_module("client")
engine = self.find_module("engine")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
2023-03-31 00:58:44 +02:00
# Get client state
client_state = mem.read_uint(engine + offset["dwClientState"])
2023-03-30 23:19:17 +02:00
# Control variable
2023-03-31 04:13:23 +02:00
self.nr__old_punch = Vec()
2023-03-30 23:19:17 +02:00
def cheat():
# Check if player is shooting
if mem.read_int(local_player + offset["m_iShotsFired"]):
# Where player is looking
2023-03-31 04:13:23 +02:00
view_angles = Vec(
mem.read_float(
client_state + offset["dwClientState_ViewAngles"]),
mem.read_float(
client_state + offset["dwClientState_ViewAngles"] + offset["float"])
)
aim_punch = Vec(
mem.read_float(
local_player + offset["m_aimPunchAngle"]),
mem.read_float(
local_player + offset["m_aimPunchAngle"] + offset["float"])
).times(2.) # server multiple punch by 2
2023-03-30 23:19:17 +02:00
# New angles
2023-03-31 04:13:23 +02:00
new_angle = angle_fixer(view_angles.plus(
self.nr__old_punch).minus(aim_punch))
2023-03-30 23:19:17 +02:00
# Cancel recoil
mem.write_float(
2023-03-31 04:13:23 +02:00
client_state + offset["dwClientState_ViewAngles"], new_angle.x)
2023-03-30 23:19:17 +02:00
mem.write_float(
2023-03-31 04:13:23 +02:00
client_state + offset["dwClientState_ViewAngles"] + offset["float"], new_angle.y)
2023-03-30 23:19:17 +02:00
2023-03-31 04:13:23 +02:00
self.nr__old_punch = aim_punch
2023-03-30 23:19:17 +02:00
else:
# Not spraying
2023-03-31 04:13:23 +02:00
self.nr__old_punch = Vec()
2023-03-30 23:19:17 +02:00
self.hack_loop(cheat)
def aimbot(self) -> None:
2023-03-31 04:08:21 +02:00
# Aliases
mem = self.pm
offset = self.offsets
# Get module addresses
client = self.find_module("client")
engine = self.find_module("engine")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
# Get local team
local_team = self.find_uint(local_player, offset["m_iTeamNum"])
# Get client state
client_state = self.find_uint(engine, offset["dwClientState"])
2023-03-30 23:19:17 +02:00
def cheat():
2023-03-31 04:08:21 +02:00
# Pressing left click
if not GetAsyncKeyState(LOCKF_PHYSICAL_LOCK):
return
# Where are the eyes
local_eye_pos = Vec(
mem.read_float(
local_player + offset["m_vecOrigin"]),
mem.read_float(
local_player + offset["m_vecOrigin"] + offset["float"]),
mem.read_float(
local_player + offset["m_vecOrigin"] + offset["float"] * 2)
).plus(Vec(
mem.read_float(
local_player + offset["m_vecViewOffset"]),
mem.read_float(
local_player + offset["m_vecViewOffset"] + offset["float"]),
mem.read_float(
local_player + offset["m_vecViewOffset"] + offset["float"] * 2)
))
# Where player is looking
view_angles = Vec(
mem.read_float(
client_state + offset["dwClientState_ViewAngles"]),
mem.read_float(
client_state + offset["dwClientState_ViewAngles"] + offset["float"])
)
# How much the view is modified
aim_punch = Vec(
mem.read_float(
local_player + offset["m_aimPunchAngle"]),
mem.read_float(
local_player + offset["m_aimPunchAngle"] + offset["float"])
).times(2.) # server multiple punch by 2
2023-03-31 04:35:07 +02:00
# AimBot FOV, higher = more aggressive
2023-03-31 04:08:21 +02:00
best_fov = 5.
best_angle = Vec()
# Loop all entities
for i in range(1, 32): # 0 is world
entity = mem.read_uint(
client + offset["dwEntityList"] + i * offset["entity_size"])
# Ignore if entity doesn't exist
if not entity:
continue
# Ignore allies
if mem.read_int(entity + offset["m_iTeamNum"]) == local_team:
continue
# Ignore dormant
if mem.read_bool(entity + offset["m_bDormant"]):
continue
# Check if ennemy is alive
if mem.read_int(entity + offset["m_lifeState"]):
continue
# TODO: Ignore ennemies behind wall
# Find head
boneMatrix = mem.read_uint(entity + offset["m_dwBoneMatrix"])
ennemy_head = Vec(
mem.read_float(
boneMatrix + offset["head_idx"] + offset["head_x"]),
mem.read_float(
boneMatrix + offset["head_idx"] + offset["head_y"]),
mem.read_float(
boneMatrix + offset["head_idx"] + offset["head_z"])
)
angle = calculate_angle(
local_eye_pos, ennemy_head, view_angles.plus(aim_punch))
# Current FOV
fov = hypot(angle.x, angle.y)
if (fov < best_fov):
best_fov = fov
best_angle = angle
# We found an ennemy to aim at
if not best_angle.is_zero():
2023-03-31 04:35:07 +02:00
# Smoothing, more = less efficient
2023-03-31 04:08:21 +02:00
best_angle = best_angle.div(3.)
final_angle = view_angles.plus(best_angle)
# Fix angle if needed
final_angle = angle_fixer(final_angle)
mem.write_float(
2023-03-31 04:35:07 +02:00
client_state + offset["dwClientState_ViewAngles"], final_angle.x)
2023-03-31 04:08:21 +02:00
mem.write_float(
2023-03-31 04:35:07 +02:00
client_state + offset["dwClientState_ViewAngles"] + offset["float"], final_angle.y)
2023-03-30 23:19:17 +02:00
self.hack_loop(cheat)
def chams(self) -> None:
2023-03-30 23:44:52 +02:00
# Aliases
mem = self.pm
offset = self.offsets
# Get module addresses
client = self.find_module("client")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
# Get local team
local_team = self.find_uint(local_player, offset["m_iTeamNum"])
2023-03-30 23:19:17 +02:00
def cheat():
2023-03-30 23:44:52 +02:00
# Loop all entities
for i in range(1, 32): # 0 is world
entity = mem.read_uint(
client + offset["dwEntityList"] + i * offset["entity_size"])
# Ignore if entity doesn't exist
if not entity:
continue
# Ignore allies
if mem.read_uint(entity + offset["m_iTeamNum"]) == local_team:
continue
2023-03-31 00:58:44 +02:00
# Ignore dormant
if mem.read_bool(entity + offset["m_bDormant"]):
continue
2023-03-30 23:44:52 +02:00
# Check if ennemy is alive
2023-03-31 03:38:40 +02:00
if mem.read_int(entity + offset["m_lifeState"]):
2023-03-30 23:44:52 +02:00
continue
# Space between values
i = mem.read_int(
entity + offset["m_iGlowIndex"]) * offset["glow_obj_size"]
# Change color
mem.write_uint(
entity + offset["m_clrRender"] + offset["render_R"], 255)
mem.write_uint(
entity + offset["m_clrRender"] + offset["render_G"], 255)
# mem.write_uint(
# entity + offset["m_clrRender"] + offset["render_B"], 0)
2023-03-31 00:58:44 +02:00
# Once this is set, no need to recycle again
sleep(100)
2023-03-30 23:19:17 +02:00
self.hack_loop(cheat)
def noflash(self) -> None:
# Aliases
mem = self.pm
offset = self.offsets
2023-03-30 23:44:47 +02:00
# Get module address
2023-03-30 23:19:17 +02:00
client = self.find_module("client")
# Get local player
local_player = self.find_uint(client, offset["dwLocalPlayer"])
def cheat():
if (mem.read_int(local_player + offset["m_flFlashDuration"])):
mem.write_int(local_player + offset["m_flFlashDuration"], 0)
2023-03-31 03:42:48 +02:00
# Less chance to get flashed again
2023-03-30 23:19:17 +02:00
sleep(1)
self.hack_loop(cheat)