Code:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
global HealthPointer := "0x00BC8458"
global CurrentHealthOffset := "0x48+0x208+0x8+0xB4"
global MaxHealthOffset := "0x48+0x208+0x8+0xB8"
global CurrentEnergyOffset := "0x48+0x208+0x8+0xBC"
global MaxEnergyOffset := "0x48+0x208+0x8+0xC0"
F1::
WinGet, pidn, PID, A
pID := pidn
WinGet, hwnds, ID, A
Handle := hwnds
InfoRead()
ToolTipDisplay("Base:" Base "`nHealth Address:" CurrentHealthAddress "`nMaxHelath Address:" MaxHealthAddress "`nEnergy Address:" CurrentEnergyAddress "`nMaxEnergy Address:" MaxEnergyAddress "`nHealth:" CurrentHealth "`nMax Health:"CurrentMaxHealth "`nEnergy:" CurrentEnergy "`nMax Energy:" CurrentMaxEnergy)
Return
InfoRead(WhatToCheck="HE") ; H Being Health only return. E Being Energy return HE being both. Global Vars to be used for info CurrentHealth, CurrentMaxHealth, CurrentEnergy, CurrentMaxEnergy
{
global Base, CurrentHealthAddress, MaxHealthAddress, CurrentEnergyAddress, MaxEnergyAddress, CurrentHealth, CurrentMaxHealth, CurrentEnergy, CurrentMaxEnergy
WinGetTitle, CurrentCaption ,A
If (CurrentCaption <> "Trove")
Return
WinGet, pidn, PID, A
pID := pidn
WinGet, hwnds, ID, A
Handle := hwnds
Base := getProcessBaseAddress(Handle)
If (WhatToCheck = "H" or WhatToCheck = "HE") {
CurrentHealthAddress := GetAddress(pID, Base, HealthPointer, CurrentHealthOffset)
MaxHealthAddress := GetAddress(pID, Base, HealthPointer, MaxHealthOffset)
CurrentHealth := ReadMemory(pID, CurrentHealthAddress)
CurrentMaxHealth := ReadMemory(pID, MaxHealthAddress)
GuiControl,Main: , HealthText, %CurrentHealth%/%CurrentMaxHealth%
}
If (WhatToCheck = "E" or WhatToCheck = "HE") {
CurrentEnergyAddress := GetAddress(pID, Base, HealthPointer, CurrentEnergyOffset)
MaxEnergyAddress := GetAddress(pID, Base, HealthPointer, MaxEnergyOffset)
CurrentEnergy := ReadMemory(pID, CurrentEnergyAddress)
CurrentMaxEnergy := ReadMemory(pID, MaxEnergyAddress)
GuiControl,Main: , EnergyText, %CurrentEnergy%/%CurrentMaxEnergy%
}
Return
}
getProcessBaseAddress(Handle)
{
Return DllCall( A_PtrSize = 4
? "GetWindowLong"
: "GetWindowLongPtr"
, "Ptr", Handle
, "Int", -6
, "Int64")
}
GetAddress(PID, Base, Address, Offset) {
pointerBase := base + Address
y := ReadMemory(PID, pointerBase)
OffsetSplit := StrSplit(Offset, "+")
OffsetCount := OffsetSplit.MaxIndex()
Loop, %OffsetCount%
{
If (a_index = OffsetCount) {
Address := (y + OffsetSplit[a_index])
} Else
if(a_index = 1) {
y := ReadMemory(PID, y + OffsetSplit[a_index])
} Else {
y := ReadMemory(PID, y + OffsetSplit[a_index])
}
}
Return Address
}
ReadMemory(pid, MADDRESS) {
VarSetCapacity(MVALUE,4,0)
ProcessHandle := DllCall("OpenProcess", "Int", 24, "Char", 0, "UInt", pid, "UInt")
DllCall("ReadProcessMemory", "UInt", ProcessHandle, "Ptr", MADDRESS, "Ptr", &MVALUE, "Uint",4)
Loop 4
result += *(&MVALUE + A_Index-1) << 8*(A_Index-1)
Return, result
}
ToolTipDisplay(Message) {
ToolTip, %Message%
SetTimer, RemoveToolTip, 5000
Return
}
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return