Yeah, you can find tons of threads about this in Ownedcore. But I feel like helping today (hopefully).
Small snippet in C++ to read descriptors:
Code:
#define RPM(X,Y,Z) ReadProcessMemory(wowHandle, X, Y, Z, 0);
// Get descriptors address
DWORD GetDescriptors(DWORD address){
DWORD ret;
RPM(reinterpret_cast<void*>(address + ObjMgr::DescriptorsOffset),&ret,sizeof(ret));
return ret;
}
// Get player's base address
DWORD GetPlayerMemLoc(){
int memloc;
RPM(reinterpret_cast<void*>(baseAddr + WoW::PlayerMemLoc), &memloc, sizeof(memloc));
return memloc;
}
// Read some descriptor
void ReadDescriptor(DWORD address, DWORD field, DWORD *var){
RPM(reinterpret_cast<void*>(GetDescriptors(address) + field),&*var,sizeof(*var));
}
// Read player's health
DWORD health;
ReadDescriptor(GetPlayerMemLoc(), Unit::Health, &health);
And the offsets for WoW 6.1.2.19865:
Code:
ObjMgr::DescriptorsOffset = 0x4,
WoW::PlayerMemLoc = 0xDC0BC8,
Unit::Health = 0xEC
In other words, it's simply this:
Code:
[[[baseAddress + 0xDC0BC8] + 0x4] + 0xEC]