💡 Nk Adventure Bot 1.3
Adventure Bot
What's new :
New launcher, to add other bots and tools later
Better compatibility
Easier setup
Easier updating (for me or other devs ahah, for common users it's the same)
Disclaimer :
This bot is here to show everyone that you can do what you want if you got an idea.
If you want a good adventure bot, you can make your own just editing my code.
Info & Tuto :
The 4th update of my adventure bot !
To make it work on a 1920x1080 : (for others, read the quick guide below)
- Press "i" and disable everything except "Dungeons".
- Set the game to windowed mode.
- Maximize this window.
- Run the GUI
- Pick the blade direction
If this is not working (the bot is just /respawn-ing), check this tutorial :
https://www.mpgh.net/forum/showthread.php?t=1488521
Explanations :
This script will make you respawn.
Then it sends keys to move to the rally blade and use it.
Once teleported, it checks if you are in a dungeon by searching for it's logo (checking pixel color at logo location) on the top right of the screen.

If the logo is found, the script checks every 5s if this logo is still here, this during 90s or until the dungeon is completed.
If the dungeon is cleared before those 90s, the script will try to loot, add 1 to dungeons count and restart (/respawn...).
After 90s uncleared the script will timeout and respawn.
To-do :
(still) Find the dungeon pointer (that shows up the dungeon logo).
Improve delays between keys sending.
Enable multi-acc.
Adapt to different resolutions
Create better "random" human behavior when waiting in dungeon or respawning
Make a geode bot
Add auto pots script
Code automatic world switch
I'm opened to all of your ideas and suggestions, don't hesitate to share them in the comments
AHK Script :
Launcher :
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
}
}
https://virusscan.jotti.org/filescanjob/sg6nayc9al
https://www.virustotal.com/gui/file/...f5c8/detection

i will try add this back bit it is a heard feature