feat: implement various player hacks and refactor main loop for modularity
Some checks failed
Python Type Check and Lint / ci (push) Failing after 1s
Some checks failed
Python Type Check and Lint / ci (push) Failing after 1s
This commit is contained in:
parent
1b3bc8a73e
commit
1730b73d1f
9 changed files with 141 additions and 85 deletions
60
libs/core.py
60
libs/core.py
|
|
@ -1,60 +0,0 @@
|
||||||
import sys
|
|
||||||
import pyMeow as pm
|
|
||||||
from pynput import keyboard
|
|
||||||
|
|
||||||
|
|
||||||
class Pointer:
|
|
||||||
local_player = 0x17E0A8
|
|
||||||
entity_list = 0x18AC04
|
|
||||||
player_count = 0x18AC0C
|
|
||||||
view_matrix = 0x17DFD0
|
|
||||||
|
|
||||||
|
|
||||||
class ProcessManager:
|
|
||||||
"""프로세스 및 모듈 초기화 관리"""
|
|
||||||
proc = None
|
|
||||||
base = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def initialize(cls):
|
|
||||||
"""AssaultCube 프로세스 초기화"""
|
|
||||||
try:
|
|
||||||
cls.proc = pm.open_process("ac_client.exe")
|
|
||||||
cls.base = pm.get_module(cls.proc, "ac_client.exe")["base"]
|
|
||||||
print("Process and base initialized successfully.")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error initializing process: {e}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_proc(cls):
|
|
||||||
return cls.proc
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_base(cls):
|
|
||||||
return cls.base
|
|
||||||
|
|
||||||
|
|
||||||
class KeyboardManager:
|
|
||||||
"""키보드 입력 관리"""
|
|
||||||
left_shift_pressed = False
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def setup(cls):
|
|
||||||
"""키보드 리스너 시작"""
|
|
||||||
listener = keyboard.Listener(on_press=cls._on_press, on_release=cls._on_release)
|
|
||||||
listener.start()
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _on_press(cls, key):
|
|
||||||
if key == keyboard.Key.shift_l:
|
|
||||||
cls.left_shift_pressed = True
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _on_release(cls, key):
|
|
||||||
if key == keyboard.Key.shift_l:
|
|
||||||
cls.left_shift_pressed = False
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def is_left_shift_pressed(cls):
|
|
||||||
return cls.left_shift_pressed
|
|
||||||
81
main.py
81
main.py
|
|
@ -1,30 +1,73 @@
|
||||||
|
import sys
|
||||||
import pyMeow as pm
|
import pyMeow as pm
|
||||||
from libs.core import Pointer, ProcessManager, KeyboardManager
|
|
||||||
from modules.esp import Entity, init_colors as init_esp_colors
|
from lib.keyboard import KeyboardManager
|
||||||
from modules.aimbot import do_aimbot
|
from modules.esp import Entity, init_colors as init_esp_colors, process_entities
|
||||||
|
from modules.aimbot import AimBot
|
||||||
|
|
||||||
|
from modules.armor import ArmorHack
|
||||||
|
from modules.health import HealthHack
|
||||||
|
from modules.grenade import GrenadeHack
|
||||||
|
from modules.mtp57 import MTP57Hack
|
||||||
|
from modules.mk77 import MK77Hack
|
||||||
|
|
||||||
|
class Pointer:
|
||||||
|
local_player = 0x17E0A8
|
||||||
|
entity_list = 0x18AC04
|
||||||
|
player_count = 0x18AC0C
|
||||||
|
view_matrix = 0x17DFD0
|
||||||
|
|
||||||
|
proc = None
|
||||||
|
base = None
|
||||||
|
|
||||||
|
hacks = {
|
||||||
|
"aimbot": True,
|
||||||
|
"esp": True,
|
||||||
|
"armor": True,
|
||||||
|
"health": True,
|
||||||
|
"grenade": True,
|
||||||
|
"mtp57": True,
|
||||||
|
"mk77": True
|
||||||
|
}
|
||||||
|
|
||||||
def init():
|
def init():
|
||||||
ProcessManager.initialize()
|
try:
|
||||||
|
proc = pm.open_process("ac_client.exe")
|
||||||
|
base = pm.get_module(proc, "ac_client.exe")["base"]
|
||||||
|
print("Process and base initialized successfully.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error initializing process: {e}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"proc : {proc}")
|
||||||
|
print(f"base : {base}")
|
||||||
|
|
||||||
KeyboardManager.setup()
|
KeyboardManager.setup()
|
||||||
|
|
||||||
print("Starting ESP + Aimbot (Hold Right Shift) overlay...")
|
|
||||||
pm.overlay_init(target="AssaultCube", fps=144, trackTarget=True)
|
pm.overlay_init(target="AssaultCube", fps=144, trackTarget=True)
|
||||||
init_esp_colors()
|
init_esp_colors()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
proc = ProcessManager.get_proc()
|
|
||||||
base = ProcessManager.get_base()
|
|
||||||
|
|
||||||
while pm.overlay_loop():
|
while pm.overlay_loop():
|
||||||
pm.begin_drawing()
|
pm.begin_drawing()
|
||||||
pm.draw_fps(10, 10)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
player_count = pm.r_int(proc, base + Pointer.player_count)
|
player_count = pm.r_int(proc, base + Pointer.player_count)
|
||||||
local_player_addr = pm.r_int(proc, base + Pointer.local_player)
|
local_player_addr = pm.r_int(proc, base + Pointer.local_player)
|
||||||
my_team = pm.r_int(proc, local_player_addr + 0x30C) # team offset
|
my_team = pm.r_int(proc, local_player_addr + 0x30C) # team offset
|
||||||
|
|
||||||
|
if hacks["armor"] == True:
|
||||||
|
ArmorHack.apply(proc, local_player_addr)
|
||||||
|
if hacks["health"] == True:
|
||||||
|
HealthHack.apply(proc, local_player_addr)
|
||||||
|
if hacks["grenade"] == True:
|
||||||
|
GrenadeHack.apply(proc, local_player_addr)
|
||||||
|
if hacks["mtp57"] == True:
|
||||||
|
MTP57Hack.apply(proc, local_player_addr)
|
||||||
|
if hacks["mk77"] == True:
|
||||||
|
MK77Hack.apply(proc, local_player_addr)
|
||||||
|
|
||||||
valid_entities = []
|
valid_entities = []
|
||||||
|
|
||||||
if player_count > 1:
|
if player_count > 1:
|
||||||
|
|
@ -32,21 +75,11 @@ def main():
|
||||||
ent_buffer = pm.r_ints(proc, ent_list, player_count)[1:]
|
ent_buffer = pm.r_ints(proc, ent_list, player_count)[1:]
|
||||||
v_matrix = pm.r_floats(proc, base + Pointer.view_matrix, 16)
|
v_matrix = pm.r_floats(proc, base + Pointer.view_matrix, 16)
|
||||||
|
|
||||||
for addr in ent_buffer:
|
valid_entities = process_entities(proc, ent_buffer, v_matrix, hacks.get("esp"))
|
||||||
if addr == 0: continue
|
|
||||||
try:
|
|
||||||
ent = Entity(proc, addr)
|
|
||||||
valid_entities.append(ent)
|
|
||||||
if ent.wts(v_matrix):
|
|
||||||
ent.draw_box()
|
|
||||||
ent.draw_name()
|
|
||||||
ent.draw_health()
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# 에임봇 실행
|
if hacks["aimbot"] == True:
|
||||||
do_aimbot(proc, valid_entities, local_player_addr, my_team, KeyboardManager.is_left_shift_pressed())
|
AimBot(proc, valid_entities, local_player_addr, my_team, KeyboardManager.is_left_shift_pressed())
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ class AimbotOffsets:
|
||||||
yaw = 0x34 # camera_x
|
yaw = 0x34 # camera_x
|
||||||
pitch = 0x38 # camera_y
|
pitch = 0x38 # camera_y
|
||||||
|
|
||||||
def do_aimbot(proc, entities, local_player_addr, my_team, left_shift_pressed):
|
def AimBot(proc, entities, local_player_addr, my_team, left_shift_pressed):
|
||||||
if not left_shift_pressed or not entities:
|
if not left_shift_pressed or not entities:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
||||||
12
modules/armor.py
Normal file
12
modules/armor.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import pyMeow as pm
|
||||||
|
|
||||||
|
class ArmorHack:
|
||||||
|
offset = 0xF0
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def apply(cls, proc, local_player_addr, value=100):
|
||||||
|
"""local_player의 Armor 값을 100으로 고정시킵니다."""
|
||||||
|
try:
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset, value)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
@ -97,3 +97,18 @@ class Entity:
|
||||||
segments=0,
|
segments=0,
|
||||||
color=self.color,
|
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
|
||||||
|
|
|
||||||
12
modules/grenade.py
Normal file
12
modules/grenade.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import pyMeow as pm
|
||||||
|
|
||||||
|
class GrenadeHack:
|
||||||
|
offset = 0x144
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def apply(cls, proc, local_player_addr, value=9999999):
|
||||||
|
"""local_player의 Grenade 값을 9999999로 고정시킵니다."""
|
||||||
|
try:
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset, value)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
12
modules/health.py
Normal file
12
modules/health.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import pyMeow as pm
|
||||||
|
|
||||||
|
class HealthHack:
|
||||||
|
offset = 0xEC
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def apply(cls, proc, local_player_addr, value=9999):
|
||||||
|
"""local_player의 Health 값을 9999로 고정시킵니다."""
|
||||||
|
try:
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset, value)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
16
modules/mk77.py
Normal file
16
modules/mk77.py
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import pyMeow as pm
|
||||||
|
|
||||||
|
class MK77Hack:
|
||||||
|
# 008438DC is MK-77 Ammo -> offset 0x12C from local_player (0x8437B0)
|
||||||
|
# 008438B8 is MK-77 Mag -> offset 0x108 from local_player (0x8437B0)
|
||||||
|
offset_ammo = 0x12C
|
||||||
|
offset_mag = 0x108
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def apply(cls, proc, local_player_addr, ammo_value=999, mag_value=99):
|
||||||
|
"""local_player의 MK-77 총알 및 탄창 개수를 고정시킵니다."""
|
||||||
|
try:
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset_ammo, ammo_value)
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset_mag, mag_value)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
16
modules/mtp57.py
Normal file
16
modules/mtp57.py
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import pyMeow as pm
|
||||||
|
|
||||||
|
class MTP57Hack:
|
||||||
|
# 008438F0 is MTP-57 Ammo -> offset 0x140 from local_player (0x8437B0)
|
||||||
|
# 008438CC is MTP-57 Mag -> offset 0x11C from local_player (0x8437B0)
|
||||||
|
offset_ammo = 0x140
|
||||||
|
offset_mag = 0x11C
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def apply(cls, proc, local_player_addr, ammo_value=999, mag_value=99):
|
||||||
|
"""local_player의 MTP-57 총알 및 탄창 개수를 고정시킵니다."""
|
||||||
|
try:
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset_ammo, ammo_value)
|
||||||
|
pm.w_int(proc, local_player_addr + cls.offset_mag, mag_value)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
Loading…
Add table
Add a link
Reference in a new issue