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


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

dwLocalPlayer = 0x1A29B8
dwEntityList = 0x1A2A78
m_iTeamNum = 0xF0
m_iHealth = 0x1F8
m_vecOrigin = 0x130
m_vecViewOffset = 0x104
m_angRotation = 0x110

pm = pymem.Pymem("hl.exe")
client = pymem.process.module_from_name(pm.process_handle, "hw.dll")
client_base = client.lpBaseOfDll

engine = pymem.process.module_from_name(pm.process_handle, "hw.dll")  # или sw.dll
engine_base = engine.lpBaseOfDll

# Функция TraceLine (движковая)
def trace_line(start, end, ignore_player):
    # Вызываем движковую функцию UTIL_TraceLine
    # Для CS 1.6 адрес функции обычно: engine_base + 0x23A6A0
    # Этот метод сложен, поэтому используем упрощённый вариант:
    # Проверяем попадание через расчёт угла и дистанции
    pass

# Упрощённый метод: проверка угла между направлением взгляда и направлением на врага
def is_looking_at_target(view_origin, view_angles, target_origin, fov=5):
    # Направление взгляда игрока
    forward = (
        math.cos(math.radians(view_angles[1])) * math.cos(math.radians(view_angles[0])),
        math.sin(math.radians(view_angles[1])) * math.cos(math.radians(view_angles[0])),
        math.sin(math.radians(view_angles[0]))
    )
    
    # Направление на врага
    delta = (
        target_origin[0] - view_origin[0],
        target_origin[1] - view_origin[1],
        target_origin[2] - view_origin[2]
    )
    dist = math.sqrt(delta[0]**2 + delta[1]**2 + delta[2]**2)
    if dist < 0.1:
        return False
    delta = (delta[0]/dist, delta[1]/dist, delta[2]/dist)
    
    # Угол между векторами
    dot = forward[0]*delta[0] + forward[1]*delta[1] + forward[2]*delta[2]
    angle = math.degrees(math.acos(max(-1, min(1, dot))))
    
    return angle < fov

def mouse_click():
    ctypes.windll.user32.mouse_event(0x0002, 0, 0, 0, 0)
    time.sleep(0.01)
    ctypes.windll.user32.mouse_event(0x0004, 0, 0, 0, 0)

print("[+] Триггер-бот (RayTrace) запущен")
print("[+] Наведите прицел точно на врага -> выстрел")

while True:
    try:
        local_player = pm.read_int(client_base + dwLocalPlayer)
        if local_player == 0:
            time.sleep(0.05)
            continue
        
        # Координаты глаз игрока
        origin = (
            pm.read_float(local_player + m_vecOrigin),
            pm.read_float(local_player + m_vecOrigin + 4),
            pm.read_float(local_player + m_vecOrigin + 8)
        )
        view_offset = (
            pm.read_float(local_player + m_vecViewOffset),
            pm.read_float(local_player + m_vecViewOffset + 4),
            pm.read_float(local_player + m_vecViewOffset + 8)
        )
        eye_pos = (origin[0] + view_offset[0], origin[1] + view_offset[1], origin[2] + view_offset[2])
        
        # Углы обзора
        angles = (
            pm.read_float(local_player + m_angRotation),
            pm.read_float(local_player + m_angRotation + 4)
        )
        
        local_team = pm.read_int(local_player + m_iTeamNum)
        
        for i in range(1, 33):
            entity = pm.read_int(client_base + dwEntityList + i * 4)
            if entity == 0:
                continue
            
            entity_team = pm.read_int(entity + m_iTeamNum)
            if entity_team == local_team:
                continue
            
            health = pm.read_int(entity + m_iHealth)
            if health <= 0:
                continue
            
            entity_origin = (
                pm.read_float(entity + m_vecOrigin),
                pm.read_float(entity + m_vecOrigin + 4),
                pm.read_float(entity + m_vecOrigin + 8)
            )
            entity_head = (entity_origin[0], entity_origin[1], entity_origin[2] + 60)  # примерная высота головы
            
            if is_looking_at_target(eye_pos, angles, entity_head, fov=3):
                mouse_click()
                print(f"[+] Выстрел по игроку {i}")
                time.sleep(0.2)  # пауза между выстрелами
                
    except Exception as e:
        pass
    
    time.sleep(0.01)