import ctypes, struct
from ctypes import wintypes
kernel32 = ctypes.windll.kernel32
psapi = ctypes.windll.psapi

pid = 43084
h = kernel32.OpenProcess(0x0410, False, pid)
hMods = (wintypes.HMODULE * 1024)()
cbNeeded = wintypes.DWORD()
psapi.EnumProcessModules(h, hMods, ctypes.sizeof(hMods), ctypes.byref(cbNeeded))
base = hMods[0]
if hasattr(base, 'value'): base = base.value
print(f"Base: 0x{base:X}")

def r64(a):
    b = ctypes.create_string_buffer(8)
    br = ctypes.c_size_t()
    kernel32.ReadProcessMemory(h, ctypes.c_void_p(a), b, 8, ctypes.byref(br))
    return struct.unpack('Q', b.raw)[0] if br.value == 8 else 0

def r32(a):
    b = ctypes.create_string_buffer(4)
    br = ctypes.c_size_t()
    kernel32.ReadProcessMemory(h, ctypes.c_void_p(a), b, 4, ctypes.byref(br))
    return struct.unpack('I', b.raw)[0] if br.value == 4 else 0

def rf3(a):
    b = ctypes.create_string_buffer(12)
    br = ctypes.c_size_t()
    kernel32.ReadProcessMemory(h, ctypes.c_void_p(a), b, 12, ctypes.byref(br))
    return struct.unpack('3f', b.raw) if br.value == 12 else (0.0, 0.0, 0.0)

roots = [0x45ccfe0, 0x45ccfd8, 0x45d4100, 0x45d3dd8, 0x45d40f8, 0x4716880, 0x4435f90, 0x4435f98]
for rva in roots:
    igs = r64(base + rva)
    if igs > 0x10000:
        p = r64(igs + 0xBE0)
        if p > 0x10000:
            hp = r32(p + 0x3D8)
            mhp = r32(p + 0x3DC)
            es = r32(p + 0x3E4)
            mes = r32(p + 0x3E8)
            xyz = rf3(p + 0x540)
            print(f"RVA 0x{rva:X} -> IGS 0x{igs:X} -> Player 0x{p:X}: HP={hp}/{mhp}, ES={es}/{mes}, XYZ={xyz}")
kernel32.CloseHandle(h)
