Что нового

Майнер бот. Эволюция от примитивного до умного.v2.5

Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель)

Версия 2.20
Решил потихоньку переделывать в умного бота.
1.изменил полностью цикл майна(функция mine()).теперь майн производится по принципу - считал все нужные данные,выполнил действие на основании этих данных.
2.изменил представление лога на более удобное.Добавил расчет длительности цикла,счетчик количества сброса лута,лог зависания дронов.


Думаю ,скоро сделаю бот полностью таким - сбор всех данных ->их анализ->действие(это все в цикле).может сделаю два независимых модуля обменивающихся информацией.

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\icons\иконки устройств\1013.ico
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Date.au3>
Opt("TrayIconDebug", 1)
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt ("MouseClickDelay", 20);Задаем интенсивность нажатия мыши.
Opt ("SendKeyDownDelay", 100)
HotKeySet ("{`}","_exit");задаем горячую клавишу остановки скрипта
HotKeySet ("{\}","_pause")
WinMove("EVE", "", -3, -27)


;+++ Шапка +++
Global $Belt;состояние возможности майнить на белте.
Global $CargoChk;переменная заполненности трюма
Global $10kmChk;переменная проверки 10км
Global $AsterChk;переменная наличия астероидов на буке
Global $LockChk;переменная лока
Global $StripChk;переменная активности стрипов
Local $StrpTimer;переменная таймера работы стрипа
Global $LootCount=0;счетчик количества сбросов лута за время работы бота.
Global $DrChk;счетчик для вычисления кликов мышью.если только прилетели на белт полный набор кликов для запуска дронов и активации майна ими.
Global $pause
Global $timer = TimerInit();таймер
Dim $hour,$min,$sec
Global $y=133;координата Y в меню бук.
Global $x;Номер буки
checkbeltnum()
IniWrite("D:\eve.ini","Script", _NowCalc(),"Start,Belt №" & $x)
IniWrite("D:\eve.ini","Mined",_NowCalc(),"начало работы")
IniWrite("D:\eve.ini","Status",_NowCalc(),"начало работы")
IniWrite("D:\eve.ini","Error",_NowCalc(), "начало работы")
#cs
справка по белтам цифра - значение $y`
1-133 2-149 3-165
4-181 5-197 6-213
7-229 8-245 9-261
10-277 11-293 12-309
#ce
;===================================



;;++++++++++ Ниже основа ;++++++++++ 
while $y<454
WinActivate("EVE")
WinWaitActive("EVE");активируем окно с евой,чтобы покорить еву ботством...:)
Global $CicleTime = TimerInit()
Undock();андокаемся - пока не пройдет проверка повторяем...
Sleep (1000)
checkbeltnum();
ConvoCheck();проверка конво
WarpToBelt();плывем к белту - ломимся,пока не пройдут проверки.
Sleep (500)
ConvoCheck();проверка конво
Sleep (1000)
Mine();здесь процесс добычи с проверками на заполненность трюма,лока,конво.
sleep (300)
Dock();летим домой
OreToHome();сбрасываем руду;проверка осталось ли че? :) Если осталось - повторить.
ConvoCheck();проверка конво
Wend
_exitgame()
_exit()
;============================Конец основы================================



;++++++++++ завершение работы скрипта + время работы скрипта
Func _exit()
	ToolTip("Завершение скрипта",0,0)
	Sleep(200)
	_TicksToTime(Int(TimerDiff($timer)),$hour,$min,$sec)
	$ScriptWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec)
	IniWrite("D:\eve.ini","Script",_NowCalc(), "Stop,Belt №" & $x &" -- "& "Время работы: "& $ScriptWorked & ", лут сбросил: " & $LootCount&" раз." )
	IniWrite("D:\eve.ini","Mined",_NowCalc(), "конец работы")
	IniWrite("D:\eve.ini","Status",_NowCalc(), "конец работы")
	IniWrite("D:\eve.ini","Error",_NowCalc(), "конец работы" )
	Exit
EndFunc
;=================================


;++++++++++ пауза
Func _pause()
	$pause=$pause+1
while $pause=1
	ToolTip("Пауза...",0,0)
	Sleep(200)
WEnd
ToolTip("продолжаем...",0,0)
Sleep(200)
$pause=0
EndFunc
;=================================


;++++++++++ функция полета на белт
Func WarpToBelt()
	Do
	ToolTip ("Пытаемся варпнутся к белту",0,0)
	MouseClick ("left",62, 47,1,20);клик на треугольник
	MouseMove(120, 52,20);плавно ведем мышь по меню
	MouseMove(120, 133,20)
	MouseMove(240, 133,20)
	;доводим до списка бук белтов - эти первые 3 операции с мышью
	;для всех белтов одинаковы
	MouseMove(240, $y,20);доводим до 1го белта в списке(разница в 16 пикселей)
	MouseClick("left",340, $y,1,20);
	
	PixelSearch(839, 7,847, 15,0x868686,10)
	If Not @error Then
		Send("{F11}")
	EndIf
	
	Sleep (8000) ;летим ждем надпись "Гипердрайв активен"
	Until CheckWarp()=0;повторяем попытки улететь на белт,пока не пройдет проверка на варп к белту

	WinActivate("EVE")
	WinWaitActive("EVE")

	Do
		Sleep(100)
		ToolTip ("летим к белту",0,0)
	Until CheckWarp()=1;повторяем надпись,пока не пройдет проверка на окончание варпа.
	Sleep(4000);необходим,чтобы успели отсортироваться астеры,иначе улетит с белта.
	$DrChk=0
EndFunc
;=============================


;++++++++++ функция проверки окончания варпа
Func CheckWarp() 
	PixelSearch (425, 527,425, 527,0xBCBCBC,10);проверяется левый верхний пиксель буквы Г в слове Гиперпрыжок :)пока он есть мы в гиперпрыжке.
	If @error Then
	Return 1
	Else
	Return 0
	EndIf
EndFunc

;=============================


;++++++++++ выход из игры - до этого док и сброс лута.
Func _exitgame();если белты с дистанцией менее 10км к астероиду кончились - выйти из игры.
	WinActivate("EVE")
	WinWaitActive("EVE")
	Dock()
	OreToHome()
	Send ("{esc}")
	sleep (4000)
	MouseClick ("left",851, 606,1,20)
	IniWrite("D:\eve.ini","Game Exit - кончились буки",_NowCalc(),"Stop,Belt №" & $x)
	Return
EndFunc

;======================================


;++++++++++ Полет домой если заполнен трюм
Func Dock() 
	WinActivate("EVE")
	WinWaitActive("EVE")
	Dronecontrol()
	;если трюм заполнился - летим домой
Do
	MouseClick ("left",62, 47,1,20);клик на треугольник`
	MouseMove (123, 56,20);аккуратно ведем мышь
	MouseMove (123, 157,20);дом
	MouseMove (223, 157,20);додвигаем до начала меню дом
	MouseClick ("left",223, 207,1,20);4й пункт 1й буки
	sleep (6000);примерное время до появления надписи "Гипердрайв активен"
	ToolTip ("Начинаю варпаться домой",0,0)
	Sleep(200)
Until CheckWarp()=0;повторяем процедуру,пока не пройдем проверку на процесс варпа

Do
ToolTip ("Варп домой",0,0)
Until CheckWarp()=1

Do
ToolTip ("Лечу в док...",0,0)
Until CheckSpace()=0

ToolTip ("Мы дома",0,0)
Sleep(200)

EndFunc
;======================================


;++++++++++ вылет со станции.
Func Undock()
	WinActivate("EVE")
	WinWaitActive("EVE")
	Do
	ToolTip("Вылетаем ботить :)",0,0)
	MouseClick("left",17, 735);щелчок на андок
	Sleep(200)
	ToolTip ("я на станции!",0,0)
	Until CheckSpace()=1;спамить андок и показывать надпись каждую секунду,пока не появимся в космосе.
EndFunc
;======================================


;++++++++++ проверка на космос
Func CheckSpace()
		WinActivate("EVE")
		WinWaitActive("EVE")
		PixelSearch(737, 122,737, 122,0xCFCFCF,10);ищем треугольник овервью
		if not @error Then                     ;- мы находимся в космосе.
		ToolTip ("я в космосе",0,0)
		Sleep(200)
		return 1
		Else
		return 0
		EndIf
EndFunc
;======================================
#cs
#ce
;++++++++++ умная версия бурения...
Func Mine()
While 1
	AllChecks()
	Select
		Case $CargoChk=1
		ExitLoop
		Case $AsterChk=0;если белт не ботабельный,то летим дальше...
			$y=$y+16
			Dronecontrol()
			If $y>454 Then
				_exitgame()
				_exit()
			EndIf
			WarpToBelt()

		Case $AsterChk=1;если белт ботабельный,то...
			If $LockChk=0 Then;если нет лока,то...
				StripChk("Off")
				Chk10km()
				If $10kmChk=1 Then;если астероид ближе 10км
					LockTarget();лочим
					StartDrone();дроны атаке
				EndIf
				If $10kmChk=0 Then;если астеры ближе 10 км кончились.
					$y=$y+16
					Dronecontrol();забираем дронов
					If $y>454 Then;проверяем кончились ли все 21 буки.если да,то...
						_exitgame();выходим из игры
						_exit();завершаем скрипт
					EndIf
					WarpToBelt();если не кончились буки - летим на следующую.
				EndIf
			EndIf
			If $LockChk=1 Then;если лок есть,то...
				If $StripChk=1 Then;если стрипы пашут,проверяем прошло ли от 25-30 сек.если прошло - остановить стрипы.
					$RndStrp=Random(30000,35000)
					StripChk("On")
					If	TimerDiff($StrpTimer)>$RndStrp Then
						StripChk("On");проверка для всех стрипов,так как активность $StripChk проверяется по первому стрипу- иногда нужно выровнять.
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}")
						Sleep(1000)
					EndIf
				EndIf
				If $StripChk=0 Then;сделано 2 проверки.
					$StrpTimer = TimerInit();активируем таймер,для проверки сколько работают стрипы.
						Sleep(500)
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}")
						MouseMove(774, 183);возвращаем мышку ближе к след.клику,чтобы потом не тратить на это время.
					;Sleep(2300)
				EndIf
			EndIf
	EndSelect
WEnd
EndFunc
;=================================================


;++++++++++ стадия майна 1 - лок,ссылка на проверку расстояния+активация дронов
Func LockTarget() 

	MouseClick ("left",879, 76);жмем кнопку лока цели
	ToolTip("Лочу цель",0,0)
	;ждем окончания лока
EndFunc

Func StartDrone()
	If $DrChk=0 Then
		MouseClick ("right",779, 628);меню дронов
		sleep(500)
		MouseClick ("left",806, 654);запустить дронов
		Sleep (3000)
		MouseClick ("right",779, 648);меню дронов
		sleep(500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
	;	MouseMove(774, 183);возвращаем мышку ближе к след.клику,чтобы потом не тратить на это время.
		$DrChk=$DrChk+1
	Else
		MouseClick ("right",779, 648);меню дронов
		sleep(2500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
	;	MouseMove(774, 183);возвращаем мышку ближе к след.клику,чтобы потом не тратить на это время.
	EndIf
EndFunc
;===========================








;++++++++++ кусок сброса лута
Func OreToHome();функция сбрасывания руды на станцию
	sleep (3000)
	Do
		ToolTip("Cбрасываю добычу",0,0)
		Sleep(200)
		MouseClick("left",150, 597,1,20);иногда происходит лаг и вся руда не вытаскивается,поэтому решил воткнуть костылик
		Send ("^a")
		MouseClickDrag ("left",63, 665,83, 366,20)
		Sleep (2000)
	Until FullEmptyCheck()=1
	_TicksToTime(Int(TimerDiff($CicleTime)),$hour,$min,$sec);вычисление времени цикла
	Local $CicleWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec);вычисление времени цикла
IniWrite("D:\eve.ini","Mined",_NowTime(5), "сброшен лут" & " Бука №" & $x & " Время цикла: "& $CicleWorked)
$LootCount=$LootCount+1;счетчик сброшенного лута
EndFunc
;================================


;++++++++++ проверка - сброшен лут или нет.
Func FullEmptyCheck()
	PixelSearch (186, 618,186, 618,0x041115,10)
	If @error Then
	ToolTip ("лут еще есть!",0,0)
	Sleep(200)
	Else
	ToolTip ("лут сброшен...",0,0)
	Sleep(200)
	return 1
	EndIf
EndFunc
;=================================


;++++++++++ узнаем номер белта по текущей координате y
Func checkbeltnum()
	Select
		Case $y=133
			$x=1
		Case $y=149
			$x=2
		Case $y=165
			$x=3
		Case $y=181
			$x=4
		Case $y=197
			$x=5
		Case $y=213
			$x=6
		Case $y=229
			$x=7
		Case $y=245
			$x=8
		Case $y=261
			$x=9
		Case $y=277
			$x=10
		Case $y=293
			$x=11
		Case $y=309
			$x=12
		Case $y=325
			$x=13
		Case $y=341
			$x=14
		Case $y=357
			$x=15
		Case $y=373
			$x=16
		Case $y=389
			$x=17
		Case $y=405
			$x=18
		Case $y=421
			$x=19
		Case $y=437
			$x=20
		Case $y=453
			$x=21
		
	EndSelect
EndFunc
;======================





;++++++++++ контроль возврата дронов
Func Dronecontrol()
Send ("!{2}")
;PixelSearch(1009, 644,1009, 644,0x010203,5);проверка открыто ли меню.когда не раскрыто - в этом пикселе точка черного цвета.
;If Not @error Then
MouseClick ("left",779, 648);раскрыть меню для анализа состояния
;	sleep(100)
;EndIf

While 1
Sleep (1000)
PixelSearch(938, 666,959, 669,0x404040)
	If @error Then
		ExitLoop
	EndIf
ToolTip("Ждем дрончегов!",0,0)

PixelSearch(844, 664,920, 671,0x00DC00,10)
;иногда после нажатия назначенной комбинации клавиш для возврата дронов,они просто прилетают к кораблю со статусом - не используется.проверяем.
	If Not @error Then
		ToolTip("сцуко зависли!",0,0)
		Sleep(2000)
		Send ("!{2}");если дроны висят,вместо того,чтобы возвратиться - послать команду еще раз.
		IniWrite("D:\eve.ini","Error",_Nowtime(5), "Дроны зависли" & " Бука №" & $x)
	EndIf
WEnd

ToolTip("Дроны вернулись!",0,0)
MouseClick ("left",779, 648);закрыть меню.можно раскомментить вначале функции проверку на раскрытость.проще просто закрыть.
Sleep (600)
EndFunc
;================


;++++++++++ контроль стрипов
Func StripChk($StrStatus)
Select
	Case $StrStatus = "On"
		PixelSearch(612, 650,612, 650,0x000000);проверка активности 1го стрипа
			If Not @error Then
					;If $do=1 Then
						ToolTip ("стрип 1 не включился - активирую...",0,0)
						IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не включился" & " Бука №" & $x)
						Send ("{f1}")
						Sleep (500)
					;EndIf
			EndIf
		PixelSearch(664, 650,664, 650,0x000000)
			If Not @error Then
				;If $do=1 Then
					ToolTip ("стрип 2 не включился - активирую...",0,0);проверка активности 2го стрипа
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не включился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(714, 650,714, 650,0x000000);проверка активности 3го стрипа
			If Not @error Then
				;If $do=1 Then
					ToolTip ("стрип 3 не включился - активирую...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не включился" & " Бука №" & $x)
					Send ("{f3}")
					Sleep (500)
				;EndIf
			EndIf

	Case $StrStatus = "Off"
		PixelSearch(612, 650,612, 650,0x000000);проверка на выключение 1го стрипа
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 1 не выключился - выключаю...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не выключился" & " Бука №" & $x)
					Send ("{f1}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(664, 650,664, 650,0x000000)
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 2 не выключился - выключаю...",0,0);проверка на выключение 2го стрипа
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не выключился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(714, 650,714, 650,0x000000);проверка на выключение 3го стрипа
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 3 не выключился - выключаю...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не выключился" & " Бука №" & $x)
					Send ("{f3}")
					Sleep (500)
				;EndIf
			EndIf
EndSelect
EndFunc
;=======================

Func Chk10km()
	WinActivate("EVE")
	WinWaitActive("EVE")
	MouseClick("left",774, 183,1,20)
	Sleep (1200)
	PixelSearch (828, 40,830, 44,0x8F8F8F,10);проверка диапазона пикселей между 2х значным XX числом километров и слова км.на наличие серого оттенка цвета(цвет чисел).
	If not @error Then;PixelSearch (836, 40,840, 44,0x8F8F8F,10) если появился нужный цвет в диапазоне,значит мы уже ближе 10км и представление цифр изменилось на XXXX м.
		ToolTip("Ближе 10км",0,0)
		Sleep (600)
		$10kmChk=1
		Return 1
	Else
		PixelSearch (943, 74,951, 87,0x8E8E8E,10)
		If @error Then
		ToolTip("Белт пустой!Летим дальше.",0,0)
		Sleep (500)
		$10kmChk=0
		Return 0
		Else
		PixelSearch (836, 40,840, 44,0x8F8F8F,10)
		If @error Then
		ToolTip("Ближе 10км",0,0)
		Sleep (600)
		$10kmChk=1
		Return 1
		EndIf
		EndIf
	 ToolTip("нет астероидов ближе 10км - меняю белт № " & $x & " на белт №" & ($x+1),0,0)
	 Sleep(600)
	$10kmChk=0
	Return 0
	EndIf
EndFunc

Func AllChecks()
	WinActivate("EVE")
	CargoCheck()
	LockCheck()
	StrpChk()
	AsterChk()
	ConvoCheck()
	ToolTip("Карго="&$CargoChk&"\Астероиды="&$AsterChk&"\Лок="&$LockChk&"\Стрипы="&$StripChk&"\Белт №"&$x,0,0)
EndFunc

Func StrpChk()
	PixelSearch(612, 650,612, 650,0x000000)
	If Not @error Then
		$StripChk=0
		Return
	Else
		$StripChk=1
		Return
	EndIf
EndFunc

Func AsterChk()
	PixelSearch(784, 174,883, 183,0xB1B1B1,10)
	If Not @error Then
		$AsterChk=1
		Return
	Else
		$AsterChk=0
		Return
	EndIf
EndFunc

;++++++++++ проверка цели на лок
Func LockCheck()
	PixelSearch(621, 80,636, 80,0x404040,10)
	If not @error Then
		$LockChk=1
		Return 1
	Else
		Sleep (600)
		$LockChk=0
		return 0
	EndIf
EndFunc
;===============================

;++++++++++ проверка на заполненность трюма
Func CargoCheck()
	;WinActivate("EVE")
	Sleep (200)
	PixelSearch (279, 617,279, 617,0x005067,10);проверка на наличие синего цвета.если есть,то заполнен.
	If Not @error Then
		ToolTip("Трюм наполнился",0,0)
		Sleep(200)
		$CargoChk=1
		Return 1
	Else
		$CargoChk=0
		Return 0
EndIf
EndFunc
;==================================

;++++++++++ функции проверки конво
Func ConvoCheck()
	If Check1()=1 Or Check2()=1 Or Check3()=1 Then ;3 проверки на конво,если вдруг срабатывает любая- принтскрин и загрузка громкой мелодии :)
		ShellExecute ("D:\Autoit\proekts\1.mp3")
		;_exitgame()
		;_exit()
	EndIf
EndFunc
	
	Func Check1()
		PixelSearch (303, 172,819, 581,0xFFA600,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "АААА конво был бляяяя!!!сработала проверка 1")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check2()
		PixelSearch (303, 172,819, 581,0x6284AF,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "АААА конво был бляяяя!!!сработала проверка 2")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check3()
		PixelSearch (303, 172,819, 581,0x0064C0,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "АААА конво был бляяяя!!!сработала проверка 3")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc
;========================
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель)

Прогресс на лицо ;)
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель)

Версия 2.23
Теперь бот умный :blum:

Изменения:
1.убрал громозкость лога.оставил только действительно нужные вещи.потому что начало скрипта,конец скприпта сильно засоряло лог.
2.Теперь бот работает на основании принципа - собираем данные-->выполняем действия проанализировав данные. есть пара линейных функций ,которые проще оставить именно такими.
3.Из-за всех оптимизаций,которые стали возможны только в умном боте --->теперь средняя длительность цикла составляет около 13 минут.Это значительное сокращение потерь.Теперь средний прирост исков(из расчета рефайна Veldspar с налогом 3.88% и средней стоимости tritanium 2.28) = около 31 500 000 исков за 10 часов майна. - Если взять стрипы т2 и выбрать определенный тип астероида для бурения с кристаллами,взять в ганг с mining foreman и оркой чела,использовать т2 дроны - прирост будет еще больше.
4.теперь текущий белт можно менять горячими клавишами - стрелка влево - минус белт ,стрелка вправо - плюс белт.
5.Добавил много комментов.теперь новичку будет гораздо проще понять как работает та или иная функция.

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

Буду рад услышать замечания и советы,а также выявленные ошибки.

Всем приятной интеграции этого бота себе :smile:

Код:
#include <Date.au3>
Opt("TrayIconDebug", 1)
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt ("MouseClickDelay", 20);Задаем интенсивность нажатия мыши.
Opt ("SendKeyDownDelay", 100)
HotKeySet ("{`}","_exit");задаем горячую клавишу остановки скрипта
HotKeySet ("{\}","_pause")
HotKeySet ("{RIGHT}","BeltPlus");горячая клавиша изменения номера белта в процессе работы бота +
HotKeySet ("{LEFT}","BeltMinus");горячая клавиша изменения номера белта в процессе работы бота -
WinMove("EVE", "", -3, -27)


;+++ Шапка +++
Global $ProcChk;процесс
;Global $dock=1;пометка о том,чтобы при анализе ,вместо варпа на белт,логика понимала,что нужно ждать,пока не докнемся.
Global $RndStrp;рандомная длительность активности стрипа
Global $all;все в одной переменной.
Global $FullEmptyCheck;проверка на наличие любого лута,если на станции
Global $SpaceChk;проверка на космос.
Global $WarpChk;проверка на варп
Global $Belt;состояние возможности майнить на белте.
Global $CargoChk;переменная заполненности трюма
Global $10kmChk;переменная проверки 10км
Global $AsterChk;переменная наличия астероидов на буке
Global $LockChk;переменная лока
Global $StripChk;переменная активности стрипов
Local $StrpTimer;переменная таймера работы стрипа
Global $LootCount=0;счетчик количества сбросов лута за время работы бота.
Global $DrChk;счетчик для вычисления кликов мышью.если только прилетели на белт полный набор кликов для запуска дронов и активации майна ими.
Global $pause
Global $CicleTime;переменная длительности цикла
Global $timer = TimerInit();таймер общей работы скрипта
Dim $hour,$min,$sec
Global $y=133;координата Y в меню бук.
Global $x;Номер буки
;===================================


;while $y<454
WinActivate("EVE");активируем окно с евой
WinWaitActive("EVE");Ждем активированное окно с евой
checkbeltnum();рассчитываем номер белта по текущей координате $y
IniWrite("D:\eve.ini","Script", _NowCalc(),"Start,Belt №" & $x)
$CicleTime = TimerInit();засекаем длительность 1 цикла.
While 1
Mine()
Wend


;++++++++++ Логика 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Func Mine()
While 1
	AllChecks()
	Select
		Case $SpaceChk="Док"
			If $FullEmptyCheck="Есть" Then
				OreToHome()
			Else
				Undock()
			EndIf
		Case $WarpChk=1 or $SpaceChk="Загрузка..." or $ProcChk="процесс..."
			Sleep(100)
		Case $CargoChk=1
			Dronecontrol()
			Dock()
		Case $AsterChk=0;если белт не ботабельный,то летим дальше...
			;If $Dock=1 Then
			;	Sleep(300)
			;EndIf
			If TimerDiff($CicleTime)<=30000 Then
				WarpToBelt()
			Else
				$y=$y+16
				Dronecontrol()
				WarpToBelt()
				If $y>454 Then
					_exitgame()
					_exit()
				EndIf
			EndIf
		Case $AsterChk=1;если белт ботабельный,то...
;			If $dock=1 Then
;				Sleep(300)
;			EndIf
			If $LockChk=0 Then;если нет лока,то...
				$StrpTimer=0
				StripChk("Off");проверка выключены ли стрипы - иногда дроны съедают астер раньше стрипов и они продолж.работать.выключаем если так.
				Chk10km();проверка ближе или дальше 10км - так как для этого нужно кликнуть мышей - вывел из цикла проверок.
				If $10kmChk="<10км" Then;если астероид ближе 10км
					LockTarget();лочим
					StartDrone();дроны атаке
				EndIf
				If $10kmChk=">10км" Then;если астеры ближе 10 км кончились.
					Sleep(2000)
					Chk10km();---- 	ЭТА ПОВТОРНАЯ ПРОВЕРКА НА ВСЯКИЙ СЛУЧАЙ.
					If $10kmChk="<10км" Then;если астероид ближе 10км 
						LockTarget();лочим
						StartDrone();дроны атаке
						;-----///-------
					Else
						$y=$y+16
						Dronecontrol();забираем дронов
						If $y>454 Then;проверяем кончились ли все 21 буки.если да,то...
							_exitgame();выходим из игры
							_exit();завершаем скрипт
						EndIf
						WarpToBelt();если не кончились буки - летим на следующую.
					EndIf
				EndIf
			EndIf
			If $LockChk=1 Then;если лок есть,то...
				If $StripChk=1 Then;если стрипы пашут,проверяем прошло ли от 25-30 сек.если прошло - остановить стрипы.
					StripChk("On")
					If	TimerDiff($StrpTimer)>=$RndStrp Then
						StripChk("On");проверка для всех стрипов,так как активность $StripChk проверяется по первому стрипу- иногда нужно выровнять.
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}")
						Sleep(2000)
					EndIf
				EndIf
				If $StripChk=0 Then;если стрипы не работают...
					$StrpTimer = TimerInit();активируем таймер,для проверки сколько работают стрипы.
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}");включаем стрипы
						$RndStrp=Random(30000,35000)
						MouseMove(774, 183);возвращаем мышку ближе к след.клику,чтобы потом не тратить на это время.
						Sleep(2000);иначе стрипы не успев включиться,могут выключиться.
				EndIf
			EndIf
	EndSelect
WEnd
EndFunc
;=================================================

;++++++++++ Проверки в одной функции
Func AllChecks()
	WinActivate("EVE")
	Sleep(100)
	CheckSpace()
	If $SpaceChk="Док" Then
		FullEmptyCheck()
		ToolTip("Лут="&$FullEmptyCheck&"\Статус="&$SpaceChk,0,0)
		Return
	EndIf
	If $SpaceChk="Загрузка..." Then
		ToolTip("Статус="&$SpaceChk,0,0)
		Return
	EndIf
	CheckProcess()
	checkbeltnum()
	CheckWarp()
	CargoCheck()
	LockCheck()
	StrpChk()
	AsterChk()
	ConvoCheck()
	ToolTip("Карго="&$CargoChk&"\Астероиды="&$AsterChk&"\Лок="&$LockChk&"\Расстояние="&$10kmChk&"\Белт №"&$x,0,0)
	;$all="Карго="&$CargoChk&"\Астероиды="&$AsterChk&"\Лок="&$LockChk&"\Лут="&$FullEmptyCheck&"\Статус="&$SpaceChk&"\Варп="&$WarpChk&"\Стрипы="&$StripChk&"\Белт №"&$x
	;ClipPut($all)
EndFunc
;========================



;++++++++++ завершение работы скрипта + время работы скрипта
Func _exit()
	ToolTip("Завершение скрипта",0,0)
	Sleep(200)
	_TicksToTime(Int(TimerDiff($timer)),$hour,$min,$sec)
	$ScriptWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec)
	IniWrite("D:\eve.ini","Script",_NowCalc(), "Stop,Belt №" & $x &" -- "& "Время работы: "& $ScriptWorked & ", лут сбросил: " & $LootCount&" раз." )
	Exit
EndFunc
;==============


;++++++++++ пауза
Func _pause()
	$pause=$pause+1
while $pause=1
	ToolTip("Пауза...",0,0)
	Sleep(200)
WEnd
ToolTip("продолжаем...",0,0)
Sleep(200)
$pause=0
EndFunc
;=======


;++++++++++ функция полета на белт
Func WarpToBelt()
	ToolTip ("Пытаемся варпнутся к белту",0,0)
	MouseClick ("left",62, 47,1,20);клик на треугольник
	MouseMove(120, 52,20);плавно ведем мышь по меню
	MouseMove(120, 133,20)
	MouseMove(240, 133,20)
	;доводим до списка бук белтов - эти первые 3 операции с мышью
	;для всех белтов одинаковы
	MouseMove(240, $y,20);доводим до 1го белта в списке(разница в 16 пикселей)
	MouseClick("left",340, $y,1,20);
	;PixelSearch(839, 7,847, 15,0x868686,10)
	;;If Not @error Then
	;	Send("{F11}")
	;EndIf
	Sleep(4000);ожидание Гипердрайв активен.
	$DrChk=0
EndFunc
;=============================





;++++++++++ выход из игры - до этого док и сброс лута.
Func _exitgame();если белты с дистанцией менее 10км к астероиду кончились - выйти из игры.
	Dock()
	OreToHome()
	Send ("{esc}")
	sleep (4000)
	MouseClick ("left",851, 606,1,20)
	IniWrite("D:\eve.ini","Game Exit - кончились буки",_NowCalc(),"Stop,Belt №" & $x)
	Return
EndFunc

;======================================


;++++++++++ Полет домой если заполнен трюм
Func Dock() 
	;если трюм заполнился - летим домой
	MouseClick ("left",62, 47,1,20);клик на треугольник`
	MouseMove (123, 56,20);аккуратно ведем мышь
	MouseMove (123, 157,20);дом
	MouseMove (223, 157,20);додвигаем до начала меню дом
	MouseClick ("left",223, 207,1,20);4й пункт 1й буки
	sleep (4000);
	CheckWarp()
	If $WarpChk=1 Then
	While 1
		CheckSpace()
		If $SpaceChk<>"Космос" Then
			ExitLoop
		EndIf
		Sleep (1000)
		ToolTip("Докаемся",0,0)
	WEnd
	EndIf
EndFunc
;======================================

;++++++++++ вылет со станции.
Func Undock()
	MouseClick("left",17, 735);щелчок на андок
;	$Dock=0
EndFunc
;======================================





;++++++++++ Лок + Активация дронов
Func LockTarget() 
	MouseClick ("left",879, 76);жмем кнопку лока цели
	;активация дронов ниже занимает чуть больше времени лока
EndFunc

Func StartDrone()
	If $DrChk=0 Then
		MouseClick ("right",779, 628);меню дронов
		sleep(500)
		MouseClick ("left",806, 654);запустить дронов
		Sleep (3000)
		MouseClick ("right",779, 648);меню дронов
		sleep(500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
		$DrChk=$DrChk+1
	Else
		MouseClick ("right",779, 648);меню дронов
		sleep(2500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
	EndIf
EndFunc
;===========================


;++++++++++ кусок сброса лута
Func OreToHome();функция сбрасывания руды на станцию
	Sleep(3500)
	MouseClick("left",150, 597,1,20)
	Send ("^a")
	MouseClickDrag ("left",63, 665,83, 366,20)
	Sleep (2000)
	FullEmptyCheck()
	Sleep (1000)
	If $FullEmptyCheck="Нет" Then;прописываем данные только тогда,когда пусто.
		If TimerDiff($timer)>=60000 Then;для того,чтобы если вначале старта бота есть лут в карго - не считалось за сброс за цикл.
			_TicksToTime(Int(TimerDiff($CicleTime)),$hour,$min,$sec);вычисление времени цикла
			Local $CicleWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec)
			IniWrite("D:\eve.ini","Mined",_NowTime(5), "сброшен лут" & " Бука №" & $x & " Время цикла: "& $CicleWorked)
			$LootCount=$LootCount+1;счетчик сброшенного лута
		EndIf
	EndIf
	$CicleTime = TimerInit();засекаем длительность последующих циклов.
EndFunc
;================================





;++++++++++ узнаем номер белта по текущей координате y
Func checkbeltnum()
	Select
		Case $y=133
			$x=1
		Case $y=149
			$x=2
		Case $y=165
			$x=3
		Case $y=181
			$x=4
		Case $y=197
			$x=5
		Case $y=213
			$x=6
		Case $y=229
			$x=7
		Case $y=245
			$x=8
		Case $y=261
			$x=9
		Case $y=277
			$x=10
		Case $y=293
			$x=11
		Case $y=309
			$x=12
		Case $y=325
			$x=13
		Case $y=341
			$x=14
		Case $y=357
			$x=15
		Case $y=373
			$x=16
		Case $y=389
			$x=17
		Case $y=405
			$x=18
		Case $y=421
			$x=19
		Case $y=437
			$x=20
		Case $y=453
			$x=21
		
	EndSelect
EndFunc
;======================





;++++++++++ контроль возврата дронов
Func Dronecontrol()
Send ("!{2}")
;PixelSearch(1009, 644,1009, 644,0x010203,5);проверка открыто ли меню.когда не раскрыто - в этом пикселе точка черного цвета.
;If Not @error Then
MouseClick ("left",779, 648);раскрыть меню для анализа состояния
;	sleep(100)
;EndIf

While 1
Sleep (1000)
PixelSearch(938, 666,959, 669,0x404040)
	If @error Then
		ExitLoop
	EndIf
ToolTip("Ждем дрончегов!",0,0)

PixelSearch(844, 664,920, 671,0x00DC00,10)
;иногда после нажатия назначенной комбинации клавиш для возврата дронов,они просто прилетают к кораблю со статусом - не используется.проверяем.
	If Not @error Then
		ToolTip("сцуко зависли!",0,0)
		Sleep(2000)
		Send ("!{2}");если дроны висят,вместо того,чтобы возвратиться - послать команду еще раз.
		IniWrite("D:\eve.ini","Error",_Nowtime(5), "Дроны зависли" & " Бука №" & $x)
	EndIf
WEnd

ToolTip("Дроны вернулись!",0,0)
MouseClick ("left",779, 648);закрыть меню.можно раскомментить вначале функции проверку на раскрытость.проще просто закрыть.
Sleep (100)
EndFunc
;================



;++++++++++ контроль стрипов
Func StripChk($StrStatus)
Select
	Case $StrStatus = "On"
		PixelSearch(611, 650,612, 650,0x000000);проверка активности 1го стрипа
			If Not @error Then
					;If $do=1 Then
						ToolTip ("стрип 1 не включился - активирую...",0,0)
						IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не включился" & " Бука №" & $x)
						Send ("{f1}")
						Sleep (500)
					;EndIf
			EndIf
		PixelSearch(662, 650,663, 650,0x000000)
			If Not @error Then
				;If $do=1 Then
					ToolTip ("стрип 2 не включился - активирую...",0,0);проверка активности 2го стрипа
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не включился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(713, 650,714, 650,0x000000);проверка активности 3го стрипа
			If Not @error Then
				;If $do=1 Then
					ToolTip ("стрип 3 не включился - активирую...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не включился" & " Бука №" & $x)
					Send ("{f3}")
					Sleep (500)
				;EndIf
			EndIf

	Case $StrStatus = "Off"
		PixelSearch(611, 650,612, 650,0x000000);проверка на выключение 1го стрипа
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 1 не выключился - выключаю...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не выключился" & " Бука №" & $x)
					Send ("{f1}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(662, 650,663, 650,0x000000)
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 2 не выключился - выключаю...",0,0);проверка на выключение 2го стрипа
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не выключился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
				;EndIf
			EndIf
		PixelSearch(713, 650,714, 650,0x000000);проверка на выключение 3го стрипа
			If @error Then
				;If $do=1 Then
					ToolTip ("стрип 3 не выключился - выключаю...",0,0)
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не выключился" & " Бука №" & $x)
					Send ("{f3}")
					Sleep (500)
				;EndIf
			EndIf
EndSelect
EndFunc
;=======================

;++++++++++ проверка ближе дальше 10км
Func Chk10km()
	MouseClick("left",774, 183,1,20)
	Sleep(500)
	PixelSearch (828, 40,830, 44,0x8F8F8F,10);проверка диапазона пикселей между 2х значным XX числом километров и слова км.на наличие серого оттенка цвета(цвет чисел).
	If not @error Then;PixelSearch (836, 40,840, 44,0x8F8F8F,10) если появился нужный цвет в диапазоне,значит мы уже ближе 10км и представление цифр изменилось на XXXX м.
		$10kmChk="<10км"
	Else
		PixelSearch (943, 74,951, 87,0x8E8E8E,10)
		If @error Then
		$10kmChk=">10км"
		Else
		PixelSearch (836, 40,840, 44,0x8F8F8F,10)
		If @error Then
		$10kmChk="<10км"
		EndIf
		EndIf
	$10kmChk=">10км"
	EndIf
EndFunc
;========================

;++++++++++ Активность стрипов
Func StrpChk();проверяется по двум черным пикселям под 1ым модулем
	PixelSearch(611, 650,612, 650,0x000000)
	If Not @error Then
		$StripChk=0
	Else
		$StripChk=1
	EndIf
EndFunc
;========================


;++++++++++ проверка на наличие астероидов на белте
Func AsterChk()
	PixelSearch(926, 177,1005, 267,0xB1B1B1,10)
	If Not @error Then
		$AsterChk=1
	Else
		$AsterChk=0
	EndIf
EndFunc
;========================


;++++++++++ проверка цели на лок
Func LockCheck()
	PixelSearch(621, 80,636, 80,0x404040,10)
	If not @error Then
		$LockChk=1
	Else
		$LockChk=0
	EndIf
EndFunc
;===============================


;++++++++++ проверка на заполненность трюма
Func CargoCheck()
	PixelSearch (279, 617,279, 617,0x005067,10);проверка на наличие синего цвета.если есть,то заполнен.
	If Not @error Then
		$CargoChk=1
	Else
		$CargoChk=0
	EndIf
EndFunc
;==================================
;++++++++++ функция проверки окончания варпа
Func CheckWarp() 
	PixelSearch (425, 527,425, 527,0xBCBCBC,10);проверяется левый верхний пиксель буквы Г в слове Гиперпрыжок :)пока он есть мы в гиперпрыжке.
	If @error Then
		$WarpChk=0
	Else
		$WarpChk=1
	EndIf
EndFunc

;=============================


;++++++++++ проверка на космос
Func CheckSpace()
		PixelSearch(3, 713,29, 728,0xFFD342,10)
		If Not @error Then;- мы находимся в доке.
			$SpaceChk="Док"
		Else
			PixelSearch(737, 122,737, 122,0xCFCFCF,10);ищем треугольник овервью
			if not @error Then ;- мы находимся в космосе.
				$SpaceChk="Космос"
			Else
				$SpaceChk="Загрузка...";меню загрузки
			EndIf
		EndIf
EndFunc
;======================================


;++++++++++ проверка на процесс(загрузка в док)
Func CheckProcess()
	PixelSearch(436, 555, 436+100, 555, 0xB3B3B3, 10)
		If Not @error Then 
			$ProcChk="процесс..."
		Else
			$ProcChk="-"
		EndIf
	EndFunc
;======================================
	
	
	
;++++++++++ проверка - сброшен лут или нет.
Func FullEmptyCheck()
	PixelSearch (186, 618,186, 618,0x041115,10)
	If Not @error Then
		$FullEmptyCheck="Нет"
	Else
		$FullEmptyCheck="Есть"
	EndIf
EndFunc
;=================================

;++++++++++ функции проверки конво
Func ConvoCheck()
	If Check1()=1 Or Check2()=1 Or Check3()=1 Then ;3 проверки на конво,если вдруг срабатывает любая- принтскрин и загрузка громкой мелодии :)
		ShellExecute ("D:\Autoit\proekts\1.mp3")
                _pause()
		;_exitgame()
		;_exit()
	EndIf
EndFunc
	
	Func Check1()
		PixelSearch (303, 172,819, 581,0xFFA600,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 1")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check2()
		PixelSearch (303, 172,819, 581,0x6284AF,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 2")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check3()
		PixelSearch (303, 172,819, 581,0x0064C0,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 3")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc
;========================


;++++++++++ функции горячего переключения белтов
Func BeltPlus()
		$y=$y+16
EndFunc
Func BeltMinus()
	$y=$y-16
EndFunc
;========================


Изменил расположение внутри овервью.скрин в спойлере.
6e7036129a71.jpg
 

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

совет, максимально быстро сделать использование дронов опциональным)) хотябы через чтение инифайла, типа вот так
Код:
USE_DRON=1
и при необходимости пользования дронами запрашивать это значение, а то выкладывание (и поддержка) 2 версий бота както режет глаз))
И да, првязка к треугольникам, она нужна. очень дико видеть координаты в виде цифр, а не переменных, темболее что функции автоматического поиска координат овервью, меню, итд я выкладывал.
Прикрути еще скан локала, и тогда бот будет полезен в нулях.
ЗЫ малаца на самом деле, виден прогресс.
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Версия 2.25
Изменения:
1.Добавил в лог - средняя длительность цикла.Делится все время работы бота на количество сбросов лута.Также эти данные отображаются в тултипе.
2.Убрал линейность функции док+поставил проверку-при попытке дока возле станции меню короче на 1 пункт и строка док находится в другом месте.сделал определение.теперь в любом месте при активации дока - кнопка нажмется правильно.
3.Теперь нажав горячую клавишу стрелку вверх - активируется и деактивируется работа дронов.по умолчанию активны.также это можно прописать в eve.ini ,кот.создается на диске d: в корне при запуске бота.в этом же файле лежит лог бота.
4.Нажав горячую клавишу стрелку вниз - выбирается реакция на конво - либо выход ,либо мp3.и конечно можно дописать что-то свое :blum: по умолчанию стоит реакция - мp3.
5.Реализовал показ статуса текущего действия или процесса тултипом через Adlib теперь во всем скрипте только один тултип,адлиб считывает всегда актуальные параметры из переменных.

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\icons\иконки устройств\1013.ico
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Date.au3>
Opt("TrayIconDebug", 1)
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt ("MouseClickDelay", 20);Задаем интенсивность нажатия мыши.
Opt ("SendKeyDownDelay", 100)
HotKeySet ("{`}","_exit");задаем горячую клавишу остановки скрипта
HotKeySet ("{\}","_pause")
HotKeySet ("{RIGHT}","BeltPlus");горячая клавиша изменения номера белта в процессе работы бота +
HotKeySet ("{LEFT}","BeltMinus");горячая клавиша изменения номера белта в процессе работы бота -
HotKeySet("{UP}","DroneUse");активировать,деактивировать работу дронов.
HotKeySet("{DOWN}","ConvoSwitch");выбрать реакцию на конво mp3 или выход из игры.
WinMove("EVE", "", -3, -27)

;+++ Шапка +++
Global $Status="#";это переменная текущего действия или процесса.
Global $NearDockWarp=0;после разгруза возле станции.ситуация - нет астеров-> белт+1,летим на белт.чтобы избежать этого информ.логику просто варпаться после разгруза.
Global $Dock=0;ситуация при прилете к станции-нет астероидов-->летим на белт.чтобы избежать этого информируем логику ждать дока,а не варпаться.
Global $MidCicleTime[4];средняя длительность цикла
Global $CicleWorked=0;длительность последнего цикла
Global $ConvoExe=1;ставим по умолчанию срабатывание mp3 при срабатывании проверки конво
Global $DroneUse=IniRead("D:\Eve.ini","Drone","Use","Да");использовать ли боту дронов в процессе.
Global $MidCicleTime
Global $ProcChk;процесс
Global $RndStrp;рандомная длительность активности стрипа
Global $all;все в одной переменной.пока не используется
Global $FullEmptyCheck;проверка на наличие любого лута,если на станции
Global $SpaceChk;проверка на космос.
Global $WarpChk;проверка на варп
Global $Belt;состояние возможности майнить на белте.
Global $CargoChk;переменная заполненности трюма
Global $10kmChk;переменная проверки 10км
Global $AsterChk;переменная наличия астероидов на буке
Global $LockChk;переменная лока
Global $StripChk;переменная активности стрипов
Local $StrpTimer;переменная таймера работы стрипа
Global $LootCount=0;счетчик количества сбросов лута за время работы бота.
Global $DrChk;счетчик для вычисления кликов мышью.если только прилетели на белт полный набор кликов для запуска дронов и активации майна ими.
Global $pause
Global $CicleTime;переменная длительности цикла
Global $timer = TimerInit();таймер общей работы скрипта
Dim $hour,$min,$sec
Global $y=133;координата Y в меню бук.
Global $x;Номер буки
;===================================


WinActivate("EVE");активируем окно с евой
WinWaitActive("EVE");Ждем активированное окно с евой
checkbeltnum();рассчитываем номер белта по текущей координате $y
IniWrite("D:\eve.ini","Script", _NowCalc(),"Start,Belt №" & $x)
$CicleTime = TimerInit();засекаем длительность 1 цикла.
AdlibRegister("Status")
While 1
Mine()
Wend






;++++++++++ Логика ====================================================================
;======================================================================================
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Func Mine()
While 1
	AllChecks()
	Select
		Case $SpaceChk="Загрузка..." or $ProcChk="процесс..." or $WarpChk=1
			Sleep(100)
		Case $SpaceChk="Док"
			If $FullEmptyCheck="Есть" Then
				OreToHome()
			Else
				Undock()
			EndIf
		Case $CargoChk=1
			If $Dock=1 Then
				$Status="Жду док..."
				Sleep(300)
			Else
				If $DroneUse="Да" Then
					Dronecontrol()
				EndIf
				Dock()
			EndIf
		Case $AsterChk=0;если белт не ботабельный,то летим дальше...
			If $Dock=1 Then
				$Status="Жду док..."
				Sleep(300)
			EndIf
			If TimerDiff($CicleTime)<=30000 or $NearDockWarp=1 Then;если бот только запустился или только андокнулся,то полетев на белт не плюсуем $y=$y+16
				WarpToBelt()
			Else
				$y=$y+16
				If $DroneUse="Да" Then
				Dronecontrol()
				EndIf
				If $y>454 Then
					_exitgame()
					_exit()
				EndIf
				WarpToBelt()
			EndIf
		Case $AsterChk=1;если белт ботабельный,то...
			If $LockChk=0 Then;если нет лока,то...
				$StrpTimer=0
				StripChk("Off");проверка выключены ли стрипы - иногда дроны съедают астер раньше стрипов и они продолж.работать.выключаем если так.
				Chk10km();проверка ближе или дальше 10км - так как для этого нужно кликнуть мышей - вывел из цикла проверок.
				If $10kmChk="<10км" Then;если астероид ближе 10км
					LockTarget();лочим
					If $DroneUse="Да" Then
						StartDrone();дроны атаке
					EndIf
				EndIf
				If $10kmChk=">10км" Then;если астеры ближе 10 км кончились.
					Sleep(5000)
					Chk10km();---- 	ЭТА ПОВТОРНАЯ ПРОВЕРКА НА ВСЯКИЙ СЛУЧАЙ.
					If $10kmChk="<10км" Then;если астероид ближе 10км
						IniWrite("D:\eve.ini","Error",_Nowtime(5), "Сработала повторная проверка" & " Бука №" & $x)
						LockTarget();лочим
						If $DroneUse="Да" Then
							StartDrone();дроны атаке
						EndIf
						;-----///-------
					Else
						$y=$y+16
						$Status="Меняю белт"
						If $DroneUse="Да" Then
							Dronecontrol();забираем дронов
						EndIf
						If $y>454 Then;проверяем кончились ли все 21 буки.если да,то...
							_exitgame();выходим из игры
							_exit();завершаем скрипт
						EndIf
						WarpToBelt();если не кончились буки - летим на следующую.
					EndIf
				EndIf
			EndIf
			If $LockChk=1 Then;если лок есть,то...
				If $StripChk=1 Then;если стрипы пашут,проверяем прошло ли от 25-30 сек.если прошло - остановить стрипы.
					StripChk("On")
					$Status="Грызу метеор"
					If	TimerDiff($StrpTimer)>=$RndStrp Then
						StripChk("On");проверка для всех стрипов,так как активность $StripChk проверяется по первому стрипу- иногда нужно выровнять.
						$Status="Выключаю стрипы"
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}")
						Sleep(2000)
					EndIf
				EndIf
				If $StripChk=0 Then;если стрипы не работают...
					$StrpTimer = TimerInit();активируем таймер,для проверки сколько работают стрипы.
						$Status="Включаю стрипы"
						Send ("{f1}")
						Send ("{f2}")
						Send ("{f3}");включаем стрипы
						$RndStrp=Random(30000,35000)
						MouseMove(774, 183);возвращаем мышку ближе к след.клику,чтобы потом не тратить на это время.
						Sleep(2000);иначе стрипы не успев включиться,могут выключиться.
				EndIf
			EndIf
		Case Else
			$Status="Неописанная ситуация!"
			Sleep(100)
	EndSelect
WEnd
EndFunc
;=================================================

;++++++++++ Проверки в одной функции
Func AllChecks()
	WinActivate("EVE")
	Sleep(100)
	CheckProcess()
	If $ProcChk="процесс..." Then
		Sleep(100)
		Return
	EndIf
	CheckSpace()
	If $SpaceChk="Загрузка..." Then
		Sleep(100)
		Return
	EndIf
	If $SpaceChk="Док" Then
		FullEmptyCheck()
		Sleep(100)
		Return
	EndIf
	CheckWarp()
	If $WarpChk=1 Then
		Sleep(100)
		Return
	EndIf
	checkbeltnum()
	CargoCheck()
	LockCheck()
	StrpChk()
	AsterChk()
	ConvoCheck()
EndFunc
;========================
Func Status()
	ToolTip("Белт №"&$x&"\Ср.длит.цикла="&$MidCicleTime[0]&"\Статус="&$Status,0,0)
EndFunc

;++++++++++ завершение работы скрипта + время работы скрипта
Func _exit()
	$Status="Завершение скрипта"
	Sleep(200)
	_TicksToTime((TimerDiff($timer)/$LootCount),$MidCicleTime[1],$MidCicleTime[2],$MidCicleTime[3])
	If $LootCount=0 Then
		$MidCicleTime[0]="-"
	Else
	$MidCicleTime[0]=StringFormat("%02d:%02d:%02d", $MidCicleTime[1],$MidCicleTime[2],$MidCicleTime[3])
	EndIf
	_TicksToTime(TimerDiff($timer),$hour,$min,$sec)
	$ScriptWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec)
	IniWrite("D:\eve.ini","Script",_NowCalc(), "Stop,Belt №" & $x &" -- "& "Время работы: "& $ScriptWorked & ", лут сбросил: " & $LootCount&" раз."&" \Цикл в среднем="&$MidCicleTime[0])
	Exit
EndFunc
;==============


;++++++++++ пауза
Func _pause()
	$pause=$pause+1
while $pause=1
	$Status="Пауза..."
WEnd
$Status="Снята пауза..."
Sleep(200)
$pause=0
EndFunc
;=======

;++++++++++ активация деактивация дронов
Func DroneUse()
	Select
		Case $DroneUse="Да"
			$DroneUse="Нет"
			$Status="Дроны деактивированы"
			Sleep(200)
			IniWrite("D:\Eve.ini","Drone","Use","Нет")
		Case $DroneUse="Нет"
			$DroneUse="Да"
			$Status="Дроны активированы"
			IniWrite("D:\Eve.ini","Drone","Use","Да")
			Sleep(200)
	EndSelect
EndFunc
;=======



;++++++++++ функция полета на белт
Func WarpToBelt()
	$Status="Варпаюсь на белт"
	MouseClick ("left",62, 47,1,20);клик на треугольник
	MouseMove(120, 52,20);плавно ведем мышь по меню
	MouseMove(120, 133,20)
	MouseMove(240, 133,20)
	;доводим до списка бук белтов - эти первые 3 операции с мышью
	;для всех белтов одинаковы
	MouseMove(240, $y,20);доводим до 1го белта в списке(разница в 16 пикселей)
	MouseClick("left",340, $y,1,20);
	;PixelSearch(839, 7,847, 15,0x868686,10)
	;;If Not @error Then
	;	Send("{F11}")
	;EndIf
	Sleep(4000);ожидание Гипердрайв активен.
	$DrChk=0
	CheckWarp()
	If $WarpChk=1 Then
		$NearDockWarp=0
	EndIf

EndFunc
;=============================





;++++++++++ выход из игры - до этого док и сброс лута.
Func _exitgame();если белты с дистанцией менее 10км к астероиду кончились - выйти из игры.
	Dock()
	OreToHome()
	Send ("{esc}")
	sleep (4000)
	MouseClick ("left",851, 606,1,20)
	IniWrite("D:\eve.ini","Game Exit - кончились буки",_NowCalc(),"Stop,Belt №" & $x)
	Return
EndFunc

;======================================


;++++++++++ Полет домой если заполнен трюм
Func Dock()
	;если трюм заполнился - летим домой
	$Status="Докаюсь"
	MouseClick ("left",62, 47,1,20);клик на треугольник`
	MouseMove (123, 56,20);аккуратно ведем мышь
	MouseMove (123, 157,20);дом
	MouseMove (223, 157,20);додвигаем до начала меню дом
	Sleep(300)
	PixelSearch(204, 239,428, 250,0x8E8E8E,10)
	If Not @error Then
		MouseClick ("left",223, 207,1,20);4й пункт 1й буки
		sleep (4000)
		CheckWarp()
		If $WarpChk=1 Then
			$dock=1
		EndIf
	Else
		MouseClick ("left",223, 190,1,20);3й пункт 1й буки - если мы возле станции
		If $NearDockWarp=1 Then
			Sleep(20000)
		EndIf
		$dock=1
	EndIf
EndFunc
;======================================

;++++++++++ вылет со станции.
Func Undock()
	$Status="Андок"
	MouseClick("left",17, 735);щелчок на андок
	$Dock=0
	$NearDockWarp=1
EndFunc
;======================================





;++++++++++ Лок + Активация дронов
Func LockTarget()
	$Status="Лочу цель"
	MouseClick ("left",879, 76);жмем кнопку лока цели
	;активация дронов ниже занимает чуть больше времени лока
	If $DroneUse="Нет" Then
		Sleep (2500)
	EndIf
EndFunc

Func StartDrone()
	$Status="Запускаю дронов"
	If $DrChk=0 Then
		MouseClick ("right",779, 628);меню дронов
		sleep(200)
		MouseClick ("left",806, 654);запустить дронов
		Sleep (3000)
		MouseClick ("right",779, 648);меню дронов
		sleep(500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
		$DrChk=$DrChk+1
	Else
		MouseClick ("right",779, 648);меню дронов
		sleep(2500)
		MouseClick ("left",808, 695);непрерывно разрабатывать
		sleep(100)
	EndIf
EndFunc
;===========================


;++++++++++ кусок сброса лута
Func OreToHome();функция сбрасывания руды на станцию
	Sleep (3500)
    $Status="Сбрасываю лут"
	MouseClick("left",150, 597,1,20)
	Send ("^a")
	MouseClickDrag ("left",63, 665,83, 366,20)
	Sleep (2000)
	FullEmptyCheck()
	If $FullEmptyCheck="Нет" Then;прописываем данные только тогда,когда пусто.
		If TimerDiff($timer)>=60000 Then;для того,чтобы если вначале старта бота есть лут в карго - не считалось за сброс за цикл.
			_TicksToTime(Int(TimerDiff($CicleTime)),$hour,$min,$sec);вычисление времени цикла
			$CicleWorked=StringFormat("%02d:%02d:%02d", $hour,$min,$sec)
			IniWrite("D:\eve.ini","Mined",_NowTime(5), "сброшен лут" & " Бука №" & $x & " Время цикла: "& $CicleWorked)
			$LootCount=$LootCount+1;счетчик сброшенного лута
			_TicksToTime((TimerDiff($timer)/$LootCount),$MidCicleTime[1],$MidCicleTime[2],$MidCicleTime[3])
			If $LootCount=0 Then
				$MidCicleTime[0]="-"
			Else
			$MidCicleTime[0]=StringFormat("%02d:%02d:%02d", $MidCicleTime[1],$MidCicleTime[2],$MidCicleTime[3])
			EndIf
			$CicleTime = TimerInit();засекаем длительность последующих циклов.
		EndIf
	EndIf

EndFunc
;================================





;++++++++++ узнаем номер белта по текущей координате y
Func checkbeltnum()
	Select
		Case $y=133
			$x=1
		Case $y=149
			$x=2
		Case $y=165
			$x=3
		Case $y=181
			$x=4
		Case $y=197
			$x=5
		Case $y=213
			$x=6
		Case $y=229
			$x=7
		Case $y=245
			$x=8
		Case $y=261
			$x=9
		Case $y=277
			$x=10
		Case $y=293
			$x=11
		Case $y=309
			$x=12
		Case $y=325
			$x=13
		Case $y=341
			$x=14
		Case $y=357
			$x=15
		Case $y=373
			$x=16
		Case $y=389
			$x=17
		Case $y=405
			$x=18
		Case $y=421
			$x=19
		Case $y=437
			$x=20
		Case $y=453
			$x=21

	EndSelect
EndFunc
;======================





;++++++++++ контроль возврата дронов
Func Dronecontrol()
$Status="Забираю дронов"
Send ("!{2}")
;PixelSearch(1009, 644,1009, 644,0x010203,5);проверка открыто ли меню.когда не раскрыто - в этом пикселе точка черного цвета.
;If Not @error Then
MouseClick ("left",779, 648);раскрыть меню для анализа состояния
;	sleep(100)
;EndIf

While 1
Sleep (1000)
PixelSearch(938, 666,959, 669,0x404040)
	If @error Then
		ExitLoop
	EndIf
$Status="Ждем дрончегов!"

PixelSearch(844, 664,920, 671,0x00DC00,10)
;иногда после нажатия назначенной комбинации клавиш для возврата дронов,они просто прилетают к кораблю со статусом - не используется.проверяем.
	If Not @error Then
		$Status="сцуко дроны зависли,повторяю команду возврата"
		Sleep(2000)
		Send ("!{2}");если дроны висят,вместо того,чтобы возвратиться - послать команду еще раз.
		IniWrite("D:\eve.ini","Error",_Nowtime(5), "Дроны зависли" & " Бука №" & $x)
	EndIf
WEnd
$Status="Дроны вернулись!"
MouseClick ("left",779, 648);закрыть меню.можно раскомментить вначале функции проверку на раскрытость.проще просто закрыть.
Sleep (100)
EndFunc
;================



;++++++++++ контроль стрипов
Func StripChk($StrStatus)
Select
	Case $StrStatus = "On"
		PixelSearch(611, 650,612, 650,0x000000);проверка активности 1го стрипа
			If Not @error Then
						$Status="стрип 1 не включился - активирую..."
						IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не включился" & " Бука №" & $x)
						Send ("{f1}")
						Sleep (500)
			EndIf
		PixelSearch(662, 650,663, 650,0x000000)
			If Not @error Then
					$Status="стрип 2 не включился - активирую...";проверка активности 2го стрип
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не включился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
			EndIf
		PixelSearch(713, 650,714, 650,0x000000);проверка активности 3го стрипа
			If Not @error Then
					$Status="стрип 3 не включился - активирую..."
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не включился" & " Бука №" & $x)
					Send ("{f3}")
					Sleep (500)
			EndIf

	Case $StrStatus = "Off"
		PixelSearch(611, 650,612, 650,0x000000);проверка на выключение 1го стрипа
			If @error Then
					$Status="стрип 1 не выключился - выключаю..."
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 1 не выключился" & " Бука №" & $x)
					Send ("{f1}")
					Sleep (500)
			EndIf
		PixelSearch(662, 650,663, 650,0x000000)
			If @error Then
					$Status="стрип 2 не выключился - выключаю...";проверка на выключение 2го стрипа
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 2 не выключился" & " Бука №" & $x)
					Send ("{f2}")
					Sleep (500)
			EndIf
		PixelSearch(713, 650,714, 650,0x000000);проверка на выключение 3го стрипа
			If @error Then
					$Status="стрип 3 не выключился - выключаю..."
					IniWrite("D:\eve.ini","Error",_Nowtime(5), "противофаза - стрип 3 не выключился" & " Бука №" & $x)
					Send ("{f3}")
			EndIf
EndSelect
EndFunc
;=======================

;++++++++++ проверка ближе дальше 10км
Func Chk10km()
	MouseClick("left",774, 183,1,20)
	Sleep(500)
	PixelSearch (828, 40,830, 44,0x8F8F8F,10);проверка диапазона пикселей между 2х значным XX числом километров и слова км.на наличие серого оттенка цвета(цвет чисел).
	If not @error Then;PixelSearch (836, 40,840, 44,0x8F8F8F,10) если появился нужный цвет в диапазоне,значит мы уже ближе 10км и представление цифр изменилось на XXXX м.
		$10kmChk="<10км"
	Else
		PixelSearch (943, 74,951, 87,0x8E8E8E,10)
		If @error Then
		$10kmChk=">10км"
		Else
		PixelSearch (836, 40,840, 44,0x8F8F8F,10)
		If @error Then
		$10kmChk="<10км"
		EndIf
		EndIf
	$10kmChk=">10км"
	EndIf
EndFunc
;========================

;++++++++++ Активность стрипов
Func StrpChk();проверяется по двум черным пикселям под 1ым модулем
	PixelSearch(611, 650,612, 650,0x000000)
	If Not @error Then
		$StripChk=0
	Else
		$StripChk=1
	EndIf
EndFunc
;========================


;++++++++++ проверка на наличие астероидов на белте
Func AsterChk()
	PixelSearch(926, 177,1005, 267,0xB1B1B1,10)
	If Not @error Then
		$AsterChk=1
	Else
		$AsterChk=0
	EndIf
EndFunc
;========================


;++++++++++ проверка цели на лок
Func LockCheck()
	PixelSearch(621, 80,636, 80,0x404040,10)
	If not @error Then
		$LockChk=1
	Else
		$LockChk=0
	EndIf
EndFunc
;===============================


;++++++++++ проверка на заполненность трюма
Func CargoCheck()
	PixelSearch (279, 617,279, 617,0x005067,10);проверка на наличие синего цвета.если есть,то заполнен.
	If Not @error Then
		$CargoChk=1
	Else
		$CargoChk=0
	EndIf
EndFunc
;==================================
;++++++++++ функция проверки окончания варпа
Func CheckWarp()
	PixelSearch (425, 527,425, 527,0xBCBCBC,10);проверяется левый верхний пиксель буквы Г в слове Гиперпрыжок :)пока он есть мы в гиперпрыжке.
	If @error Then
		$WarpChk=0
	Else
		$WarpChk=1
		$Status="Варпаюсь"
	EndIf
EndFunc

;=============================


;++++++++++ проверка на космос
Func CheckSpace()
		PixelSearch(3, 713,29, 728,0xFFD342,10)
		If Not @error Then;- мы находимся в доке.
			$SpaceChk="Док"
		Else
			PixelSearch(737, 122,737, 122,0xCFCFCF,10);ищем треугольник овервью
			if not @error Then ;- мы находимся в космосе.
				$SpaceChk="Космос"
			Else
				$SpaceChk="Загрузка...";меню загрузки
				$Status="Загрузка"
			EndIf
		EndIf
EndFunc
;======================================


;++++++++++ проверка на процесс(загрузка в док)
Func CheckProcess()
	PixelSearch(377, 391, 646, 413, 0xB3B3B3, 10)
		If Not @error Then
			$ProcChk="процесс..."
			$Status="процесс"
		Else
			$ProcChk="-"
		EndIf
	EndFunc
;======================================



;++++++++++ проверка - сброшен лут или нет.
Func FullEmptyCheck()
	PixelSearch (186, 618,186, 618,0x041115,10)
	If Not @error Then
		$FullEmptyCheck="Нет"
	Else
		$FullEmptyCheck="Есть"
	EndIf
EndFunc
;=================================

;++++++++++ функции проверки конво
Func ConvoCheck()
	If Check1()=1 Or Check2()=1 Or Check3()=1 Then ;3 проверки на конво,если вдруг срабатывает любая- принтскрин и загрузка громкой мелодии :)
		If $ConvoExe=1 Then
			ShellExecute ("D:\Autoit\proekts\1.mp3")
			_pause()
		Else
			_exitgame()
			_exit()
		EndIf
	EndIf
EndFunc

	Func Check1()
		PixelSearch (303, 172,819, 581,0xFFA600,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 1")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check2()
		PixelSearch (303, 172,819, 581,0x6284AF,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 2")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc

	Func Check3()
		PixelSearch (303, 172,819, 581,0x0064C0,10)
		If Not @error Then
			IniWrite("D:\eve.ini","Convo",_NowCalc(), "Конво!!!сработала проверка 3")
			Send ("{PRINTSCREEN}")
			Return 1
		Else
			Return 0
		EndIf
	EndFunc
;========================


;++++++++++ функции горячего переключения белтов
Func BeltPlus()
		$y=$y+16
EndFunc
Func BeltMinus()
	$y=$y-16
EndFunc
;========================
;++++++++++ функция переключения реагирования на конво
Func ConvoSwitch()
	Select
		Case $ConvoExe=1
			$ConvoExe=0
			$Status="Реакция на конво = Выход"
			Sleep(300)
		Case $ConvoExe=0
			$ConvoExe=1
			$Status="Реакция на конво = MP3"
			Sleep(300)
	EndSelect
EndFunc
;========================
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Можно еще сделать работу не с "EVE" Окном, а с заданным окном, тоесть заменить везде где идет указание на окно "EVE" на переменную с идентификатором, или же "EVE - "&$CharName
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Ок.Бельф очень хочу,чтобы ты просмотрел хотя бы поверхностно скрипт и посоветовал что нибудь полезное еще(можно в личку - если секретно :blum:) :smile: Да и вообще все кто тестит и просматривает бота - буду рад услышать интересные предложения или как можно оптимизировать сам скрипт.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Сегодня - завтра гляну, ну или сегодня на работе если свободное время будет
114.gif
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

23-я строка: Global $MidCicleTime[4]
27-я строка: Global $MidCicleTime
---
40-я строка: Local $StrpTimer;переменная таймера работы стрипаGlobal $MidCicleTime
при таком определении эта переменная все равно будет видна везде где только можно.
---
48-я строка: Global $x;Номер буки
Не сразу вообще сообразил как работает checkbeltnum()
А чем тебе вот эти две функции не понравились?
Код:
Func _Then($Case1, $Case2=0, $Case3=0, $Case4=0) ;=============================================================================================================
    Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
    Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
    If Not WinActive($TarWinName) Then
        Wait(500)
        WinActivate($TarWinName)
        WinWaitActive($TarWinName)
    EndIf
    Select
        Case $Case1 = "Warp"
            ; @error = 1 Если была попытка варпануться в следующий или предидущий белт не побывав при этом ни в одном белте
            ; @error = 2 Если была попытка варпануться в белт используя не существующее условие $Case2 = "кокая-то х-ня"
            ; @error = 3 Если была попытка исползовать функцию Warp используя не существующее условие $Case1 = "кокая-то х-ня"
            Send("^r") ;Перезаряжаемся пока летим
            Select
                Case $Case2 = "Belt"
                    Select
                        Case $Case3 = "Warp"
                            ;Ранее должен быть с ГУИ считан номер белта в который надо прыгнуть
                            $CurBelt = Number(GUICtrlRead($MiniGUIInput_1))
                            If $CurBelt < $Belt[0] Then $CurBelt = $Belt[0]
                            If $Curbelt > $Belt[1] Then $Curbelt = $Belt[1]
                            Wait(500)
                            GUICtrlSetState($MiniGUIRadio[7], $GUI_UNCHECKED)
                            GUICtrlSetState($MiniGUIRadio[5], $GUI_CHECKED)
                        Case $Case3 = "Rand"
                            $CurBelt = Random($Belt[0], $Belt[1], 1)
                        Case $Case3 = "Next"
                            If $CurBelt > 0 Then
                                $CurBelt = $CurBelt + 1
                                If $CurBelt > $Belt[1] Then $CurBelt = $Belt[0]
                            Else
                                SetError(1)
                                Return
                            EndIf
                        Case $Case3 = "Prev"
                            If $CurBelt > 0 Then
                                $CurBelt = $CurBelt - 1
                                If $CurBelt < $Belt[0] Then $CurBelt = $Belt[1]
                                Else
                                SetError(1)
                                Return
                            EndIf
                        Case $Case3 >= $Belt[0] And $Case3 <= $Belt[1]
                            $CurBelt = $Case3
;~                             MsgBox(0,'',$CurBelt)
                        Case $Case3 = "Back"
                            If $CurBelt > 0 Then
;~                                 MsgBox(0,"",$CurBelt)
                                OpenMenu(1, $CurBelt, 1)
                                Return
                            Else
                                SetError(1)
                                Return
                            EndIf
                        Case $Case3 = "POS"
                            OpenMenu(5,1, 1)
;~                             Доработать
                            MouseClick("left", 376, 114, 1, 10)
                            GUICtrlSetState($MiniGUIRadio[8], $GUI_UNCHECKED)
                            GUICtrlSetState($MiniGUIRadio[5], $GUI_CHECKED)
                            Return
                        Case Else
                            SetError(2)
                            Return
                    EndSelect
;~                     TestMSG("Варпаюсь в "&$Case3)
                    OpenMenu(1, $CurBelt, 1) ;Варпаем в белт
                
                Case $Case2 = "Stop"
                    Wait(1000)
                Case Else
                    SetError(3)
            EndSelect

        Case Else
            TestMSG("Неверный ввод в функцию ToDo")
    EndSelect
EndFunc


Func OpenMenu($L1, $L2, $L3) ;Фишечка для работы с меню игры
    $L1 = $L1-1
    $L2 = $L2-1
    $L3 = $L3-1
    Local $x = Random($Options[1][0]-1, $Options[1][0]+1), $y = Random($Options[1][1]-1, $Options[1][1]+1)
    MouseClick("left", $x, $y, 1, 10)
    Wait(500)
    Local $var = PixelSearch($x, $y+8+15*$L1, $x+500, $y+8+15*$L1, 0xCDCDCD, 5);Ищим треугольник справа от строки на которую хотим ткнуть
    If Not @error Then ;если нашли
        MouseMove($var[0], $var[1], 5) ;наводим на него мышь и тем самым открываем второй уровень меню
        Wait(500)
        Local $var1 = PixelSearch($var[0]+50, $var[1]+15*$L2, $var[0]+500, $var[1]+15*$L2, 0xCDCDCD, 5) ;а5 ищим треугольник справа от строки на которую хотим ткнуть
        If Not @error Then ;если нашли
            MouseMove($var1[0], $var1[1], 5) ;наводим на него мышь и тем самым открываем третий уровень меню
            Wait(500)
            MouseClick("Left", $var1[0]+50, $var1[1]+15*$L3, 1, 5) ;Ну и таки жмакаем на команду на  которую хотели. Я буду работать только со строками варп в 0 и док, так что Warp to with in, изголяться и добавлять работу с 4-м уровнем меню я не стал
        Else
            SetError(2) ;Если мы ошиблись на 2-м уровне - возвращаем Еррор = 2
        EndIf
    Else
        SetError(1) ;Если ошиблись на первом уровне возвращаем Еррор = 1
    EndIf
EndFunc
Я вроде их выкладывал где-то с описанием, правда не в этом виде.

Ну, а так в принципе если работает, то уже неплохо. То что скрипт написан без рекурсии - уже хорошо. Если есть желание развить своего бота дальше и получить новые знания я бы посоветовал на данном этапе остановиться, создать новый файл и начать писать его снова. Я так часто делал, таким образом концепции построения логики и самих функций у меня менялись неоднократно :smile:.
P.S. Если не усну, вероятнее всего после ДТ начну новую тему, под названием "Самый оптимизированный и самый функциональный майнинг бот на триале". Ну типа конкурс :D. Ну и постараюсь описать его более внятно чем хантера :smile:.
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

27я строка - ошибка - нужно просто убрать эту строку.

с 40й неясно - это не критично,потому что у меня нет одинаковых переменных и без разницы какой она будет.А почему она будет видна везде,если я ее определил как Local?

checkbeltnum() просто проверяет по координате Y - номер буки.это скорее для информации.она не работает с меню.с меню работает Warptobelt()

по поводу 2х функций - можно,но проще было оставить как есть.все действия в одной функции это удобно,работа с меню тоже.но так как данный бот только и делает,что выбирает буки и больше ничего - решил не использовать openmenu.Как только мой чар докачается до хантера = буду писать с нуля,а там и openmenu можно включить и сделать в одной фунции все действия.да и скорее там будет два разных скрипта - один собирает данные,другой их обрабатывает и действует.

Я этого бота и переписывал почти с нуля,когда начинал делать умным.Пришлось перевернуть и переделывать весь код.Идея интересная - написать нового,но пока нет сильного энтузиазма делать так.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Про Local: Ты сделал ее локальной где? Ты ее локализовал не в отдельной функции а локализовал в самом теле скрипта, она локальна по всему скрипту. Попробуй локализовать переменную снаружи и использовать ее внутри функции и наоборот, первый вариант сработает а второй нет :smile:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Скопипастил код и начал подгонять под свой клиент... :smile:
Проверка на 10км. Сделал не по запятой... а по овервью (99 м) (9.999 м) (10 км) Везде "м/км" поэтому Просто ищем пиксели буквы "к"...
=> на один If/EndIf стало меньше.

Нет проверки на суицидников... (только называется настроил и запустил... как через 4 часа сбили рифтером... :shok: капсулу не убили) еще пол ночи капсула была на белте... (береги импланты с молоду... :whistle:smile:

Так же надо бы проверку на зависание бота... если он например одно и тоже действие пытается повторить 10-й раз... :smile: За час до того, как сбили он завис на каком-то из действий...

По букам... я так понял 21 буку это делается не на 21 белте... по 2-3 буки на белт... с разных сторон?

Бот копает только в 1 окно... А хочется в 2-3, но это более менее просто прикрутить. (дублируем переменные и добавляем логику проверяющую 2-е, 3-е, 4-е окно... + в начале нужно распределение по ID процессов.)

+Можно когда закончились белты в этой сисе... уйти в другую...

:IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1:
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

zlo-kazan сказал(а):
Нет проверки на суицидников... (только называется настроил и запустил... как через 4 часа сбили рифтером... :shok: капсулу не убили) еще пол ночи капсула была на белте... (береги импланты с молоду... :whistle:smile:
У моего ледоруба постоянно проверяется наличие модуля в лоу слоте. Если модуль не найден, значит я не в корабле - логоф и выключение скрипта. правда это было пока был вайдскрин, но и сейчас подобную проверку наверно можно устроить.
Насчёт яйца - сбитие яйца в империи понижает сек.статус гораздо сильнее чем сбитие шипа, потому имхо капсулы должны реже убивать.
Опять же есть проверка на цвет точки в квадратике на примерно 80% шилда. Если белая - всё нормально, если красная - делаем ноги (непись тоже бывает пилит, и если обычная не пробивает, то респ с фракционником).


zlo-kazan сказал(а):
Так же надо бы проверку на зависание бота... если он например одно и тоже действие пытается повторить 10-й раз... :smile: За час до того, как сбили он завис на каком-то из действий...
Моя методика - два скрипта. Один конкретно бот-добытчик, а второй - шедулер, надсмотрщик. Есть функция _Ping(), которая только и делает, что меняет время редактирования файла ping.txt. Запускается она в момент дока-андока, а также в момент, когда количество груза в трюме изменилось на большее. Для ледоруба получается примерно раз в 5 минут. Надсмотрщик следит за временем изменения пингового файла, и если он изменялся, давнее чем Н минут (для ледоруба поставил 10), значит наш бот где-то завис. Убиваем скрипт бота, убиваем клиент (потому что бот зависает при рестарте клиента на дисконнекте), запускаем процедуру логина, после запускаем бот, обновляем пинговый файл (ведь у него время уже больше предела), надзираем дальше.

zlo-kazan сказал(а):
По букам... я так понял 21 буку это делается не на 21 белте... по 2-3 буки на белт... с разных сторон?
Для майнера... Когда я делал нубомайнера, я сделал так. У меня на белты всего 1 бука. Бот прыгает на буку. Если ближайший астероид дальше 150 км (это если он белт сменил, на новом ведь буки нет), то он варпает к астеру, или вариант два - если до астера больше 10 (15, зависит от типа лазеров) км, причём значительно (каждый сам решает насколько), удаляем старую буку, делаем новую на астер, реварп. Если расстояние незначительно больше предела лазеров, подползаем на расстояние удара, но буку всё-равно меняем, чтоб каждый раз не подползать.

zlo-kazan сказал(а):
Бот копает только в 1 окно... А хочется в 2-3, но это более менее просто прикрутить. (дублируем переменные и добавляем логику проверяющую 2-е, 3-е, 4-е окно... + в начале нужно распределение по ID процессов.)
Дублируем? Я бы делал просто массив. Тогда гораздо проще будет прикрутить ещё 1-2-3-10 окон при случае.
ID процессов? Зачем? Если можно в опциях евы поставить отображение в заголовке не просто EVE, а EVE - char name. И просто по заголовкам переключаться. А в начале просто по-очереди запустить для каждого от начала и до конца функцию логина (к примеру).
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Нет проверки на суицидников... (только называется настроил и запустил... как через 4 часа сбили рифтером... :shok: капсулу не убили) еще пол ночи капсула была на белте... (береги импланты с молоду... :whistle:smile:
нету.я не ставил дорогие модули и нахожусь в низконаселенной системе - поэтому не нужно было.

Так же надо бы проверку на зависание бота... если он например одно и тоже действие пытается повторить 10-й раз... :smile: За час до того, как сбили он завис на каком-то из действий...
можно поставить.даже не представляю где может зависнуть.хотя...разве только на буках.Если ты последовательно выставил буки на один и тот же белт,тогда да.Можно либо выставить по разному белты,либо поставить проверку.Бот тестирован(именно эта версия) много ночей - зависаний ни разу не было.А еще могут грохнуть - это да.подумаю.

По букам... я так понял 21 буку это делается не на 21 белте... по 2-3 буки на белт... с разных сторон?
да.вначале я сделал аппруч и увидел ,что он не эффективен.1.это потеря времени. 2.халк может запутаться в астероидах - при варпе особенно.
летишь с одного края на быстром фриге и выбираешь ,чтобы бука охватывала как можно больше астеров в радиусе 10км.затем летишь дальше 21 км и ставишь буку там.

+Можно когда закончились белты в этой сисе... уйти в другую...
Можно конечно.Опять же необходимости не возникало.21 буки с головой хватает,если ты в малонаселенной системе.

Бот копает только в 1 окно... А хочется в 2-3, но это более менее просто прикрутить. (дублируем переменные и добавляем логику проверяющую 2-е, 3-е, 4-е окно... + в начале нужно распределение по ID процессов.)
да.об этом я думаю,пока сильного желания нет копаться в боте.Может позже добавлю. Буду думать.

P.S.В последнем патче изменились некоторые элементы интерфейса.например,теперь док находится в другом месте меню.Теперь вместо надписи Гипердрай активен,появляется надпись Режим скольжения - соотвественно в боте нужно переопределить маусклики и пиксельсерчи.это функции Dock и CheckWarp.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Уроды со своими патчами уже заколебали!!!
104.gif
 

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

На след недельке думаю очередной патч выйдет - будут править вылезшие проблемы. У меня после этого патча стали залипать модули до того момента как их передвинешь на другой слот в меню Ф1-Ф8. Кстати, теперь сокорпы отображаются как соалийцы - синей звездой.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

2-й день копает более менее нормально, но стабильно раз в 3-4 часа виснет... причем в разных местах... последний раз перед доком перебирал несуществующие буки... при том, что вроде. как астероиды не кончились... Подумываю увеличить чуть-чуть паузы между действиями... возможно в этом проблема... EVE может иногда подлагивать...
Буки пока использую две и на разных белтах. копаю нубо-шипом... отлаживаю... 3 халка с дронами появятся где-то дней через 10...

SirMaksFromEho
Про массивы только подумал и читаю у тебя... :smile:) думаю в ноябре... когда соберу систему с core i7... можно будет попробовать максимально возможное количество окон запустить...
Надсмотрщика тоже напишу... чуть погодя... в планах сделать систему копающую 23/7 на отдельном компьютере... на который не нужно будет обращать внимания... (хотя думаю оставлю возможность зайти на него удаленно)... Нужно будет уезжать на 5-7 дней... Хотя думаю от нового патча систему не спасти... :blum:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

zlo-kazan сказал(а):
2-й день копает более менее нормально, но стабильно раз в 3-4 часа виснет... причем в разных местах... последний раз перед доком перебирал несуществующие буки... при том, что вроде. как астероиды не кончились... Подумываю увеличить чуть-чуть паузы между действиями... возможно в этом проблема... EVE может иногда подлагивать... Буки пока использую две и на разных белтах. копаю нубо-шипом... отлаживаю... 3 халка с дронами появятся где-то дней через 10... SirMaksFromEho Про массивы только подумал и читаю у тебя... :smile:) думаю в ноябре... когда соберу систему с core i7... можно будет попробовать максимально возможное количество окон запустить... Надсмотрщика тоже напишу... чуть погодя... в планах сделать систему копающую 23/7 на отдельном компьютере... на который не нужно будет обращать внимания... (хотя думаю оставлю возможность зайти на него удаленно)... Нужно будет уезжать на 5-7 дней... Хотя думаю от нового патча систему не спасти... :blum:
Исходя из твоей логики, ты таки на всех порах мчишься к внеочередному бану
ungry.png
 
Автор
yaodnako

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

2-й день копает более менее нормально, но стабильно раз в 3-4 часа виснет... причем в разных местах... последний раз перед доком перебирал несуществующие буки... при том, что вроде. как астероиды не кончились... Подумываю увеличить чуть-чуть паузы между действиями... возможно в этом проблема... EVE может иногда подлагивать...
Буки пока использую две и на разных белтах. копаю нубо-шипом... отлаживаю... 3 халка с дронами появятся где-то дней через 10...
Ты если пишешь о зависании - то пиши конкретно и проверяй свои догадки,иначе так и будет виснуть дальше.Скорее всего именно поэтому и повис - ведь у тебя всего 2 буки,и когда он их съел,он автоматически перескакивает на следующую.А ее у тебя нет.У меня на последней буке стоит выход из игры - рекомендую тебе сделать также.А еще проверь все пиксельсёчи - если у тебя хоть один датчик периодически врет - то бот будет виснуть и неправильно себя вести в ситуации.+добавь бук больше.Даже если не ты съел участок белта - это может сделать халк соседа :smile:

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

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Re: Нубский Майнер Бот(замкнутая вермишель) -->умный бот.

Belfigor сказал(а):
Исходя из твоей логики, ты таки на всех порах мчишься к внеочередному бану
ungry.png
Думаю все-таки получится его избежать... :smile:) в разное время разными аками.... в разных сисах... :smile: Пока только тестю... триалами по 51 дню.. :smile:) В принципе ничего не теряю... :smile:
Можно всяких оповещалок прикрутить в ICQ и т.д. :smile:

yaodnako сказал(а):
Ты если пишешь о зависании - то пиши конкретно и проверяй свои догадки,иначе так и будет виснуть дальше.Скорее всего именно поэтому и повис - ведь у тебя всего 2 буки,и когда он их съел,он автоматически перескакивает на следующую.А ее у тебя нет.У меня на последней буке стоит выход из игры - рекомендую тебе сделать также.А еще проверь все пиксельсёчи - если у тебя хоть один датчик периодически врет - то бот будет виснуть и неправильно себя вести в ситуации.+добавь бук больше.Даже если не ты съел участок белта - это может сделать халк соседа :smile:

Слипы я очень долго подбивал и в том месте где он мог реально ошибится из за лага,я добавил еще одну проверку - это проверка на наличие ближе 10км астера,так как иногда из-за лага не успевает считать и даже это происходит крайне редко.Если ты конечно сам не уменьшил нек.задержки.Поэтому слипы врядли исправят дело - этот бот анализирует текущую ситуацию и действует исходя из этой ситуации,он не работает линейно,здесь нет переходов на этапы,при которых он может не успеть перейти из-за слипа и зависнуть.Ищи проблему у себя...
Повторюсь... отлаживаю нубо-шипом в 1 цивилиан модуль... он при всем желании белт не сгрызет... :smile: Проверку 2-3 стрипов отключил... все пиксель серчи до и после патча перепроверил... Астеройды есть всегда... Дешевыми солидами залетные халки брезгуют... :smile: Подумываю пока на время зациклить буки... задержки не менял. Проблема 100% у меня ))) потом дома буду следить и отловить момент глюка... (сейчас на работе... за ботом слежу по удаленке)
 
Верх