AssaultCube-Hack/modules/esp.py
imnyang 1730b73d1f
Some checks failed
Python Type Check and Lint / ci (push) Failing after 1s
feat: implement various player hacks and refactor main loop for modularity
2026-05-30 18:45:42 +09:00

114 lines
3.5 KiB
Python

import pyMeow as pm
# ESP 오프셋
class ESPOffsets:
name = 0x205
health = 0xEC
armor = 0xF0
team = 0x30C
pos = 0x4 # Head position
fpos = 0x28 # Foot position
# 색상
class Colors:
cyan = None
orange = None
white = None
black = None
def init_colors():
"""오버레이 초기화 후 색상을 초기화합니다."""
Colors.cyan = pm.get_color("cyan")
Colors.orange = pm.get_color("orange")
Colors.white = pm.get_color("white")
Colors.black = pm.get_color("black")
class Entity:
def __init__(self, proc, addr):
self.proc = proc
self.addr = addr
self.health = pm.r_int(proc, addr + ESPOffsets.health)
if self.health <= 0 or self.health > 10000:
raise Exception("Entity is not alive or invalid.")
self.name = pm.r_string(proc, addr + ESPOffsets.name)
self.armor = pm.r_int(proc, addr + ESPOffsets.armor)
self.team = pm.r_int(proc, addr + ESPOffsets.team)
self.color = Colors.cyan if self.team else Colors.orange
self.pos3d = pm.r_vec3(proc, self.addr + ESPOffsets.pos)
self.fpos3d = pm.r_vec3(proc, self.addr + ESPOffsets.fpos)
self.pos2d = self.fpos2d = None
self.head = self.width = self.center = None
def wts(self, vm):
try:
self.pos2d = pm.world_to_screen(vm, self.pos3d)
self.fpos2d = pm.world_to_screen(vm, self.fpos3d)
self.head = self.fpos2d["y"] - self.pos2d["y"]
self.width = self.head / 2
self.center = self.width / 2
return True
except:
return False
def draw_box(self):
pm.draw_rectangle(
posX=self.pos2d["x"] - self.center,
posY=self.pos2d["y"] - self.center / 2,
width=self.width,
height=self.head + self.center / 2,
color=pm.fade_color(self.color, 0.3),
)
pm.draw_rectangle_lines(
posX=self.pos2d["x"] - self.center,
posY=self.pos2d["y"] - self.center / 2,
width=self.width,
height=self.head + self.center / 2,
color=self.color,
lineThick=1.2,
)
def draw_name(self):
text_size = pm.measure_text(self.name, 15) / 2
pm.draw_text(
text=self.name,
posX=self.pos2d["x"] - text_size,
posY=self.pos2d["y"],
fontSize=15,
color=Colors.white,
)
def draw_health(self):
pm.draw_circle_sector(
centerX=self.pos2d["x"] - self.center,
centerY=self.pos2d["y"] - self.center / 2,
radius=self.center / 3 + 2,
startAngle=0,
endAngle=360,
segments=0,
color=Colors.black,
)
pm.draw_circle_sector(
centerX=self.pos2d["x"] - self.center,
centerY=self.pos2d["y"] - self.center / 2,
radius=self.center / 3,
startAngle=0,
endAngle=360 / 100 * min(self.health, 100),
segments=0,
color=self.color,
)
def process_entities(proc, ent_buffer, v_matrix, enable_esp):
valid_entities = []
for addr in ent_buffer:
if addr == 0: continue
try:
ent = Entity(proc, addr)
valid_entities.append(ent)
if enable_esp and ent.wts(v_matrix):
ent.draw_box()
ent.draw_name()
ent.draw_health()
except:
continue
return valid_entities