Что нового

[kfgame] Повышение скорости оброботки скрипта.

^Gun

Новичок
Сообщения
9
Репутация
0
В общем решил сделать бота для Легенды Кунг Фу.
Взял за основу скрипт http://autoit-script.ru/index.php/topic,1844.0.html для Eve-Online
Скрипт должен автоматически определить окно - делает
проверить состояние ХП масивом.. Ну и если что принять решение хилиться или нет..
Хеалз чек работает, но в МАин функции не обробатывает Кейс,либо контрл сенд.
Помогите плЗ)
Код:
AutoItSetOption ( "PixelCoordMode", 0)
AutoItSetOption ( "MouseCoordMode", 2)
AutoItSetOption ( "TrayAutoPause", 0)

Global $Paused
Global $sWinDo = "Легенды Кунг Фу  Сервер-Дракон"
Global $hWnd = WinGetHandle("[CLASS:FxMain]")
Global $HealthCheck
Global $Status
Global $HP_Pix[7]=[261, 79, 265, 79, 0xEF5643]
HotKeySet("{NUMPAD1}", "Main") 
HotKeySet("{NUMPAD2}", "TogglePause") 
HotKeySet("{NUMPAD3}", "Terminate") 
HotKeySet ( "{F1}", "_GetWinHandle1") ;

AdlibRegister("Status",1000)

While 1
   Sleep (3000)
   WEnd

Func Main ()
While 1 
Select
Case $HealthCheck=1
   $Status = "Много ХП" ;Работает
Case $HealthCheck=0
   $Status = "Мало ХП" ; работает
   ControlSend($hWnd,"","","{0}") ; неработает
   Sleep (20000)
EndSelect
Wend
EndFunc

Func Status ()
   _Check("HealthCheck")
   _Check("ManaCheck")
EndFunc

Func _Check($Object,$Object2="No")
   Select
   Case $Object="HealthCheck"
	  PixelSearch($HP_Pix[0],$HP_Pix[1],$HP_Pix[2],$HP_Pix[3],$HP_Pix[4],$HP_Pix[5])
	  If Not @error Then
		 $HealthCheck=1
	  Else
		 $HealthCheck=0
	  EndIf
	  
   EndSelect
  ToolTip("Чек ХП = "&$Status&"",0,0)
EndFunc
   

Func _GetWinHandle1 () ; функция определения хэндла первог?окна
    $aAllWindows = WinList (); собираем вс?окна ?массив
    For $i = 1 to $aAllWindows[0][0]; перебираем вс?окна ?цикл??проверяем активн?ли он?
        If _IsActive($aAllWindows[$i][1]) Then ; если окно активн? то эт?наше окно
            $sWinDo = $aAllWindows[$i][1] ; помещаем ег?хэнд??заране?приготовленную переменную
TrayTip ( "Определение Окна", "Готово "&$sWinDo&" ", 3)
            HotKeySet ( "{F1}")
        EndIf
    Next
EndFunc

Func _IsActive($handle); функция проверки активн?ли окно
  If BitAnd( WinGetState($handle), 8 ) Then 
    Return 1
  Else
    Return 0
  EndIf
EndFunc


Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Re: [Автоматизация] Легенды Кунг Фу Разработка "умного" Бота.

^Gun сказал(а):
Код:
ControlSend($hWnd,"","","{0}") ; неработает
Может потому что в 3-ем параметре пустые кавычки, вместо id\class элемента куда нужно высылать набор символов?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Легенды Кунг Фу Разработка "умного" Бота.

А зачем ты 0 в скобки взял?
Попробуй вот так
Код:
ControlSend($hWnd,"","","0")
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Re: [Автоматизация] Легенды Кунг Фу Разработка \"умного\" Бота.

Нет ребята , почему то перестало эмулировать.. до последнейго апдейта норм выводило.. Сейчас чтото контрол сенд вобще не хочет работать...Что делать то?



Добавлено:
Сообщение автоматически объединено:

Все само решилось от запятой нада пробел перед "{0}" ставить было)))
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: [Автоматизация] Легенды Кунг Фу Разработка "умного" Бота.

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Автоматизация] Легенды Кунг Фу Разработка "умного" Бота." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Вот более развитая версия.. Проблему с ControlSend решил. На работе не работало. Дома работало все...
Помогла совместимость с вин7,и запуск автоита от имени админа.

Теперь такая проблема.. Статус обрабатываеться както непонятно.. Нужно установить приоритеты на выполнение действий и оброботку Кейса.
Кайс ду хил.. Работает не правельно, даже во время боя юзает 4, q юзать не хочет
Как реализовать?
А то он может быть в режиме боя.. и не реагировать на то что уровень маны упал,или на то что накопилась ярость и не делает нечего...

Код:
Opt ("SendKeyDownDelay", 150)
AutoItSetOption ( "PixelCoordMode", 0)
AutoItSetOption ( "MouseCoordMode", 2)
AutoItSetOption ( "TrayAutoPause", 0)

HotKeySet("{NUMPAD1}", "Main") 
HotKeySet("{NUMPAD4}", "TogglePause") 
HotKeySet("{NUMPAD3}", "Terminate") 
HotKeySet ( "{F1}", "_GetWinHandle1") 

Global $Paused
Global $sWinDo = "Легенды Кунг Фу  Сервер-Дракон"
Global $hWnd = WinGetHandle("[CLASS:FxMain]")


;####################################################################################
;###############             ПЕРЕМЕННЫЕ         #####################################
;###################################################################################
Global $HpChk;Хранит состояние ХП
Global $InFChk;Хранит состояние бой/спокойствие
Global $Status;Статус БАР
;===================================================================================
;===================================================================================



;####################################################################################
;##################       ПИКСЕЛЬ ШАРДЫ    ##########################################
;####################################################################################
Global $HP_Px[7]=[278, 79, 278, 79, 0x25201D];Пиксель на полоске ХП примерно 60-70%
Global $IF_Px[7]=[169, 72, 169, 72, 0xE93C04];Пиксель подсветки возле хп бара ( светиться во время боя)
;====================================================================================
;====================================================================================
AdlibRegister("Status",500)

While 1
   Sleep (200)
   WEnd

Func Main ()
While 1 
Select
   Select
   Case $HpChk=1
	;  $Status = "Мало ХП"
	  _Action("Heal")
	  Sleep(5000)
   Case $InFChk=1 
	  $Status = "Бой"
EndSelect
Wend
EndFunc

Func Status ()
   _Check("HpChk")
   _Check("InFChk")
EndFunc

Func _Check($Object,$Object2="No")
   Select
	  
   Case $Object="HpChk"
	  PixelSearch($HP_Px[0],$HP_Px[1],$HP_Px[2],$HP_Px[3],$HP_Px[4],$HP_Px[5])
	  If Not @error Then
		 $HpChk=1
	  Else
		 $HpChk=0
	  EndIf
	  
	   Case $Object="InFChk"
	  PixelSearch($IF_Px[0],$IF_Px[1],$IF_Px[2],$IF_Px[3],$IF_Px[4],$IF_Px[5])
	  If Not @error Then
		 $InFChk=1
	  Else
		 $InFChk=0
	  EndIf
   EndSelect
  ToolTip("Статус   =   "&$Status&"",0,0)
EndFunc
   

;#####################################################################################
;####################   ДЕЙСТВИЯ   ###################################################
;#####################################################################################

Func _Action($Do,$Do2="No",$Do3="No",$Do4="No",$Do5="No")
   Select
   ;Case $Do="Atack"
	  If $InFChk=0 Then ;если не находиться в состоянии боя 
	  $Status="Кушаю"
	  ControlSend($hWnd, "", "", "{0}")
	  Sleep(5000)
	  EndIf
	   
	Case $Do="Heal"
		  If $InFChk=0 Then ;если не находиться в состоянии боя то должен юзнуть 4 .. но юзает даже в состоянии боя
		  ControlSend($hWnd, "", "", "{4}")
		  Sleep(5000)
		  Else                                        ; поидеи это альтернатива если в состоянии боя.. ее юзать в бою отказываеться..
		  ControlSend($hWnd, "", "", "{q}")
		  Sleep(400)
	      EndIf
	  
	;Case $Do="Triple"
   
EndSelect
EndFunc

Func _GetWinHandle1 () ; функция определения хэндла первог?окна
    $aAllWindows = WinList (); собираем вс?окна ?массив
    For $i = 1 to $aAllWindows[0][0]; перебираем вс?окна ?цикл??проверяем активн?ли он?
        If _IsActive($aAllWindows[$i][1]) Then ; если окно активн? то эт?наше окно
            $sWinDo = $aAllWindows[$i][1] ; помещаем ег?хэнд??заране?приготовленную переменную
TrayTip ( "Определение Окна", "Готово", 3)
            HotKeySet ( "{F1}")
        EndIf
    Next
EndFunc

Func _IsActive($handle); функция проверки активн?ли окно
  If BitAnd( WinGetState($handle), 8 ) Then 
    Return 1
  Else
    Return 0
  EndIf
EndFunc


Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Main()

Func Main ()
   Local $LogicState
   While 1
	  $LogicState = GetLogicState()
	  MsgBox(0,"LogicState[0]", $LogicState[0])
	  Select
		 Select
		 Case $LogicState[0] = "0|0"
			MsgBox(0,"Совпадение","Сработал шаблон ситуации 0|0")
			;Делаем что-то
		 Case $LogicState[0] = "0|1"
			MsgBox(0,"Совпадение","Сработал шаблон ситуации 0|1")
			;Делаем что-то
		 Case $LogicState[0] = "1|1"
			MsgBox(0,"Совпадение","Сработал шаблон ситуации 1|1")
			;Делаем что-то
		 Case $LogicState[0] = "1|0"
			MsgBox(0,"Совпадение","Сработал шаблон ситуации 1|0")
			;Делаем что-то
	  EndSelect
   Wend
EndFunc

Func GetLogicState()
   Local $LogicState[3]
   $LogicState[1] = _Check("HpChk")
   $LogicState[2] = _Check("InFChk")
   $LogicState[0] = $LogicState[1]&"|"&$LogicState[2]
   Return $LogicState
EndFunc


Вот как правильно используется тот тип логики, что ты пытался применить у себя. Читай темы в разделе EVE Online "Пишем бота за сколько-то там часов"
P.S. Использование AdlibRegister для функций занимающихся сбором информации или же выполняющим ввод, нежелательно ввиду большой вероятности возникновения ошибки.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
оп , спасибо). Попробую))
Да действительно, данный тип логики открывает большие возможности)
Еще раз спасибо. Стало человечнее действовать)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
^Gun, Belfigor,
Это рабочие скрипты? Я, честно говоря, не понимаю как работает конструкция
Код:
Select
         Select
         Case 
            ;Делаем что-то
      EndSelect
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
C2H5OH

У меня только пример логической конструкции на основе предоставленных ранее функций.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Вот рабочий кусок кода).Думаю добавить еще пару значений.
Надо теперь готовить Систему таргетенга,и передвижения)..
Пошгол шелестеть форум.. Если есть у кого на заметках темы хорошие.. Просьба в личку кинуть). :IL_AutoIt_1:
Код:
;В данном примере показана работа с 2мя переменными..Может быть и больше.. Реализована система "умного боя" - скрипт анализирует состояние персонажа в игре и действует исходя из логики.
Func Main ()
   Local $LogicState
While 1 
   $LogicState = GetLogicState()
Select
   Case $LogicState[0] = "0|0|0|0|0";хп в норме,мп в норме,не голоден, не в бою,ярости 0
		 _Action ("Atack")
		 $Status="Все ОК"
   Case $LogicState[0] = "0|0|0|0|1"
		 _Action ("Atack")
		 $Status="В БОЙ"
   Case $LogicState[0] = "0|0|0|1|1"
	     _Action ("Ult")
		 $Status="Ультаа"
EndSelect
Wend
EndFunc

Func Status ();тултип - важная информация о боте в данный момент.обрабатывается adlib,поэтому всегда актуальна.
   _Check("HpChk")
   _Check("InFChk")
 
EndFunc

Func GetLogicState()
   Local $LogicState[6]
   $LogicState[1] = _Check("HpChk")
   $LogicState[2] = _Check("InFChk")
   $LogicState[3] = 
   $LogicState[4] = 
   $LogicState[5] = 
 
$LogicState[0] = $LogicState[1]&"|"&$LogicState[2]&"|"&$LogicState[3]&"|"&$LogicState[4]&"|"&$LogicState[5] 
    Return $LogicState

EndFunc


Func _Check($Object,$Object2="No")
   Select
            Case $Object="HpChk"
	  PixelSearch($HP_Px[0],$HP_Px[1],$HP_Px[2],$HP_Px[3],$HP_Px[4],$HP_Px[5])
	  If Not @error Then
		 $HpChk=1
	  Else
		 $HpChk=0
	  EndIf
	   Case $Object="InFChk"
	  PixelSearch($IF_Px[0],$IF_Px[1],$IF_Px[2],$IF_Px[3],$IF_Px[4],$IF_Px[5])
	  If Not @error Then
		 $InFChk=1
	  Else
		 $InFChk=0
	  EndIf
   EndSelect
  ToolTip("Статус   =   "&$Status&"",0,0)
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Не надо использовать глобальные переменные для таких примитивных задач. При разрастании кода, ты уже не сможешь нормально отслеживать и отлаживать их состояние.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Вот у меня какраз вопрос по теме походу..
Увидил в процессе необходимость создания Интерфейса с чекбоксами для того чтоб я мог определить что мне надо от бота..
Например сейчас бой организован более мене нормально.. Нужно конечно же дорабатывать..
Есть необходимость еше в реалезации сбора. Так как Професий сбора около 6 то будет напряжно выполнять весь скрипт со всеми прверками сразу.. Так как будет сильная нагрузка на процессор, в следствии будет плохо рабоатать.
Возникла мысль чекбоксом отмечать что мы будем делать . И в зависимости от этого выполнять определенный кусок кода..
Сразу возникла идея подключения нескольких скриптов, или создать одну библиотеку которая будет выбирать что делать..
Есть ли смысл такое организовывать? И про глобальные переменные ты имел ввиду что при выше описаном разделение кода будет плохо работать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Разбивать скрипт можешь как хочешь, в конечном итоге он работает как единое целое.
В глобальных переменных имеет смысл разве что статическую информацию, такие как хендлы контролов, тех же чекбоксов. Где-то снаружи ты создаешь чекбокс, и далее внутри любой функции используешь его хендл для считывания или изменения его состояния. Все же данные обрабатываемые или выводимые скриптом стоит делать внутри функций не выводя их наружу, как ты делаешь это с переменной $Status. В одной функции ты изменяешь её значение, а в другой выводишь её состояние. Если бы это была какая-то важная переменная и ты бы забыв что где-то её уже использовал, попытался изменить в какой-то третьей функции, у тебя бы могли начать конфликтовать между собой твои функции.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Спасибо , за развернутый ответ. Ушол осваивать.. Как что-то интересное будет покажу).
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
я думаю пора , уже поковырять память игры , это тебе даст прирост производительности процентов на 40. Также если ты используешь ControlSend и он работает с игрой , стоит отказаться от pixelsearch дабы была возможность работы бота в неактивном окне , пока ты занимаешься своими делами.
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
ну нешарю как память ковырять)) помог бы кто))
 
Автор
G

^Gun

Новичок
Сообщения
9
Репутация
0
Итак наконец то дошли руки до того о чем забыл давно...
Вобщем ситуация следующая..
Скачал и установил Cheat Engine. Нашёл адреса отвечающие за хп , мп персонажа, и т.д.. Интересует каким образом задействовать эти данные в Автоит..
Второй вопрос, через чит енджин могу ли я отслеживать обмен пакетов, например атаковать первым скилом пакет такойто , и т.д.. что бы сделать бота на пакетном уровне.. Вроде должно быть быстро , только вот работы больше..
В общем буду благодарен за любую инфу.. а то не нашёл на форуме нечего ...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
На CE Если найдешь управляющую конструкцию в памяти, которая принимает те или инные значения и вызывает ту или иную функцию то да, но такие конструкции сложно найти и как правило они защищены от записи и за ними следит гейм гвард.

А для пакетного уровня тебе нужно что-то типа WPE Pro.

То как использовать полученные адреса, ищи в теме про Iris Online
 
Верх