Загрузка данных


import pymem
import pymem.process
import ctypes
import time
import math

user32 = ctypes.windll.user32
gdi32 = ctypes.windll.gdi32

# === ВАШИ ОФФСЕТЫ (из скриншота) ===
OFFSET_VIEW_MATRIX = 0x12EAF0      # Client + 0x12EAF0
OFFSET_ENTITY_LIST = 0x12043C8     # Engine + 0x12043C8
OFFSET_IN_CROSS = 0x125314         # Client + 0x125314 (для триггера)
OFFSET_RECOIL = 0x122E324          # Engine + 0x122E324
OFFSET_ON_GROUND = 0x122E2D4       # Engine + 0x122E2D4
OFFSET_MOVE_TYPE = 0x100A0B8       # Engine + 0x100A0B8
OFFSET_ON_LADDER = 0x136D8C        # Client + 0x136D8C
OFFSET_IS_CHATTING = 0x64429C      # Engine + 0x64429C
OFFSET_IN_MENU = 0x6C3AB0          # Engine + 0x6C3AB0

# Стандартные смещения внутри структуры PlayerInfo
OFFSET_HEALTH = 0xF8               # m_iHealth
OFFSET_TEAM = 0xF0                 # m_iTeamNum
OFFSET_ORIGIN = 0x130              # m_vecOrigin

ESP_ENABLED = True
ESP_COLOR = 0x0000FF  # Красный
BOX_SIZE = 20

def get_window_size():
    hwnd = user32.FindWindowW(None, "Counter-Strike")
    rect = ctypes.wintypes.RECT()
    user32.GetWindowRect(hwnd, ctypes.byref(rect))
    return rect.right - rect.left, rect.bottom - rect.top

def world_to_screen(x, y, z, view_matrix, sw, sh):
    w = view_matrix[12]*x + view_matrix[13]*y + view_matrix[14]*z + view_matrix[15]
    if w < 0.01:
        return None
    sx = view_matrix[0]*x + view_matrix[1]*y + view_matrix[2]*z + view_matrix[3]
    sy = view_matrix[4]*x + view_matrix[5]*y + view_matrix[6]*z + view_matrix[7]
    sx = (sw / 2) * (1 + sx / w)
    sy = (sh / 2) * (1 - sy / w)
    return (sx, sy)

def draw_rect(dc, x, y, w, h, color):
    brush = gdi32.CreateSolidBrush(color)
    gdi32.SelectObject(dc, brush)
    gdi32.Rectangle(dc, int(x - w/2), int(y - h/2), int(x + w/2), int(y + h/2))
    gdi32.DeleteObject(brush)

def main():
    SCREEN_W, SCREEN_H = get_window_size()
    
    print("=== CS 1.6 ESP (с вашими оффсетами) ===")
    print("Rutube: https://rutube.ru/channel/43805541")
    print("Telegram: hackeriks")
    print()
    
    try:
        pm = pymem.Pymem("hl.exe")
        print("[+] hl.exe найден")
    except:
        print("[-] CS 1.6 не запущена")
        return
    
    # Получаем базы модулей
    engine = pymem.process.module_from_name(pm.process_handle, "hw.dll")
    client = pymem.process.module_from_name(pm.process_handle, "client.dll")
    
    engine_base = engine.lpBaseOfDll
    client_base = client.lpBaseOfDll
    
    print(f"[+] Engine (hw.dll) base: {hex(engine_base)}")
    print(f"[+] Client (client.dll) base: {hex(client_base)}")
    
    # Абсолютные адреса
    view_matrix_addr = client_base + OFFSET_VIEW_MATRIX
    entity_list_addr = engine_base + OFFSET_ENTITY_LIST
    
    print(f"[+] ViewMatrix: {hex(view_matrix_addr)}")
    print(f"[+] EntityList: {hex(entity_list_addr)}")
    
    # Получаем дескриптор окна для рисования
    hwnd = user32.FindWindowW(None, "Counter-Strike")
    dc = user32.GetDC(hwnd)
    
    print("[*] ESP активен. F1 - вкл/выкл, F2 - выход")
    
    global ESP_ENABLED
    running = True
    
    while running:
        # Управление
        if user32.GetAsyncKeyState(0x70) & 1:  # F1
            ESP_ENABLED = not ESP_ENABLED
            print(f"ESP: {'ON' if ESP_ENABLED else 'OFF'}")
            time.sleep(0.2)
        if user32.GetAsyncKeyState(0x71) & 1:  # F2
            running = False
            break
        
        if not ESP_ENABLED:
            time.sleep(0.05)
            continue
        
        # Очищаем экран
        brush = gdi32.CreateSolidBrush(0x000000)
        gdi32.SelectObject(dc, brush)
        gdi32.Rectangle(dc, 0, 0, SCREEN_W, SCREEN_H)
        gdi32.DeleteObject(brush)
        
        try:
            # Читаем матрицу вида
            view_matrix = []
            for i in range(16):
                view_matrix.append(pm.read_float(view_matrix_addr + i*4))
            
            # Читаем EntityList (указатель на первый объект)
            entity_list = pm.read_int(entity_list_addr)
            if not entity_list:
                continue
            
            # Перебираем игроков (1-32)
            for i in range(1, 33):
                entity = pm.read_int(entity_list + i * 4)
                if not entity:
                    continue
                
                # Команда и здоровье
                team = pm.read_int(entity + OFFSET_TEAM)
                health = pm.read_int(entity + OFFSET_HEALTH)
                
                if health <= 0:
                    continue
                
                # Координаты
                x = pm.read_float(entity + OFFSET_ORIGIN)
                y = pm.read_float(entity + OFFSET_ORIGIN + 4)
                z = pm.read_float(entity + OFFSET_ORIGIN + 8)
                
                # Рисуем рамку над головой
                screen = world_to_screen(x, y, z + 60, view_matrix, SCREEN_W, SCREEN_H)
                if screen:
                    # Разный цвет для врагов и союзников
                    if team == 2:
                        draw_rect(dc, screen[0], screen[1], BOX_SIZE, BOX_SIZE, 0x0000FF)  # CT - синий
                    elif team == 1:
                        draw_rect(dc, screen[0], screen[1], BOX_SIZE, BOX_SIZE, 0x00FF00)  # T - зелёный
                    else:
                        draw_rect(dc, screen[0], screen[1], BOX_SIZE, BOX_SIZE, 0xFFFFFF)  # Неизвестно - белый
                        
        except Exception as e:
            pass
        
        time.sleep(0.03)
    
    user32.ReleaseDC(hwnd, dc)
    print("ESP остановлен.")

if __name__ == "__main__":
    main()