Page 1 of 3 123 LastLast
Results 1 to 15 of 40
  1. #1
    reppin's Avatar
    Join Date
    Feb 2010
    Gender
    male
    Posts
    1,070
    Reputation
    17
    Thanks
    5,368
    My Mood
    Dead

    Nippy's Fishing Bot(Most advanced one out and uses less cpu and most efficient)

    Please Update to 1.1 Major changes fixes and a feature or 2. See change log below for list of changes.


    Welcome to Nippy's Fish Bot thread. Here you will see my rant about whats bad about the old way everyone else's bot out there does things. Sorry but I just have to put it out there. First if you multi client like I do you hate having to open more then one exe to run the fisher on each client. The old way used loops and was vary poorly made. I tired and tired but failed to convert the old way in to a multi client due to the looping. Second, Not a fan of the ticktimer. It was not a vary good way to tell if it was not fishing or full inventory. It never could truly tell if you had a lure in the water or not. Third, The way it was scanning memory is it would scan all 3 liquid types. This can cause issues with CPU usage if you ran more then one client. Fourth, It would waste lures for no bloody reason other then to waste them. But for now I should stop this rant here since you are probably not even reading this and just want the bot anyhow. There are a whole list of things that that are wrong with it. That I have corrected in my version. Feel free to take a look at the code and compare to others you will notice no other is like mine.

    Oh, And before you say its just another bot. Sure it is but it is not a clone of other bots like all the ones out there are. It is way better in so many ways. Just take a peak at the source and see for your self. It is nothing like the others.


    Ok, On ward with the bot it self.

    I need to give a shout out to @taejim he helped me with a few things that helped improve the reliability of the bot with ideas and some coding and just someone to bounce issues off to till a idea stuck and worked.
    Greetings all those older bot writers that are basically the same bot with a new skin. You know who you are and I have come to crush you.

    Now to the good parts that you really came here for.


    How to use
    The hotkeys are as followed.

    NumberPad1 Start and Stop Single client.
    This key will start the autofish for that client by adding it to the bot list. If the client is already on the list it will ask you if you wish to remove it.

    NumerPad3 Stop Single client
    This will stop the foremost active window client. Unlike up top it wont ask you yes or no to remove.

    CTRL+NumberPad1 This will start all trove.exe clients at once.
    With this hotkey will start every client open at once. Make sure you pointing at what ever liquid type you are fishing. If there is already clients on the client list this command will not work. It will tell you so.

    CTRL+NumberPad3 Mass Stop of all clients
    This will remove all clients on the list. They will not finish there last cast.

    CTRL+NumberPad* Reload command
    If for what ever reason you need to reload the bot and don't wish to use the icon. Just use this hotkey.


    Usage
    If the bot detects that is is not fishing a screen will come up with the pID. You can then just click that screen to stop that client from fishing. it will bring that window to the foreground so you know which one it is if running alot. Some times the bot might glitch and not cast so you can ignore the first one you see. But if it comes up over and over you might want to check it to resolve the issue it is having.

    If you wish to fish in a new liquid type just stop the bot on that client and then start it up again facing the new liquid type.

    If for trove is update to update pointers just edit the NippysFishBot.ini that is created when it is first ran.
    In side you will see The following
    Code:
    [Nippys Fish Bot]
    Offset=0x00A43F04
    Just change the Offset=XxXXXXXXXX
    To the new offset. The default offset will change as I update things. But that is to change it if I do not release a update fast enough.


    Known Issues
    It doesn't go the to kitchen and make me a sandwich.
    So if you see any other problem please do report them.

    List of current features
    1. The bot will work with more then one client. No need to run more then one exe for each client.
    2. More efficient at scanning memory. It wont try and scan all 3 types of liquids only the type of which it started fishing in first.
    3. It checks to see if you have a lure in the water between 8 and 11seconds or more then 45seconds after cast. No need to wait the 40 to 45 seconds like most bots to tell the user it is not fishing.
    4. Memory scan wont start till the lure has been in the water for more then 12 seconds. This saves on cpu usage with the bot it self.
    5. Better error handling. Meaning it should not cast for no reason and waste lures.
    6. No more loops for main thread. So you can stop and start with out having to reload the fishing bot it self.
    7. Open source. I do not care if others have the source. But just remember to give credit where credit is due.
    8. Window title change. With info of the pID of that client and if it is fishing or not.
    9. There are others but can't seem to think of anymore atm I will fill it in as the come in.



    To-Do List
    1. Auto shut off when it can't fish set amount of time.
    2. More info. example How long its been fishing. How many lures used. How many reel ins last cast time ect.
    3. GUI for both settings and information related info.
    4. Add Boot drop/Decons(This is a long shot but after this is perfected i will take a crack at it.)
    5. Add trove.exe detection to the single client add. So try not to add other windows. It will just make the unable to detect fishing pop up till removed.
    6. Add a few more sleeps here and there to give a more real feel.
    7. Custom hotkeys(Will do this with GUI release)
    8. and what ever else you guys request.




    Also remember any questions or comments or just like to say thanks post below and give thanks to the opening post.

    Donations are always welcomed as well.
    Feel free to donate by clicking the image below
    [IMG]https://img.widgetbo*****m/thumbs/13d7c148-ea72-40fc-903f-2f3ac15d55e6.png[/IMG]


     

    Version 1.0
    initial release no logs to be seen.

    Version 1.0.1
    Tweaked the detection time of liquids to help detect liquid type if client lags.

    Version 1.1
    • With 1.1 I rewrote most of it again. Major clean up. Compare the 2 source codes and you can see what I have been threw.
    • General
      The way it started fishing was by adding the client to the array. It no longer is used. It now uses a active flag.
      Added a way to add info for the bot for later use. I wont go in to major details in this as it is used backend mostly and for the gui when I add it.
    • Error handling
      Major improvement on error handling.
      Those changes are as follow.
      No more spam of the Error screen. *Sorry about that.*
      Error screen wont pop up just because it errors once.
      It now takes 3 ticks for it to pop up. 3 ticks are about 8 to 11 secs apart. That means it tried 3 times within 24 to 45secs to recast before telling the user about it.
      Clicking the error gui now stops all clients that have reported errors. This is to prevent over lapping error screens.
      Rewrote how error handling was buffer. No more array for it.
    • Recast
      Rewrote the recast to fit new format of buffer. *means no longer in its own array like error
    • There might have been other changes but I can't think of any more. I will make sure to write all this down next time as I the changes.




     

     
    Code:
    #WinActivateForce
    ;warn
    Global FAddress := "0x00A682D0" ; Defailt address.
    Global IniFile := "NippysFishBot.ini" ;Save Filename
    
    Global BotList := Object()              ;The array where the clients are added.
    Global ClientsListtoRecast := Object()  ;buffer Array for recast.
    Global ReportedIDs = Object()           ;Budder away for hung/not fishing clients.
    
    ;Ini Settings load.
    IfNotExist, %A_ScriptDir%/%IniFile%
    {
    ;Default Settings.
    IniWrite, %FAddress%, %A_ScriptDir%/%IniFile%, Nippys Fish Bot, Offset
    }
    IniRead, FAddress, %A_ScriptDir%/%IniFile%, Nippys Fish Bot, Offset
    ;InitialSetup so it does not get ran again. Its not neded but make it look more pro.
    if !InitialSetup
      {
      	;Making sure it is ran as admin.
      	IF NOT A_IsAdmin
        {
          Run *RunAs "%A_ScriptFullPath%"
          ExitApp
        }
      	;Switchs toggle to on
      	FishBiteMemoryScanToggle := !FishBiteMemoryScanToggle
      	;Starts Memory Scan/Recast buffer.
      	SetTimer, FishBiteMemoryScan, 1000
    		SetTimer, Recast, 4000
    		
        InitialSetup = 1
      }
    
    ^NumpadMult::Reload
    
    NumPad1:: ;Manaully add/remove foreground client
    WinGet, pidn, PID, A
    pid := pidn
    WinGet, hwnds, ID, A
    Handle := hwnds
    	
    ;Detects if the bot is already on the list if found returns warning.	
    for index, element in BotList
    {
    BotListEx := StrSplit(element, "|") 
      If (BotListEx[1] = pid)
       {
    	;ToolTipDisplay("That client is already on the list.`nIndexID: [" . index . "] pID: [" . pid . "]  Handle: [" . Handle . "]")
        Msgbox, 4, Question, This cleint is already on the list. `n`nDo you wish to remove %pid%?
          IfMsgBox No
           Return
          else IfMsgBox Yes
             {
    								BotList.Remove(index)
    								ToolTipDisplay("Removing client from list.`nIndexID: [" . index . "] pID: [" . pid . "]")
    								return
            }
        return
       }
    }
    ;First cast also to detect liquid type.
             ControlSend, , {f down}, ahk_pid %pid%
     			 	 RandSleep(86,100)
     			 	 ControlSend, , {f up}, ahk_pid %pid%
     			 	 Sleep 400
     			 	 
    ;Setting up addresses for next scan.
    	Base := getProcessBaseAddress(Handle)
    	WaterAddress := GetAddressWater(Base, FAddress, pid)
    	Sleep 100
    	LavaAddress := GetAddressLava(Base, FAddress, pid)
    	ChocoAddress := GetAddressChoco(Base, FAddress, pid)
    	Sleep 100
    	GetFishingStateWaterAddress := GetFishingStateWaterAddress(Base, FAddress, pid)
    	GetFishingStateLavaAddress := GetFishingStateLavaAddress(Base, FAddress, pid)
    	Sleep 100
    	GetFishingStateChocoAddress := GetFishingStateChocoAddress(Base, FAddress, pid)
      Sleep 200
    ;Detecting Liquid type via memory read.
    DetectedLiquidType := 0 ;Default = for unknown type.
    	
    	      if (ReadMemory(GetFishingStateWaterAddress,pid) = 1)
    	       DetectedLiquidType := 1
    	      Else if (ReadMemory(GetFishingStateLavaAddress,pid) = 1)
    	       DetectedLiquidType := 2
    	      Else if (ReadMemory(GetFishingStateChocoAddress,pid) = 1)
    	       DetectedLiquidType := 3
    ;Adding bot to botlist array
      StartTime = %a_now%
      LastReelCast = %a_now%
      BotList.Insert(pid . "|" . Handle . "|" . Base . "|" . WaterAddress . "|" . LavaAddress . "|" . ChocoAddress . "|" . StartTime . "|" . LastReelCast . "|" . GetFishingStateWaterAddress . "|" . GetFishingStateLavaAddress . "|" . GetFishingStateChocoAddress . "|" . DetectedLiquidType)
    	
    	    if (DetectedLiquidType = 1) ;Water found scan only water type
    				LiquidType = Water
    			Else if (DetectedLiquidType = 2)	;Lava found scan only lava type
    				LiquidType = Lava
    		  Else if (DetectedLiquidType = 3) ;Choco found only scan Choco type
    				LiquidType = Chocolate
    			Else
    			  LiquidType = Unknown
    	ToolTipDisplay("Adding this client to the list.`npID: [" . pid . "] Liquid type: [" . LiquidType . "]")
    return
    
    ^NumPad1::
    if (BotList[1]) 
    {
    	ToolTipDisplay("Please clear out the client list before tring to add new clients or manauly add a new one.")
    return
    }
    Clientlist = 
    WinGet, TroveList, List, ahk_exe trove.exe
    While TroveList%a_index%
    {
        WinGet, pid, PID, % "ahk_id " TroveList%a_index%
        WinGet, Handle, ID, % "ahk_id " TroveList%a_index%
        
    for index, element in BotList 
    {
    BotListEx := StrSplit(element, "|") 
      If (BotListEx[1] = pid)
       {
       	;Bot is already on the list.
        return
       }
    }
    ;First cast also to detect liquid type.
             RandSleep(100,200)
             ControlSend, , {f down}, ahk_pid %pid%
     			 	 RandSleep(86,100)
     			 	 ControlSend, , {f up}, ahk_pid %pid%
     			 	 Sleep 400
     			 	 
    ;Setting up addresses for next scan.
    	Base := getProcessBaseAddress(Handle)
    	WaterAddress := GetAddressWater(Base, FAddress, pid)
    	Sleep 100
    	LavaAddress := GetAddressLava(Base, FAddress, pid)
    	ChocoAddress := GetAddressChoco(Base, FAddress, pid)
    	Sleep 100
    	GetFishingStateWaterAddress := GetFishingStateWaterAddress(Base, FAddress, pid)
    	GetFishingStateLavaAddress := GetFishingStateLavaAddress(Base, FAddress, pid)
    	Sleep 100
    	GetFishingStateChocoAddress := GetFishingStateChocoAddress(Base, FAddress, pid)
      Sleep 200
    ;Detecting Liquid type via memory read.
    DetectedLiquidType := 0 ;Default = for unknown type.
    	
    	      if (ReadMemory(GetFishingStateWaterAddress,pid) = 1)
    	       DetectedLiquidType := 1
    	      Else if (ReadMemory(GetFishingStateLavaAddress,pid) = 1)
    	       DetectedLiquidType := 2
    	      Else if (ReadMemory(GetFishingStateChocoAddress,pid) = 1)
    	       DetectedLiquidType := 3
    ;Adding bot to botlist array
      StartTime = %a_now%
      LastReelCast = %a_now%
      BotList.Insert(pid . "|" . Handle . "|" . Base . "|" . WaterAddress . "|" . LavaAddress . "|" . ChocoAddress . "|" . StartTime . "|" . LastReelCast . "|" . GetFishingStateWaterAddress . "|" . GetFishingStateLavaAddress . "|" . GetFishingStateChocoAddress . "|" . DetectedLiquidType)
    	
    	    if (DetectedLiquidType = 1) ;Water found scan only water type
    				LiquidType = Water
    			Else if (DetectedLiquidType = 2)	;Lava found scan only lava type
    				LiquidType = Lava
    		  Else if (DetectedLiquidType = 3) ;Choco found only scan Choco type
    				LiquidType = Chocolate
    			Else
    			  LiquidType = Unknown
    	Clientlist .= "pID: [" . pid . "] Liquid type: [" . LiquidType . "]`n" 
    }
    ToolTipDisplay("The followling clients have been added.`n" . Clientlist) 
    return
    
    
    NumPad3::
    RemoveClient:
    ;To remove active window from client list.
    WinGet, pidn, PID, A
    pid := pidn
    WinGet, hwnds, ID, A
    Handle := hwnds
    
    ;Setting up current pid/handle for next scan. Reminder to move this out of the loop if I can to save on memory reading.
    
    
    for index, element in BotList
    {
    	BotListEx := StrSplit(element, "|") 
      If (BotListEx[1] = pid)
    {
    	BotList.Remove(index)
    	ToolTipDisplay("Removing client from list.`nIndexID: [" . index . "] pID: [" . pid . "]")
    return
    }
    }
    ToolTipDisplay("This client was not found on the list.`npID: [" . pid . "]")
    Return	
    
    ^NumPad3::
    Global BotList := Object()
    ToolTipDisplay("Removed all clients from client the list." )
    return
    
    
    +^NumPadSub::
    	if !FishBiteMemoryScanToggle {
    				SetTimer, FishBiteMemoryScan, 1000
    				SetTimer, Recast, 2000
    				SoundPlay, %A_WinDir%\Media\Windows Ding.wav
      } else {
    				SetTimer, FishBiteMemoryScan, Off
    				SetTimer, Recast, Off
    		  	SoundPlay, %A_WinDir%\Media\Windows Ding.wav
            sleep 100
            SoundPlay, %A_WinDir%\Media\Windows Ding.wav
    	}
    	FishBiteMemoryScanToggle := !FishBiteMemoryScanToggle
    return
    
    FishBiteMemoryScan:
    for index, element in BotList
    {
      CurrentTime = %a_now%
    	BotListEx := StrSplit(element, "|") 
    	
    		;Checking to make sure the next scan that the client is running. If not found it will auto remove form the list and move on to next.
    		WinID := BotListEx[2]
    		IfWinNotExist, ahk_id %WinID%
    		{
    			ToolTipDisplay("Client no longer found Removing.`nIndexID: [" . index . "] pID: [" . pid . "]")
    			BotList.Remove(index)
    		Return
    		}
         ;Checks if bot hangs and if hung attempts a recast. Also will warn user.
         LastCastTime := BotListEx[8]
         EnvSub, CurrentTime, LastCastTime, seconds
         
         if (8 < CurrentTime && CurrentTime < 11 or 45 < CurrentTime)
          {
          	FishingState := 0
          		
            CaughtFishingStateWater := ReadMemory(BotListEx[9],BotListEx[1])
    				CaughtFishingStateLava := ReadMemory(BotListEx[10],BotListEx[1])
    				sleep 200
    				CaughtFishingStateChoco := ReadMemory(BotListEx[11],BotListEx[1])	
    					
    				If (CaughtFishingStateWater = 1 or CaughtFishingStateLava = 1 or CaughtFishingStateChoco = 1)
    				  FishingState := 1
    					
          	If (FishingState = 0)
          	 {
          	 SetTimer, Recast, Off
             Text := "The client on index[" . index . "] pID[" . BotListEx[1] . "] seems to be not be fishing. Possible causes could be frozen client/character or full inventory. Click this window to remove client from list and bring the window to the foreground."
             TransSplashText_On("Error",Text,600,"Arial","Black",0,10,,,7000)
             LastReelCast = %a_now%
             BotList[index] := BotListEx[1] . "|" . BotListEx[2] . "|" . BotListEx[3] . "|" . BotListEx[4] . "|" . BotListEx[5] . "|" . BotListEx[6] . "|" . BotListEx[7] . "|" . LastReelCast . "|" . BotListEx[9] . "|" . BotListEx[10] . "|" . BotListEx[11] . "|" . BotListEx[12]
             bID := BotListEx[1]
             ReportedIDs.Insert(bID)
             ClientsListtoRecast.Insert(bID)
             SetTimer, Recast, 4000
            }
          }
         
    
    	;Memory scan for current client.
          if (12 < CurrentTime) ;Wont start a memory scan till 15seconds has passed. This is to lower cpu usage.
          {
          	if (BotListEx[12] = 1) ;Water found scan only water type
    				CaughtWater := ReadMemory(BotListEx[4],BotListEx[1])
    				Else if (BotListEx[12] = 2)	;Lava found scan only lava type
    				CaughtLava := ReadMemory(BotListEx[5],BotListEx[1])
    				Else if (BotListEx[12] = 3) ;Choco found only scan Choco type
    				CaughtChoco := ReadMemory(BotListEx[6],BotListEx[1])
    			  Else {
    			  ;Unknown type so we can all 3. This will use more cpu.
    			  CaughtWater := ReadMemory(BotListEx[4],BotListEx[1])
    			  CaughtLava := ReadMemory(BotListEx[5],BotListEx[1])
    			  CaughtChoco := ReadMemory(BotListEx[6],BotListEx[1])
    			  }
    			} Else {
    				CaughtWater := 0
    				CaughtLava := 0
    				CaughtChoco := 0
    			}
    			
      	If (CaughtWater = 1 or CaughtLava = 1 or CaughtChoco = 1)
    			{
            for ClientCheckIndex, ClientCheckElement in ClientsListtoRecast
             {
         		  if (ClientCheckElement = BotListEx[1])
         		  {
               Return
              }
             }
          	 bID := BotListEx[1]
          	 RandSleep(100,200)
          	 ControlSend, , {f down}, ahk_pid %bID%
     			 	 RandSleep(86,100)
     			 	 ControlSend, , {f up}, ahk_pid %bID%
     			 	 Sleep 200
     			 	 LastReelCast = %a_now%
             BotList[index] := BotListEx[1] . "|" . BotListEx[2] . "|" . BotListEx[3] . "|" . BotListEx[4] . "|" . BotListEx[5] . "|" . BotListEx[6] . "|" . BotListEx[7] . "|" . LastReelCast . "|" . BotListEx[9] . "|" . BotListEx[10] . "|" . BotListEx[11] . "|" . BotListEx[12]
             ClientsListtoRecast.Insert(bID)
             return
             
    			} 
    
    }
    return
    
    Recast:
    for RecastIndex, RecastElement in ClientsListtoRecast
    {
    			for ReportedIDsRIndex, ReportedIDsRElement in ReportedIDs
     			 {
              if (ReportedIDsRElement = RecastElement)
                 ReportedIDs.Remove(ReportedIDsRIndex)
     			 }
        RandSleep(1000,2000)
        ControlSend, , {f down}, ahk_pid %RecastElement%
        RandSleep(86,100)
        ControlSend, , {f up}, ahk_pid %RecastElement%
        ClientsListtoRecast.Remove(RecastIndex)
    
    }
    
    Return
    
    
    
    Numpad7::
    ExitApp
    
    getProcessBaseAddress(Handle)
    {
    return DllCall( A_PtrSize = 4
    ? "GetWindowLong"
    : "GetWindowLongPtr"
    , "Ptr", Handle
    , "Int", -6
    , "Int64") ; Use Int64 to prevent negative overflow when AHK is 32 bit and target process is 64bit
    ; If DLL call fails, returned value will = 0
    } 
    
    GetAddressWater(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return WaterAddress := (y3 + 0x70) 
    }
    GetAddressLava(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return LavaAddress := (y3 + 0x514) 
    }
    
    GetAddressChoco(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return ChocoAddress := (y3 + 0x2c0) 
    }
    
    GetFishingStateWaterAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d4,PID)
     Return FishingStateWater := (y3 + 0x5a0)
    }
    
    GetFishingStateChocoAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateChoco := (y3 + 0x684)
    }
    
    GetFishingStateLavaAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateLava := (y3 + 0x1e4)
    }
    
    ReadMemory(MADDRESS, pid)
    {
    VarSetCapacity(MVALUE,4,0)
    ProcessHandle := DllCall("OpenProcess", "Int", 24, "Char", 0, "UInt", pid, "UInt")
    ;DllCall("ReadProcessMemory","UInt",ProcessHandle, "UInt",MADDRESS,"Str",MVALUE,"UInt",4,"UInt *",0)
    DllCall("ReadProcessMemory", "UInt", ProcessHandle, "Ptr", MADDRESS, "Ptr", &MVALUE, "Uint",4)
    Loop 4
    result += *(&MVALUE + A_Index-1) << 8*(A_Index-1)
    return, result
    }
    
    RandSleep(x,y) {
    				Random, rand, %x%, %y%
    				Sleep %rand%
    }
    
    ToolTipDisplay(Message) {
    ToolTip, %Message%
    SetTimer, RemoveToolTip, 5000
    return
    }
    RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
    return
    
    TransSplashText_On(Title="",Text="",Width="",Font="",TC="",SC="",TS="",xPos="",yPos="",TimeOut="")
    	{
    TransSplashText_Off()
    	If Title = 
    		Title = %A_ScriptName%
    	If Text = 
    		Text = TransSplashText
    	If Width = 
    	 Width = 200
    	If Font = 
    		Font = Impact
    	If TC = 
    		TC = White
    	If SC = 
    		SC = 828284
    	If TS = 
    		TS = 20
    	If xPos = 
    		xPos = Center
    	If yPos = 
    		yPos = Center
    	If TimeOut = 
    		TimeOut = 0
    	If SC != 0
    		{
    		Gui, 99:Font, S%TS% C%SC%, %Font%
    		Gui, 99:Add, Text, x7 y7 w%Width%, %Text%
    		}
    	Gui, 99:Font, S%TS% C%TC%, %Font%
    	Gui, 99:Add, Text, x5 y5 w%Width% gGUITextClick, %Text%
    
    	;Gui, 99:Color, EEAA99
    	Gui, 99:+LastFound +AlwaysOnTop +ToolWindow ;-Caption
    	;WinSet, TransColor, EEAA99
    	Gui, 99:Show, x%xPos% y%yPos% AutoSize, %Title%
    	If TimeOut != 0
    		{
    		SetTimer, TextOff, %TimeOut%
    		Return
    		TextOff:
    		TransSplashText_Off()
    		Return
    		}
    	}
    
    GUITextClick:
    	TransSplashText_Off()
      pid := ReportedIDs[1]
    
    for index, element in BotList
    {
    			BotListEx := StrSplit(element, "|") 
    		  If (pid = BotListEx[1])
    			{
    				ClientWindow := BotListEx[2]
    				WinActivate, ahk_id %ClientWindow%
    				BotList.Remove(index)
    				ReportedIDs.remove(1)
    				;Removes the Recast PID
    				for RecastIndex, RecastElement in ClientsListtoRecast
             {
              	if (RecastElement = pid)
              	{
              		ClientsListtoRecast.Remove(RecastIndex)
              	}	
             }
    				ToolTipDisplay("Removed client from list.`nIndexID: [" . index . "] pID: [" . BotListEx[1] . "]")
    			}
    }
    return
    
    TransSplashText_Off()
    	{
    	Gui, 99:Destroy
    	SetTimer, TextOff, Off
    	}


     
    Code:
    #WinActivateForce
    ;warn
    global FAddress := "0x00A43F04" ; Defailt address.
    global IniFile := "NippysFishBot.ini" ;Save Filename
    
    global BotList := Object()              ;The array where the clients are added.
    ;Global ClientsListtoRecast := Object()  ;buffer Array for recast.
    ;Global ReportedIDs = Object()           ;Budder away for hung/not fishing clients.
    
    
    ;Ini Settings load.
    IfNotExist, %A_ScriptDir%/%IniFile%
        {
            ;Default Settings.
            IniWrite, %FAddress%, %A_ScriptDir%/%IniFile%, Nippys Fish Bot, Offset
        }
    IniRead, FAddress, %A_ScriptDir%/%IniFile%, Nippys Fish Bot, Offset
    ;InitialSetup so it does not get ran again. Its not neded but make it look more pro.
    If !InitialSetup
        {
            ;Making sure it is ran as admin.
            If NOT A_IsAdmin
                {
                    Run *RunAs "%A_ScriptFullPath%"
                    ExitApp
                }
    
            ;Switchs toggle to on
            FishBiteMemoryScanToggle := !FishBiteMemoryScanToggle
            SetTimer, ActiveClientScan, 5000
    
            ;Starts Memory Scan/Recast buffer.
            SetTimer, FishBiteMemoryScan, 1000
            SetTimer, Recast, 4000
            InitialSetup = 1
            Goto, ActiveClientScan
        }
    
    NumpadMult::Reload
    
    ;Debugging stuff.
    Numpad4::
        Text =
        for index, element in BotList
        {
            Text .= "`n`nIndexMain:[" . index . "]`n"
            for index2, element2 in BotList[index]
            {
                Text .= "Index: [" . index2 . "] Element:[" . element2 . "]`n"
                for index3, element3 in BotList[index][index]
                {
                    Text .= "Index: [" . index3 . "] of [" . index2 . "] Element:[" . element3 . "]`n"
                }
        }
    
    }
    ToolTipDisplay(Text)
    Return
    
    NumPad1:: ;Sart and stop Fishing for active foreground client.
    
        ;Getting the pID and Handle that is used for memory scans.
        WinGet, pidn, PID, A
        pID := pidn
        WinGet, hwnds, ID, A
        Handle := hwnds
    
        ;First cast also to detect liquid type.
        ControlSend, , {f down}, ahk_pid %pID%
        RandSleep(86,100)
        ControlSend, , {f up}, ahk_pid %pID%
    
        ;Setting up addresses for Memory scan
        Base := getProcessBaseAddress(Handle)
        WaterAddress := GetAddressWater(Base, FAddress, pid)
        Sleep 200
        LavaAddress := GetAddressLava(Base, FAddress, pid)
        ChocoAddress := GetAddressChoco(Base, FAddress, pid)
        Sleep 200
        GetFishingStateWaterAddress := GetFishingStateWaterAddress(Base, FAddress, pid)
        GetFishingStateLavaAddress := GetFishingStateLavaAddress(Base, FAddress, pid)
        Sleep 200
        GetFishingStateChocoAddress := GetFishingStateChocoAddress(Base, FAddress, pid)
    
        ;Detecting Liquid type via memory read.
        DetectedLiquidType := 0 ;Default = for unknown type.
        If (ReadMemory(GetFishingStateWaterAddress,pid) = 1)
                DetectedLiquidType := 1
        Else If (ReadMemory(GetFishingStateLavaAddress,pid) = 1)
                DetectedLiquidType := 2
        Else If (ReadMemory(GetFishingStateChocoAddress,pid) = 1)
                DetectedLiquidType := 3
    
        ;Adding bot to botlist array
        StartTime := a_now
        LastReelCast := a_now
        ActiveFishing := 1 ;Turns it on.
        Recast := 0
        ErrorCount := 0
        ReelinCount := 0
        RecastCount := 0
    
        ;Updating Bot List with new info
        for index, element in BotList
        {
            ;Searching for pID match to know which bot to update with memory info.
            If (BotList[index, 1] = pID)
                {
                    ;BotList[index, 1] := pID       ;These get added by auto detect client
                    ;BotList[index, 2] := Handle    ;These get added by auto detect client
                    BotList[index, 3] := Base
                    BotList[index, 4] := WaterAddress
                    BotList[index, 5] := LavaAddress
                    BotList[index, 6] := ChocoAddress
                    BotList[index, 7] := StartTime
                    BotList[index, 8] := LastReelCast
                    BotList[index, 9] := GetFishingStateWaterAddress
                    BotList[index, 10] := GetFishingStateLavaAddress
                    BotList[index, 11] := GetFishingStateChocoAddress
                    BotList[index, 12] := DetectedLiquidType
                    BotList[index, 13] := ActiveFishing
                    BotList[index, 14] := Recast
                    BotList[index, 15] := ErrorCount
                    ;BotList[index, 16] := ClientDetectedTime   ;These get added by auto detect client
                    BotList[index, 17] := ReelinCount ; Total Cought?
                    BotList[index, 18] := RecastCount ; Recast Counter to be used to tell if it is over using lures.
                }
        }
    If (DetectedLiquidType = 1) ;Water found scan only water type
            LiquidType = Water
    Else If (DetectedLiquidType = 2)	;Lava found scan only lava type
            LiquidType = Lava
    Else If (DetectedLiquidType = 3) ;Choco found only scan Choco type
            LiquidType = Chocolate
    Else
            LiquidType = Unknown
    ToolTipDisplay("This Client has started fishing.`npID: [" . pid . "] Liquid type: [" . LiquidType . "]")
    Return
    
    ^NumPad1::
        ToolTipDisplay("Mass fishing started. Please wait...")
        Clientlist =
        WinGet, TroveList, List, ahk_exe trove.exe
        While TroveList%a_index%
        {
            WinGet, pid, PID, % "ahk_id " TroveList%a_index%
            WinGet, Handle, ID, % "ahk_id " TroveList%a_index%
    
            ;First cast also to detect liquid type.
            RandSleep(100,200)
            ControlSend, , {f down}, ahk_pid %pid%
            RandSleep(86,100)
            ControlSend, , {f up}, ahk_pid %pid%
            Sleep 400
    
            ;Setting up addresses for next scan.
            Base := getProcessBaseAddress(Handle)
            WaterAddress := GetAddressWater(Base, FAddress, pid)
            Sleep 100
            LavaAddress := GetAddressLava(Base, FAddress, pid)
            ChocoAddress := GetAddressChoco(Base, FAddress, pid)
            Sleep 100
            GetFishingStateWaterAddress := GetFishingStateWaterAddress(Base, FAddress, pid)
            GetFishingStateLavaAddress := GetFishingStateLavaAddress(Base, FAddress, pid)
            Sleep 100
            GetFishingStateChocoAddress := GetFishingStateChocoAddress(Base, FAddress, pid)
            Sleep 200
    
            ;Detecting Liquid type via memory read.
            DetectedLiquidType := 0 ;Default = for unknown type.
    
            If (ReadMemory(GetFishingStateWaterAddress,pid) = 1)
                    DetectedLiquidType := 1
            Else If (ReadMemory(GetFishingStateLavaAddress,pid) = 1)
                    DetectedLiquidType := 2
            Else If (ReadMemory(GetFishingStateChocoAddress,pid) = 1)
                    DetectedLiquidType := 3
            ;Adding bot to botlist array
            ;Adding bot to botlist array
            StartTime := a_now
            LastReelCast := a_now
            ActiveFishing := 1 ;Turns it on.
            Recast := 0
            ErrorCount := 0
            ReelinCount := 0
            RecastCount := 0
    
            ;Updating Bot List with new info
            for index, element in BotList
            {
                ;Searching for pID match to know which bot to update with memory info.
                If (BotList[index, 1] = pID)
                    {
                        ;BotList[index, 1] := pID       ;These get added by auto detect client
                        ;BotList[index, 2] := Handle    ;These get added by auto detect client
                        BotList[index, 3] := Base
                        BotList[index, 4] := WaterAddress
                        BotList[index, 5] := LavaAddress
                        BotList[index, 6] := ChocoAddress
                        BotList[index, 7] := StartTime
                        BotList[index, 8] := LastReelCast
                        BotList[index, 9] := GetFishingStateWaterAddress
                        BotList[index, 10] := GetFishingStateLavaAddress
                        BotList[index, 11] := GetFishingStateChocoAddress
                        BotList[index, 12] := DetectedLiquidType
                        BotList[index, 13] := ActiveFishing
                        BotList[index, 14] := Recast
                        BotList[index, 15] := ErrorCount
                        ;BotList[index, 16] := ClientDetectedTime   ;These get added by auto detect client
                        BotList[index, 17] := ReelinCount ; Total Cought?
                        BotList[index, 18] := RecastCount ; Recast Counter to be used to tell if it is over using lures.
                    }
    
            }
    
        ;This to change the detectedliqidtype from a number to the word for displaying
        If (DetectedLiquidType = 1) ;Water found scan only water type
                LiquidType = Water
        Else If (DetectedLiquidType = 2)	;Lava found scan only lava type
                LiquidType = Lava
        Else If (DetectedLiquidType = 3) ;Choco found only scan Choco type
                LiquidType = Chocolate
        Else
                LiquidType = Unknown
        Clientlist .= "pID: [" . pid . "] Liquid type: [" . LiquidType . "]`n"
        }
    ToolTipDisplay("Mass start fishing finshed.`n`nThe followling clients have started fishing.`n" . Clientlist)
    Return
    
    
    NumPad3::
    RemoveClient:
        ;To remove active window from client list.
        WinGet, pidn, PID, A
        pid := pidn
        WinGet, hwnds, ID, A
        Handle := hwnds
    
        for index, element in BotList
        {
            If (BotList[index][1] = pid)
                {
                    BotList[index][13] := 0
                    ToolTipDisplay("This client has been deactivated from fishing.`nIndexID: [" . index . "] pID: [" . pid . "]")
                    Return
                }
        }
    ToolTipDisplay("This client was not set to active fishing.`npID: [" . pid . "]")
    Return
    
    ^NumPad3::
        global BotList := Object()
        ToolTipDisplay("Removed all clients from client the list." )
    Return
    
    
    +^NumPadSub::
        If !FishBiteMemoryScanToggle {
                SetTimer, FishBiteMemoryScan, 1000
                SetTimer, Recast, 2000
                SoundPlay, %A_WinDir%\Media\Windows Ding.wav
        } Else {
                SetTimer, FishBiteMemoryScan, Off
                SetTimer, Recast, Off
                SoundPlay, %A_WinDir%\Media\Windows Ding.wav
                Sleep 100
                SoundPlay, %A_WinDir%\Media\Windows Ding.wav
            }
        FishBiteMemoryScanToggle := !FishBiteMemoryScanToggle
    Return
    
    ActiveClientScan:
        WinGet, TroveList, List, ahk_exe trove.exe ;Scans all trove.exe files and adds to array
        While TroveList%a_index% ;Loops the array.
        {
            WinGet, pID, PID, % "ahk_id " TroveList%a_index%
            WinGet, Handle, ID, % "ahk_id " TroveList%a_index%
            If (pID = "" or Handle = "")
                    Return
    
            TotalClientsOnList := BotList.MaxIndex()
    
            ;If(TotalClientsOnList = "")
            ;  TotalClientsOnList := 1
    
            AddClient := 1
    
            Loop, %TotalClientsOnList%
                {
                    If (BotList[a_index, 1] = pID) {
                            AddClient = 0
                        }
                }
            If (AddClient = 1) {
                    ;Adding bot to botlist array
                    ClientDetectedTime := a_now
                    BotList.Insert(Array(pID ,Handle, "0", "0", "0", "0", "0", "0", "0", "0", "0" ,"0" ,"0", "0", "0" ,ClientDetectedTime))
                    TotalClientsOnList := BotList.MaxIndex()
                    ToolTipDisplay("New Trove client window found. Added the follow to the client list.`npID: [" . pid . "]`n`nTotal Clients Detected:[" . TotalClientsOnList . "]")
                }
        }
    
    Return
    
    
    FishBiteMemoryScan:
        for index, element in BotList
        {
            ;TotalClientsOnList := BotList.MaxIndex()
            ;loop, %TotalClientsOnList%
            ; {
            ;index := a_index
            ;Setting Current time of scan. Used to compair for bot erro han
            CurrentTime = %a_now%
            WinID :=
            ;Checking to make sure the next scan that the client is running. If not found it will auto remove form the list and move on to next.
            WinID := BotList[index, 2]
            ;If (WinID = "")
            ;    Return
            IfWinNotExist, ahk_id %WinID%
                {
                    ToolTipDisplay("Client no longer found Removing.`nIndexID: [" . index . "] pID: [" . BotList[index, 1] . "]")
                    BotList.Remove(index)
                    Return
                }
    
            WinGetTitle, CurrentTitle, % "ahk_pid " BotList[index, 1] ;Lets get the current title name.
            If (BotList[index, 13] = 1) ; Checking ot make sure the fishing flag and the recast flag are both set to 1 being on.
                {
                    ;Fishing is Active on pID
                    NewTitle := "pID:[" . BotList[index, 1] . "] Fishing Active:[Yes]"
                    If (NewTitle <> CurrentTitle)
                            WinSetTitle, % "ahk_pid " BotList[index, 1], , % NewTitle
            } Else {
                    ;Fishing is not active on pID
                    NewTitle := "pID:[" . BotList[index, 1] . "] Fishing Active:[No]"
                    If (NewTitle <> CurrentTitle)
                            WinSetTitle, % "ahk_pid " BotList[index, 1], , % "pID:[" . pID . "] Fishing Active:[No]"
                }
    
    
            ;Checking if bot the bot to make sure it has the active fish flag. If set 0 means it is not fishing. So returns to do next scan.
            If (BotList[index, 13] <> 0)
                {
                    ;Checking last cast on record with currnet time.
                    LastCastTime := BotList[index, 8]
                    EnvSub, CurrentTime, LastCastTime, Seconds ;Converting last last cast time to Seconds.
    
                    ;Error handling to check to make sure it is still fishing.
                    If (8 < CurrentTime && CurrentTime < 11 or 45 < CurrentTime)
                        {
                            FishingState := "0"
                            ;Checking all 3 fishing states.
                            CaughtFishingStateWater := ReadMemory(BotList[index, 9],BotList[index, 1])
                            CaughtFishingStateLava := ReadMemory(BotList[index, 10],BotList[index, 1])
                            CaughtFishingStateChoco := ReadMemory(BotList[index, 11],BotList[index, 1])
    
                            ;If fishing state = 1 ignores the error logging. 15
                            If (CaughtFishingStateWater = 1 or CaughtFishingStateLava = 1 or CaughtFishingStateChoco = 1)
                                {
                                    FishingState := "1"
                                    BotList[index, 15] := "0" ;Since fishing is detected it will wipe out the Error Count.
                                }
    
                            If (FishingState = 0)
                                {
                                    If (BotList[index, 14] <> 1) { ;If recast is not 1 it trigers the Error Report.
                                            SetTimer, Recast, Off
                                            BotList[index, 15] := BotList[index, 15] + 1 ; Adds 1 for each time it is found not fishing.
                                            bID := BotList[index, 1]
                                            BotList[index, 14] := 1 ;Turning on the recast flag.
                                            SetTimer, Recast, 4000
                                            If (BotList[index, 15] > 2)
                                                {
                                                    Text := "The client on index[" . index . "] pID[" . BotList[index, 1] . "] seems to be not be fishing. Possible causes could be frozen client/character or full inventory. Click this window to remove client from list and bring the window to the foregRound."
                                                    TransSplashText_On("Error",Text,600,"Arial","Black",0,10,,,7000)
                                                }
                                            ;Fix this by adding a var yes or no to skip next parts  do not use return Return
                                        }
                                }
                        }
    
                    ;Memory scan for current client to check for fish bite
                    If (12 < CurrentTime) ;Wont start a memory scan till 12Seconds has passed. This is to Lower cpu usage.
                        {
                            If (BotList[index, 12] = 1) ;Water type found scan only water type
                                    CaughtWater := ReadMemory(BotList[index, 4],BotList[index, 1])
                            Else If (BotList[index, 12] = 2)	;Lava type found scan only lava type
                                    CaughtLava := ReadMemory(BotList[index, 5],BotList[index, 1])
                            Else If (BotList[index, 12] = 3) ;Choco type found only scan Choco type
                                    CaughtChoco := ReadMemory(BotList[index, 6],BotList[index, 1])
                            Else {
                                    ;Unknown type so we can all 3. This will use more cpu.
                                    CaughtWater := ReadMemory(BotList[index, 4],BotList[index, 1])
                                    CaughtLava := ReadMemory(BotList[index, 5],BotList[index, 1])
                                    CaughtChoco := ReadMemory(BotList[index, 6],BotList[index, 1])
                                }
                    } Else {
                            CaughtWater := 0
                            CaughtLava := 0
                            CaughtChoco := 0
                        }
    
                    ;Preforming reelin
                    If (CaughtWater = 1 or CaughtLava = 1 or CaughtChoco = 1)
                        {
                            ;Checking to see if the bot is already recasting. And if so it will ignore below.
                            If (BotList[index, 14] <> 1) {
                                    SetTimer, Recast, Off
                                    RandSleep(100,200)
                                    ControlSend, , {f down}, % "ahk_pid " BotList[index, 1]
                                    RandSleep(86,100)
                                    ControlSend, , {f up}, % "ahk_pid " BotList[index, 1]
                                    Sleep 200
                                    BotList[index, 14] := 1   ;Turning on the recast flag.
                                    BotList[index, 17] := BotList[index, 17] + 1 ;Padding the reeled in Counter.
                                    SetTimer, Recast, 4000
                                }
                        }
                }
        }
    Return
    
    Recast:
        TotalClientsOnList := BotList.MaxIndex()
        Loop, %TotalClientsOnList%
            {
                If (BotList[a_index, 14] = 1) ; Checking ot make sure the fishing flag and the recast flag are both set to 1 being on.
                    {
                        BotList[a_index, 18] := BotList[a_index, 18] + 1 ;Pading the recast Count by 1
                        pID := BotList[a_index, 1] ;Setting pID for Control Send.
                        RandSleep(1000,2000) ; Random wait time Between casts. Gives a more real feel.
                        ControlSend, , {f down}, % "ahk_pid " BotList[a_index, 1]
                        RandSleep(86,100)
                        ControlSend, , {f up}, % "ahk_pid " BotList[a_index, 1]
                        BotList[a_index, 14] := "0"  ;Reseting the recast it recasted.
                        BotList[a_index, 8] := a_now ;Setting the last cast time to current time.
                    }
            }
    Return
    
    getProcessBaseAddress(Handle)
        {
            Return DllCall( A_PtrSize = 4
            ? "GetWindowLong"
    : "GetWindowLongPtr"
        								, "Ptr", Handle
        								, "Int", -6
        								, "Int64")
        }
    
    GetAddressWater(Base, Address, pid) {
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,pid)
            y2 := ReadMemory(y1 + 0x144,pid)
            y3 := ReadMemory(y2 + 0xe4,pid)
            Return WaterAddress := (y3 + 0x70)
        }
    GetAddressLava(Base, Address, pid) {
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,pid)
            y2 := ReadMemory(y1 + 0x144,pid)
            y3 := ReadMemory(y2 + 0xe4,pid)
            Return LavaAddress := (y3 + 0x514)
        }
    
    GetAddressChoco(Base, Address, pid) {
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,pid)
            y2 := ReadMemory(y1 + 0x144,pid)
            y3 := ReadMemory(y2 + 0xe4,pid)
            Return ChocoAddress := (y3 + 0x2c0)
        }
    
    GetFishingStateWaterAddress(Base, Address, PID) {
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,PID)
            y2 := ReadMemory(y1 + 0x5d8,PID)
            y3 := ReadMemory(y2 + 0x7d4,PID)
            Return FishingStateWater := (y3 + 0x5a0)
        }
    
    GetFishingStateChocoAddress(Base, Address, PID)	{
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,PID)
            y2 := ReadMemory(y1 + 0x5d8,PID)
            y3 := ReadMemory(y2 + 0x7d8,PID)
            Return FishingStateChoco := (y3 + 0x684)
        }
    
    GetFishingStateLavaAddress(Base, Address, PID)	{
            pointerBase := base + Address
            y1 := ReadMemory(pointerBase,PID)
            y2 := ReadMemory(y1 + 0x5d8,PID)
            y3 := ReadMemory(y2 + 0x7d8,PID)
            Return FishingStateLava := (y3 + 0x1e4)
        }
    
    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
        }
    
    RandSleep(x,y) {
            Random, rand, %x%, %y%
            Sleep %rand%
        }
    
    ToolTipDisplay(Message) {
            ToolTip, %Message%
            SetTimer, RemoveToolTip, 5000
            Return
        }
    RemoveToolTip:
        SetTimer, RemoveToolTip, Off
        ToolTip
    Return
    
    TransSplashText_On(Title="",Text="",Width="",Font="",TC="",SC="",TS="",xPos="",yPos="",TimeOut="") {
            TransSplashText_Off()
            If Title =
                    Title = %A_ScriptName%
            If Text =
                    Text = TransSplashText
            If Width =
                    Width = 200
            If Font =
                    Font = Impact
            If TC =
                    TC = White
            If SC =
                    SC = 828284
            If TS =
                    TS = 20
            If xPos =
                    xPos = Center
            If yPos =
                    yPos = Center
            If TimeOut =
                    TimeOut = 0
            If SC != 0
                {
                    Gui, 99:Font, S%TS% C%SC%, %Font%
                    Gui, 99:Add, Text, x7 y7 w%Width%, %Text%
                }
            Gui, 99:Font, S%TS% C%TC%, %Font%
            Gui, 99:Add, Text, x5 y5 w%Width% gGUITextClick, %Text%
    
            ;Gui, 99:Color, EEAA99
            Gui, 99:+LastFound +AlwaysOnTop +ToolWindow ;-Caption
            ;WinSet, TransColor, EEAA99
            Gui, 99:Show, x%xPos% y%yPos% AutoSize, %Title%
            If TimeOut != 0
                {
                    SetTimer, TextOff, %TimeOut%
                    Return
    TextOff:
        TransSplashText_Off()
    Return
    }
    }
    
    GUITextClick:
        TransSplashText_Off() ;Turns off any active splash Screens.
        TotalClientsOnList := BotList.MaxIndex()
        Loop, %TotalClientsOnList%
            {
                If (1 < BotList[a_index, 15]) ;If client has any erors Counts it will automatic remove form active fishing when Gui is Clicked
                    {
                        ClientWindow := BotList[a_index, 2]
                        WinActivate, ahk_id %ClientWindow% ;Brings the erroed client to the foregound.
                        BotList[a_index, 13] := 0 ;Removing client from active scan list.
                        BotList[a_index, 15] := 0 ;Resetting errot Count as it is no longer on the active list.
                        BotList[a_index, 14] := 0 ;Removing Recast just incase. If it is activly fishing it wont try and recast lure.
                        ToolTipDisplay("Removed client from active fishing list.`nIndexID: [" . a_index . "] pID: [" . BotList[a_index, 1] . "]")
                    }
            }
    Return
    
    TransSplashText_Off() {
            Gui, 99:Destroy
            SetTimer, TextOff, Off
        }



    https://www.virustotal.com/en/file/d...is/1441837721/
    Code:
    SHA256:	dc1c01a167f85990794f5637f32e1d9242968ef560497053806aa7b16afb088c
    File name:	Nippy's Fish Bot1.1.rar
    Detection ratio:	2 / 56
    Analysis date:	2015-09-09 22:28:41 UTC ( 0 minutes ago )
    <b>Downloadable Files</b> Downloadable Files
    Last edited by Yemiez; 09-10-2015 at 07:32 AM.
    Like what I do? Well feel free to donate to show your love.


  2. The Following 39 Users Say Thank You to reppin For This Useful Post:

    65fhg (09-09-2015),Asior224 (08-27-2016),aunman (09-08-2015),bubag (09-11-2015),Cameron9456 (09-10-2015),chrisfaith07 (09-09-2015),cosMoXP (09-10-2015),darksayde59 (11-08-2016),DeadlyData13 (09-09-2015),destruct1on (09-11-2015),DoubleZz (04-28-2018),Ebony001 (02-14-2016),ghostwinderzz (09-08-2015),gigino (09-08-2015),intekanske (09-08-2015),ipowerbr (09-08-2015),JiChi (09-09-2015),kaicp (09-08-2015),kirabc (09-08-2015),Mafma (09-10-2015),maniacxxmat (09-09-2015),nakarin047 (07-01-2016),NchenNOOb (09-02-2016),NegativeTime (09-11-2015),OMGTECHLORD (08-09-2016),overgreen (09-09-2015),PAXMA (09-09-2015),Quaesitum (09-09-2015),rossicka (09-08-2015),sebas123451 (06-09-2016),StarlightRemix (09-08-2015),stunwar37 (09-08-2015),taejim (09-08-2015),TheKuze (09-08-2015),TheReafg1000 (09-08-2015),thomas749112 (09-08-2015),TWDD (09-11-2015),wow6158 (09-11-2015),Yushii16 (09-08-2015)

  3. #2
    Yemiez's Avatar
    Join Date
    Jun 2012
    Gender
    male
    Location
    Sweden
    Posts
    2,566
    Reputation
    731
    Thanks
    16,283
    My Mood
    Devilish
    File is safe

    /Approved

  4. #3
    reppin's Avatar
    Join Date
    Feb 2010
    Gender
    male
    Posts
    1,070
    Reputation
    17
    Thanks
    5,368
    My Mood
    Dead
    Quote Originally Posted by Yamiez View Post
    File is safe

    /Approved
    Ty for that but I left something off I just updated for 1.0.1 my bad. You just approved it to fast that time for me.
    Like what I do? Well feel free to donate to show your love.


  5. #4
    mageman89's Avatar
    Join Date
    Apr 2010
    Gender
    male
    Posts
    13
    Reputation
    10
    Thanks
    0
    Im gonna test that after approval ! Thx mate.

  6. #5
    Yemiez's Avatar
    Join Date
    Jun 2012
    Gender
    male
    Location
    Sweden
    Posts
    2,566
    Reputation
    731
    Thanks
    16,283
    My Mood
    Devilish
    Approved again

  7. #6
    reppin's Avatar
    Join Date
    Feb 2010
    Gender
    male
    Posts
    1,070
    Reputation
    17
    Thanks
    5,368
    My Mood
    Dead
    Quote Originally Posted by Yamiez View Post
    Approved again
    I was waiting for that rage. You normally give me 10 to 20minutes to make changes. But today you must be feeling better and on the ball. Instant approval within 7minutes or your money back.
    Like what I do? Well feel free to donate to show your love.


  8. #7
    rossicka's Avatar
    Join Date
    Aug 2015
    Gender
    male
    Posts
    2
    Reputation
    10
    Thanks
    1
    My Mood
    Amazed
    Thank you very much!

  9. #8
    floowsnaake's Avatar
    Join Date
    Jul 2015
    Gender
    female
    Posts
    72
    Reputation
    10
    Thanks
    381
    My Mood
    Innocent
    I can help you with a GUI if you like

  10. #9
    taejim's Avatar
    Join Date
    Jul 2011
    Gender
    male
    Location
    Trove
    Posts
    301
    Reputation
    10
    Thanks
    892
    My Mood
    Devilish
    Quote Originally Posted by floowsnaake View Post
    I can help you with a GUI if you like
    lol use macrocreator again? haha

    Code:
    My Trove Bot (OUTDATED) LazyFishing v1.9
    If you appreciate what i have done:

    1. Press the Thanks button above and give me reputation <3

    2. You can donate me if you feel like it, any amount is much appreciate.


  11. #10
    choobai's Avatar
    Join Date
    Apr 2011
    Gender
    male
    Posts
    83
    Reputation
    10
    Thanks
    10
    I would really really like a auto boot drop. Does this work with other standalone boot drop scripts out there?

  12. #11
    floowsnaake's Avatar
    Join Date
    Jul 2015
    Gender
    female
    Posts
    72
    Reputation
    10
    Thanks
    381
    My Mood
    Innocent
    Quote Originally Posted by taejim View Post
    lol use macrocreator again? haha
    whats wrong with it? o.0

    - - - Updated - - -

    why do you have all these functions? and not just make it in to one function?

    Code:
    GetAddressWater(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return WaterAddress := (y3 + 0x70) 
    }
    GetAddressLava(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return LavaAddress := (y3 + 0x514) 
    }
    
    GetAddressChoco(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return ChocoAddress := (y3 + 0x2c0) 
    }
    
    GetFishingStateWaterAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d4,PID)
     Return FishingStateWater := (y3 + 0x5a0)
    }
    
    GetFishingStateChocoAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateChoco := (y3 + 0x684)
    }
    
    GetFishingStateLavaAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateLava := (y3 + 0x1e4)
    }
    - - - Updated - - -

    Quote Originally Posted by choobai View Post
    I would really really like a auto boot drop. Does this work with other standalone boot drop scripts out there?
    use this one:
    https://www.mpgh.net/forum/showthread.php?t=1023639

  13. #12
    taejim's Avatar
    Join Date
    Jul 2011
    Gender
    male
    Location
    Trove
    Posts
    301
    Reputation
    10
    Thanks
    892
    My Mood
    Devilish
    Quote Originally Posted by floowsnaake View Post
    why do you have all these functions? and not just make it in to one function?
    well if you know how to code and not using macrocreator to make your auto bot then you would know why lol

    Code:
    My Trove Bot (OUTDATED) LazyFishing v1.9
    If you appreciate what i have done:

    1. Press the Thanks button above and give me reputation <3

    2. You can donate me if you feel like it, any amount is much appreciate.


  14. #13
    reppin's Avatar
    Join Date
    Feb 2010
    Gender
    male
    Posts
    1,070
    Reputation
    17
    Thanks
    5,368
    My Mood
    Dead
    Quote Originally Posted by floowsnaake View Post
    whats wrong with it? o.0

    - - - Updated - - -

    why do you have all these functions? and not just make it in to one function?

    Code:
    GetAddressWater(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return WaterAddress := (y3 + 0x70) 
    }
    GetAddressLava(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return LavaAddress := (y3 + 0x514) 
    }
    
    GetAddressChoco(Base, Address, pid)
    {
    pointerBase := base + Address
    y1 := ReadMemory(pointerBase,pid)
    y2 := ReadMemory(y1 + 0x144,pid)
    y3 := ReadMemory(y2 + 0xe4,pid)
    Return ChocoAddress := (y3 + 0x2c0) 
    }
    
    GetFishingStateWaterAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d4,PID)
     Return FishingStateWater := (y3 + 0x5a0)
    }
    
    GetFishingStateChocoAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateChoco := (y3 + 0x684)
    }
    
    GetFishingStateLavaAddress(Base, Address, PID)
    {
     pointerBase := base + Address
     y1 := ReadMemory(pointerBase,PID)
     y2 := ReadMemory(y1 + 0x5d8,PID)
     y3 := ReadMemory(y2 + 0x7d8,PID)
     Return FishingStateLava := (y3 + 0x1e4)
    }
    - - - Updated - - -



    use this one:
    https://www.mpgh.net/forum/showthread.php?t=1023639
    because I am lazy and used there code as it worked. But now that you pointed it out I can rewrite this my self looking at it again. Right now it was about getting it working 100% or atlest 95% as there is a few bugs that still need to be squashed like every thing good. But for the most part I need to still fix the error handling that splash screen that comes up. When I woke up about 20minutes ago a idea of a flag of how many errors poped up on how I can handle this. Hell just now thinking about it again I might have solved another issue that could arise from that same thing. omg I did it agin while writing this post had 2 ideas on how to handle it. The 2nd one better then the first. Anyhow I better stop rambling now.


    As for a interface for the GUI I have yet to decide on what I really need on it. As right now top is to get it working 100% and in my eye it works like a charm but still have a issue or 2 that I noticed personally.

    Edit:
    As for a boot drop to work with this. It can easily be added if there is a 100% working one. The best place to add a boot drop would be in the recast buffer. So it would do the boot drop and decon before it recasts the lure after it reels in. And yes I set my bot up that way so it could handle this kind of thing. If you ask why is it that way. Well let me tell you. AHK Does not support multi threading sadly. I tried and tried and this array buffer idea was my best one I could come up with and it works. If you ask what do you mean by multi threading? Well, What I mean by this is that if you try and run 2 functions in a row. There is no way to have them run at the same exact time. Meaning You have to wait for the first one to finish before the 2nd one will run. I went threw this in long detail with taejim and using a buffer via array is the best result that I came up with while tossing idea and thoughts his way a few days ago.


    I am vary long winded at the moment. Sorry just woke up.

    - - - Updated - - -

    New offset has been released with newest patch. I have test it and it is working.
    Code:
    [Nippys Fish Bot]
    Offset=0x00A682D0
    https://www.mpgh.net/forum/showthread.php?t=1022036
    Last edited by reppin; 09-08-2015 at 11:02 AM.
    Like what I do? Well feel free to donate to show your love.


  15. #14
    U mirin brah?'s Avatar
    Join Date
    Jun 2015
    Gender
    male
    Posts
    109
    Reputation
    20
    Thanks
    10
    My Mood
    Devilish
    Most advanced?

  16. #15
    floowsnaake's Avatar
    Join Date
    Jul 2015
    Gender
    female
    Posts
    72
    Reputation
    10
    Thanks
    381
    My Mood
    Innocent
    Do you want some help with the bot @reppin?

Page 1 of 3 123 LastLast

Similar Threads

  1. Most advanced afk bot i ever seen..
    By noobhackers in forum Combat Arms Help
    Replies: 12
    Last Post: 08-02-2010, 02:04 AM
  2. [Release] {SO-CA} TapTrap 3.0 - Most advanced tapper ever
    By Samueldo in forum Combat Arms Hacks & Cheats
    Replies: 61
    Last Post: 02-17-2010, 02:15 AM
  3. [Release] Zmansquared's CA MultiTool-The best one out there
    By zmansquared in forum Combat Arms Hacks & Cheats
    Replies: 21
    Last Post: 12-22-2009, 12:16 AM
  4. Are there new ones out yet? im new here
    By stopit in forum Combat Arms Hacks & Cheats
    Replies: 2
    Last Post: 03-05-2009, 02:18 PM
  5. [Repost]Hack pack on which most user missed out on
    By turbo159 in forum WarRock - International Hacks
    Replies: 5
    Last Post: 06-07-2007, 12:00 AM