Spent some time looking into this last night, but may just be rehashed content--sorry in advance if so.
Code:
CurrentHealth: Object + 0x188] + 0xC0
MaxHealth: Object + 0x188] + 0xE0
Checking if you're dead is as simple as just checking if CurrentHealth == 0.
Code:
bool IsGhostOrDead(this) at Object vtable[112]
Relevant code below
LABEL_12:
v6 = 0i64;
goto LABEL_13;
}
if ( !(*(unsigned __int8 (__fastcall **)(__int64))(*(_QWORD *)v4 + 0x380i64))(v4)
&& !((*(_DWORD *)(*(_QWORD *)(v5 + 0x188) + 0x160i64) >> 13) & 1) )
{
goto LABEL_12;
}
v6 = 1i64;
LABEL_13:
sub_7FF7336E0C70(v1, v6);
return 1i64;
Seems like 0x188 from the object base address holds some sort of structure for additional player data? 0x160 seems to be some movement/character state flags or something. I see different bits getting flipped when I'm rooted or when my hp falls below different thresholds. I still haven't figured that part out yet fully, but the above information is enough to figure out if your character is dead or a ghost.