Jump to content

Problem with stack overflow in my bot

Recommended Posts


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 ; 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 $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)


$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)
$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
GUISetBkColor(0x788190) ; will change background color
;GUICtrlSetBkColor($label_hand, 0xF0F4F9)


    Switch GuiGetMsg()
        Case $GUI_EVENT_CLOSE

        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
               MsgBox(0, "Error", "You must setup coordinations")
         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
Until False

;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

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

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

   If $file = -1 Then
   MsgBox(0, "Error", "Unable to save data.")
   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.")

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

   If $file = -1 Then
   MsgBox(0, "Error", "Unable to load data.")
   ;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)

   MsgBox(0, "Done", "Settings loaded")

Func stop()

Func kill()
   Exit 0

;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 & "}" )

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


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 ]")
      $hotkeys = 0
      $info_hotkeys = "INACTIVE"
      GUICtrlSetData($label_hotkeys, "Status: "&" "&$info_hotkeys)
      GUICtrlSetData($label_task, "[ End of calibration ]")

Func check_mana()
   $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
         $RunOrNot = False

   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
         ;GUICtrlSetData($label_task, "[ Waiting for mana.. ]")
         check_mana() ;Mana arnt ready so back to mana checking
   Else ;If not safty then run escape function

Func runforestrun()
      $way_one = GUICtrlRead($Input_22)
      $way_two = GUICtrlRead($Input_23)
      ControlSend("Medivia","","", "{" & $way_one & "}" )
         ;GUICtrlSetData($label_task, "[ Not safty outside!! ]")
         $BattleListColor = PixelGetColor($battle_pixel_x, $battle_pixel_y)
         If $BattleListColor = $battle_color Then
            $RunOrNot = True
            $RunOrNot = False
      Until $RunOrNot = True
      MouseClick($MOUSE_CLICK_RIGHT, $food_pos_x, $food_pos_y, 4)
      ControlSend("Medivia","","", "{" & $way_two & "}" )

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)

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)

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)

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)

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)

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)

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)

Func afk()


Share this post

Link to post
Share on other sites

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

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

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
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[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
      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