Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;--------------------------------------------------------------------------------
;Getting My Player GUID
;--------------------------------------------------------------------------------
#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$playerName = 0xE28460
$MountsCount = 0xD26730
$MountsList = $MountsCount + 0x4
$IsCasting = 0xC38
;--------------------------------------------------------------------------------
;public enum UnitFields
;--------------------------------------------------------------------------------
$UNIT_FIELD_HEALTH = 0x8 + 0x14
Global Const $ClientConnection = 0xE28420 ;The first 2 are you create you manager from the baseaddress wow
Global Const $CurrMgrOffset = 0x462C
Global Const $FirstObjectOffset = 0xCC ;The next one is to get the address of your first object ONLY
Global Const $NextObjectOffset = 0x3C ;To cycle through the object you need this offset
Global Const $DescriptorOffset = 0x8
Global Const $localPlayerGUIDOffset = 0xD0
Global Const $GameObjGUIDOffset = 0x30 ;This next one is to find the objects type : 1 to 7
Global Const $GameObjTypeOffset = 0x14
;Open WoW Process to enable Memory Reading and Get the WoW Base Address
$ProcessID = ProcessExists("wow.exe")
$WowProcess = _MemoryOpen($ProcessID)
;Getting WoWBase Address
$WowBase = GetWoWBaseAddress($ProcessID)
;1) Getting CurrentManager_Pre
$currMgr_pre = _MemoryRead("0x" & Hex($WowBase + $ClientConnection), $WowProcess , "dword")
;2) Getting CurrentManager
$currMgr = _MemoryRead("0x" & Hex($currMgr_pre + $CurrMgrOffset), $WowProcess , "dword")
;Getting My Player GUID (Player Global Unique ID)
$pGUID = _MemoryRead("0x" & Hex($currMgr + $localPlayerGUIDOffset), $WowProcess , "UINT64") ;Player Guid
$pGUID2 = _MemoryRead("0x" & Hex($currMgr + $localPlayerGUIDOffset), $WowProcess , "dword") ;Player Guid 2
;Gettin My Player Address
$ObjectMemLoc = GetMemLocByGUID($pGUID)
$msgbox_text = "";
$msgbox_text &= "$ProcessID: " & $ProcessID & ;
$msgbox_text &= "$WowBase: " & $WowBase & ;
$msgbox_text &= "$currMgr_pre: " & $currMgr_pre & ;
$msgbox_text &= "$currMgr: " & $currMgr & ;
$msgbox_text &= "$pGUID: " & $pGUID & ;
$msgbox_text &= "$pGUID2: " & $pGUID2 & ;
$msgbox_text &= "Player Name: " & GetPlayerName() & ;
$msgbox_text &= "Player health: " & GetPlayerHealth() & ;
$msgbox_text &= "spellName: " & $IsCasting & ;
$msgbox_text &= "Mount: " & $MountsList & ;
MsgBox(1,"Test",$msgbox_text)
Func GetPlayerName()
return _memoryread($WowBase + $playerName, $WowProcess, "char[20]")
EndFunc
Func GetPlayerHealth()
$pDescriptor = _MemoryRead("0x" & Hex($ObjectMemLoc + $DescriptorOffset), $WowProcess , "dword");<---essentially says that you want to use a descriptor (aka health)
$pHealth = _MemoryRead("0x" & Hex($pDescriptor + $UNIT_FIELD_HEALTH), $WowProcess ,"dword");<---looks up your health
return $pHealth
EndFunc
Func GetMemLocByGUID($guid)
;Read the first wow object by adding our current manager address and our first object offset together
$NextObject = _MemoryRead("0x" & Hex($currMgr + $FirstObjectOffset), $WowProcess , "dword")
;next get the object type buy adding our first object and our Objtype offset together and reading that
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
;If the return of object type is less than or equal to 7 (which it should always be) and more than 0 in the case that we do have an object in the list than do a while loop.
while (($ObjType <= 7) And ($ObjType > 0))
;NOTE: if there is an object in the list, objType will have to be = 1 to 7
; If our object plus the GUIDoffset = the GUID we are looking for (example our localplayer GUID) …
IF (_MemoryRead("0x" & Hex($NextObject + $GameObjGUIDOffset), $WowProcess , "UINT64") = $guid) Then ; …then return our object
Return $NextObject ;found what we wanted.
EndIf
;if no return happens (stays in the function) then cycle through the objects using our next object offset on our next object (might also be called current object)
$NextObject = _MemoryRead("0x" & Hex($NextObject + $NextObjectOffset), $WowProcess , "dword")
;We will also need to see the type
$ObjType = _MemoryRead("0x" & Hex($NextObject + $GameObjTypeOffset), $WowProcess , "dword")
Wend
;if we find nothing Return 0 (address are probably wrong or you messed up code)
Return 0;
EndFunc
Func GetWoWBaseAddress($ProcessID)
$HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $ProcessID)
$STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule[256];" & "WCHAR szExePath[260]")
DllStructSetData($STMODULE, "dwSize", DllStructGetSize($STMODULE))
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32FirstW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
IF ($RET[0] = False) Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return 0
Else
$RET[0] = True
Do
If DllStructGetData($STMODULE, "szModule") = "Wow.exe" Then
DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
Return DllStructGetData($STMODULE, "modBaseAddr")
EndIf
$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32NextW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
Until $RET[0] = False
EndIf
EndFunc