Code:
#SingleInstance force
#IfWinActive,ahk_exe Trove.exe
#NoEnv
#Persistent
SendMode Input
SetWorkingDir %A_ScriptDir%
SetBatchLines -1
if NOT A_IsAdmin{
Run *RunAs "%A_ScriptFullPath%"
ExitApp
}
Process,Exist,TeamViewer.exe
If (ErrorLevel)
Msgbox,% "Teamviewer is currenly running. This is a known program to cause issues with the script. Please close it or disable quick connect feature. If issues still happen try to uninstall it."
SplashTextOn,500,25,FishingBot,Initializing, please wait...
global version:=4.3
global connected:=false
global firstStart:=false
global active:=Object()
global throwTimer:=5
global minReelTimer:=400
global maxReelTimer:=700
global fishingGameKey:="f"
global pointersUpdate:=0
global pointer:="0x01074874"
global waterOffsets:="0x68+0xF4+0x690+0x7F0"
global lavaOffsets:="0x68+0xF4+0x690+0xCC4"
global chocoOffsets:="0x68+0xF4+0x690+0xA58"
global waterStateOffsets:="0x68+0xF4+0x4A8+0x6E8"
global lavaStateOffsets:="0x68+0xF4+0x4A8+0x480"
global chocoStateOffsets:="0x68+0xF4+0x4A8+0x950"
global pointerPTS:="0x0"
global waterOffsetsPTS:="0x0"
global lavaOffsetsPTS:="0x0"
global chocoOffsetsPTS:="0x0"
global waterStateOffsetsPTS:="0x0"
global lavaStateOffsetsPTS:="0x0"
global chocoStateOffsetsPTS:="0x0"
global iniFile:=A_ScriptDir "/config"version ".ini"
if (FileExist(iniFile)){
IniRead,throwTimer,%iniFile%,Vars,throwTimer
IniRead,minReelTimer,%iniFile%,Vars,minReelTimer
IniRead,maxReelTimer,%iniFile%,Vars,maxReelTimer
IniRead,fishingGameKey,%iniFile%,GameKeys,fishingGameKey,%A_Space%
IniRead,pointersUpdate,%iniFile%,PointerOffsets,pointersUpdate
IniRead,pointer,%iniFile%,PointerOffsets,pointer
IniRead,waterOffsets,%iniFile%,PointerOffsets,waterOffsets
IniRead,lavaOffsets,%iniFile%,PointerOffsets,lavaOffsets
IniRead,chocoOffsets,%iniFile%,PointerOffsets,chocoOffsets
IniRead,waterStateOffsets,%iniFile%,PointerOffsets,waterStateOffsets
IniRead,lavaStateOffsets,%iniFile%,PointerOffsets,lavaStateOffsets
IniRead,chocoStateOffsets,%iniFile%,PointerOffsets,chocoStateOffsets
IniRead,pointerPTS,%iniFile%,PointerOffsets,pointerPTS
IniRead,waterOffsetsPTS,%iniFile%,PointerOffsets,waterOffsetsPTS
IniRead,lavaOffsetsPTS,%iniFile%,PointerOffsets,lavaOffsetsPTS
IniRead,chocoOffsetsPTS,%iniFile%,PointerOffsets,chocoOffsetsPTS
IniRead,waterStateOffsetsPTS,%iniFile%,PointerOffsets,waterStateOffsetsPTS
IniRead,lavaStateOffsetsPTS,%iniFile%,PointerOffsets,lavaStateOffsetsPTS
IniRead,chocoStateOffsetsPTS,%iniFile%,PointerOffsets,chocoStateOffsetsPTS
}ELSE{
global firstStart:=true
SaveCgf()
}
SplashTextOff
Update(true)
global updateYear:=pointersUpdate//10000
global updateMonth:=(pointersUpdate-updateYear*10000)//100
global updateDay:=(pointersUpdate-100*(updateMonth+100*(updateYear)))
SplashTextOn,500,25,mpPassiveFishingBot,Building GUI, please wait...
Gui 1:+Resize -MinimizeBox
Gui,1:Add,Tab,w380 h220,General|Comptes|settings|Live|PTS
Gui,1:Tab,1
Gui,1:Add,Text,,=) /i <3 o/
Gui,1:Add,Text,,Pointers lastest updated : %updateMonth%/%updateDay%/%updateYear%
Gui,1:Add,Text,,Version : Kil
Gui,1:Add,Text,,Activation : [F12]
Gui,1:Add,Button, w350 h25 gUpdateButton,&Update
Gui,1:Add,Button,w350 h25 gDebug,&Copy Debug Data
Gui,1:Tab,2
Gui,1:Add,ListView,w350 h180 -Hdr grid -ReadOnly -LV0x10,| | | | | |
Gui,1:Tab,3
Gui,1:Add,Text,Section,Time before throwing (ms) :
Gui,1:Add,Text,,Minimum time before reeling (ms) :
Gui,1:Add,Text,,Maximum time before reeling (ms) :
Gui,1:Add,Text,,Fishing key :
Gui,1:Add,Edit,xs+200 ys-5 w50 vthrowTimer gChangeConfig,%throwTimer%
Gui,1:Add,Edit,w50 vminReelTimer gChangeConfig,%minReelTimer%
Gui,1:Add,Edit,w50 vmaxReelTimer gChangeConfig,%maxReelTimer%
Gui,1:Add,Hotkey,w50 gChangeConfig vfishingGameKey,%fishingGameKey%
Gui,1:Tab,4
Gui,1:Add,Text,,Pointer :
Gui,1:Add,Text,,Water Offsets :
Gui,1:Add,Text,,Lava Offsets :
Gui,1:Add,Text,,Choco Offsets :
Gui,1:Add,Text,,Water State Offsets :
Gui,1:Add,Text,,Lava State Offsets :
Gui,1:Add,Text,,Choco State Offsets :
Gui,1:Add,Edit,xs+200 ys-5 w150 vpointer gChangeConfig,%pointer%
Gui,1:Add,Edit,w150 vwaterOffsets gChangeConfig,%waterOffsets%
Gui,1:Add,Edit,w150 vlavaOffsets gChangeConfig,%lavaOffsets%
Gui,1:Add,Edit,w150 vchocoOffsets gChangeConfig,%chocoOffsets%
Gui,1:Add,Edit,w150 vwaterStateOffsets gChangeConfig,%waterStateOffsets%
Gui,1:Add,Edit,w150 vlavaStateOffsets gChangeConfig,%lavaStateOffsets%
Gui,1:Add,Edit,w150 vchocoStateOffsets gChangeConfig,%chocoStateOffsets%
Gui,1:Tab,5
Gui,1:Add,Text,,PTS Pointer :
Gui,1:Add,Text,,PTS Water Offsets :
Gui,1:Add,Text,,PTSLava Offsets :
Gui,1:Add,Text,,PTS Choco Offsets :
Gui,1:Add,Text,,PTS Water State Offsets :
Gui,1:Add,Text,,PTS Lava State Offsets :
Gui,1:Add,Text,,PTS Choco State Offsets :
Gui,1:Add,Edit,xs+200 ys-5 w150 vpointerPTS gChangeConfig,%pointerPTS%
Gui,1:Add,Edit,w150 vwaterOffsetsPTS gChangeConfig,%waterOffsetsPTS%
Gui,1:Add,Edit,w150 vlavaOffsetsPTS gChangeConfig,%lavaOffsetsPTS%
Gui,1:Add,Edit,w150 vchocoOffsetsPTS gChangeConfig,%chocoOffsetsPTS%
Gui,1:Add,Edit,w150 vwaterStateOffsetsPTS gChangeConfig,%waterStateOffsetsPTS%
Gui,1:Add,Edit,w150 vlavaStateOffsetsPTS gChangeConfig,%lavaStateOffsetsPTS%
Gui,1:Add,Edit,w150 vchocoStateOffsetsPTS gChangeConfig,%chocoStateOffsetsPTS%
SplashTextOff
Gui,1:Show,,ZBEUB
if(firstStart)
MsgBox,Please config the fishing key
SetTimer,ScanFish,100
SetTimer,ScanReel,100
SetTimer,SecondAdder,1000
SetTimer,UpdateGUI,250
SetTimer,UpdateTimer,60000
TrayTip,mpPassiveFishingBot,Bot started ! Press "f" on water/lava/chocolate !
return
F12::
WinGet,pidA,pid,A
newActive:=Object()
found:=false
for k,accountA in active{
if (accountA[1]=pidA)
found:=true
else
newActive.Insert(accountA)
}
if (!found){
newActive.Insert([pidA,0,9,0,0,"Detecting","Detecting",0])
TrayTip,mpPassiveFishingBot,Bot started on %pidA%!
}else
TrayTip,mpPassiveFishingBot,Bot stopped on %pidA%!
global active:=newActive
return
ScanFish:
for i,account in active
if(account[8]=0)
if (account[4]=0){
WinGet,handle,ID,% "ahk_pid "account[1]
Base:=getProcessBaseAddress(handle)
waterStateAddress:=GetAddress(account[1],Base,pointer,waterStateOffsets)
lavaStateAddress:=GetAddress(account[1],Base,pointer,lavaStateOffsets)
chocoStateAddress:=GetAddress(account[1],Base,pointer,chocoStateOffsets)
waterStateAddressPTS:=GetAddress(account[1],Base,pointerPTS,waterStateOffsetsPTS)
lavaStateAddressPTS:=GetAddress(account[1],Base,pointerPTS,lavaStateOffsetsPTS)
chocoStateAddressPTS:=GetAddress(account[1],Base,pointerPTS,chocoStateOffsetsPTS)
if (ReadMemory(waterStateAddress,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointer,waterOffsets)
account[5]:=waterStateAddress
account[6]:="Water"
account[7]:="Live"
}else if (ReadMemory(lavaStateAddress,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointer,lavaOffsets)
account[5]:=lavaStateAddress
account[6]:="Lava"
account[7]:="Live"
}else if (ReadMemory(chocoStateAddress,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointer,chocoOffsets)
account[5]:=chocoStateAddress
account[6]:="Chocolate"
account[7]:="Live"
}else if (ReadMemory(waterStateAddressPTS,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointerPTS,waterOffsetsPTS)
account[5]:=waterStateAddressPTS
account[6]:="Water"
account[7]:="PTS"
}else if (ReadMemory(lavaStateAddressPTS,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointerPTS,lavaOffsetsPTS)
account[5]:=lavaStateAddressPTS
account[6]:="Lava"
account[7]:="PTS"
}else if (ReadMemory(chocoStateAddressPTS,account[1])=1){
account[4]:=GetAddress(account[1],Base,pointerPTS,chocoOffsetsPTS)
account[5]:=chocoStateAddressPTS
account[6]:="Chocolate"
account[7]:="PTS"
}else if (account[3]>throwTimer){
account[3]:=0
SendF(account[1])
}
}else if (account[3]>throwTimer)
if (ReadMemory(account[4],account[1])=1){
account[2] ++
account[8]:=1
account[3]:=0
}else if (ReadMemory(account[5],account[1])=0){
account[3]:=0
SendF(account[1])
}
return
ScanReel:
for j,accountR in active
if(accountR[8]=1){
Random, rand, minReelTimer, maxReelTimer
Sleep %rand%
SendF(accountR[1])
accountR[8]:=0
}
return
SendF(pidS){
ControlSend,ahk_parent,{%fishingGameKey% down},ahk_pid %pidS%
Sleep,90
ControlSend,ahk_parent,{%fishingGameKey% up},ahk_pid %pidS%
}
SecondAdder:
for i,accountS in active
accountS[3]++
return
UpdateGUI:
LV_DELETE()
LV_Add("","Name","PID","Server","Liquide","Nbr","Delai")
WinGet,l,list,ahk_exe Trove.exe
WinGet,currentPid,pid,A
WinGet,name,ProcessName,ahk_pid %currentPid%
if(name!="Trove.exe")
ToolTip
loop %l%{
WinGet,pidU,PID,% "ahk_id " l%a_index%
WinGetTitle, nameU,% "ahk_id " l%a_index%
foundU:=false
for i,accountU in active
if (accountU[1]=pidU){
foundU:=true
LV_Add("",nameU,accountU[1],accountU[7],accountU[6],accountU[2],accountU[3])
if (currentPid=pidU)
ToolTip,% "Fishing`nPID : "accountU[1] "`nServer : "accountU[7] "`nLiquid : "accountU[6] "`nReeled : "accountU[2] "`nTimer : "accountU[3],0,0
}
if (!foundU){
LV_Add("",nameU,pidU,"Not fishing","-",0,0)
if (currentPid=pidU)
ToolTip,% "Not fishing`nPid : "pidU,0,0
}
}
LV_ModifyCol()
return
ChangeConfig:
GuiControlGet,throwTimer,,throwTimer
GuiControlGet,minReelTimer,,minReelTimer
GuiControlGet,maxReelTimer,,maxReelTimer
GuiControlGet,pointer,,pointer
GuiControlGet,waterOffsets,,waterOffsets
GuiControlGet,lavaOffsets,,lavaOffsets
GuiControlGet,chocoOffsets,,chocoOffsets
GuiControlGet,waterStateOffsets,,waterStateOffsets
GuiControlGet,lavaStateOffsets,,lavaStateOffsets
GuiControlGet,chocoStateOffsets,,chocoStateOffsets
GuiControlGet,pointerPTS,,pointerPTS
GuiControlGet,waterOffsetsPTS,,waterOffsetsPTS
GuiControlGet,lavaOffsetsPTS,,lavaOffsetsPTS
GuiControlGet,chocoOffsetsPTS,,chocoOffsetsPTS
GuiControlGet,waterStateOffsetsPTS,,waterStateOffsetsPTS
GuiControlGet,lavaStateOffsetsPTS,,lavaStateOffsetsPTS
GuiControlGet,chocoStateOffsetsPTS,,chocoStateOffsetsPTS
SaveCgf()
return
SaveCgf(){
IniWrite,%throwTimer%,%iniFile%,Vars,throwTimer
IniWrite,%minReelTimer%,%iniFile%,Vars,minReelTimer
IniWrite,%maxReelTimer%,%iniFile%,Vars,maxReelTimer
IniWrite,%fishingGameKey%,%iniFile%,GameKeys,fishingGameKey
IniWrite,%pointersUpdate%,%iniFile%,PointerOffsets,pointersUpdate
IniWrite,%pointer%,%iniFile%,PointerOffsets,pointer
IniWrite,%waterOffsets%,%iniFile%,PointerOffsets,waterOffsets
IniWrite,%lavaOffsets%,%iniFile%,PointerOffsets,lavaOffsets
IniWrite,%chocoOffsets%,%iniFile%,PointerOffsets,chocoOffsets
IniWrite,%waterStateOffsets%,%iniFile%,PointerOffsets,waterStateOffsets
IniWrite,%lavaStateOffsets%,%iniFile%,PointerOffsets,lavaStateOffsets
IniWrite,%chocoStateOffsets%,%iniFile%,PointerOffsets,chocoStateOffsets
IniWrite,%pointerPTS%,%iniFile%,PointerOffsets,pointerPTS
IniWrite,%waterOffsetsPTS%,%iniFile%,PointerOffsets,waterOffsetsPTS
IniWrite,%lavaOffsetsPTS%,%iniFile%,PointerOffsets,lavaOffsetsPTS
IniWrite,%chocoOffsetsPTS%,%iniFile%,PointerOffsets,chocoOffsetsPTS
IniWrite,%waterStateOffsetsPTS%,%iniFile%,PointerOffsets,waterStateOffsetsPTS
IniWrite,%lavaStateOffsetsPTS%,%iniFile%,PointerOffsets,lavaStateOffsetsPTS
IniWrite,%chocoStateOffsetsPTS%,%iniFile%,PointerOffsets,chocoStateOffsetsPTS
}
Debug:
debugText:="ez"
clipboard=%debugText%
MsgBox,Debug data copied to clipboard
return
GuiClose:
ExitApp
UpdateTimer:
Update(false)
return
UpdateButton:
Update(true)
return
Update(boxUpdate){
if(boxUpdate)
SplashTextOn,500,25,mpPassiveFishingBot,Connecting to update server, please wait...
WebRequest:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET","https://www.nagatwin.ovh/Trove/mpPassiveFishingBotUpdater")
WebRequest.Send()
values:=StrSplit(WebRequest.ResponseText,"$")
global connected:=(values[1]="tokenOK")
if (connected&&values[4]>pointersUpdate){
global pointersUpdate:=values[4]
global pointer:=values[5]
global waterOffsets:=values[6]
global lavaOffsets:=values[7]
global chocoOffsets:=values[8]
global waterStateOffsets:=values[9]
global lavaStateOffsets:=values[10]
global chocoStateOffsets:=values[11]
global pointerPTS:=values[12]
global waterOffsetsPTS:=values[13]
global lavaOffsetsPTS:=values[14]
global chocoOffsetsPTS:=values[15]
global waterStateOffsetsPTS:=values[16]
global lavaStateOffsetsPTS:=values[17]
global chocoStateOffsetsPTS:=values[18]
SaveCgf()
TrayTip,mpPassiveFishingBot,Pointers and offsets updated
}
if(boxUpdate){
SplashTextOff
if (!connected)
MsgBox,Welcome o/
else if (values[2]>version){
MsgBox,4,,% "Version "values[2] " available, go to MPGH topic ? (press Yes or No)"
IfMsgBox Yes
{
Run % "https://www.mpgh.net/forum/showthread.php?t="values[3]
ExitApp
}
}else
TrayTip,mpPassiveFishingBot,Updated
}
}
getProcessBaseAddress(hnd){
Return DllCall( A_PtrSize = 4 ? "GetWindowLong": "GetWindowLongPtr","Ptr",hnd,"Int",-6,"Int")
}
GetAddress(PIDGA,BaseGA,PointerGA,OffsetsGA){
p:=ReadMemory(BaseGA + PointerGA,PIDGA)
OffsetsSpl:=StrSplit(OffsetsGA,"+")
loop,% (OffsetsSpl.MaxIndex() - 1)
p:=ReadMemory(p + OffsetsSpl[a_index],PIDGA)
if (OffsetsGA != "")
p:=p + OffsetsSpl[OffsetsSpl.MaxIndex()]
return p
}
ReadMemory(MADDRESS,PIDRM){
VarSetCapacity(MVALUE,4,0)
ProcessHandle:=DllCall("OpenProcess","Int",24,"Char",0,"Int",PIDRM,"Int")
DllCall("ReadProcessMemory","Int",ProcessHandle,"Ptr",MADDRESS,"Ptr",&MVALUE,"Int",4)
Loop 4
result+= *(&MVALUE+A_Index-1) << 8*(A_Index-1)
Return result
}