Nk Gems/XP Bot
What's new :
New launcher, can work in any adventure world (even geode topside !)
Now working in background !
Now working on any monitor (not only primary) !
Disclaimer :
This bot is here to prove that you can do avnthing you want if you have an idea.
If you want a better gems/exp bot, you can make your own just editing my code.
Info & Tuto :
The 5th update of my adventure bot !
To make it work on a 1920x1080 : (for others, read the quick guide below)
- If you keyboard layout is not azerty, you have to edit these lines with the keys you are using to move :
Code:if (%dir% = "TopL"){
xDirKey := "q"
yDirKey := "z"
}else if (%dir% = "Top"){
xDirKey := ""
yDirKey := "z"
}else if (%dir% = "TopR"){
xDirKey := "d"
yDirKey := "z"
}else if (%dir% = "Left"){
xDirKey := "q"
yDirKey := ""
}else if (%dir% = "Right"){
xDirKey := "d"
yDirKey := ""
}else if (%dir% = "BotL"){
xDirKey := "q"
yDirKey := "s"
}else if (%dir% = "Bot"){
xDirKey := ""
yDirKey := "s"
}else if (%dir% = "BotR"){
xDirKey := "d"
yDirKey := "s"
}
- Press "i" and disable everything except "Dungeons".
- Set the game to windowed mode.
- Maximize this window.
- Run the GUI
- Enter a world
- Pick the blade direction on the GUI
- You are done, now you can let it play in background
If this is not working (the bot is just /respawn-ing), check this tutorial :
https://www.mpgh.net/forum/showthread.php?t=1490985
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.https://i.imgur.com/E6NEaD8.png
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 caves bot
Add auto pots script
Add automatic world switch ?
I'm opened to all of your ideas and suggestions, feel free to share them in the comments (Thanks to those who already inspired me). This is experimental, so it may not work on the first try !
AHK Script :
Launcher :
Bot :Code: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 gTop, 🡹
Gui Add, Button, xm+165 ym+12 w80 h23 gTopR, 🡽
Gui Add, Button, xm+5 ym+35 w80 h23 gLeft, 🡸
Gui Add, Button, xm+85 ym+35 w80 h23, unused
Gui Add, Button, xm+165 ym+35 w80 h23 gRight, 🡺
Gui Add, Button, xm+5 ym+58 w80 h23 gBotL, 🡿
Gui Add, Button, xm+85 ym+58 w80 h23 gBot,🡻
Gui Add, Button, xm+165 ym+58 w80 h23 gBotR, 🡾
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 gPause vToggle, Pause
Gui Add, Button, xm+257 ym+58 w80 h23 gStop, Stop
Gui Show,, Nk Bots v1.5
Return
TopL:
Run, NkAdvBot.ahk "TopL"
Return
Top:
Run, NkAdvBot.ahk "Top"
Return
TopR:
Run, NkAdvBot.ahk "TopR"
Return
Left:
Run, NkAdvBot.ahk "Left"
Return
Right:
Run, NkAdvBot.ahk "Right"
Return
BotL:
Run, NkAdvBot.ahk "BotL"
Return
Bot:
Run, NkAdvBot.ahk "Bot"
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
hWnd := WinExist("ahk_exe Trove.exe")
if(hWnd=""){
MsgBox, 48, Error, No Trove window found
ExitApp
}else{
CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
SysGet, WindowBorderWidth, 32
;Delay between each key (ms) to avoid some bugs while typing
SetKeyDelay, 40
}
;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 := "q"
yDirKey := "z"
}else if (%dir% = "Top"){
xDirKey := ""
yDirKey := "z"
}else if (%dir% = "TopR"){
xDirKey := "d"
yDirKey := "z"
}else if (%dir% = "Left"){
xDirKey := "q"
yDirKey := ""
}else if (%dir% = "Right"){
xDirKey := "d"
yDirKey := ""
}else if (%dir% = "BotL"){
xDirKey := "q"
yDirKey := "s"
}else if (%dir% = "Bot"){
xDirKey := ""
yDirKey := "s"
}else if (%dir% = "BotR"){
xDirKey := "d"
yDirKey := "s"
}
;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 %hWnd%
Sleep 100
ControlSend,,{z down},ahk_id %hWnd%
ControlSend,,{d down},ahk_id %hWnd%
Sleep 100
ControlSend,,{Space},ahk_id %hWnd%
Sleep 200
ControlSend,,{Space},ahk_id %hWnd%
Sleep 200
ControlSend,,{Space},ahk_id %hWnd%
Sleep 200
ControlSend,,{Space},ahk_id %hWnd%
Sleep 200
ControlSend,,{Space},ahk_id %hWnd%
Sleep 200
ControlSend,,{Space down},ahk_id %hWnd%
Sleep 600
ControlSend,,{z up},ahk_id %hWnd%
ControlSend,,{d up},ahk_id %hWnd%
ControlSend,,{Space up},ahk_id %hWnd%
Sleep 200
;respawn to the rally blade and use it
ControlSend,,{Enter}{Shift down}:{Shift up}respawn{Enter},ahk_id %hWnd%
Sleep 1000
ControlSend,,e,ahk_id %hWnd%
;Send {e}
Sleep 2000
ControlSend,,w,ahk_id %hWnd%
ControlSend,,{%yDirKey% down},ahk_id %hWnd%
ControlSend,,{%xDirKey% down},ahk_id %hWnd%
Sleep 300
ControlSend,,{%yDirKey% up},ahk_id %hWnd%
Sleep 100
ControlSend,,{%xDirKey% up},ahk_id %hWnd%
Sleep 1000
ControlSend,,e,ahk_id %hWnd%
Sleep 3000
TimeOut = 0
FoundDungeon = 0
Loop {
;detect a dungeon TO-DO : Edit for multi accounts
Dungeon1 := PixelColorSimple(1560 , 122, hWnd)
Dungeon2 := PixelColorSimple(1560 , 194, hWnd)
Dungeon3 := PixelColorSimple(1560 , 266, hWnd)
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 %hWnd%
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 %hWnd%
;auto loot everything
Sleep 5000
ControlSend,,{e up},ahk_id %hWnd%
}
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 pixel color and tooltip color libs
PixelColorSimple(pc_x, pc_y, hWnd)
{
SysGet, WindowTitleHeight, 4
SysGet, WindowBorderWidth, 45
pc_hDC := DllCall("GetDC", "UInt", hWnd)
pc_fmtI := A_FormatInteger
SetFormat, IntegerFast, Hex
pc_c := DllCall("GetPixel", "UInt", pc_hDC, "Int", pc_x+WindowBorderWidth, "Int", pc_y-WindowTitleHeight, "UInt")
pc_c := pc_c >> 16 & 0xff | pc_c & 0xff00 | (pc_c & 0xff) << 16
pc_c .= ""
SetFormat, IntegerFast, %pc_fmtI%
DllCall("ReleaseDC", "UInt", hWnd, "UInt", pc_hDC)
return pc_c
}
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
}
}
Virus scans :
https://virusscan.jotti.org/filescanjob/jrwnntyaev
https://www.virustotal.com/gui/file/...f32e/detection