Code:
global Version := "1.1"
global IniFile := "NippysAutoHealth.ini" ;Save Filename
global DHealthPointer := "0x00B1B160" ; Defailt address.
global DCurrentHeathOffset := "0x48+0x208+0x8+0xB4" ;Water bite offset
global DMaxHealthOffset := "0x48+0x208+0x8+0xB8" ;Lava Bite offset
global DHealthSliderPrecent := 65
global OldClient := "0000"
global DMinHealthRestartScan := "100"
global DMaxHealthRestartScan := "200000"
IniRead, ConfigVersion, %A_ScriptDir%/%IniFile%, Config Version, Version
If (ConfigVersion <> Version)
FileDelete, %A_ScriptDir%/%IniFile%
IfNotExist, %A_ScriptDir%/%IniFile%
{
;Default Settings.
IniWrite, %Version%, %A_ScriptDir%/%IniFile%, Config Version, Version
IniWrite, %DHealthPointer%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthPointer
IniWrite, %DCurrentHeathOffset%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, CurrentHeathOffset
IniWrite, %DMaxHealthOffset%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MaxHealthOffset
IniWrite, %DHealthSliderPrecent%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthSliderPrecent
IniWrite, %DMinHealthRestartScan%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MinHealthRestartScan
IniWrite, %DMaxHealthRestartScan%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MaxHealthRestartScan
}
global HealthPointer
global CurrentHeathOffset
global MaxHealthOffset
global HealthSliderPrecent
global MinHealthRestartScan
global MaxHealthRestartScan
IniRead, HealthPointer, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthPointer
IniRead, CurrentHeathOffset, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, CurrentHeathOffset
IniRead, MaxHealthOffset, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MaxHealthOffset
IniRead, HealthSliderPrecent, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthSliderPrecent
IniRead, MinHealthRestartScan, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MinHealthRestartScan
IniRead, MaxHealthRestartScan, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MaxHealthRestartScan
Toggle := 1
SetTimer, AutoPot, 150
Gui, Main:Add, Text, x12 y9 w70 h20 , Health Pointer:
Gui, Main:Add, Edit, x83 y9 w110 h16 vHealthPointer, %HealthPointer%
Gui, Main:Add, Text, x12 y39 w100 h20 +Right, Current Helath:
Gui, Main:Add, Text, x122 y39 w100 h20 vCurrentHealthText, Unknown
Gui, Main:Add, Text, x12 y59 w100 h20 +Right, Current Max Health:
Gui, Main:Add, Text, x122 y59 w100 h20 vMaxHealthText, Unknown
Gui, Main:Add, Text, x12 y79 w210 h20 , What Health Percent to use potion at?
Gui, Main:Add, Slider, x2 y99 w190 h30 Range1-100 Page5 gSliderChange vHealthSliderPrecent, %HealthSliderPrecent%
Gui, Main:Add, Text, x192 y102 w30 h20 vLabelPrecent, %HealthSliderPrecent%`%
Gui, Main:Add, Button, x2 y129 w110 h20 gSaveSettings, Save Settings
Gui, Main:Add, Button, x112 y129 w110 h20 gBNTReload , Reload
Gui, Main:Add, Button, x2 y149 w220 h20 gExitUI, Save and Exit
Gui, Main:Show, x296 y362 h175 w228, Nippy's Autopot
Return
SliderChange:
;Gui, Submit, nohide
LabelPrecent := HealthSliderPrecent
GuiControl,, LabelPrecent, %LabelPrecent%`%
SaveSettings()
return
SaveSettings:
SaveSettings()
Return
BNTReload:
SaveSettings()
Reload
Return
ExitUI:
MainGuiClose:
SaveSettings()
ExitApp
Return
^q::
Toggle := !Toggle
If toggle = 0
{
SoundBeep
sleep 100
SoundBeep
SetTimer, AutoPot, Off
}
If toggle = 1
{
SoundBeep
SetTimer, AutoPot, 150 ;120000 = 120 seconds.
}
return
AutoPot:
If WinActive("Trove")
{
RestartScan:
WinGet, pidn, PID, A
pID := pidn
WinGet, hwnds, ID, A
Handle := hwnds
If (OldClient <> pID) {
Sleep 2000
Base := getProcessBaseAddress(Handle)
CurrentHealthAddress := GetAddress(pID, Base, HealthPointer, CurrentHeathOffset)
MaxHealthAddress := GetAddress(pID, Base, HealthPointer, MaxHealthOffset)
OldClient := pID
ToolTipDisplay("Newinfo for current client.`npID:" pID "`nBaseAddress:" Base "`nCurrentHealthAddres:" CurrentHealthAddress "`nMaxHealthAddress:" MaxHealthAddress)
}
CurrentHealth := ReadMemory(pID, CurrentHealthAddress)
CurrentMaxHealth := ReadMemory(pID, MaxHealthAddress)
If (CurrentHealth = 0)
Goto, RestartScan
GuiControl,Main: , CurrentHealthText, %CurrentHealth%
GuiControl,Main: , MaxHealthText, %CurrentMaxHealth%
SetFormat Float, 0
PotBy := (CurrentMaxHealth / 100) * HealthSliderPrecent
If (CurrentHealth > MaxHealthRestartScan or CurrentMaxHealth < MinHealthRestartScan or CurrentMaxHealth < MinHealthRestartScan)
{
OldClient := 0
Goto, RestartScan
}
If (CurrentHealth < PotBy)
{
Send q
sleep 500
}
}
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
}
ToolTipDisplay(Message)
{
ToolTip, % Message , 6, 6
SetTimer, RemoveToolTip, 5000
}
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
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
}
SaveSettings()
{
Gui, Main:Submit, nohide
IniWrite, %HealthPointer%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthPointer
IniWrite, %CurrentHeathOffset%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, CurrentHeathOffset
IniWrite, %MaxHealthOffset%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, MaxHealthOffset
IniWrite, %HealthSliderPrecent%, %A_ScriptDir%/%IniFile%, Nippys AutoHealth, HealthSliderPrecent
}