• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Вопрос Помощь с esp

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
28 Май 2025
Сообщения
10
Реакции
0
Решил написать простенький esp на python с помощью модуля pygame(знаю что с imgui и glfw было бы лучше,но тк я еще эти модули не освоил,то пока пытаюсь написать на pygame),проблема в том,что мой код(приложу ниже) просто создает прозрачное окно и рисует на нем обводку(красный прямоугольник),но не вокруг игроков, а просто- один такой прямоугольник по центру экрана, через несколько секунд после запуска кода вылезает ошибка,что окно pygame не отвечает,на этом все. Так как я в этом деле новичок,то хотелось бы послушать советы знатоков на данную тему,тк наверняка ошибка где-то в моем коде,но сам найти ее не могу. Буду рад любым советам
Python:
Expand Collapse Copy
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)
 
Решил написать простенький esp на python с помощью модуля pygame(знаю что с imgui и glfw было бы лучше,но тк я еще эти модули не освоил,то пока пытаюсь написать на pygame),проблема в том,что мой код(приложу ниже) просто создает прозрачное окно и рисует на нем обводку(красный прямоугольник),но не вокруг игроков, а просто- один такой прямоугольник по центру экрана, через несколько секунд после запуска кода вылезает ошибка,что окно pygame не отвечает,на этом все. Так как я в этом деле новичок,то хотелось бы послушать советы знатоков на данную тему,тк наверняка ошибка где-то в моем коде,но сам найти ее не могу. Буду рад любым советам
Python:
Expand Collapse Copy
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)
ты не в цикле обрабатываешь , а просто долбишь бесконечный while True с рисованием
 
Назад
Сверху Снизу