Allow GUID resolution when legacy object manager global is zero

This commit is contained in:
Dusk-92
2026-08-28 18:21:59 +02:00
parent bff19dd95b
commit 134e5a37f9
+7 -3
View File
@@ -225,11 +225,16 @@ pub fn unitGUID(unit_id: [*:0]const u8) u64 {
/// Resolve a GUID → object pointer via the object manager hash table.
pub fn getObjectByGUID(guid: u64) u32 {
if (guid == 0) return 0;
if (hook.readMem(u32, o.OBJECT_MANAGER_PTR) == 0) return 0;
const lo: u32 = @truncate(guid);
const hi: u32 = @truncate(guid >> 32);
// Do not gate this call on OBJECT_MANAGER_PTR. Nampower uses WoW's
// GetObjectPtr at 0x464870 directly, and on this modified client the
// legacy OBJECT_MANAGER_PTR global remains 0 even while the game is live.
// The stdcall(u64) ABI is equivalent on x86 to pushing lo + hi as two u32s.
const result = hook.call(fn (u32, u32) callconv(hook.cc.stdcall) u32, o.FN_GET_OBJECT_BY_GUID, .{ lo, hi });
// Guard: hash table can return stale/invalid pointers for destroyed objects
// Guard: hash table can return stale/invalid pointers for destroyed objects.
if (result != 0 and !isValidPtr(result)) return 0;
return result;
}
@@ -237,7 +242,6 @@ pub fn getObjectByGUID(guid: u64) u32 {
/// Split-GUID variant for callers that already have lo/hi parts.
pub fn getObjectByGUIDSplit(guid_lo: u32, guid_hi: u32) u32 {
if (guid_lo == 0 and guid_hi == 0) return 0;
if (hook.readMem(u32, o.OBJECT_MANAGER_PTR) == 0) return 0;
return hook.call(fn (u32, u32) callconv(hook.cc.stdcall) u32, o.FN_GET_OBJECT_BY_GUID, .{ guid_lo, guid_hi });
}