Jump to content
BJJ

Problem with stack overflow in my bot

Recommended Posts

BJJ

Hello everyone,

I have huge problem with "Recurison level has been exceeded - AutoIt will quit to prevent stack overflow" in my own Bot.

I have no idea how rebuild my loops for eliminate this type of error.

 

Here is my code 

 

#Region
#AutoIt3Wrapper_Icon=C:\Users\barbosa\Desktop\autoIt\produkcja\angelica.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Run_Obfuscator=y
#EndRegion
#Region ; GUI generated by GUIBuilderNxt Prototype 1.0
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
;#include <nomad.au3>

HotKeySet("{end}","stop") ;end for app kill

Local Const $sFont = "Open Sans" ;font variable
Local $sFile = "angelica.ico" ;icon variable
Global $MainStyle = BitOR($WS_OVERLAPPED, $WS_CAPTION, $WS_SYSMENU, $WS_VISIBLE, $WS_CLIPSIBLINGS, $WS_MINIMIZEBOX,   $FW_SEMIBOLD = 600)
Global $info_task = "[ Waiting for calibration ]",$info_battlelist = "None",$info_empty = "None",$info_hotkeys = "INACTIVE",$info_100 = "None",$info_mana = "None",$info_food = "None",$info_blank = "None",$info_drop = "None",$info_hand = "None"
Global $hMain = GuiCreate("Auto_Angela_Beta_1.0", 330, 559, -1, -1, $MainStyle)

GUISetIcon($sFile)

$label_100 = GuiCtrlCreateLabel("[F4] Mana Point "&"   "&$info_100, 20, 40, 170, 20,-1)
$label_mana = GuiCtrlCreateLabel("[F5] Mana Bar "&"     "&$info_mana, 20, 60, 170, 20,-1)
$label_empty = GuiCtrlCreateLabel("[F6] Nothing "&"        "&$info_empty, 20, 80, 170, 20,-1)
$label_battlelist = GuiCtrlCreateLabel("[F7] Battle List "&"     "&$info_battlelist, 20, 100, 170, 20,-1)
$label_food = GuiCtrlCreateLabel("[F8] Food "&"            "&$info_food, 20, 120, 170, 20,-1)
$label_blank = GuiCtrlCreateLabel("[F9] Blank "&"           "&$info_blank, 20, 140, 170, 20,-1)
$label_drop = GuiCtrlCreateLabel("[F10] Drop "&"          "&$info_drop, 20, 160, 170, 20,-1)
$label_hand = GuiCtrlCreateLabel("[F11] Hand "&"         "&$info_hand, 20, 180, 170, 20,-1)
$Group_11 = GuiCtrlCreateGroup("Configuration", 10, 10, 190, 220,-1)
$Group_12 = GuiCtrlCreateGroup("Setup", 210, 10, 110, 220,-1)
$btn_setting = GuiCtrlCreateButton("Setup", 220, 40, 70, 30,-1)
$btn_load = GuiCtrlCreateButton("Load", 220, 100, 70, 30,-1)
$btn_save = GuiCtrlCreateButton("Save", 220, 140, 70, 30,-1)
$label_hotkeys = GuiCtrlCreateLabel("Status: "&$info_hotkeys, 220, 190, 90, 20,-1)
$input_spell = GuiCtrlCreateInput("Adura Vita", 20, 270, 120, 20,-1)
$box_house_mode = GuiCtrlCreateCheckbox("House mode", 20, 300, 90, 20,-1)
$box_pk_mode = GuiCtrlCreateCheckbox("Anty PK", 20, 330, 90, 20,-1)
$Checkbox_20 = GuiCtrlCreateCheckbox("Alarms", 20, 360, 90, 20,-1)
$Checkbox_21 = GuiCtrlCreateCheckbox("Anty Idle", 20, 390, 90, 20,-1)
$btn_auto = GuiCtrlCreateButton("Start", 200, 360, 70, 30,-1)
$btn_refiler = GuiCtrlCreateButton("Rune thrower", 200, 400, 70, 20,-1);$btn_manual = GuiCtrlCreateButton("Start", 200, 360, 70, 30,-1)
$Input_22 = GuiCtrlCreateInput("down", 140, 300, 60, 20,-1)
$Input_23 = GuiCtrlCreateInput("up", 210, 300, 60, 20,-1)
$Group_24 = GuiCtrlCreateGroup("Mode", 10, 250, 310, 180,-1)
GUISetFont(9, $FW_SEMIBOLD) ;white color and bigger font
;$label_task = GuiCtrlCreateLabel($info_task, 10, 450, 370, 24,-1)
GUICtrlSetColor($label_task, 0xffffff)
GUISetFont(9, $FW_MEDIUM)
$Label_28 = GuiCtrlCreateLabel("Auto_Angela_Beta 1.1 @ Medivia 2016", 60, 530, 370, 20,-1)



Global $way_one
Global $way_one

Global $food_pos_x,$food_pos_y
Global $hand_pos_x,$hand_pos_y

Global $drop_pos_x,$drop_pos_y
Global $blank_pos_x, $blank_pos_y

Global $RunOrNot
Global $pid
Global $hotkeys = 0 ;By default hotkeys are disabled

Global $mana_color, $battle_color
Global $mana_100_x,$mana_100_y
Global $mana_pixel_x, $mana_pixel_y
Global $empty_pixel_x = 000, $empty_pixel_y = 000
Global $battle_pixel_x, $battle_pixel_y
Global $is_break
;Global $MapClickEscape_x, $MapClickEscape_y
;GUICtrlSetDefColor(0xFF0000)
GUISetBkColor(0x788190) ; will change background color
;GUICtrlSetBkColor($label_hand, 0xF0F4F9)

GuiSetState(@SW_SHOWNORMAL)

Do
    Switch GuiGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop

        Case $btn_setting
            _EnableDisable() ;function which make hotkeys enable/disable


        Case $btn_auto
            IF $info_food <> "None" OR $info_blank <> "None" OR $info_drop <> "None" OR $info_hand <> "None" OR $info_100 <> "None" OR $info_mana <> "None" Then ;simple validation data in possitions variables
               check_mana() ;Function is first in chain for making runes
            Else
               MsgBox(0, "Error", "You must setup coordinations")
            EndIf
         Case $btn_load
            load_from_file() ;load data from text file
         Case $btn_save
            save_to_file() ;dave data in text file
         Case $btn_refiler
            refiler() ;for fast refile
    EndSwitch
Until False
#EndRegion

;Func uher()
   ;x,y postaci = F10 DROP
   ;x,y uha w plecaku = F9 Blank
   ;kolor uha pobrany przy ustawieniu
   ;kolor plecaka = F6 BP Color
   ;odpowienio przygotowane staki plecakow

   ;co 400ms sprawdza czy jest dosc hp na uha
   ;jesli trzeba sie uchnac to sprawdza czy w miejscu na uha jest niebieska runa
   ;jesli nie ma to sprawdza czy jest yellow bp jesli nie ma to sygnal dzwiekowy bledu i kill uhera
   ;jesli jest to otwiera plecak i sprawdza czy jest niebieska runa jak nie ma to error i kill uhera
   ;jesli jest to ja przeciaga na postac bardzo szybko
;EndFunc

Func refiler()
   local $i = 20
   While $i > 0
      MouseClickDrag($MOUSE_CLICK_LEFT, $blank_pos_x, $blank_pos_y, $drop_pos_x, $drop_pos_y, 1)
      $i = $i - 1
   WEnd
EndFunc



Func save_to_file()
   $file = FileOpen("angela_memory.txt", 1)

   If $file = -1 Then
   MsgBox(0, "Error", "Unable to save data.")
   Else
   FileWrite($file, $mana_100_x & @CRLF)
   FileWrite($file, $mana_100_y & @CRLF)

   FileWrite($file, $mana_pixel_x & @CRLF)
   FileWrite($file, $mana_pixel_y & @CRLF)

   FileWrite($file, $empty_pixel_x & @CRLF)
   FileWrite($file, $empty_pixel_y & @CRLF)

   FileWrite($file, $battle_pixel_x & @CRLF)
   FileWrite($file, $battle_pixel_y & @CRLF)

   FileWrite($file, $food_pos_x & @CRLF)
   FileWrite($file, $food_pos_y & @CRLF)

   FileWrite($file, $blank_pos_x & @CRLF)
   FileWrite($file, $blank_pos_y & @CRLF)

   FileWrite($file, $drop_pos_x & @CRLF)
   FileWrite($file, $drop_pos_y & @CRLF)

   FileWrite($file, $hand_pos_x & @CRLF)
   FileWrite($file, $hand_pos_y & @CRLF)

   MsgBox(0, "Done", "Settings saved.")
   EndIf
EndFunc




Func load_from_file()
   $file = FileOpen("angela_memory.txt", $FO_READ)

   If $file = -1 Then
   MsgBox(0, "Error", "Unable to load data.")
Else
   ;wczytywanie segmentow
   $mana_100_x = FileReadLine($file, 1)
   $mana_100_y = FileReadLine($file, 2)
   $info_100 = "X: "&$mana_100_x&"   "&"Y: "&$mana_100_y
   GUICtrlSetData($label_100, "[F4] Mana point "&"   "&$info_100)
   ;;;;
   $mana_pixel_x = FileReadLine($file, 3)
   $mana_pixel_y = FileReadLine($file, 4)
   $info_mana = "X: "&$mana_pixel_x&"   "&"Y: "&$mana_pixel_y
   GUICtrlSetData($label_mana, "[F5] Mana Bar "&"     "&$info_mana)
   ;;;;
   $empty_pixel_x = FileReadLine($file, 5)
   $empty_pixel_y = FileReadLine($file, 6)
   $info_empty = "X: "&$empty_pixel_x&"   "&"Y: "&$empty_pixel_y
   GUICtrlSetData($label_empty, "[F6] Nothing "&"        "&$info_empty)
   ;;;;
   $battle_pixel_x = FileReadLine($file, 7)
   $battle_pixel_y = FileReadLine($file, 8)
   $info_battlelist = "X: "&$battle_pixel_x&"   "&"Y: "&$battle_pixel_y
   GUICtrlSetData($label_battlelist, "[F7] Battle List "&"     "&$info_battlelist)
   ;;;;
   $food_pos_x = FileReadLine($file, 9)
   $food_pos_y = FileReadLine($file, 10)
   $info_food = "X: "&$food_pos_x&"   "&"Y: "&$food_pos_y
   GUICtrlSetData($label_food, "[F8] Food "&"            "&$info_food)
   ;;;;
   $blank_pos_x = FileReadLine($file, 11)
   $blank_pos_y = FileReadLine($file, 12)
   $info_blank = "X: "&$blank_pos_x&"   "&"Y: "&$blank_pos_y
   GUICtrlSetData($label_blank, "[F9] Blank "&"           "&$info_blank)
   ;;;;
   $drop_pos_x = FileReadLine($file, 13)
   $drop_pos_y = FileReadLine($file, 14)
   $info_drop = "X: "&$drop_pos_x&"   "&"Y: "&$drop_pos_y
   GUICtrlSetData($label_drop, "[F10] Drop "&"          "&$info_drop)
   ;;;;
   $hand_pos_x = FileReadLine($file, 15)
   $hand_pos_y = FileReadLine($file, 16)
   $info_hand = "X: "&$hand_pos_x&"   "&"Y: "&$hand_pos_y
   GUICtrlSetData($label_hand, "[F11] Hand "&"         "&$info_hand)

   ;;;;
   FileClose($file)
   MsgBox(0, "Done", "Settings loaded")
   EndIf
EndFunc


Func stop()
   Exit
EndFunc

Func kill()
   Exit 0
EndFunc

;functions checking if checkbox checked
Func _IsChecked_pk_mode($box_pk_mode)
    Return BitAND(GUICtrlRead($box_pk_mode), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked
Func _IsChecked_house_mode($box_house_mode)
    Return BitAND(GUICtrlRead($box_house_mode), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func floor_maker()

      ;GUICtrlSetData($label_task, "[ Burning rune.. ]")
      $spell_name = GUICtrlRead($input_spell)
      $way_one = GUICtrlRead($Input_22)
      $way_two = GUICtrlRead($Input_23)

      If _IsChecked_house_mode($box_house_mode) Then
         ControlSend("Medivia","","", "{" & $way_one & "}" )

      EndIf
      Sleep(1000)
      MouseClickDrag($MOUSE_CLICK_LEFT, $blank_pos_x, $blank_pos_y, $hand_pos_x, $hand_pos_y, 2)
      ControlSend("Medivia","","",$spell_name)
      ControlSend("Medivia","","","{enter}")
      MouseClickDrag($MOUSE_CLICK_LEFT, $hand_pos_x, $hand_pos_y, $drop_pos_x, $drop_pos_y, 2)
      Sleep(300)
      MouseClick($MOUSE_CLICK_RIGHT, $food_pos_x, $food_pos_y, 4, 10)
      Sleep(400)
      MouseClick($MOUSE_CLICK_RIGHT, $food_pos_x, $food_pos_y, 4, 10)
      Sleep(300)
      If _IsChecked_house_mode($box_house_mode) Then
         ControlSend("Medivia","","", "{" & $way_two & "}" )
      EndIf
      Beep(1000, 150)
      check_mana()

 EndFunc


Func _EnableDisable()
   If $hotkeys = 0 Then
      HotKeySet("{F4}", "mana_100")
      HotKeySet("{F5}", "mana_get_color")
      ;HotKeySet("{F6}", "MapClickEscape")
      HotKeySet("{F7}", "battle_get_color");Pobiera kolor do zmiennej $battle_color
      HotKeySet("{F8}", "mouse_pos_food")
      HotKeySet("{F9}", "mouse_pos_blank")
      HotKeySet("{F10}", "mouse_pos_drop")
      HotKeySet("{F11}", "mouse_pos_hand")
      $hotkeys = 1
      $info_hotkeys = "ACTIVE"
      GUICtrlSetData($label_hotkeys, "Status: "&" "&$info_hotkeys)
      GUICtrlSetData($label_task, "[ Calibration in progress ]")
   Else
      HotKeySet("{F4}")
      HotKeySet("{F5}")
      HotKeySet("{F6}")
      HotKeySet("{F7}")
      HotKeySet("{F8}")
      HotKeySet("{F9}")
      HotKeySet("{F10}")
      HotKeySet("{F11}")
      $hotkeys = 0
      $info_hotkeys = "INACTIVE"
      GUICtrlSetData($label_hotkeys, "Status: "&" "&$info_hotkeys)
      GUICtrlSetData($label_task, "[ End of calibration ]")
      EndIf
EndFunc


Func check_mana()
   ;sleep(700)
   ;IsSafty()
   $current_color = PixelGetColor($mana_100_x,$mana_100_y) ;Taking current color from defined mana break point on maan bar
   $BattleListColor = PixelGetColor($battle_pixel_x, $battle_pixel_y) ;Taking current color from defined posiotion on battle list

   If _IsChecked_pk_mode($box_pk_mode) Then ;only if pk_mode checkbox is checked
      If $BattleListColor = $battle_color Then ;If collor on battle list point didnt change, means nothing (player/monster) enter on out screen
         $RunOrNot = True
      Else
         $RunOrNot = False
      EndIf
   EndIf

   If Not ($RunOrNot = False) Then ;If variable RunOrNot are not false it mean is true = is safe
      If $mana_color = $current_color Then ;If mana color flood mana bar break point
         floor_maker() ;rune making function
      Else
         ;GUICtrlSetData($label_task, "[ Waiting for mana.. ]")
         Sleep(1000)
         check_mana() ;Mana arnt ready so back to mana checking
      EndIf
   Else ;If not safty then run escape function
      runforestrun()
    EndIf
   EndFunc

Func runforestrun()
      $way_one = GUICtrlRead($Input_22)
      $way_two = GUICtrlRead($Input_23)
      ControlSend("Medivia","","", "{" & $way_one & "}" )
      Sleep(5000)
      Do
         ;GUICtrlSetData($label_task, "[ Not safty outside!! ]")
         Beep(700,300)
         Beep(200,500)
         Sleep(5000)
         ;IsSafty()
         $BattleListColor = PixelGetColor($battle_pixel_x, $battle_pixel_y)
         If $BattleListColor = $battle_color Then
            $RunOrNot = True
         Else
            $RunOrNot = False
         EndIf
      Until $RunOrNot = True
      MouseClick($MOUSE_CLICK_RIGHT, $food_pos_x, $food_pos_y, 4)
      Sleep(1000)
      ControlSend("Medivia","","", "{" & $way_two & "}" )
      Sleep(2000)
      check_mana()
EndFunc



Func mana_100()
   $pos = MouseGetPos()
   $mana_100_x = $pos[0]
   $mana_100_y = $pos[1]
   $info_100 = "X: "&$mana_100_x&"   "&"Y: "&$mana_100_y
   GUICtrlSetData($label_100, "[F4] Mana point "&"   "&$info_100)
EndFunc

Func mana_get_color()
   $pos = MouseGetPos()
   $mana_pixel_x = $pos[0]
   $mana_pixel_y = $pos[1]
   $mana_color = PixelGetColor($mana_pixel_x, $mana_pixel_y)
   $info_mana = "X: "&$mana_pixel_x&"   "&"Y: "&$mana_pixel_y
   GUICtrlSetData($label_mana, "[F5] Mana Bar "&"     "&$info_mana)
EndFunc

Func battle_get_color()
   $pos = MouseGetPos()
   $battle_pixel_x = $pos[0]
   $battle_pixel_y = $pos[1]
   $battle_color = PixelGetColor($battle_pixel_x, $battle_pixel_y)
   $info_battlelist = "X: "&$battle_pixel_x&"   "&"Y: "&$battle_pixel_y
   GUICtrlSetData($label_battlelist, "[F7] Battle List "&"     "&$info_battlelist)
EndFunc


Func mouse_pos_food()
   $pos = MouseGetPos()
   $food_pos_x = $pos[0]
   $food_pos_y = $pos[1]
   $info_food = "X: "&$food_pos_x&"   "&"Y: "&$food_pos_y
   GUICtrlSetData($label_food, "[F8] Food "&"            "&$info_food)
EndFunc


Func mouse_pos_hand()
   $pos = MouseGetPos()
   $hand_pos_x = $pos[0]
   $hand_pos_y = $pos[1]
   $info_hand = "X: "&$hand_pos_x&"   "&"Y: "&$hand_pos_y
   GUICtrlSetData($label_hand, "[F11] Hand "&"          "&$info_hand)
EndFunc


Func mouse_pos_drop()
   $pos = MouseGetPos()
   $drop_pos_x = $pos[0]
   $drop_pos_y = $pos[1]
   $info_drop = "X: "&$drop_pos_x&"   "&"Y: "&$drop_pos_y
   GUICtrlSetData($label_drop, "[F10] Drop "&"          "&$info_drop)
EndFunc

Func mouse_pos_blank()
   $pos = MouseGetPos()
   $blank_pos_x = $pos[0]
   $blank_pos_y = $pos[1]
   $info_blank = "X: "&$blank_pos_x&"   "&"Y: "&$blank_pos_y
   GUICtrlSetData($label_blank, "[F9] Blank "&"          "&$info_blank)
EndFunc

Func afk()
   ControlSend("Medivia","","","{ctrldown}{down}{ctrlup}")
   Sleep(350)
   ControlSend("Medivia","","","{ctrldown}{up}{ctrlup}")
EndFunc

 

Share this post


Link to post
Share on other sites
genius257

Hi! First of all i feel like i should mention game automation discussion is not allowed, and by looking at your code i gather that's what this bot is?

However! I realize your problem is not necessarily helping with game automation, but to avoid the problem in the feature.

So i think i know where this error happens. Within your function "check_mana" you've made it so it can call itself, within itself. This could be theoretically infinite, so you get a stack overflow. IF you need repetition of functionality, use a loop within the function. A function calling itself is mostly not a good idea.

Also: "check_mana" calls "runforestrun" whitch can call "check_mana", again making a possible infinite loop.

Hope this solves your problem :)

Share this post


Link to post
Share on other sites
BJJ

Yes, but I cant see different way to do this. 

 

floor_maker after making magic rune call function check_mana() 

check_mana - this function first checking some condition after that checking mana status, if mana is not ready need call itself for checking this first condition and again mana. If mana is ready call floor_maker for make new rune and then we need to call check_mana again. 

Share this post


Link to post
Share on other sites
genius257

Honestly, then maybe you should look into smaller projects, to get a better idea, as to how.

AdlibRegister might be a solution. For right now it seems that the GUI loop is being blocked by "check_mana".

And "floor_maker" does not need to call "check_mana".

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Similar Content

    • Spartan117
      By Spartan117
      Hi everyone,
      I am wondering if is there any autoit function that make the program ignore errors and move on and resume correct lines?
      Thank you
    • nacerbaaziz
      By nacerbaaziz
      Hi dear
      I have a question please
      Can we customize error messages in autoit script?
      I mean internal error messages
      for example
      AutoIt Error
      Line 4  (File "D:\my projects\NVDA Manager\New AutoIt v3
      Script.au3"):
      $script[1] = 1
      $script^ ERROR
      Error: Subscript used on non-accessible variable.
      For example, I want to customize this message
      Is this possible?
      am waiting for your answers
    • AnonymousX
      By AnonymousX
      Hello,
      I'm trying to make a program that can look at a folder directory, find all the CSV files, and then add the data from CSV's to an array. 
      The problem I seem to be running into is on the 2nd iteration (2nd file) when the script will not create an array. Could someone please help? Thanks in advance
       
      #include <Array.au3> #include <File.au3> #include <MsgBoxConstants.au3> #include <Excel.au3> #include <MsgBoxConstants.au3> Global $MasterArray RefineData() Func RefineData() Local $i, $filenum, $file, $csvArray, $sFilePath = @ScriptDir $fileList = _FileListToArrayRec($sFilePath, "*.csv", 1) ;Create and array of all .csv files within folder ;=====Loop through the .csv files within the folder====== For $filenum = 1 To UBound($fileList) - 1 Step 1 $file = $fileList[$filenum] $sFilePath = $sFilePath & "\" & $file ;=====Create array based on csv file===== _FileReadToArray($sFilePath, $csvArray, $FRTA_NOCOUNT, ",") _ArrayDisplay($csvArray,"File: " & $filenum) If $filenum = 1 Then $MasterArray = $csvArray _ArrayDisplay($MasterArray, "Master") Else $MasterArray = _ArrayColInsert($MasterArray, UBound($MasterArray)) ;want column added at end For $i = 0 To UBound($MasterArray)-1 Step 1 $MasterArray[$i][UBound($MasterArray) - 1] = $csvArray[$i][4] Next _ArrayDisplay($MasterArray, "Master") EndIf Next EndFunc ;==>RefineData  
    • ur
      By ur
      In the autoit file, if we add multiple libraries (both internal and custom created one)
       
      When we compile the code and run the exe, some time we are getting runtime errors.
      But the line number of error is not showing the exact line number, might be it is including the line number count of libraries also.
      Can you please suggest how to get the exact error line number.
      So, it will be useful for debugging.
    • Rskm
      By Rskm
      i have seen many pointing out issues related to this, i tried reading through them - still unable to solve mine.. i have a script which reads certain lines based on a search item, this is an iterative process - the ldflst_file gets updated for each iteration and the script finds the line number which has the search item. this works perfectly for few iterations, but stops in some cases abruptly with the error = 
      Subscript used on non-accessible variable $aRead^ ERROR I have verified that the search item is present in the file. what could be the reason for this code to stop in certain cases. thanks for help
      my code below (partial).. full code is in attachment
       
      local $aRead=FileReadToArray($ldflst_file)
      global $ldflst_var1=" JOINT  LOAD       FORCE(X)        FORCE(Y)        FORCE(Z)       MOMENT(X)       MOMENT(Y)       MOMENT(Z)"
       
      for $i= 0 to $ldflst_totlines    ; ldflst_totlines is total number of  lines in the file 'ldflst_file'

          if $aRead[$i]=$ldflst_var1 Then
              $ldflst_LFound=$i
              ExitLoop
              else
              EndIf
      Next
       
       
      nomo_new1.au3
×