Что нового

Майнер бот, от вермишели до ии

Ledary

Новичок
Сообщения
2
Репутация
0
Недавно познакомился с Autoit, прочитал много тем на форуме и решил что пора. ;D
Хочу предоставить вам своего бота хайсечного майнера, сделан был под вентурку, но и подкрутить его под скиф или макинаву будет не сложно.
Основная задача бота, вылететь, накопать, вернуться, сложить.
Варпает он по букам, на данный момент доступна только одна точка для копки (уже утром постараюсь подкрутить ещё десяток)
Очень надеюсь на советы, чего ему не хватает, какие части стоит подкрутить или оптимизировать.
Бот достатчнно туповат, не судите строго, это мой первый бот :smile:
Что сейчас он умеет:
* Андок, проверка в космосе ли он
* Варп, в варпе ли он, выход из варпа
* Подлёт к астеру на <10 км, остановка корабля
* Лок, проверка лока
* Выпустить, собрать дронов, проверить
* Начать копку, проверить локал, проверить броню, проверить состояние лока
* Отварп на станцию, проверка варпа, проверка выхода из варпа, проверка дока
* Проверка наличия меню, открыть меню, сбросить руду

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

Код:
Opt ("MouseClickDelay", 20); мышка
Opt ("SendKeyDownDelay", 100); кнопка
HotKeySet ("{`}","bot_exit");хот на стоп ; возникает проблема, если язык стоит рус, то бот не выключится, даже если язык поменять на нужный.
HotKeySet ("{\}","bot_pause");хот на паузу ; пока думаю как решить эту проблему (сделать на цифру?)
WinMove("EVE", "", 0, 0) ; подвину окошко к левому верх. краю



;---------------основа
while 1
WinActivate("EVE"); - Вывожу окно евы наперёд
WinWaitActive("EVE")
Undock() ; андок, проверка в космосе ли я
Sleep (1000)
WarpToBelt() ; варпа, проверка в варпе ли я, прилетел ли я
sleep(1000)
DropDrones() ; дроп дронов, проверка дроны ли в космосе
Sleep(1000)
Approach() ; апроч, проверка <10 км
Sleep(1000)
Lock() ; лок, проверка залочил ди
Sleep(1000)
Mine() ; копать, пока не сработает Alarm'a
Sleep(1000)
ScopeDrones() ; скопнуть дронов, проверить скопнул ли
Sleep(1000)
WarpToStan() ; варп к станке, проверка варпа, проверка вышел ли из варпа, проверка докнут ли я
Sleep(1000)
OreToStorage() ; проверка открыто ли окно руды, открыть окно с рудой (если не открыто), перекинуть руду, конец цикла
Sleep(1000)

Wend


Func bot_exit() ; выход из скрипта
    ToolTip("Отключаю бота..",0,0)
    Sleep(300)
    Exit
EndFunc

Func bot_pause() ; пауза, украдена у yaodnako :), работает отлично, сам недодумался
    $pause=$pause+1
while $pause=1
    ToolTip("Пауза...",0,0)
    Sleep(200)
WEnd
ToolTip("продолжаем...",0,0)
Sleep(200)
$pause=0
EndFunc
;=================================
Func Undock()
    WinActivate("EVE")
    WinWaitActive("EVE")
    Do
    ToolTip("Андокаю",508, 234)
    MouseClick("left",997, 150,1,20);щелчок на андок
    Sleep(500)
    ToolTip ("я на станции",508, 234)
    Until CheckSpace()=1
EndFunc
;======================================


;++++++++++ проверка на космос
Func CheckSpace()
        WinActivate("EVE")
        WinWaitActive("EVE")
        PixelSearch(776, 33,776, 33,0xFFFFFF,1);уголок обзорки
        if not @error Then
        ToolTip ("Андокнут, я в космосе",508, 234)
        return 1
        Else
        return 0
        EndIf
EndFunc

Func WarpToBelt()
   Do
	  WinActivate("EVE")
        WinWaitActive("EVE")
	  ToolTip("Варпану на белт",508, 234)
	  MouseClick("right",112, 230,1,20);пкм на буку в меню бук
	  MouseClick("left",198, 240,1,20);лкм на варпануть в 0

	  Sleep(3000)
   Until WarpCheck() = 1
   Do
	  ToolTip("Я варпаю",508, 234)
   Until EndWarp() = 0
EndFunc

Func WarpCheck() ; проверка варпа
   WinActivate("EVE")
        WinWaitActive("EVE")
   ToolTip("Ищу пиксель",508, 234)
   PixelSearch(513, 751, 513, 751,0x19252F,10);в полоске скорости проверка буквы 'i' когда там warping
   if Not @error Then
	  ToolTip("нашел пиксель, я варпаю",508, 234)
	  Return 1
   Else
	  Return 0
   EndIf
EndFunc

Func EndWarp()
   WinActivate("EVE")
        WinWaitActive("EVE")
   PixelSearch(513, 751, 513, 751,0x19252F,10) ;тот же пиксель, жду пока он пропадёт
   if Not @error Then
	  Return 1
   Else
	  Return 0
	  ToolTip("Я прилетел",508, 234)
	  MouseClick("left",747, 43,1,20) ;костыль, иногда пиксель не поределяет (определяет долго), сделал чтоб закрывал менюшку с инфо, потом подумаю
   EndIf								;что мне делать с ним.....
EndFunc

Func DropDrones()
   ToolTip("Дропаю дронов",508, 234)
   MouseClick("right",118, 396,1,20) ;пкм на дрон менюшку
   MouseClick("left", 186, 404,1,20) ; лкм на лаун дронов

   PixelSearch(79, 439,79, 439,0xD0D0D0,20) ; ищу треугольник слева от папки с дронами ('> Боевые (2)')
   Sleep(2000)
   if Not @error Then
	  ToolTip("Запустил дронов",508, 234)
   Else
	  ToolTip("Налажал, пробую снова",508, 234) ; тут перепроверка только раз, вроде как хватает, посже посмотрю что сделать ещё
	   MouseClick("right",115, 396,1,20)
   MouseClick("left", 186, 404,1,20)
   EndIf

EndFunc

Func Approach()
   Do
   ToolTip("апроч к астеру",508, 234)
   MouseClick("left",819, 239,1,20) ; клик на первый обьект в обзорке (обзорка настроена только на астеры)
   MouseClick("left",793, 110,1,20) ; клик на Approach к астеру
   Sleep(10000)
Until ApproachCheck() = 0
EndFunc

Func ApproachCheck()
   PixelSearch(891, 76,891, 76,0x777777,1) ; проверка верхушки буквы k  ("Distance 10 km")
   if Not @error then
	  ToolTip(">10 km",508, 234)
	  Return 1
   Else
	  MouseClick("left",455, 732,1,20) ; если меньше 10км, то остановить шип (кликает на -) (минус слева от скорости шипа)
	  ToolTip("Остановил шип",508, 234)
	  Return 0
	  EndIf
EndFunc

Func Lock()
   Do
   ToolTip("Лочу цель",508, 234)
   MouseClick("left",890, 107,1,21) ; кликает на кнопку лока
   MouseMove(522, 380,10) ; отодвигает мышку чтоб подсвечивать значок лока (там цвет менятся, вызывали уйму проблем)
   Sleep(5000)            ; возможно это достаточно убогий костыль, но я пока не придумал получше :(
Until LockCheck() =1;

EndFunc

Func LockCheck()
   PixelSearch(892, 109,892, 109,0xFD1010,20) ; проверяем красный пиксель в центре значка лока (когда залочен)
   if Not @error Then
	  ToolTip("Залочил цель",508, 234)
	  Return 1
   Else
	  Return 0
	  EndIf
   EndFunc

Func Mine()
   Send("{F1}")
   Sleep(Random(500,1000)) ; рандом :)
   Send("{F2}") ; запускает копалки, копает пока не звякнит одна из аларм
   Do
	  Sleep(3000)
	  ToolTip("Копаю...",0, 0)
   Until Alarm() = 1;
EndFunc

Func Alarm()
WinWaitActive("EVE")
   PixelSearch(128, 685, 128, 685, 0x004D63,10) ; карго фулл, синий пиксель в карго строке
   ;PixelSearch(55, 685, 55, 685, 0x004D63,10) ; тест карго (пустое карго),
   if Not @error Then
	  ToolTip("Карго фулл",508, 234)
	  Return 1
   EndIf
   PixelSearch(557, 678, 557, 678, 0xFF1F1F,10) ; красный пиксель в полоске хп (брони)
   if Not @error Then
	  ToolTip("Просела броня",508, 234)
	  Return 1
   EndIf
   PixelSearch(892, 109,892, 109,0xFD1010,20) ; слетел лок, использую как ультимативное средство (сьел астер, заджамили, убили)
   if @error then
	  ToolTip("Слетел лок",508, 234)
	  Return 1
   EndIf
   PixelSearch(574, 80, 574, 577,0x910202,10) ; враг в столбике локала (проискиваю красный пиксель в окне локала) (столб в 1 пиксель)
   if Not @error Then
	  ToolTip("Враг обнаружен!!!", 508,234)
	  Return 1

   EndIf
EndFunc


Func ScopeDrones()
  Do
   MouseClick("right",122, 439,1,20) ; пкм клик на папку с дроами
   MouseClick("left",172, 483,1,20) ; отправить в дрон бей
   Sleep(3000)
   ToolTip("Скупаю дронов", 508, 234)
   Until ScopeCheck() = 1

EndFunc

Func ScopeCheck()
 PixelSearch(79, 397,79, 397,0xD0D0D0,20) ; берём пиксель с треугольника слева от папки с дронами
 if Not @error Then
	ToolTip("Скупнул...", 508, 234)
	Return 1
 Else
	Return 0
	EndIf
EndFunc


Func WarpToStan()
   Do
WinActivate("EVE")
WinWaitActive("EVE")
	  ToolTip("Варпану на станку",508, 234)
	  Send("{F1}") ; отключает копалки
	  Send("{F2}")
	  MouseClick("right",146, 209,1,20);пкм в меню бук
	  MouseClick("left",180, 249,1,20);докнуть

	  Sleep(5000)
   Until WarpCheck() = 1 ; использую ранее сделаные части
   Do
	  ToolTip("Я варпаю",508, 234)
   Until EndWarp() = 0   ; так же
   Do
	  ToolTip("Докаюсь....",508, 234)
	  Until Docked() = 1
   EndFunc

Func Docked()
	  PixelSearch(1018, 367,1018, 367, 0xFFFFFF,20) ; проверяю пиксель шестерёнки, справа от поиска, вкладка "Guests" станции, если пиксель есть, значит докнут
	  if Not @error Then
		 ToolTip("Докнут.",508, 234)
		 Return 1
	  Else
		 Return 0
	  EndIf
EndFunc

Func OreToStorage()
  if CheckStorage() = 1 Then
   MouseClick("left",422, 338) ; костыль, иногда "сtrl + a" не работает, нажимает на центр склада
   Send("^a") ; выделить всё
   MouseClickDrag("left",245, 191, 113, 240,20) ; перетащить в item hangar
Else
   Do
   Send("!c")
   Sleep(2000)
Until CheckStorage() = 1
EndIf
EndFunc

Func CheckStorage()
   PixelSearch(173, 480,173, 480,0xFFFFFF,10) ; проверяет + справа от My Filters
   if Not @error Then
	  ToolTip("Склад открыт, всё норм", 508, 234)
	  Return 1
   Else
	  Return 0
   EndIf
EndFunc

Картиночка моего экрана с ботом (Window mode | 1024 x 768)
BCDVSwF.png

P.S. Знаю на счёт "а что если нейтрал уже в системе а ты варпанешь, т.к. чекер нейтрала стоит в майнер части", я думаю как это реализовать, добавлять к каждой функции чекер на врага я не хочу, это самый простой выход, но не лучший...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
1.gif
Эво куда тебя загнала нелегкая.
Архитектура должна заключаться не в последовательном выполнении действий, а в регулярном сборе актуальных данных, их анализе и приеме соответствующих решений на их основе. Любое действие которое умеет реализовать бот - бесполезно если для того чтобы понять что делать его не надо, бот должен попасть в определенную ситуацию. Бот должен уметь в любом месте очнуться и начать делать то, что требует та ситуация.
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
OffTopic:
EVE популярность опять набирает?
Вторая тема за сутки поднялась...

Мой тебе совет, хайсечный майнер...такое себе... ищи другие пути заработка.
Впрочем, если для поднятия скила в программировании на AUtoit, можно и с этого начать. Успехов.

А для чего во все боты пихают чекер нейтрала? Если бот копает в империи?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
Чтобы в будущем без проблем смасштабировать решение в сторону нулей.
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
Belfigor [?]
Чтобы в будущем без проблем смасштабировать решение в сторону нулей.

Ну вот, у меня плохо получается масштабировать...ну т.е. каждый бот пишется под свои задачи, логика у всех разная.
Понятно, что есть одинаковые функции и интегрировать их в любую структуру, достаточно просто...
OffTopic:
ну вот, очередное обновление, переписывать датчики:-((
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
Оно конечно так, многие функции специфичны и имеют свои тонкости, но когда я активно писал, я организовывал свой код модульно. Это позволяло собирать ботов как конструктор. Модули считвыания информации, модули выполнения действий, модули анализа информации. При этом каждый принимает на вход и выдает как результат - какие-то обстрактные данные, а что происходит внутри других модулей они не знали и им было это не нужно. Поэтому в случае если что-то менялось, даже кардинально, всё что оставалось - это сохранить неизвенными входящие и исходящие данные, а внутри - хоть взрывай :smile:. Ну + нейросети, им плевать на очень многие отклонения данных, они продолжают работать как работали. Например нейросеть с вероятностью 99% распознает иконки в прозрачном овервью, поэтому всякую графическую соль которую ццп постоянно добавляет в игру, я спокойно обходил уже много лет назад :smile:
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
Belfigor [?]
Пробовал освоить это направление, понял, что это колоссальная мощь...поделитесь каким-нибудь примитивным примером и библиотекой?!
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
Я писал полностью на AutoIt, чисто из акадимического интереса. Обучение работало медленно, но работало чисто силами AutoIt. Применение уже обученной сети происходило довольно резво. На то чтобы обучить сеть различать например иконки в овервью уходило пол дня :smile:. Постараюсь в ближайшие месяцы найти время на то чтобы восстановить код. Многое безвозвратно утеряно с годами.
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
Belfigor [?]
Постараюсь в ближайшие месяцы
Как-то...и торопить вроде не вежливо и месяцы...
Может сам принцип объясните, не могу сообразить, как "загружать" данные пикселей, и, или если не правильно то как именно происходит (на примере овервью) распознавание - обучение - загрузка...
Если бы знал, что именно хочу сказать, сказал бы точнее.=((
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
Семья, работа, даже на форум зайти удается не каждый день :smile:
Да и писать многое надо по памяти ввиду утери части оригиналов.
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
Belfigor
В общем раз в месяц пинать буду, ибо тема интересная.)
 

Belfigor

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


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

https://github.com/Belfi/AutoitNNBuilder репозиторий в котором я буду вести разработку нейросети. Найти исходники старые во вменяемом состоянии не удалось :(
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
Если всё будет по плану то к воскресенью там будет прототип работающий на датасэте MNIST
 

mr.Gbabak

Осваивающий
Сообщения
256
Репутация
23
А можно пару, вводных вопросов? (на примере EVE, так проще сформулировать, в овере будем определять тип корабля (грузовик)).
- Для этого нужно натренировать сеть, где, а вернее как в нее загрузить шаблон грузовика? (я так понимаю, данная сеть работает с яркостью, а не цветами?)
- Возможно ли одну сеть натренировать на распознавание различных типов кораблей (фригат, крузак, батл и.т.д.)
-допустим сеть уже натренированна: если грубо, то возможно ли в нее загрузить скрин овера, чтоб она посчитала количество и типы кораблей, или нужно каждый элемент отдельно распознавать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
mr.Gbabak [?]
я так понимаю, данная сеть работает с яркостью, а не цветами?
Сеть оптимизирована для работы с яркостью да. Для того чтобы обработать цветную шкалу RGB, состоящую из 3х цифр от 0 до 255 - понадобится в 3 раза больше операций чем для обработки шкалы оттенков черного и белого цвета, состоящей из одной цифры от 0 до 255
Для этого нужно натренировать сеть, где, а вернее как в нее загрузить шаблон грузовика?
Сеть нужно тренировать сразу на всех объектах которые она должна распознавать. При этом эти объекты должны подаваться в неё равномерными соотношениями, но перемешанными. Если например подать в сеть сначала 10000 иконок грузовика, а потом 10000 иконок фрегата, сеть не будет различать одинаково хорошо фригаты и грузовики, она будет везде, даже в белом квадрате видеть то что последним было подано в неё в большом количестве. Сеть будет "переучена" на один конкретный объект и не сможет функционировать.
Шаблон грузовика представляет собой иконку где сначала RGB конвертируется в яркость, а потом массив из двумерного выпрямляется в одномерный, в начале массива добавляется айдишник (целое число, начиная с 0) который будет говорить сети что это грузовик.
Возможно ли одну сеть натренировать на распознавание различных типов кораблей (фригат, крузак, батл и.т.д.)
Да, тренировка сети происходит именно так. Можно конечно натренировать на каждый корабль по своей отдельной сети и научить каждую отдельную сеть определять например что именно ей подали на вход, красную иконку, белую или синюю, но в таком случае на то чтобы идентифицировать одну единственную иконку, нужно будет поочередно активировать все сети пока хотябы одна не даст правильный результат.
Поэтому самым простым способом в начале будет обучить одну сеть идентифицировать различные иконки, а там дальше ничто не мешает строить сети решающие более мелкие, детализованные задачи, такие как например определение опасности для корабля исходящей от конкретной строки овервью.

допустим сеть уже натренированна: если грубо, то возможно ли в нее загрузить скрин овера, чтоб она посчитала количество и типы кораблей, или нужно каждый элемент отдельно распознавать?
Данная сеть для этого не подойдет, для идентификации предметов в поле зрения, именно идентификации, это когда сеть смотрит на картинку и говорит "вижу вот это, то, еще вот то, и то" нужны память если мне не изменяет сверточные сети. В рамках данного проекта работа со сверточными сетями производиться не будет.
Реализуемая в рамках проекта сеть сможет только определить по полученному изображению какую-то ситуацию. При этом чем меньше изображение тем проще будет работать сети. Если говорить об овервью, то в случае нахождения в нем 10 объектов, нужно будет захватить из него 10 иконок и 10 раз подать на вход нейросети.
Когда я закончу ветку с рефакторингом кода, я потихоньку начну делать гуй, чтобы облегчить работу с сетью, а после гуя уже проект будет в той стадии когда можно будет начинать работать с реальными данными.
 
Автор
Ledary

Ledary

Новичок
Сообщения
2
Репутация
0
Таки много времени уже прошло и чтоб никто не подумал что я забил, (немного таки забил, сделал себя чекеров для моих ророк, чтоб локал чекало, астер, дронов, непись и пищало на это всё дело, если будет интересно, могу поделиться) делаю небольшую темку с тем что я уже сделал и что собираюсь делать в будующем.
Почему нету промежуточных этапов, я считаю что в этом нет особого смысла, на форуме есть подобные моей теме и пока я могу найти там очень много полезной информации и лишний раз обьяснять мне отдельно думаю не есть необходимо :smile:
На счёт самого бота, он много что пережил, был некоторое время макароной, потом переехал на if и оттуда уже перешел на case, что в конечном итоге мне больше всего понравилось.
В итоге, он был переделал по совету белфи, теперь он полностью на чекерах, без макарон и if. Сейчас я выкладываю промежуточную стадию, в ней ещё нет самой главной, копательной функции и функции отстрела неписи, я их сейчас делаю, они во многом готовы, но работают не так как мне хотелось бы и я продолжаю работу в этом направлении.

Во многих местах есть двойные проверки и разные костыльки ;D, я ещё думаю как это подправить, очень надеюсь на совет)

Код:
HotKeySet("{End}","Bot_Exit") ; хот на отключение скрипта
HotKeySet("{Home}","Bot_Stop") ; хот на стоп
WinMove("EVE - ", "", -8, -30) ; подвину окошко к левому верх. краю ;  1440x900 - экран

Global $CharName = "char" ; имя чара

;------------Значения------------- (0 - False, 1 - True)
Global $pause = 0 ; для паузы
Global $Location = "Default" ; локация корабля
Global $Helper = "Default" ; действие для ToolTip`a
Global $LocalHelper = "Default" ; состояние локала для тултипа
Global $StorageStatus ; значения для чекера открыт ли ангар
Global $StorageOreStatus ; количество руды в ангаре
Global $OreDropCount = 0; количество сбросов руды (для статистики)
Global $LocalCheckStatus ; состояние локала
Global $SuperLocationStatus ; точное место корабля в космосе
Global $BeltNumber =  0 ; номер белта
Global $SelectCheckStatus ; состояние выбора
Global $LockCheckStatus ; статус лока
Global $DistanceCheckStatus ; расстояние
Global $BeltCheckStatus ; проверка белта (x2)
Global $OreCheckStatus ; переменная статуса руды в оре холде
;Global $CheckValue
;====================================================================================

;------------Конфиги---------------------
Global $SpaceCheckConfig[6] = [1193, 135, 1193, 135, 0xCCCCCC, 10] ; иконка настройки обзорки
Global $DockCheckConfig[6] = [1427, 25, 1427, 25, 0xC4C4C4, 10] ; буква i в меню станции 
Global $DockCheckConfig1[6] = [1242, 328, 1242, 328, 0xB2B2B2, 10] ; Агенты в меню станции 
Global $WarpCheckConfig[6] = [631, 615, 631, 615, 0xC3C3C4, 10] ; буква R в полоске Warping
Global $StorageCheckConfig[6] = [745, 434, 745, 434, 0xFFFFFF, 10] ; + справа от фильтров в окне ангара
Global $StorageOreCheckConfig[6] = [811, 58, 811, 58, 0x02485C, 10] ; синяя полоска заполнености трюма (около 10%)
Global $StorageOreCheckConfig2[6] = [787, 53, 787, 53, 0x0F0F0F, 10] ; синяя полоска заполнености трюма (около 1%)
Global $StartLocalCheck[6] =  [250, 49, 250, 49, 0x080808, 10] ; проверяю столбик иконок локала на наличие нейтрала
Global $EndLocalCheck[6] =   [250, 49, 250, 810, 0x910202, 10] ; можно ввести сначала верхнюю часть а потом нижнюю (цвет беру из EndLocalCheck)
Global $LocationCheckBonus[6] = [80, 31, 250, 31, 0x00FFFF, 10] ; проверяем бонус после андока
Global $LocationCheckTethered[6] = [719, 687, 719, 687, 0x82F3F3, 10] ; проверяем наличие тизера
Global $LocationCheckBelt[6] = [1198, 205, 1198, 350, 0x494949, 10]; на белте
Global $SelectCheckConfig[6] = [1217, 203, 1217, 203, 0x2B2B2B, 1]; проверяем цвет полоски (выбран ли астер)
Global $SelectCheckConfig1[6] = [1217, 203, 1217, 203, 0x242424, 1]; дополнительная проверка
Global $LockCheckConfigUnLocked[6] = [1300, 79, 1300, 79, 0xDCDCDC, 10] ; крестик лока, в этом состоянии не залочен
Global $LockCheckConfigLocked[6] = [1300, 79, 1300, 79, 0xF12D2D, 10] ; крестик лока, в этом состоянии залочен
;Global $LocationCheckEmptyBelt[6] = [1193, 202, 1193, 202, 0x6B6B6A, 10] ; на пустом белте?
;Global $StripControlCheck[6] = [1095, 133, 1162, 152, 0x98680B, 2] ; иконку стрипов под локом
;Global $Strip1 = 
Global $DistanceCheckInfo[6] = [1320, 50, 1320, 50, 0x979797, 10] ; проверяет букву m
Global $BeltCheckInfo[6] =  [1299, 157, 1299, 157, 0xFFFF8B, 10] ; дополнительная проверка наличия космоса
Global $OreCheckInfo[6] = [394, 787, 394, 787, 0x004D63, 10] ; чекалка руды на 99%+
Global $StripCheckInfo1[6] = [840, 778, 840, 778, 0x839081, 20] ; чекалка первого стрипа
Global $StripCheckInfo2[6] = [891, 778, 891, 778, 0x6D796C, 20] ; чекалка второго стрипа
Global $ShipMoveCheckInfo[6] = [719, 852, 719, 852, 0x6E91AF, 10] ; чекалка полёта

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

While 1

Lopata_v_boi() ; запускаем лопату покорять мир евы 
Sleep(100)

WEnd

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


; --------------- основа ----------------
Func Lopata_v_boi()
 WinActivate("EVE - "&$CharName)
   WinWaitActive("EVE - "&$CharName)
   _Check("MyLocation")

 Select
	; ------------------------------ Действия в доке  ----------------------------------
 Case $Location = "InDock" ; мы в доке, лопата скучает
_Check("LocalCheck")				;проверяет локал
   Select
	  Case $LocalCheckStatus = "Enemy" ;бот не будет дергаться пока нейтрал не уйдёт
			_Do("Wait")
		 Case $LoCalCheckStatus = "Friendly" ; нейтрал ушел...
			  _Check("StorageCheck")
			Select
			   Case $StorageStatus = "Close" ; открываю ангар
				  _Do("HangarSwitch")		; универсальный переключатель ангара
			   Case $StorageStatus = "Open"
				  _Check("StorageOreCheck") 		; проверяю количество руды
				  Select
					 Case $StorageOreStatus = ">10%"
						_Do("OreToStorage") 			; если больше 10%, то перетаскиваю
					 Case $StorageOreStatus = "<10%"
						_Do("Undock") 				; если меньше 10%, то вылетаю (на самом деле там датчик на 1% лута)
					EndSelect
			EndSelect
		EndSelect

    ; ------------------------------ действия в космосе (не в белте)  ----------------------------------
   Case $Location = "InSpace" ; урааа, мы в космосе!!! лопата немного радуется
	  _Check("LocalCheck")
	  Select
	  Case $LocalCheckStatus = "Enemy"
		 _Check("SuperLocationCheck")
			Select
			Case $SuperLocationStatus = "NearStation"
			   _Do("NearbyDock")
			Case $SuperLocationStatus = "OnBelt" or $SuperLocationStatus = "DeepSpace"
			   _Do("LongDock")
			EndSelect
		 Case $LocalCheckStatus = "Friendly"
			_Do("WarpToBelt")
		EndSelect
	
   ; ------------------------------ действия в белте  ----------------------------------
 Case $Location = "InBelt" ;And $BeltCheckStatus =  "Yes" ; ну наконец уже в белте, лопата довольна
	  _Check("LocalCheck")
	  Select
	  Case $LocalCheckStatus = "Enemy"
		 _Check("SuperLocationCheck")
			Select
			Case $SuperLocationStatus = "NearStation"
			   _Do("NearbyDock")
			Case $SuperLocationStatus = "OnBelt" or $SuperLocationStatus = "DeepSpace"
			   _Do("LongDock")
			EndSelect
	  Case $LocalCheckStatus = "Friendly"
		_Check("SelectCheck")
			Select 					
			Case $SelectCheckStatus = "UnSelected"
				_Do("Select")
			Case $SelectCheckStatus = "Selected"
				_Check("DistanceCheck")
				Select 
				Case $DistanceCheckStatus =  ">10km"
					_Do("Approach")
				Case $DistanceCheckStatus =  "<10km"					
					_Check("LockCheck")					
					Select 
					Case $LockCheckStatus = "UnLocked"
						_Do("Lock")
					Case $LockCheckStatus = "Locked"
						_Check("OreCheck")
						Select 
						Case $OreStoreStatus =  "Full"
							_Do("LongDock")
						Case $OreStoreStatus =  "Empty"
							_Check("StripCheck")
										
										
										
						EndSelect 
					EndSelect 
				EndSelect 
			EndSelect 			
		EndSelect 
EndSelect
EndFunc

Func _Check($Check)
   Select
; ================================================================================================================================================
; ==================================================== ЧЕКЕРЫ ==================================================================================
; ================================================================================================================================================
   Case $Check = "MyLocation"

	  PixelSearch($DockCheckConfig[0],$DockCheckConfig[1],$DockCheckConfig[2],$DockCheckConfig[3],$DockCheckConfig[4],$DockCheckConfig[5])
	  if Not @error Then
		 $Location = "InDock" ; проверка на док
		 $Helper = "В доке"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		 ContinueCase
	  EndIf
	
	PixelSearch($DockCheckConfig1[0],$DockCheckConfig1[1],$DockCheckConfig1[2],$DockCheckConfig1[3],$DockCheckConfig1[4],$DockCheckConfig1[5])
	  if Not @error Then
		 $Location = "InDock" ; дополнительная проверка на док
		 $Helper = "В доке"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		 ContinueCase
	  EndIf

	  PixelSearch($LocationCheckBelt[0],$LocationCheckBelt[1],$LocationCheckBelt[2],$LocationCheckBelt[3],$LocationCheckBelt[4],$LocationCheckBelt[5])
	  If Not @error Then
		 $Location = "InBelt" ; проверка на нахождение в белте
		 $Helper = "Я на белте"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		 ContinueCase
	  EndIf

	  PixelSearch($SpaceCheckConfig[0],$SpaceCheckConfig[1],$SpaceCheckConfig[2],$SpaceCheckConfig[3],$SpaceCheckConfig[4],$SpaceCheckConfig[5])
	  if Not @error Then
		 $Location = "InSpace" ; проверка на космос
		 $Helper = "В космосе"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)

		 PixelSearch($WarpCheckConfig[0],$WarpCheckConfig[1],$WarpCheckConfig[2],$WarpCheckConfig[3],$WarpCheckConfig[4],$WarpCheckConfig[5])
	  if Not @error Then
		 $Location = "InWarp" ; если в космосе, то в варпе ли?
		 $Helper = "В варпе"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  EndIf
   Else
	  $Location = "InLoading" ; если не в космосе, не в доке, не в варпе, значит прогрузка, а может и cокет вылетел :D (думаю как исправить)
		$Helper = "В прогрузке"
		ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  EndIf
; ================================================================================================================================================
 Case $Check = "123" ; кейс-костыль, в функции выше есть ContinueCase, она выведет сюда, не знаю как сделать другой выход из select`a  :\
; ================================================================================================================================================
	Case $Check =  "BeltCheck"
		 PixelSearch($BeltCheckInfo[0], $BeltCheckInfo[1], $BeltCheckInfo[2], $BeltCheckInfo[3], $BeltCheckInfo[4], $BeltCheckInfo[5])
		If Not @error Then
			$BeltCheckStatus =  "Yes"
			Else 							; пока не активно
			$BeltCheckStatus =  "No"
		EndIf
; ================================================================================================================================================

   Case $Check = "StorageCheck"
	  PixelSearch($StorageCheckConfig[0],$StorageCheckConfig[1],$StorageCheckConfig[2],$StorageCheckConfig[3],$StorageCheckConfig[4],$StorageCheckConfig[5])
   If Not @error Then
	  $StorageStatus = "Open"
	  $Helper = "Ангар Открыт" ; проверка пикселя открытого ангара, выставление значения
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
   Else
	  $StorageStatus = "Close";
	  $Helper = "Ангар Закрыт"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
   EndIf
; ================================================================================================================================================
   Case $Check = "StorageOreCheck"
	  PixelSearch($StorageOreCheckConfig[0],$StorageOreCheckConfig[1],$StorageOreCheckConfig[2],$StorageOreCheckConfig[3],$StorageOreCheckConfig[4],$StorageOreCheckConfig[5])
	  If Not @error Then
		 $StorageOreStatus = ">10%"   ; проверка руды
		 $Helper = "Руды больше 10%"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  Else
	  PixelSearch($StorageOreCheckConfig2[0],$StorageOreCheckConfig2[1],$StorageOreCheckConfig2[2],$StorageOreCheckConfig2[3],$StorageOreCheckConfig2[4],$StorageOreCheckConfig2[4])
	  If Not @error Then
		 $StorageOreStatus = "<10%"
		 $Helper = "Руды меньше 10%"
		 ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  EndIf
	  EndIf
; ================================================================================================================================================
   Case $Check = "SuperLocationCheck"
	  Sleep(2000)

	   PixelSearch($LocationCheckBonus[0],$LocationCheckBonus[1],$LocationCheckBonus[2],$LocationCheckBonus[3],$LocationCheckBonus[4],$LocationCheckBonus[5])
		if Not @error Then
			$SuperLocationStatus = "NearStation"
			$Helper = "Я у станции"							; дополниткльная проверка локаций
			ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)

		 Else
	  PixelSearch($LocationCheckTethered[0],$LocationCheckTethered[1],$LocationCheckTethered[2],$LocationCheckTethered[3],$LocationCheckTethered[4],$LocationCheckTethered[5])
		 if Not @error Then
			$SuperLocationStatus = "NearStation"
			$Helper = "Я у станции"
			ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)

		 Else
			PixelSearch($LocationCheckBelt[0],$LocationCheckBelt[1],$LocationCheckBelt[2],$LocationCheckBelt[3],$LocationCheckBelt[4],$LocationCheckBelt[5])
			If Not @error Then
			   $SuperLocationStatus = "OnBelt"
			   $Helper = "Я на белте"
			   ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)

		 Else
			   $SuperLocationStatus = "DeepSpace"
			   $Helper = "В глубоком космосе"
			   ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
				$BeltNumber =  $BeltNumber +  1
		 EndIf
	  EndIf
   EndIf
; ================================================================================================================================================
   Case $Check = "LocalCheck"
		 $LocalHelper = "Запустил чекер локала"
		 Local $TrueLocalCheck[6] = [$StartLocalCheck[0],$StartLocalCheck[1],$EndLocalCheck[2],$EndLocalCheck[3],$EndLocalCheck[4],$EndLocalCheck[5]] ; описания вначале
		 PixelSearch ($TrueLocalCheck[0],$TrueLocalCheck[1],$TrueLocalCheck[2],$TrueLocalCheck[3],$TrueLocalCheck[4],$TrueLocalCheck[5]) ; описание вначале
		 If Not @error Then
			$LocalHelper = "Враг обнаружен!"
			$LocalCheckStatus = "Enemy"
			ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		 Else
			$LocalCheckStatus = "Friendly"
			$LocalHelper = "Врагов нет"
			ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		 EndIf
; ================================================================================================================================================
	Case $Check =  "LockCheck"
		PixelSearch($LockCheckConfigUnLocked[0], $LockCheckConfigUnLocked[1], $LockCheckConfigUnLocked[2], $LockCheckConfigUnLocked[3], $LockCheckConfigUnLocked[4], $LockCheckConfigUnLocked[5])
			If Not @error Then 
				$Helper = "Нелочен"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
				$LockCheckStatus = "UnLocked"
			EndIf
		PixelSearch($LockCheckConfigLocked[0], $LockCheckConfigLocked[1], $LockCheckConfigLocked[2], $LockCheckConfigLocked[3], $LockCheckConfigLocked[4], $LockCheckConfigLocked[5])
		If Not @error Then 
			$Helper = "Лочен"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
				$LockCheckStatus = "Locked"
		EndIf
; ================================================================================================================================================
	Case  $Check =  "SelectCheck"
		PixelSearch($SelectCheckConfig[0], $SelectCheckConfig[1], $SelectCheckConfig[2], $SelectCheckConfig[3], $SelectCheckConfig[4], $SelectCheckConfig[5])
		If Not @error Then 
			$SelectCheckStatus =  "Selected"
			$Helper = "Выбрано!"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		ContinueCase 
		EndIf
		
		PixelSearch($SelectCheckConfig1[0], $SelectCheckConfig1[1], $SelectCheckConfig1[2], $SelectCheckConfig1[3], $SelectCheckConfig1[4], $SelectCheckConfig1[5])
		If Not @error Then 
			$SelectCheckStatus =  "Selected"
			$Helper = "Выбрано!"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		Else 
			$SelectCheckStatus =  "UnSelected"
			$Helper = "Не Выбрано!"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
			
		EndIf
; ================================================================================================================================================
	Case $Check =  "1122" ; такойже кейс-костыль
; ================================================================================================================================================
	Case $Check = "StripCheck"
		PixelSearch($StripControlCheck[0], $StripControlCheck[1], $StripControlCheck[2], $StripControlCheck[3], $StripControlCheck[4], $StripControlCheck[5])
		If Not @error Then
			$Helper = "Стрипы активны"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
			$StripCheckContol =  "Active"
		EndIf
; ================================================================================================================================================
	Case $Check =  "DistanceCheck"
		PixelSearch($DistanceCheckInfo[0], $DistanceCheckInfo[1], $DistanceCheckInfo[2], $DistanceCheckInfo[3], $DistanceCheckInfo[4], $DistanceCheckInfo[5])
		If Not @error Then
			$DistanceCheckStatus =  "<10km"
		Else 
			$DistanceCheckStatus = ">10km"
		EndIf
; ================================================================================================================================================	
	Case $Check =  "OreCheck"
		PixelSearch($OreCheckInfo[0], $OreCheckInfo[1], $OreCheckInfo[2], $OreCheckInfo[3], $OreCheckInfo[4], $OreCheckInfo[5])
		If Not @error Then
		$Helper = "Руды Больше 90%"
	ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
		$OreCheckStatus =  "Full"
		Else 
		$OreCheckStatus =  "Empty"
		EndIf
; ================================================================================================================================================	
	Case $Check =  "ShipMoveCheck"
		PixelSearch($ShipCheckInfo[1], $ShipCheckInfo[1], $ShipCheckInfo[1], $ShipCheckInfo[1], $ShipCheckInfo[1], $ShipCheckInfo[1])
		
		
		
EndSelect 
EndFunc

Func _Do($Do)
Select
; ================================================================================================================================================
; ==================================================== ДЕЙСТВИЯ ==================================================================================
; ================================================================================================================================================
   Case $Do = "HangarSwitch"
	  Sleep(Random(400,600))
   $Helper = "Открыл/Закрыл ангар"
   ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
   MouseClick("left", Random(600, 1000), Random(480, 600),1,20)
	  Sleep(Random(1000,2000))
   Send("!c")
	  Sleep(Random(3000,3500))
; ================================================================================================================================================
   Case $Do = "OreToStorage"
	  $Helper = "Начинаю сброс руды"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  $OreDropCount = $OreDropCount + 1 ; записали дроп руды на склад

	  Sleep(Random(500,1000))
	  MouseClick("left", Random(930, 930+100), Random(353, 353+40),1,20)
	  Sleep(Random(400,600)) 												; маусклики по складу, да и вобщем, клики решил не выносить на глобалы
	  MouseClickDrag("left", Random(1170, 1200), Random(90, 130), Random(795, 830), Random(300, 340),40) ; их итак много...
	  Sleep(Random(400,600))																						; здесь я выделаю область с рудой в карго
	  ;MouseClickDrag("left", Random(805, 840), Random(95, 130), Random(670, 710), Random(194, 202),50)    ; и перекидываю на склад
	  MouseClickDrag("left", Random(805, 840), Random(95, 130), Random(680, 700), Random(148, 152),50)
	  Sleep(Random(400,600))
; ================================================================================================================================================
   Case $Do = "Undock"
	  $Helper = "Начинаю андок"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  Sleep(Random(500,1000))
	  MouseClick("Left", Random(1385, 1385+25), Random (110, 110+20 + 30),1,20) ; вернуть на + 30 
	  Sleep(6000)
; ================================================================================================================================================
   Case $Do = "LongDock"
	  $Helper = "Начинаю док"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  Local $x = Random(362, 362+40)
	  Local $y = Random(175, 175+10)
   MouseClick("right", $x, $y,1,20)
   Sleep(Random(400,600))
   MouseClick("left", $x+25, $y+10, 1, 20)
   Sleep(5000)


   Case $Do = "NearbyDock"
	  $Helper = "Начинаю док"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  Local $x = Random(362, 362+40)
	  Local $y = Random(175, 175+10)
   MouseClick("right", $x, $y,1,20)
   Sleep(Random(400,600))
   MouseClick("left", $x+25, $y+55, 1, 20)
   Sleep(5000)
; ================================================================================================================================================
   Case $Do = "Wait"
	  $Helper = "Я жду..."
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	  Sleep(100)
; ================================================================================================================================================
   Case $Do = "WarpToBelt"
	  $Helper = "Варпаю на белт"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
   Local $BookPosition =  $BeltNumber * 20
  If $BookPosition =  4 Then 
	$BookPosition =  1
  EndIf
   Local $x = Random(350,400)
   Local $y = Random(195, 205) +  $BookPosition
   MouseClick("right", $x, $y, 1, 20)
   Sleep(Random(400,600))
   MouseClick("left", $x+20, $y+10, 1, 35)
   Sleep(5000)
; ================================================================================================================================================
	Case $Do = "Select"
		$Helper = "Выбираю"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	Sleep(Random(400,600))
	MouseClick("left", Random(1220, 1280), Random(202, 211), 1, 20)
	Sleep(Random(400,600))
; ================================================================================================================================================
	Case $Do =  "Lock"
		$Helper = "Начинаю лочить"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	Sleep(Random(400,600))
	MouseClick("left", Random(1294, 1306), Random(73, 84), 1, 20)
	Sleep(Random(400,600))
	MouseClick("left", Random(1100, 1150), Random(20, 80), 1, 20)
	Sleep(Random(1200,1600))
; ================================================================================================================================================
	Case $Do =  "Approach"
		$Helper = "Начинаю апрочить"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)
	Sleep(Random(400,600))
	MouseClick("left", Random(1193, 1208), Random(71, 89), 1, 20)
	Sleep(Random(2000,3000))
; ================================================================================================================================================
	Case $Do =  "Ship_Stop"
		$Helper = "Остановил шип"
	  ToolTip("Статус: "&$Helper&" || "&"Локал: "&$LocalHelper)   ; позже добавлю чекер на полет корабля и его остановку, а то слетает чекалка расстояния
	Sleep(Random(400,600))
	Send("^{SPACE}")
	Sleep(Random(800,1600))
; ================================================================================================================================================



EndSelect
EndFunc

Func Bot_Exit()
   ToolTip("Отключаю..")
   Sleep(500)
   Exit
EndFunc

Func Bot_Stop()
   $pause = $pause + 1
   While $pause = 1
	  ToolTip("Пауза..")
	  Sleep(1000)
   WEnd
   $pause = 0
   ToolTip("Продолжаю..")
EndFunc


Как-то так, to do list:
* Переделаю Helper`a, пусть будет отдельной функцией
* Майнер функция (проверка стрипов, астера, копать, переключить, новый залочить)
* Отстрел неписи (дроп дронов, лок неписи, отстрел, скоп дронов)
* Конво чек, чек на дт, чек на закрытие сокеты (вылет из игры)

И про моменты которые мне очень сложно осилить:
* В момент когда стрипы включаются и начинают копку, они начинают мигать и обычный поиск пикселя не понимает этого, сейчас у меня на этом стоит костыль ввиде, всех цветов этого зеленого свечения, но это жутко неудобно и я понимаю что я делаю что-то не так, но хорошего решения я так и не нашел. (про иконки под самим астером знаю, но реализация через них очень муторная, сложно определить который именно из стрипов работает)
* Хочу сделать чекер в свернутом окне, это возможно реализовать? Подобных тем на форуме пару видел, но решения там не было, в основном полу-заброшенные.
* Злая непись в хай секе джамит лопату, не знаю стоит ли мне лишний раз и этим делом запариваться, как я знаю в нулевых секторах такой проблемы нет, а туда и настроенны в будущем боты.

Безопасность:
как таковой нет, но поставил рандомные задержки и клики, так же поменял разрешение 1440х900
(не отслеживает, не поможет, .... ну а вдруг? :smile:)

Cкриншот в космосе
Cкриншот в доке


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

Belfigor сказал(а):
Архитектура должна заключаться не в последовательном выполнении действий, а в регулярном сборе актуальных данных, их анализе и приеме соответствующих решений на их основе..
Реализовал как смог :smile:

mr.Gbabak сказал(а):
Мой тебе совет, хайсечный майнер...такое себе... ищи другие пути заработка.
Впрочем, если для поднятия скила в программировании на AUtoit, можно и с этого начать. Успехов.

А для чего во все боты пихают чекер нейтрала? Если бот копает в империи?
Спасибо :smile:
Да, в хаях проще научиться, потом я переставлю ботов в нулевые сектора.

Belfigor сказал(а):
Ну + нейросети, им плевать на очень многие отклонения данных, они продолжают работать как работали.

Подозреваю что это во многом то, что может мне помочь с решением проблемы мигания стрипов :smile:
Но пока не буду браться, не готов ещё) В любом случае, тема очень интересная, спасибо
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,605
Репутация
941
В логике самого верхнего уровня всё равно наблюдается наличие глубоких ветвлений. Логичнее будет собирать все показания датчиков в одну строку типа:
Код:
Case "InDock|Enemy|Датчик2|Датчик3|Датчик4" 
   Do(something1)
Case "InDock|Friendly|Датчик2|Датчик3|Датчик4" 
   Do(something2)
Case Else
   Показать нераспознаную ситуацию
   ClipPut($situation)

Минус логики с глубоким ветвлением в том, что при большом количестве параметров она сильно усложняется и приходится тратить много времени на её трассировку.
Логика как на примере выше, может так сказать "писать саму себя". Просто формируем показания всех датчиков в переменную создавая тем самым конкретную ситуацию, смотрим есть ли для такой ситуации решение, если есть - выполняем действие в решении, если нет то выводим ситуацию чтобы добавить её в код.


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

P.S. лучше не прибегать к работе с игрой любыми методами отличными от тех которые может использовать человек. Любое явное отклонение от человеческих возможностей может вызвать сработку их ИИ и ты получишь автобан.
 

rakar

Новичок
Сообщения
5
Репутация
1
Ledary сказал(а):
И про моменты которые мне очень сложно осилить:
* В момент когда стрипы включаются и начинают копку, они начинают мигать и обычный поиск пикселя не понимает этого, сейчас у меня на этом стоит костыль ввиде, всех цветов этого зеленого свечения, но это жутко неудобно и я понимаю что я делаю что-то не так, но хорошего решения я так и не нашел. (про иконки под самим астером знаю, но реализация через них очень муторная, сложно определить который именно из стрипов работает)
* Хочу сделать чекер в свернутом окне, это возможно реализовать? Подобных тем на форуме пару видел, но решения там не было, в основном полу-заброшенные.

1. Как я делал датчик стрипа. В момент включения "High" слота, в котором установлен добывающий модуль, вокруг него по кругу загорается бегущая белая полоска, которая показывает цикл работы модуля. Датчик у меня опрашивает два пикселя, первый - в начале белой полосы, второй - тот что следующий справа от первого и сравнивает их значения.

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

strip.jpg


Код:
Func Check_Strip($strip_num) ; Функция проверки состояния стрипов, возвращает ("Вкл.", "Выкл."). Шаг между модулями = 51.
   Local $strip[2] = [1400, 1317] ; Координаты точки активации первого "High" слота.
   Local $state = "выкл."
   For $i = 1 To 2 Step 1
	  $point_1 = PixelGetColor($strip[0] + 51*($strip_num - 1), $strip[1])
	  $point_2 = PixelGetColor($strip[0] + 1 + 51*($strip_num - 1), $strip[1])
	  If $point_1 - $point_2 > 2500000 Then
		 $state = "вкл."
		 ExitLoop
	  EndIf
	  Sleep(1000)
   Next
   Return $state
EndFunc


2. Для работы бота в свернутом окне, его нужно устанавливать на виртуальную машину.
 
Верх