Что нового

Работа с внутриигровым автопилотом.

garrul

Знающий
Сообщения
16
Репутация
10
Заметил, что такой немаловажный модуль как автопилот, незаслуженно обделён вниманием. Решил кинуть камень в нужном направлении, может у кого есть всё-таки наработки по этой теме, ну или по крайней мере идеи :smile:
Этот модуль - это выдранный из скрипта-хаулера кусок и "обвешанный" всем необходимым для автономности. Посему есть ряд условий для нормальной работы:
1. Перед запуском скрипта, шип должен быть остановлен (по крайней мере на четверть).
2. "Желтые" ворота не должны быть выделены (да да :smile: имаджсёрч).
3. В настройках овервью должно быть убрано всё, кроме ворот.
4. Ну и понятное дело надо сначала тыкнуть "Set destination" куда надо лететь ;)

При выполнении этих условий всё работает. У меня, повторюсь, на основе этой конструкции работает бот-хаулер (до фрейтера его не докачал пока ещё :smile: и скрипт для выполнения курьерок)

Код:
Opt ("MouseCoordMode", 0)
Opt("PixelCoordMode", 0)
Opt("SendKeyDownDelay", 200)
WinActivate("EVE")
WinWaitActive("EVE")
WinMove("EVE","",0,0)
Global $xg = 0, $yg = 0
Global $xok = 0, $yok = 0
Global $WinPos = WinGetPos("EVE")
Global $Paused
Global $WarpTestX = $WinPos[0] + 543; Координаты пикселя варпа
Global $WarpTestY = $WinPos[1] + 741
Global $JumpTestX = $WinPos[0] + 776; Рамка иконки станции в selected items
Global $JumpTestY = $WinPos[1] + 45
HotKeySet("{INSERT}", "TogglePause")
HotKeySet("{F9}", "Terminate")

#include <ImageSearch.au3>
#include <_SelectedItem.au3>

Func Terminate()
	Exit
EndFunc
;~ ==============================================================================================================
Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('На паузе',0,0)
    WEnd
		ToolTip("")
EndFunc
;~ ==============================================================================================================

AutoPilot()

	Func AutoPilot()
		$unknow = 0
		Do 
		If _ImageSearchArea("gate.bmp", 1, $WinPos[2]-257, $WinPos[3]-625, $WinPos[2]-237, $WinPos[3]-215, $xg, $yg, 5) Then
			ToolTip("Есть WayPoint", ($WinPos[2]*0.5),($WinPos[3]*0.5))
			Sleep(Random(300,900))
			Okshutt()
			MouseClick("left",$xg,$yg,1)
			Okshutt()
			_SIButton(2) ; Warp To
			WarpTest()
			Okshutt()
			_SIButton(3) ; Jump
			JumpTest()
		Else
			$unknow = 1
			ToolTip("Вэйпоинт ричд", ($WinPos[2]*0.5),($WinPos[3]*0.5)) 
			Sleep(500)
		EndIf
		Until $unknow = 1
	EndFunc
		
	Func WarpTest()
		$i = 0
		$WarpTestCheckSum = PixelGetColor($WarpTestX, $WarpTestY)
		Do
			Sleep(10000) ; такая задержка (9 сек. или больше, если бш-баржа) нужна чтобы 100% определить отварп
			PixelSearch($WarpTestX, $WarpTestY, $WarpTestX+1, $WarpTestY+1, $WarpTestCheckSum, 5 )
			If @error Then
				$i = 1
			EndIf
		Until $i = 1
		ToolTip("Лечу", ($WinPos[2]*0.5),($WinPos[3]*0.5))
		Sleep(300)
		$WarpTestCheckSum = PixelGetColor($WarpTestX, $WarpTestY)
		Do
			Sleep(5000) ; меньше пяти возможны ложные определения (будет думать что всё ещё летит)
			PixelSearch($WarpTestX, $WarpTestY, $WarpTestX+1, $WarpTestY+1, $WarpTestCheckSum, 5 )
			If @error Then
				$i = 0
			EndIf
		Until $i = 0
		ToolTip("Прилетел", ($WinPos[2]*0.5),($WinPos[3]*0.5))
		Sleep(500)
	EndFunc
	
	Func Okshutt() ; Ищет кнопку ОК на табличке о ДТ и нажимает её
		If _ImageSearchArea("okshutt.bmp", 1, $WinPos[0], $WinPos[1], $WinPos[2], $WinPos[3], $xok, $yok, 10) Then
			ToolTip("Shutdown грядёт :)", ($WinPos[2]*0.5),($WinPos[3]*0.5))
			Sleep(Random(300,900))
			MouseClick("left",$xok,$yok,1)
		EndIf
	EndFunc


	Func JumpTest()
		$j = 0
		$JumpTestCheckSum = PixelGetColor($JumpTestX, $JumpTestY)
		Do
			Sleep(10000)
			PixelSearch($JumpTestX, $JumpTestY, $JumpTestX+1, $JumpTestY+1, $JumpTestCheckSum, 5)
			If @error Then
				$j = 1
			EndIf
		Until $j = 1
		ToolTip("Пропрыгнул", ($WinPos[2]*0.5),($WinPos[3]*0.5))
		Sleep(3000)
	EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Есть таковой, думал он выложен о_О. По сути зачем а5 же пользовать имедж серч, если мы летим по роуту? Просто убираем из овервью все кроме гейтов и делаем пиксельсерч по желтому цвету, потом тыкаем по тем координатам и уже работаем с селектед итем.
P.S. дежри +1 :smile:
Попросите Арчибальда, он в импу летает, у него должен быть какой-нибудь травел бот, для коллекции :smile:
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Автопилот

Belfigor сказал(а):
Есть таковой, думал он выложен о_О. По сути зачем а5 же пользовать имедж серч, если мы летим по роуту? Просто убираем из овервью все кроме гейтов и делаем пиксельсерч по желтому цвету, потом тыкаем по тем координатам и уже работаем с селектед итем.
P.S. дежри +1 :smile:
Попросите Арчибальда, он в импу летает, у него должен быть какой-нибудь травел бот, для коллекции :smile:
ЦЕА ЩЬП!!
Да вы чо???
Нафига травелботу имаджсёрч ???
Я аж дар речи потерял, итак голоса нету а вы ещё в такой шок вводите. Принцип необходимости и достаточности на первом курсе института изучали?
Вот его и применяем.

Код:
#include "WarpTest v0.3.au3"

Opt("MouseCoordMode", 0)
Opt("PixelCoordMode", 0)
Opt("MustDeclareVars", 0)
HotKeySet("^{BREAK}", "Terminate")
Dim $OverviewX = 767, $OverviewY = 139
Dim $Stroke1 = 0, $Stroke2 = 0, $Stroke3 = 0, $Stroke4 = 0, $Stroke5 = 0, $Type = 0
Global $OverviewX = 767, $OverviewY = 139, $SI_Centre1BtnX = 772, $SI_Centre1BtnY = 111, $X_SI_BtnStep = 25, $BtnNumber = 1
Global $MouseSpeed = Random(2, 3)
Global $Paused

$LogTi = TimerInit()
$LogFi = "Log_MB.txt"

WinWaitActive("EVE", "")
While 1
SearchGate()
Sleep(2000)
WEnd
Func SearchGate()
$a = PixelSearch(767, 189, 767, 620, 0xFFFF00, 3)
If Not @error Then
	Sleep(1000)
	MouseClick("left", $a[0], $a[1], 1, 7)
	Sleep(500)
	MouseClick("left", $a[0], $a[1], 1, 7)
	While 1
	$a = PixelSearch(800,122, 827, 122, 0x808080)
	If $a <> @error Then ExitLoop
	Sleep(200)
	WEnd
	Sleep(500)
	SI_Btn_Click(2)
	Sleep(1500)
	Sleep(10000)
	While 1
		$Warpstatus = _WarpTest()
		Tooltip($Warpstatus, 500, 0)
		If $Warpstatus = 00 Then
			Sleep(500)
			SI_Btn_Click(3)
			Sleep(7000)
			ExitLoop
		EndIf
		Sleep(500)
	WEnd
Else
	Sleep(200)
EndIf
EndFunc

Func SI_Btn_Click($BtnNumber)
	Dim $a1 =0
	$BtnNumber = $BtnNumber - 1
	$a1 = $BtnNumber * $X_SI_BtnStep
Sleep(Random(250, 350))
MouseMove($SI_Centre1BtnX + $a1, $SI_Centre1BtnY, $MouseSpeed*2)
Sleep(Random(300, 450))
MouseClick("Left")
Sleep(Random(250, 350))
EndFunc

Func Terminate()
	_Log("Скрипт завершён пользователем.")
    Exit 0
EndFunc
 
Автор
garrul

garrul

Знающий
Сообщения
16
Репутация
10
Re: Автопилот

хе-хе, мы стопудова в разных институтах обучались ;D у нас знаете что преподы отвечали на вопрос "а зачем корабельному передатчику корпус из стали толщиной 10мм?"... "чтобы осколками не посекло" ))))
... а код покурим, покурим ;) лично для меня имаджсёрч в некоторых моментах был решающ - каким то образом в овервью просачивались вреки, желтые есессно )
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Создать новый пресет в овервью, деселект олл, патом "Add stargate to Overview" и сохранить, и никаких вреков там не будет. Да и в любом случаее сли даже попался желтый врек, ткнуть на него мышкой и посмотреть можно ли на него варпануться, если нельзя то идти дальше.
 
Автор
garrul

garrul

Знающий
Сообщения
16
Репутация
10
Re: Автопилот

[quote author=Belfigor]
Создать новый пресет в овервью, деселект олл, патом "Add stargate to Overview" и сохранить, и никаких вреков там не будет. Да и в любом случаее сли даже попался желтый врек, ткнуть на него мышкой и посмотреть можно ли на него варпануться, если нельзя то идти дальше.
[/quote]
да не, это всё понятно то. просто иногда по запарке стоит другой пресет и в нём как раз станции и вреки присутствуют (пресет называется "ninj_salv" ;D )

[quote author=Archy26] Принцип необходимости и достаточности на первом курсе института изучали?[/quote]
Код:
Dim $OverviewX = 767, $OverviewY = 139
Global $OverviewX = 767, $OverviewY = 139,


а так, покурил код, подкрутил, спасибо за наводку ;)

было:

Код:
#include <ImageSearch.au3>

Код:
If _ImageSearchArea("gate.bmp", 1, $WinPos[2]-257, $WinPos[3]-625, $WinPos[2]-237, $WinPos[3]-215, $xg, $yg, 5) Then

Код:
MouseClick("left",$xg,$yg,1)


стало:

Код:
;~ #include <ImageSearch.au3>

Код:
$a = PixelSearch ($WinPos[2]-257, $WinPos[3]-625, $WinPos[2]-237, $WinPos[3]-215, 0xFFFF00, 3)
If Not @error Then

Код:
MouseClick("left",$a[0],$a[1],1)


и минус упрёки про имаждсёрч ;D

...хотя опять же, как вот без него определить появление того же окошка ДТ ну или другого какого нить?
 
B

Bad_boy

Гость
Re: Автопилот

очень даже легко.. спамь кнопку энтер
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Автопилот

Bad_boy сказал(а):
очень даже легко.. спамь кнопку энтер
Очень даже легко: она взлетает по-таймеру, никогда не замечали?
простоенькая функция которая будет время отслеживать и в определённых временных промежутках засылать энтер каждые 10 секунд, это вообще не сложно. один раз написать и забыть.
 
B

Bad_boy

Гость
Re: Автопилот

Зачем вот взял и разжевал все )) кому надо тот сам бы додумался )
Хватит 2 времени вбить , первый раз за час то дт, второй за 20 минут до дт ( и тут лучше уже боту вписать чтобы он уже докался или на пос летел и спал до конца дт)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Отдал команду, проверил совершилась ли она, если не совершилась отдал еще раз, не сканало второй раз, то тут два варианта, либо бот пытается применить команду не там где надо, либо окно зафризилось, либо появилось то самое окошко.
Далее чтобы узнать там ли мы где надо мы проверяем местоположение бота во вселенной
Если окно зафризилось - несколько раз ждем по 10-20 секунд и если не разфризилось перезапускаем процесс.
И последняя проверка (по факту я бы делал ее основываясь на текущем времеи) Смотрим по нескольким контрольным точкам нету ли у нас на экране окошка с сообщением на злободневную тему, если есть закрываем его и работает дальше.
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Автопилот

Ну, поскольку у моих майнера и охотника трюм всегда открыт... А в трюме есть места, где никогда не бывает ничего кроме полной тьмы - 0x000000 то если вдруг там не тьма, по проверяем ещё 4 точки по краям кнопки "Ок" - они всегда абсолютно белые, что тоже обычно в трюме не бывает (а заодно точку из иконки буквы i там где синий цвет, а в нормальной ситуации - часть трюма, ни разу не синяя). И жмём мышкой в это "Ок". Пропало - значит так и было надо.
 

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Автопилот

эммм, слово вставлю.
Код:
Func check_quantity($qua1); проверка диалога "сколько загрузить" и указание сколько, работает по команде check_quantity("количество{ENTER}")
        $q1=PixelGetColor($WinPos[2]/2, $WinPos[3]/2-15)
        If $q1=0 Then Send($qua1)
        $q2=PixelGetColor($WinPos[2]/2, $WinPos[3]/2+50); проверка оповещения о дт
        If $q2=0 Then Send($qua1)
   EndFunc


проверка диалога "сколько загрузить" и указание сколько, также пользую в ключевых местах, там где есть риск появления нежелательных меню, типа в полный трюм пытаюсь загнать еще кусочек, check_quantity("{ENTER}"), тоесть просто посылается интер на черноту
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Кстати, летаю на блокаднике, при полетах по импе, самый банальный вариант при выходе из варпа жать на мвдешечку
 
B

Bad_boy

Гость
Re: Автопилот

не согласен. Проще всего ждать когда можно нажать пропрыг
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Попрыг можно нажать в радиусе 2.5 км от ворот, включится мвд, пропрыгнешь в гейт и мвд снова вырубится. Смысл если мы прилетаем в 15 км когда по стандартному автопилоту летим?
 

DJ_Tommy

Продвинутый
Сообщения
234
Репутация
57
Re: Автопилот

Стал частенько летать по импе на фрейте, соответственно пришлось под себя сделать автопилот. Хотелось бы услышать комментарии к коду. только сразу замечу - не делал пока случайных областей нажатий, т.е. все координаты строго по моему экрану.
И еще - это именно для фрейта, соответственно и временные паузы расчитаны на длительный набор скоростти фрейтом.
Код:
;Перед запуском скрипта шип должен быть в космосе, координаты всех точек должны совпадать,
;в овервью должна быть включена закладка в которой будут одни только гейты
;Путь должен быть проложен заранее до запуска скрипта, в конечной точке в доке должно что нибудь лежать.
;Как работает: пауза 15 секунд, сигнал запуска скрипта, и идет проверка состояния скорости,
;как только скорость упала примерно до нуля, нажимается кнопка стоп и включается поиск желтого пикселя в картинках
;гейтов в овервью, как только пиксель найден - на него ставится курсормыши и нажимается ЛКМ,
;далее нажимается кнопка варп, потом кнопка Автопилот, запускается проверка состояния и как только
;скорость упадет до нуля нажимается стоп и далее по кругу поиск желтого пикселя. Как только
;не сможем найти желтый пиксель в течении 14-20 секунд запускается функция которая загоняет 
;шип в док, а именно, открывает асеты при помощи ЛКМ, вызывает на первой строке ассетов кон-
;текстное меню ПКМ, а затем при помощи ЛКМ нажимается док и скрипт завершает свою работу.
$sxs=1021 ;координаты оси Х по которой ищется желтый символ гейта
$sys=148 ;координата по оси У с которой начинается поиск желтого пикселя
$nomb=0 ;номер строки овервью
;$cola ;переменная для возвращения значения пиксельгетколор на гейте
;$colb ;переменная для возвращения значения пиксельгетколор на строке скорости
$xw=603 ;координата по х первой точки проверки варпа
$yw=745 ;координата по у проверки варпа
$wx=1048 ; координаты примерного центра кнопки варпа
$wy=73
$ax=540 ;координаты примерного центра кнопки автопилота
$ay=735
$stopx=595 ;примерные координаты треугольника стоп
$stopy=739
$tt=1 ;отсчет времени нахождения желтого цвета после остановки шипа
$ss=1 ;количество проверок остановки шипа
$assetsx=15 ;примерные координаты кнопки ассетов
$assetsy=411
$assetsx1=616 ;примерные координаты верхней строки ассетов (упорядочивание должно быть по количеству джампов)
$assetsy1=489
$assetsx2=662 ;примерные координаты пункта докнутся контекстного меню
$assetsy2=579
Func ShipDock() 
Sleep(750)
Send("{ENTER}")
MouseClick("left", $assetsx, $assetsy, 1, 7)
Sleep(2000)
Send("{ENTER}")
MouseClick("right", $assetsx1, $assetsy1, 1, 7)
Sleep(2000)
Send("{ENTER}")
MouseClick("left", $Assetsx2, $assetsy2, 1, 7)
EndFunc
Func StopShips()
sleep (350)
Send("{ENTER}")
MouseClick("left", $stopx, $stopy, 1, 7) ;нажали кнопку стоп
sleep (1500)
Send("{ENTER}")
MouseClick("left", $stopx, $stopy, 1, 7) ;нажали кнопку стоп
EndFunc
Func SearchGate ()
While 1
$cola = PixelSearch($sxs,$sys, $sxs, $sys+140, 0xFFFF00)
	If $tt>=20 Then ExitLoop
	If $cola <> @error Then 
	Sleep (1000)
	StopShips()
	$tt=1
	Sleep (1000)
	Send("{ENTER}")
	MouseClick("left", $cola[0], $cola[1], 1, 7) ;выделили строку овервью
	Sleep (3000)
	Send("{ENTER}")
	MouseClick("left", $wx, $wy, 1, 7) ;нажали кнопку варпа
	Sleep (2000)
	Send("{ENTER}")
	MouseClick("left", $ax, $ay, 1, 7) ;нажали кнопку автопилота
	Sleep (10000)
	ExitLoop
Else
	Sleep (1350)
	$tt=$tt+1
	EndIf
WEnd
EndFunc
Func WaitStopAvto ()
While 1
$colb = PixelSearch($xw,$yw,$xw+5,$yw,0x939393)
If $colb = @error Then 
	Sleep (1200)
Else 
	$ss=$ss+1
	Sleep(1000)
EndIf
If $ss>=2 Then ExitLoop
WEnd
$ss=1
EndFunc
;--------------------------------------------------------------
;--------------------------------------------------------------
Sleep (15000)
Beep(500,5)
WaitStopAvto ()
While 1
	SearchGate ()
	If $tt>=20 Then ExitLoop
	WaitStopAvto ()
WEnd
ShipDock()
 

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Автопилот

Если код работает у тебя, то значит это отличный код. Фишка всех ботов в том что ничего сверхъестественного в программировании они не представляют,это простейший пиксельсерч, тайминги и немного IF THEN и клики. Главное это мысль, о том как заставить такими примитивными средствами делать что тебе надо, а главное, как сделать это не прибегая к новым средствам :laugh: .

Я вот все думал как заставить бота докнутся на нужную станцию, тем более что рейсы регулярные, то есть ассетсы есть 100%. Так что спасибо.
 

Typok

Знающий
Сообщения
14
Репутация
14
Re: Автопилот

hikki сказал(а):
Я вот все думал как заставить бота докнутся на нужную станцию, тем более что рейсы регулярные, то есть ассетсы есть 100%. Так что спасибо.
У моего бота окошко ассестов сжато до минимума у занимает правый нижний угол (не принципиально конечно)
И в нужных мне системах весь хлам свален только на одной станции => докаюсь по верхней строке ассест-меню (возможно там сортировка нужна по кол-ву джампов - щас не вспомню)
Работает отлично ;)

P.S. DJ_Tommy извиняй: сначала написал - потом твой код прочел ;D
 

DJ_Tommy

Продвинутый
Сообщения
234
Репутация
57
Re: Автопилот

Ну во первых - прежде чем выложить код - я его 4 дня обкатывал и дополнял ... Так что тут вопрос к тем кто хорошо разбирается в этом - какие у мну промахи и что хорошо бы дополнить.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Re: Автопилот

Я бы убрал все тайминги переложив их полностью на логику. Тем самым сократив бы простои кода до минимума. Так же я бы запустил вместе с фрейтером сеточника тем самым сократив время перелетов на 80-90%
 
Верх