x, y, z is
Code:
(UnitAddress + 0x90) + 0x18
ObjMgr traversal in C#:
Code:
[StructLayout(LayoutKind.Explicit, Pack = 4)]
internal struct ObjectManagerStruct
{
[FieldOffset(WowOffsets.ObjMgr_ArraySize)]
public long ArraySize;
[FieldOffset(WowOffsets.ObjMgr_ArrayBase)]
public nint ArrayBase;
[FieldOffset(WowOffsets.ObjMgr_ObjectCount)]
public ulong ObjectCount;
}
Code:
[StructLayout(LayoutKind.Explicit, Pack = 4)]
internal struct ObjectManagerEntry
{
[FieldOffset(WowOffsets.ObjMgr_EntryNext)]
public nint Next;
[FieldOffset(WowOffsets.ObjMgr_EntryGuid)]
public Int128 WowGuid;
[FieldOffset(WowOffsets.ObjMgr_EntryData)]
public nint DataPtr;
}
Code:
[StructLayout(LayoutKind.Explicit, Pack = 4)]
internal struct ObjectManagerEntryData
{
[FieldOffset(WowOffsets.ObjMgr_EntryDataGuid)]
public Int128 WowGuid;
[FieldOffset(WowOffsets.ObjMgr_EntryDataObject)]
public nint ObjectBase;
}
Code:
internal enum ObjectManagerObjectType : byte
{
Object = 0,
Item = 1,
Container = 2,
AzeriteEmpoweredItem = 3,
AzeriteItem = 4,
Unit = 5,
Player = 6,
ActivePlayer = 7,
GameObject = 8,
Dynamic = 9,
Corpse = 10,
Areatrigger = 11,
Scene = 12,
Conversation = 13,
AiGroup = 14,
Scenario = 15,
Loot = 16,
Invalid = 17
}
Code:
var objMgr = Memory.Read<IntPtr>(Memory.ImageBase + Offsets.ObjectManager);
if (objMgr == IntPtr.Zero)
return;
var objMgrData = Memory.Read<ObjectManagerStruct>(objMgr);
var arrayListBase = objMgrData.ArrayBase;
var arraySize = objMgrData.ArraySize;
var objectsCount = objMgrData.ObjectCount;
var playerGUID = Memory.Read<Int128>(Memory.ImageBase + Offsets.PlayerGUID);
var currentAddress = Memory.Read<IntPtr>(arrayListBase);
var counter = 0UL;
for (int x = 0; x < arraySize;)
{
if (counter >= objectsCount)
break;
if (currentAddress == IntPtr.Zero)
{
currentAddress = Memory.Read<IntPtr>(arrayListBase + 0x8 * ++x);
continue;
}
var entry = Memory.Read<ObjectManagerEntry>(currentAddress);
var entryData = Memory.Read<ObjectManagerEntryData>(entry.DataPtr);
if (entry.WowGuid != entryData.WowGuid)
throw new InvalidDataException($"Entry's guid is not equal to entry data's guid!");
var objType = Memory.Read<ObjectManagerObjectType>(entryData.ObjectBase + WowOffsets.ObjMgr_ObjectType);
++counter;
// populating your lists here...
if (entry.Next == IntPtr.Zero)
{
currentAddress = Memory.Read<IntPtr>(arrayListBase + 0x8 * ++x);
}
else
{
currentAddress = entry.Next;
}
}
But this code returns objects that moved from the range of visibility. Could anyone please tell me how to determine if an object is visible? I'm pretty bad in IDA... 😅