Code:
;thanks to kui5z for the gui idea
SetWorkingDir %A_ScriptDir%
PauseFlag := 0
Gui Add, GroupBox, h87 w250, Adventure Bot Control (arrow = blade position)
Gui Add, Button, xm+5 ym+12 w80 h23 gTopL,🡼
Gui Add, Button, xm+85 ym+12 w80 h23 gTopR, 🡽
Gui Add, Button, xm+165 ym+12 w80 h23 gPause vToggle, Pause
Gui Add, Button, xm+5 ym+35 w80 h23 gBotL, 🡿
Gui Add, Button, xm+85 ym+35 w80 h23 gBotR, 🡾
Gui Add, Button, xm+165 ym+35 w80 h23 gStop, Stop
Gui Add, Button, xm+5 ym+58 w80 h23, unused
Gui Add, Button, xm+85 ym+58 w80 h23, unused
Gui Add, Button, xm+165 ym+58 w80 h23, unused
Gui Add, GroupBox, h87 w90 x262 y6, Tools
Gui Add, Button, xm+257 ym+12 w80 h23 gPxChk, Pixel Checker
Gui Add, Button, xm+257 ym+35 w80 h23, unused
Gui Add, Button, xm+257 ym+58 w80 h23, unused
Gui Show,, Nk Bots v1.3
Return
TopL:
Run, NkAdvBot.ahk "TopL"
Return
TopR:
Run, NkAdvBot.ahk "TopR"
Return
BotL:
Run, NkAdvBot.ahk "BotL"
Return
BotR:
Run, NkAdvBot.ahk "BotR"
Return
Pause:
Send {Numpad1}
if(PauseFlag=0){
PauseFlag := 1
GuiControl,,Toggle,Resume
}else{
PauseFlag := 0
GuiControl,,Toggle,Pause
}
Return
Stop:
Send {Numpad0}
Return
PxChk:
Run, NkPxChk.ahk
Return
GuiClose:
Send {Numpad0}
ExitApp
Return
Code:
#SingleInstance force
#NoTrayIcon
;get window handle
WinGet, win_ids, ID, Trove
if(win_ids=""){
MsgBox, 48, Error, No Trove window found
ExitApp
}else{
;TO-DO : edit for multi accounts
Handle := win_ids
;Delay between each key (ms) to avoid some bugs while typing
SetKeyDelay, 40
;Currently working in foreground only
WinActivate, Trove
}
;Retrieve the direction from args[1] and setup the keys (don't ask me why, dir is always equal to 1, which is also the name of the first arg var, so it works only like this Ô_o
dir := 1
if (%dir% = "TopL"){
xDirKey := "z"
yDirKey := "q"
}else if (%dir% = "TopR"){
xDirKey := "z"
yDirKey := "d"
}else if (%dir% = "BotL"){
xDirKey := "s"
yDirKey := "q"
}else if (%dir% = "BotR"){
xDirKey := "s"
yDirKey := "d"
}
;Init quests tracker
ClearedDungeons := 0
Loop {
ToolTipColor(0x262626,0xffab87)
ToolTip, Dungeons completed : %ClearedDungeons%`nPress num1 to pause`nPress num0 to exit, 10, 34
Sleep 200
ControlSend,,{w},ahk_id %Handle%
Sleep 100
ControlSend,,{z down},ahk_id %Handle%
ControlSend,,{d down},ahk_id %Handle%
Sleep 100
ControlSend,,{Space},ahk_id %Handle%
Sleep 200
ControlSend,,{Space},ahk_id %Handle%
Sleep 200
ControlSend,,{Space},ahk_id %Handle%
Sleep 200
ControlSend,,{Space},ahk_id %Handle%
Sleep 200
ControlSend,,{Space},ahk_id %Handle%
Sleep 200
ControlSend,,{Space down},ahk_id %Handle%
Sleep 600
ControlSend,,{z up},ahk_id %Handle%
ControlSend,,{d up},ahk_id %Handle%
ControlSend,,{Space up},ahk_id %Handle%
Sleep 200
;respawn to the rally blade and use it
ControlSend,,{Enter}{Shift down}:{Shift up}respawn{Enter},ahk_id %Handle%
Sleep 1000
ControlSend,,e,ahk_id %Handle%
;Send {e}
Sleep 2000
ControlSend,,w,ahk_id %Handle%
ControlSend,,{%xDirKey% down},ahk_id %Handle%
ControlSend,,{%yDirKey% down},ahk_id %Handle%
Sleep 300
ControlSend,,{%xDirKey% up},ahk_id %Handle%
Sleep 100
ControlSend,,{%yDirKey% up},ahk_id %Handle%
Sleep 1000
ControlSend,,e,ahk_id %Handle%
Sleep 3000
TimeOut = 0
FoundDungeon = 0
Loop {
;detect a dungeon TO-DO : Edit for multi accounts
PixelGetColor Dungeon1, 1570, 130, RGB
PixelGetColor Dungeon2, 1570, 202, RGB
PixelGetColor Dungeon3, 1570, 274, RGB
if (Dungeon1 = "0xFEF89A"||Dungeon2 = "0xFEF89A"||Dungeon3 = "0xFEF89A")
{
FoundDungeon = 1
if (TimeOut = 18)
{
;break after 5000ms*18=90s in uncleared dungeon
Break
}
TimeOut++
;fake human moves in 5000ms loop
Sleep 500
ControlSend,,&,ahk_id %Handle%
Sleep 4500 ;=5000ms wait per loop inside dungeon
}
else
{
;When the dungeon is completed (after waiting a bit and the detected icon disappeared)
if (FoundDungeon = 1)
{
ClearedDungeons++
;time to loot !
Sleep 2000
;wait for chest to be destroyed
ControlSend,,{e down},ahk_id %Handle%
;auto loot everything
Sleep 5000
ControlSend,,{e up},ahk_id %Handle%
}
Break
}
}
}
Numpad0::ExitApp
Numpad1::
ToolTipColor(0x262626,0xff0000)
ToolTip, The bot is paused `nPress num1 to resume, 10, 34
Pause,,1
Return
;libraries :
;Thanks to lexikos for his tooltip color lib
ToolTipColor(Background := "", Text := "", hwnd := "") {
static bc := "", tc := ""
if (hwnd = "") {
if (Background != "")
bc := Background="Default" ? "" : _TTG("Color", Background)
if (Text != "")
tc := Text="Default" ? "" : _TTG("Color", Text)
_TTHook()
}
else {
VarSetCapacity(empty, 2, 0)
DllCall("UxTheme.dll\SetWindowTheme", "ptr", hwnd, "ptr", 0
, "ptr", (bc != "" && tc != "") ? &empty : 0)
if (bc != "")
DllCall("SendMessage", "ptr", hwnd, "uint", 1043, "ptr", bc, "ptr", 0)
if (tc != "")
DllCall("SendMessage", "ptr", hwnd, "uint", 1044, "ptr", tc, "ptr", 0)
}
}
_TTHook() {
static hook := 0
if !hook
hook := DllCall("SetWindowsHookExW", "int", 4
, "ptr", RegisterCallback("_TTWndProc"), "ptr", 0
, "uint", DllCall("GetCurrentThreadId"), "ptr")
}
_TTWndProc(nCode, _wp, _lp) {
Critical 999
;lParam := NumGet(_lp+0*A_PtrSize)
;wParam := NumGet(_lp+1*A_PtrSize)
uMsg := NumGet(_lp+2*A_PtrSize, "uint")
hwnd := NumGet(_lp+3*A_PtrSize)
if (nCode >= 0 && (uMsg = 1081 || uMsg = 1036)) {
_hack_ = ahk_id %hwnd%
WinGetClass wclass, %_hack_%
if (wclass = "tooltips_class32") {
ToolTipColor(,, hwnd)
}
}
return DllCall("CallNextHookEx", "ptr", 0, "int", nCode, "ptr", _wp, "ptr", _lp, "ptr")
}
_TTG(Cmd, Arg1, Arg2 := "") {
static htext := 0, hgui := 0
if !htext {
Gui _TTG: Add, Text, +hwndhtext
Gui _TTG: +hwndhgui +0x40000000
}
Gui _TTG: %Cmd%, %Arg1%, %Arg2%
if (Cmd = "Font") {
GuiControl _TTG: Font, %htext%
SendMessage 0x31, 0, 0,, ahk_id %htext%
return ErrorLevel
}
if (Cmd = "Color") {
hdc := DllCall("GetDC", "ptr", htext, "ptr")
SendMessage 0x138, hdc, htext,, ahk_id %hgui%
clr := DllCall("GetBkColor", "ptr", hdc, "uint")
DllCall("ReleaseDC", "ptr", htext, "ptr", hdc)
return clr
}
}