import ctypes, struct
from ctypes import wintypes

kernel32 = ctypes.windll.kernel32
advapi32 = ctypes.windll.advapi32

hToken = wintypes.HANDLE()
if advapi32.OpenProcessToken(kernel32.GetCurrentProcess(), 0x0020 | 0x0008, ctypes.byref(hToken)):
    luid = wintypes.LARGE_INTEGER()
    if advapi32.LookupPrivilegeValueW(None, 'SeDebugPrivilege', ctypes.byref(luid)):
        class TP(ctypes.Structure):
            _fields_ = [('Count', wintypes.DWORD), ('Luid', wintypes.LARGE_INTEGER), ('Attr', wintypes.DWORD)]
        advapi32.AdjustTokenPrivileges(hToken, False, ctypes.byref(TP(1, luid, 2)), ctypes.sizeof(TP), None, None)
    kernel32.CloseHandle(hToken)

pids = [32572, 31164, 12768, 30076]
out = []

for pid in pids:
    h = kernel32.OpenProcess(0x10 | 0x400, False, pid)
    if not h: continue
    
    # Read 128 bytes from 0x006DEC00 to 0x006DEC80
    base = 0x006DEC00
    size = 128
    buf = (ctypes.c_char * size)()
    kernel32.ReadProcessMemory(h, ctypes.c_void_p(base), buf, size, None)
    data = bytes(buf)
    
    out.append(f"\n=======================================================")
    out.append(f"PID {pid} | STATIC LOCAL PLAYER BLOCK (0x006DEC00 - 0x006DEC80)")
    out.append(f"=======================================================")
    out.append("Offset     Hex Bytes             i32         u16       ASCII")
    out.append("-" * 65)
    
    for off in range(0, len(data), 4):
        addr = base + off
        b4 = data[off:off+4]
        i32 = struct.unpack('<i', b4)[0]
        u16_lo = struct.unpack('<H', b4[:2])[0]
        u16_hi = struct.unpack('<H', b4[2:])[0]
        asc = "".join(chr(b) if 32 <= b <= 126 else "." for b in b4)
        
        note = ""
        if addr == 0x006DEC44: note = " <=== TÊN NHÂN VẬT (Bắt đầu)"
        elif addr == 0x006DEC66: note = " <=== CẤP ĐỘ (uint16)"
        elif addr == 0x006DEC38: note = " <=== MAP ID / SUBWORLD?"
        
        out.append(f"0x{addr:08X}   {' '.join(f'{b:02X}' for b in b4):<12} {i32:<11} ({u16_lo:<5}, {u16_hi:<5})  '{asc}' {note}")

    kernel32.CloseHandle(h)

with open(r"C:\Projects\JX\logs\local_player_static_block.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(out))

print("Done inspecting static block.")
