ArrowOutdatedMpFollowingBots v1.1 : Multi-account Bots (multiboxing-like)

Posts 1–4 of 4 · Page 1 of 1
MpFollowingBots v1.1 : Multi-account Bots (multiboxing-like)
Hey guys !

This is a small script that will make several account follow you !
Requierments : AutoHotKey (last version I guess)

How it works :
Just grab the source code and paste it in a .ahk file and start it! You can also download it directly. (wait for @Psychotic @Wyo @Bryan approval)
Start it (Tutorial here : http://www.mpgh.net/forum/showthread.php?t=1150041)
First press the config button !
Check the box if you are using QUERTY keyboard setup ! You can also set your own hotkeys (I'll refer them as Numpad0, Numpad1 and Numpad2)!
You can also change the radius you want them to stay in (in block)
Now start all your accounts and make them all face SOUTH (use the compass at the top of your screen)
Go on your main account (the one that the other accounts will follow) and press Numpad0 : Every other account will follow this one !
They will automatically collect loot if you active collect mode (Numpad 2).
If you want them to throw spells, press Numpad1 to trigger FIGHT MODE. Once you're done with fighting, press again numpad1, and the boths will mount and follow again.
You can start it on as many accounts as you need !
Press Numpad0 again to change main account or Pause the bots.

Pro tips :
If you stand next to a portal, at 1 block at the North of it (so the bots are facing the portals) the boths will take it !
Bots are more likely to get stuck if they fall, be carefull while roaming around.
This is really efficient on flat areas or to mine in caves. However it might be harder to farm dungeons.

Updating pointers :
This version should self-update pointers, however I will have to find them before so it could take some time
You can still find them by yourself. No tutorials for now


Not working ?
-After an update :
Check the last comments to see if there's any new pointer.
If not, post here and wait for someone to post it or me to update it
-Script not starting :
Describe your issue here in comment
-Other :
Press the 'info' button on the GUI, then press "Copy Debug Data" and paste it here. It should look like this :
 
Debug
Code:
Version = 1.1
Pointer = 0x00CB84B8
X Offsets = 0x0+0x28+0x9C+0x5C+0x94
Y Offsets = 0x0+0x28+0x9C+0x5C+0x98
Z Offsets = 0x0+0x28+0x9C+0x5C+0x9C
Client:
PID = 4336
Handle = 0x200570
Base = 17104896
X Address = 503454948
Y Address = 503454952
Z Address = 503454956
Client:
PID = 8840
Handle = 0x560580
Base = 17104896
X Address = 503454948
Y Address = 503454952
Z Address = 503454956

Then wait for an answer


/!\ You need the default move keys to use this; I'll try to add customisable keys.

 
Source code

Code:
#SingleInstance force
#Persistent
#IfWinActive, Trove

SetBatchLines -1

SplashTextOn, 500,25, mpFollowingBots, Initializing and updating pointers, please wait...

SetWorkingDir %A_ScriptDir%

global Ver:=1.1
global _Version:=0
global _Pointer:="0x0"
global _xOffset:="0x0"
global _yOffset:="0x0"
global _zOffset:="0x0"
global iniFile := A_ScriptDir . "/config.ini"
global fight := False
global KB := true
global sHKMain := "Numpad0"
global sHKFight := "Numpad1"
global sHKCollect := "Numpad2"
global sTR := 1
global sFR := 5
global sUPDRate := 199

If (FileExist(iniFile)){
	IniRead, _Version, %iniFile%, Global, _Version
	IniRead, _Pointer, %iniFile%, Global, _Pointer
	IniRead, _xOffset, %iniFile%, Global, _xOffset
	IniRead, _yOffset, %iniFile%, Global, _yOffset
	IniRead, _zOffset, %iniFile%, Global, _zOffset
	IniRead, _zOffset, %iniFile%, Global, _zOffset
	IniRead, sHKMain, %iniFile%, Hotkeys, sHKMain, %A_Space%
	IniRead, sHKFight, %iniFile%, Hotkeys, sHKFight, %A_Space%
	IniRead, sHKCollect, %iniFile%, Hotkeys, sHKCollect, %A_Space%
	IniRead, KB, %iniFile%, Global, QWERTY
	IniRead, sTR, %iniFile%, Global, sTR
	IniRead, sFR, %iniFile%, Global, sFR
	IniRead, sUPDRate, %iniFile%, Global, sUPDRate
}ELSE{
	IniWrite, %sHKMain%, %iniFile%, Hotkeys, sHKMain
	IniWrite, %sHKFight%, %iniFile%, Hotkeys, sHKFight
	IniWrite, %sHKCollect%, %iniFile%, Hotkeys, sHKCollect
	IniWrite, %KB%, %iniFile%, Global, QWERTY
	IniWrite, %sTR%, %iniFile%, Global, sTR
	IniWrite, %sFR%, %iniFile%, Global, sFR
	IniWrite, %sUPDRate%, %iniFile%, Global, sUPDRate
}

url := "https://dl.dropb" + "oxusercontent.com/u/52517919/MpFollowingBotsPointer.txt"
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", url)
WebRequest.Send()

Contents := StrSplit(WebRequest.ResponseText, "$")

if (Contents[1] > _Version){
	global _Version:=Contents[1]
	global _Pointer:=Contents[2]
	global _xOffset:=Contents[3]
	global _yOffset:=Contents[4]
	global _zOffset:=Contents[5]
	IniWrite, %_Version%, %iniFile%, Global, _Version
	IniWrite, %_Pointer%, %iniFile%, Global, _Pointer
	IniWrite, %_xOffset%, %iniFile%, Global, _xOffset
	IniWrite, %_yOffset%, %iniFile%, Global, _yOffset
	IniWrite, %_zOffset%, %iniFile%, Global, _zOffset
	TrayTip ,mpFollowingBots, % "Values updated to :`nPointer : " _Pointer "`nX offset : " _xOffset "`nY offset : "_yOffset "`nZ offset : " _zOffset
	}

global X := 0
global Y := 0
global Z := 0

global Mp := -1

Gui 1:-Resize -MinimizeBox
Gui, 1:Add, ListView, xm ym Checked grid -ReadOnly -LV0x10 w700, Window pid|Handle|Base Address|X Adress|X Value|Y Adress|Y Value|Z Adress|Z Value|Message
Gui, 1:Add, Button, w700 gConfig , &Config

Gui 2:-Resize -MinimizeBox
Gui, 2:Add, Text, xm, Hotkeys :
Gui, 2:Add, Text, xm, Main hotkey :
Gui, 2:Add, Text, xm, Fight hotkey :
Gui, 2:Add, Text, xm, Auto collect hotkey :
Gui, 2:Add, Hotkey, ym x+5 gAssignCollect vHKCollect, %sHKCollect%
Gui, 2:Add, Hotkey, gAssignFight vHKFight, %sHKFight%
Gui, 2:Add, Hotkey, gAssignMain vHKMain, %sHKMain%
Gui, 2:Add, Text, xm, Others :
Gui, 2:Add, Checkbox, xm Checked%KB% vKeyboard, Checked : QWERTY/ Unchecked : AZERTY
Gui, 2:Add, Text, xm, Travelling range : 0
Gui, 2:Add, Slider, Range0-10 ToolTip x+5 vTR gTraRange, %sTR%
Gui, 2:Add, Text, x+5,10
Gui, 2:Add, Text, xm, Fighting range :    0
Gui, 2:Add, Slider, Range0-10 ToolTip x+5 vFR gFigRange, %sFR%
Gui, 2:Add, Text, x+5,10
Gui, 2:Add, Text, xm, Update rate (ms) :
Gui, 2:Add, Edit, x+5 vUPDRate gUPDRateAssign, %sUPDRate%
Gui, 2:Add, Button, xm gDebug , &Copy Debug Data

Hotkey, %sHKMain%, Main, On
Hotkey, %sHKFight%, Fight, On
Hotkey, %sHKCollect%, Collect, On

SplashTextOff

if (Contents[6] > Ver){
	num := Contents[7]
	url = http://www.mpgh.net/forum/showthread.php?t=%num%
	MsgBox, 4,, New version available, go to MPGH topic ? (press Yes or No)
	IfMsgBox Yes
		Run %url%
	}

Gui, 1:Show,,mpFollowingBots

SetTimer, UpdateGui, 999

TrayTip ,mpFollowingBots, Bot started !`nPress numPad0 to select your main account !`nEnsure others are facing SOUTH !
return

Main:
	WinGet, p, pid, A
	WinGet, process, ProcessName, ahk_pid %p%
	IF (process = "Trove.exe"){
		IF (Mp <> p){
			Mp := p
			TrayTip ,mpFollowingBots, % "New main account set : " Mp
			SetTimer, Move, %sUPDRate%
		}ELSE{
			Mp := -1
			TrayTip ,mpFollowingBots, Bot Paused
			SetTimer, Move, Off
			SetTimer, Collecting, Off
			SetTimer, Fighting, Off
			Sleep, 999
			WinGet, l, list, ahk_exe Trove.exe
			Loop %l%
				ControlSend, , {w up}{a up}{z up}{q up}{s up}{d up}, % "ahk_id " l%a_index%
		}
	}
	return

Fight:
	fight := !fight
	IF (fight){
		SetTimer, Fighting, 999
		TrayTip ,mpFollowingBots, Fighting Mode
	}
	ELSE{
		SetTimer, Fighting, Off
		TrayTip ,mpFollowingBots, Travelling Mode
		Sleep, 1000
		WinGet, l, list, ahk_exe Trove.exe
		Loop %l%{
			WinGet, p, pid,% "ahk_id " l%a_index%
			IF (p != Mp)
				IF (KB)
					ControlSend, , z, ahk_pid %p%
				ELSE
					ControlSend, , w, ahk_pid %p%
		}
	}
	return

Collect:
	collect := !collect
	IF (collect){
		SetTimer, Collecting, 999
		TrayTip ,mpFollowingBots, Collect On
	}
	ELSE{
		SetTimer, Collecting, Off
		TrayTip ,mpFollowingBots, Collect Off
		WinGet, l, list, ahk_exe Trove.exe
		Loop %l%{
			WinGet, p, pid,% "ahk_id " l%a_index%
			IF (p != Mp)
				ControlSend, , {e up}, ahk_pid %p%
		}
	}
	return
	
Move:
	WinGet, l, list, ahk_exe Trove.exe
	Loop %l%{
		WinGet, p, pid,% "ahk_id " l%a_index%
		BaseAddress := getProcessBaseAddress(l%a_index%)
		xAddress := GetAddress(p, BaseAddress, _Pointer, _xOffset)
		yAddress := GetAddress(p, BaseAddress, _Pointer, _yOffset)
		zAddress := GetAddress(p, BaseAddress, _Pointer, _zOffset)
		xValue := ReadMemory(xAddress, p)
		yValue := ReadMemory(yAddress, p)
		zValue := ReadMemory(zAddress, p)
		IF (4294967295 - xValue < xValue)
			xValue := xValue - 4294967295
		IF (4294967295 - yValue < yValue)
			yValue := yValue - 4294967295
		IF (4294967295 - zValue < zValue)
			zValue := zValue - 4294967295
		IF (p == Mp){
			X := xValue
			Y := yValue
			Z := zValue
		}ELSE{
			dX := X - xValue
			dY := Y - yValue
			dZ := Z - zValue
			IF ((dX > sTR && !fight) || (dX > sFR && fight))
				IF (KB)
					ControlSend, , {d up}{a down}, ahk_pid %p%
				ELSE
					ControlSend, , {d up}{q down}, ahk_pid %p%
			ELSE IF ((dX < -sTR && !fight) || (dX < -sFR && fight))
				IF (KB)
					ControlSend, , {a up}{d down}, ahk_pid %p%
				ELSE
					ControlSend, , {q up}{d down}, ahk_pid %p%
			ELSE
				ControlSend, , {q up}{d up}{a up}, ahk_pid %p%
			IF ((dZ > sTR && !fight) || (dZ > sFR && fight))
				IF (KB)
					ControlSend, , {s up}{w down}, ahk_pid %p%
				ELSE
					ControlSend, , {s up}{z down}, ahk_pid %p%
			ELSE IF ((dZ < -sTR && !fight) || (dZ < -sFR && fight))
				IF (KB)
					ControlSend, , {w up}{s down}, ahk_pid %p%
				ELSE
					ControlSend, , {z up}{s down}, ahk_pid %p%
			ELSE
				ControlSend, , {w up}{s up}{z up}, ahk_pid %p%
			IF (dY > 1)
				ControlSend, , {Space}, ahk_pid %p%
			IF ((dX > sTR && !fight) || (dX > sFR && fight) || (dX < -sTR && !fight) || (dX < -sFR && fight) || (dZ < -sTR && !fight) || (dZ < -sFR && fight) || (dZ > sTR && !fight) || (dZ > sFR && fight)){
				Random,r ,1,10
				IF (r = 5)	
					ControlSend, , {w up}{a up}{z up}{q up}{s up}{d up}{Space}, ahk_pid %p%
			}
		}
	}
	return

Collecting:
	WinGet, l, list, ahk_exe Trove.exe
	Loop %l%
	{
		WinGet, p, pid,% "ahk_id " l%a_index%
		IF (p != Mp){
			ControlSend, , {e down}, ahk_pid %p%
			Random, r, 999, 1999
			Sleep, %r%
			ControlSend, , {e up},ahk_pid %p%
		}
	}
	return

Fighting:
	WinGet, l, list, ahk_exe Trove.exe
	Loop %l%{
		WinGet, p, pid,% "ahk_id " l%a_index%
		IF (p != Mp)
			ControlSend, , {vk31}{vk32}, ahk_pid %p%
	}
	return

UpdateGui:
	Gui, 1:Default
	LV_DELETE()
	WinGet, l, list, ahk_exe Trove.exe
	Loop %l%{
		WinGet, p, pid,% "ahk_id " l%a_index%
		BaseAddress := getProcessBaseAddress(l%a_index%)
		xAddress := GetAddress(p, BaseAddress, _Pointer, _xOffset)
		yAddress := GetAddress(p, BaseAddress, _Pointer, _yOffset)
		zAddress := GetAddress(p, BaseAddress, _Pointer, _zOffset)
		xValue := ReadMemory(xAddress, p)
		yValue := ReadMemory(yAddress, p)
		zValue := ReadMemory(zAddress, p)
		IF (4294967295 - xValue < xValue)
			xValue := xValue - 4294967295
		IF (4294967295 - yValue < yValue)
			yValue := yValue - 4294967295
		IF (4294967295 - zValue < zValue)
			zValue := zValue - 4294967295
		IF (Mp != -1 && (dX+dY+dZ)>30){
			Message := "I'm lost"
			TrayTip, %p% is lost !
		}ELSE IF(fight)
			Message := "Fight mode"
		ELSE
			Message := "Travelling mode"
		IF (p = Mp)
			LV_Add("Check", l%a_index%, p, BaseAddress, xAddress, xValue, yAddress, yValue, zAddress, zValue, "Main Account")
		ELSE
			LV_Add("", l%a_index%, p, BaseAddress, xAddress, xValue, yAddress, yValue, zAddress, zValue, Message)
	}
	GuiControlGet, KB,, Keyboard
	LV_ModifyCol()
	return

Debug:
	message := "[SP" . "OILER=Debug][CO" . "DE]Version = " . Ver . "`nPointer = " . _Pointer . "`nX Offsets = " . _xOffset . "`nY Offsets = " . _yOffset . "`nZ Offsets = " . _zOffset
	WinGet, l, list, ahk_exe Trove.exe
	Loop %l%
	{
		Handle := l%a_index%
		WinGet, pid, PID, ahk_id %Handle%
		Base := getProcessBaseAddress(Handle)
		xAddress := GetAddress(p, BaseAddress, _Pointer, _xOffset)
		yAddress := GetAddress(p, BaseAddress, _Pointer, _yOffset)
		zAddress := GetAddress(p, BaseAddress, _Pointer, _zOffset)
		message := message . "`nClient" . i . ":`nPID = " . pid . "`nHandle = " . Handle . "`nBase = " . Base . "`nX Address = " . xAddress . "`nY Address = " . yAddress . "`nZ Address = " . zAddress
		}
	message := message . "[/CO" . "DE][/SPO" . "ILER]"
	clipboard = %message%
	MsgBox, Debug data copied to clipboard
	return

TraRange:
	sTR := TR
	return

FigRange:
	sFR := FR
	return

AssignMain:
	Hotkey, %sHKMain%, Main, Off
	Hotkey, %HKMain%, Main, On
	sHKMain := HKMain
	MsgBox, Main hotkey set to %sHKMain%
	return

AssignFight:
	Hotkey, %sHKFight%, Fight, Off
	Hotkey, %HKFight%, Fight, On
	sHKFight := HKFight
	MsgBox, Fight hotkey set to %sHKFight%
	return

AssignCollect:
	Hotkey, %sHKCollect%, Collect, Off
	Hotkey, %HKCollect%, Collect, On
	sHKCollect := HKCollect
	MsgBox, Collect hotkey set to %sHKCollect%
	return

UPDRateAssign:
	sUPDRate := UPDRate
	IF (Mp != -1)
		SetTimer, Move, %sUPDRate%
	return

Config:
	Gui, 2:Show,,Config
	return

GuiClose:
	ExitApp

2GuiClose:
	IniWrite, %sHKMain%, %iniFile%, Hotkeys, sHKMain
	IniWrite, %sHKFight%, %iniFile%, Hotkeys, sHKFight
	IniWrite, %sHKCollect%, %iniFile%, Hotkeys, sHKCollect
	IniWrite, %KB%, %iniFile%, Global, QWERTY
	IniWrite, %sTR%, %iniFile%, Global, sTR
	IniWrite, %sFR%, %iniFile%, Global, sFR
	IniWrite, %sUPDRate%, %iniFile%, Global, sUPDRate
	Gui, 2:Hide
	return

getProcessBaseAddress(Handle){
	Return DllCall( A_PtrSize = 4 ? "GetWindowLong": "GetWindowLongPtr", "Ptr", Handle, "Int", -6, "Int64")
	}

GetAddress(PID, Base, Address, Offset){
	p := ReadMemory(base + Address,PID)
	OffsetSplit := StrSplit(Offset, "+")
	OffsetCount := OffsetSplit.MaxIndex()
	Loop, %OffsetCount%{
		IF (a_index = OffsetCount)
			p := p + OffsetSplit[a_index]
	  	ELSE
			p := ReadMemory(p + OffsetSplit[a_index],PID)
		}
	Return p
	}

ReadMemory(MADDRESS, pid){
	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
	}


 
Version history
Code:
v1.0 (7510b):
Initial release

v1.1(11868b):
Fixed few glitches
Added Customusable hotkeys
Can now toogle Collect MODE
Added a button to copy account and vars list, BBCODE formatted


Disclaimer :
This is an early release and may crash often ! Please report bugs here.
I will not be responsible of any ban you get by using this !

There are the virus scans :
https://virusscan.jotti.org/en-US/fi...job/qmhgv6tywp
https://www.virustotal.com/en/file/d...is/1479315419/

Todo :
-Suggestions
-More combat skills
-Add gliding/boat support
-/joinme
-Video tutorial/example
-Customisable keys for game
mpFollowingBotsv1.1_mpgh.net.zip3 KB · 111 downloads Clean
Looks good to me. /Approved
Thanks ! I am working on something about mounts ! I can't get it fly as you do( I can detect it but the bot will always fly south) but I can make the bot use boat and mounts at the same time as the main account !
Bot not working since the update !
Pointer updated later today !

- - - Updated - - -

Pointer updated !
Posts 1–4 of 4 · Page 1 of 1
This thread is closed for replies.

Similar Threads

Tags for this Thread

None

Need help?