Начинающий
- Статус
- Оффлайн
- Регистрация
- 28 Май 2025
- Сообщения
- 10
- Реакции
- 0
Решил написать простенький esp на python с помощью модуля pygame(знаю что с imgui и glfw было бы лучше,но тк я еще эти модули не освоил,то пока пытаюсь написать на pygame),проблема в том,что мой код(приложу ниже) просто создает прозрачное окно и рисует на нем обводку(красный прямоугольник),но не вокруг игроков, а просто- один такой прямоугольник по центру экрана, через несколько секунд после запуска кода вылезает ошибка,что окно pygame не отвечает,на этом все. Так как я в этом деле новичок,то хотелось бы послушать советы знатоков на данную тему,тк наверняка ошибка где-то в моем коде,но сам найти ее не могу. Буду рад любым советам
Python:
import requests
import pymem
import pymem.process
import struct
import pygame
import sys
import win32api
import win32con
import win32gui
def get_offsets():
offsets = requests.get('https://raw.githubusercontent.com/a2x/cs2-dumper/main/output/offsets.json').json()
client_dll = requests.get('https://raw.githubusercontent.com/a2x/cs2-dumper/main/output/client_dll.json').json()
return {
'dwEntityList': offsets['client.dll']['dwEntityList'],
'dwLocalPlayerPawn': offsets['client.dll']['dwLocalPlayerPawn'],
'm_iTeamNum': client_dll['client.dll']['classes']['C_BaseEntity']['fields']['m_iTeamNum'],
'm_iHealth': client_dll['client.dll']['classes']['C_BaseEntity']['fields']['m_iHealth'],
'm_iIDEntIndex': client_dll['client.dll']['classes']['C_CSPlayerPawnBase']['fields']['m_iIDEntIndex'],
'm_vecOrigin': client_dll['client.dll']['classes']['CGameSceneNode']['fields']['m_vecOrigin'],
'dwViewMatrix': offsets['client.dll']['dwViewMatrix'],
'm_hPlayerPawn' : client_dll['client.dll']['classes']['CCSPlayerController']['fields']['m_hPlayerPawn']
}
offsets = get_offsets()
client_dll = get_offsets()
try:
pm = pymem.Pymem('cs2.exe')
except pymem.exception.ProcessNotFound:
print('...Запустите игру!...')
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll
pygame.init()
# Создаем поверхность с альфа-каналом
screen = pygame.display.set_mode((1920, 1080), pygame.NOFRAME | pygame.SRCALPHA)
transparent = (255, 0, 255 ) # RGBA с альфа=0 (полная прозрачность)
# Настройки окна
hwnd = pygame.display.get_wm_info()["window"]
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE,
win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED)
win32gui.SetLayeredWindowAttributes(hwnd, win32api.RGB(*transparent), 0, win32con.LWA_COLORKEY)
for event in pygame.event.get():
if event.type == pygame.QUIT: # Закрытие по Alt+F4
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE: # Выход по ESC
pygame.quit()
sys.exit()
def draw_esp(screen, screen_x, screen_y, enemy_w, enemy_h):
pygame.draw.rect(screen, (255, 0, 0), (screen_x, screen_y, enemy_w, enemy_h), 2)
def get_view_matrix():
matrix_bytes = pm.read_bytes(client + offsets['dwViewMatrix'], 64)
return struct.unpack("16f", matrix_bytes)
def read_position(entity_address):
x =pm.read_float(entity_address + offsets['m_vecOrigin'])
y = pymem.memory.read_float(pm.process_handle, entity_address + offsets['m_vecOrigin'] + 0x4)
z = pymem.memory.read_float(pm.process_handle, entity_address + offsets['m_vecOrigin'] + 0x8)
return (x, y, z)
def world_to_screen(view_matrix, world_pos, screen_width=1920, screen_height=1080):
x, y, z = world_pos
# 1. Умножаем на матрицу вида (получаем clip-координаты)
clip_x = x * view_matrix[0] + y * view_matrix[4] + z * view_matrix[8] + view_matrix[12]
clip_y = x * view_matrix[1] + y * view_matrix[5] + z * view_matrix[9] + view_matrix[13]
clip_z = x * view_matrix[2] + y * view_matrix[6] + z * view_matrix[10] + view_matrix[14]
clip_w = x * view_matrix[3] + y * view_matrix[7] + z * view_matrix[11] + view_matrix[15]
# 2. Если объект позади камеры — не рисуем
if clip_w < 0.1:
return None
# 3. Нормализуем координаты (переводим в NDC)
ndc_x = clip_x / clip_w
ndc_y = clip_y / clip_w
# 4. Переводим в экранные координаты
screen_x = (screen_width / 2 * ndc_x) + (screen_width / 2)
screen_y = -(screen_height / 2 * ndc_y) + (screen_height / 2)
return (int(screen_x), int(screen_y))
while True:
screen.fill(transparent)
local_player_pawn_addr = pm.read_longlong(client + offsets['dwLocalPlayerPawn'])
if not local_player_pawn_addr:
print('...local_player_pawn_addr не найден...')
continue
view_matrix = get_view_matrix()
for i in range(64):
entity = pm.read_longlong(client + offsets['dwEntityList'])
if not entity:
continue
list_entry = pm.read_longlong(entity + ((8 * (i & 0x7FFF) >> 9) + 16))
if not list_entry:
continue
entity_controller = pm.read_longlong(list_entry + 120 * (i & 0x1FF))
if not entity_controller:
continue
entity_controller_pawn = pm.read_longlong(entity_controller + client_dll['m_hPlayerPawn'])
if not entity_controller_pawn:
continue
list_entry = pm.read_longlong(entity + (0x8 * ((entity_controller_pawn & 0x7FFF) >> 9) + 16))
if not list_entry:
continue
entity_pawn_addr = pm.read_longlong(list_entry + 120 * (entity_controller_pawn & 0x1FF))
if not entity_pawn_addr or entity_pawn_addr == local_player_pawn_addr:
continue
entity_team = pm.read_int(entity_pawn_addr + client_dll['m_iTeamNum'])
entity_health = pm.read_int(entity_pawn_addr + client_dll['m_iHealth'])
local_player_team = pm.read_int((local_player_pawn_addr + client_dll['m_iTeamNum']))
if entity_team == local_player_team or entity_health<=0:
continue
pos = read_position(entity_pawn_addr)
screen_pos = world_to_screen(view_matrix, pos)
if screen_pos:
draw_esp(screen, screen_pos[0], screen_pos[1], 40, 70)
pygame.display.flip()
pygame.time.delay(10)