import pymem

pm = pymem.Pymem(43084)
base = 0x7ff6afc20000
igs = pm.read_ulonglong(base + 0x4430108)
area = pm.read_ulonglong(igs + 0x290)
if not (0x10000 <= area <= 0x7fffffffffff):
    area = pm.read_ulonglong(igs + 0x2a0)

print(f"InGameState: {hex(igs)}, AreaInstance: {hex(area)}")

# In AreaInstance, where is the Entity list / Entity Map?
# In POE1/2, EntityList is often at AreaInstance + 0x80..0x200 or inside an EntityMap.
# Let's search all pointers in AreaInstance for objects that have components or metadata
for off in range(0x80, 0x800, 8):
    val = pm.read_ulonglong(area + off)
    if 0x100000000 <= val <= 0x7fffffffffff:
        # check if it's a vector or hash table
        try:
            p1 = pm.read_ulonglong(val)
            p2 = pm.read_ulonglong(val + 8)
            # check if p1, p2 are pointers
            if 0x100000000 <= p1 <= 0x7fffffffffff and 0x100000000 <= p2 <= 0x7fffffffffff:
                cnt = (p2 - p1) // 8
                if 2 <= cnt <= 5000:
                    # check first 5 elements
                    names = []
                    for i in range(min(cnt, 5)):
                        ent = pm.read_ulonglong(p1 + i * 8)
                        if 0x100000000 <= ent <= 0x7fffffffffff:
                            # check if ent has a string at +0x08, +0x10, +0x18, +0x20...
                            for soff in range(0, 0x60, 8):
                                sptr = pm.read_ulonglong(ent + soff)
                                if 0x100000000 <= sptr <= 0x7fffffffffff:
                                    try:
                                        s = pm.read_bytes(sptr, 64).decode("utf-8", errors="ignore").split('\x00')[0]
                                        if len(s) >= 4 and s.isprintable() and ("Metadata" in s or "Characters" in s or "NPC" in s or "Monster" in s):
                                            names.append(f"{hex(ent)}: {s}")
                                            break
                                    except: pass
                    if names:
                        print(f"AreaInstance +0x{off:x} -> vector of {cnt} entities! Examples:")
                        for n in names:
                            print(f"   {n}")
        except: pass
