Что нового

Lasers.au3 (CheckLaser и LaserPress)

Lexx98

Продвинутый
Сообщения
272
Репутация
73
; Зависит от CheckPixel в модуле Colors.au3 link
; CheckLaser проверяет включён ли лазер номер $LaserNum (соответствует номеру клавиши F1-F8), работает при разрешени окна еве 1024*768. Проверка идёт в первых точках которые начинают светиться по окружности.
; LaserPress включает (при $on=1) или выключает (при $on=0) лазер с номером $LaserNum. Дополнительную проверку на включенность перед вызовом не требует, ибо проверяет сама.
; Естественно, работает только при настройках клиента уже описанных где-то в этом форуме - widescreen on.

lasercheckhere.jpg

; Вот тут примерно, только скрин брался старый, без widescreen включенного.
;;;;;;;;;;;;;;;;;;;;

Старый скрипт
Код:
Func CheckLaser($LaserNum)
        if CheckPixel($WinPos[0]+614+51*($Lasernum-1), $WinPos[1]+671, $WinPos[0]+616+51*($Lasernum-1), $WinPos[1]+672, 0x101010)==1 then
            return 1
        else
            return 0
        endif
        ;;;;616+51 672 тут 616 - х координата точки проверки первого лазера, 51 - расстояние между иконками лазеров. 672 - y координата точки проверки.
    EndFunc ; => CheckLaser
     
    Func LaserPress($LaserNum, $on)
        if CheckLaser($LaserNum)<>$on then
            Send("{F"&$LaserNum&"}")
            $Randc=Random(100, 500)
            Sleep($Randc)
        endif
    EndFunc; => LaserPress

[quote author=Archy26]С тримкалором, работать будет и БЕЗ вайдскрина, если задать значение яркости от 235 до 255
Хотя, может и подглючивать.[/quote]

Не уверен, там вроде не настолько яркая полоса, именно в том месте. Я вон с 0х101010 сравниваю. Хотя, возможно я и перестраховываюсь, не помню уже точно. Да и мало ли, вдруг солнце как раз там окажется, и всё, без вайдскрина никак.

Оказалось, скрипт всё же чуть-чуть сбоит. Поскольку область поиска пикселя задана чуть шире, иногда в неё попадает часть названия врека, которая отображается даже на чёрном фоне вайдскрина. Замирает собака, поскольку думает что сальвагер включён, когда он не включён, и ждёт когда врек отсальважится, до бесконечности.
Нужно либо чуть уменьшить зону поиска чтоб лишних пикселей не захватывать (если название никогда не залазит на ту тёмную окружность, по которой полоска активности бегает), либо проверять на зелёный цвет активации.
UPD. Также бывает достаточно просто отодвинуть камеру чуть дальше от корабля, чтобы все притаскиваемые вреки были в центре экрана. Хотя сделать распознавание зелёного все-равно стоит.

UPDATE 13.03.11
Текущий скрипт.
Код:
;;;;;;;;;;;;;;;;;;;;
Dim $DeltaHUDHSlot1x=41 ; смещение 1-го слота по x от координат HUD-а
Dim $DeltaHUDHSlot1y=-80 ; смещение 1-го слота по y от координат HUD-а

Func CheckLaser($LaserNum)
if CheckPixel($HUDx+$DeltaHUDHSlot1x-1+51*($Lasernum-1), $HUDy+$DeltaHUDHSlot1y-1, $HUDx+$DeltaHUDHSlot1x+51*($Lasernum-1), $HUDy+$DeltaHUDHSlot1y-1, 0x40)==1 then
 sleep(250)
 if CheckPixel($HUDx+$DeltaHUDHSlot1x-1+51*($Lasernum-1), $HUDy+$DeltaHUDHSlot1y-1, $HUDx+$DeltaHUDHSlot1x+51*($Lasernum-1), $HUDy+$DeltaHUDHSlot1y-1, 0x40)==1 then
  return 1
 else
  return 0
 endif
endif
;616+51 672
EndFunc ; => CheckLaser

Func LaserPress($LaserNum, $on)
if CheckLaser($LaserNum)<>$on then
 Send("{F"&$LaserNum&"}")
 _CS(100, 300)
endif
EndFunc; => LaserPress


Тут "внешние" переменные $HUDx, $HUDy - координаты HUD-а, это самая левая яркая точка верхней полосы.
Работает только с хай-слотами, но легко доделывается и под мед, лоу, при желании и необходимости.
Зависит от модуля http://autoit-script.ru/index.php?topic=62.0
В вызове CheckPixel(...) последний параметр 0x40 - средняя яркость начала бегущей полосы. Когда был вайдскрин использовал 0x10, сбоев не было. Сейчас в режиме обычного космоса (не карты) иногда сбоит, но для хантера это некритично.
Проверка точки происходит дважды с интервалом 250 миллисекунд, хотите, можете добавить ещё одну проверку, всего-то несколько строк добавить по аналогии.
Функция _CS($param1, $param2) - просто тот же Sleep() на время, выбранное рандомом между 1м и 2-м параметрами.
 

hikki

Продвинутый
Сообщения
233
Репутация
99
Lexx98 сказал(а):
Оказалось, скрипт всё же чуть-чуть сбоит. Поскольку область поиска пикселя задана чуть шире, иногда в неё попадает часть названия врека, которая отображается даже на чёрном фоне вайдскрина. Замирает собака, поскольку думает что сальвагер включён, когда он не включён, и ждёт когда врек отсальважится, до бесконечности.
Нужно либо чуть уменьшить зону поиска чтоб лишних пикселей не захватывать (если название никогда не залазит на ту тёмную окружность, по которой полоска активности бегает), либо проверять на зелёный цвет активации.
UPD. Также бывает достаточно просто отодвинуть камеру чуть дальше от корабля, чтобы все притаскиваемые вреки были в центре экрана. Хотя сделать распознавание зелёного все-равно стоит.

кстати, очень простым решением будет выключить отображение брекетов, все равно бот по овервью ориентируется
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Ыыыы, спасибо друг! Ведь и тормозить будет меньше...
Как-то не пришло в голову само...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Lexx98 сказал(а):
Ыыыы, спасибо друг! Ведь и тормозить будет меньше...
Как-то не пришло в голову само...
Включая WideScreen это совершенно никак не убирает нагрузку на клиент, можно полностью заменить фон игры на чорный, кроме окон небудет ничего видно, но нагрузки на цп это не снимет.
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Думаю, это снизит не нагрузку на ЦП, а лаги при влёте в белт с 50-ю старателями и кучей секьюрных контов.
 

Belfigor

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

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Belfigor сказал(а):
все рисуется независимо от того видишь ты это или нет
Я тут полазил по рессурсам, подебажил немножко интерпретатор питона, запаяный в екзефайл. Вощем да, к моему большому сожалению, всё ОБРАБАТЫВАЕТСЯ независимо от того, отображение чего включено. Хотя, на слабых машинах, это может слегка снизить нагрузку на видеокарту. В её буффер грузится меньше текстур при прилёте в белт с 50ю старателями. Лекс прав.
Т.о. вы оба и правы и неправы одновременно.
 

Spanishpilot

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

Идея в простой 2й проверки квадрата 3х3 пикселей (как в первом посте.) Но ни как не могу решить эту проблему. еше нужно решить проблему логического сложения. тоесть если 1 раз нашел точку а второй нет, то ясно что модуль всеже работает. что то вроде этого...

0+0=0 модуль не активен
0+1=1 модуль активен
1+0=1 модуль активен
1+1=1 модуль активен

а вот как это реализовать и присвоить к функции я незнаю
Код:
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt ("MouseClickDelay", 50) ;
Opt("SendKeyDownDelay", 50)

;---------------------------------------------------------------------------------------------

WinActivate ( "EVE")
Do
until checkmodule() = 0
;--------------------------------------------------------------------------
MsgBox ( 0 , "end script" , "Х**" )
;-----------------------------------------Используемые функции-------------------------------------------
Func checkmodule ()
	pixelSearch (810, 781, 812, 783, 0xAEABA4 or 0x95998C , 10 ); Поиск ативности модуля
    If Not @error Then
			sleep (250)
			pixelSearch (810, 781, 812, 783, 0xAEABA4 or 0x95998C , 10 ); ждем 0.25 сек и пороверяемп повторно ON
			If not @error Then
				Return 1
				MsgBox ( 0 , "не знаю" , "return 1" )
			Else
			EndIf
	Else
			sleep (250)
			pixelSearch (810, 781, 812, 783, 0xAEABA4 or 0x95998C , 10 ); ждем 0.25 сек и пороверяемп повторно OFF
			If Not @error Then
		Else
			Return 0
			MsgBox ( 0 , "не знаю" , "return 0" )
			EndIf
	EndIf
EndFunc


Вот что пока есть. :-[
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Код:
Else
            EndIf

else лишнее.


Под твою логику:
Код:
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt ("MouseClickDelay", 50) ;
Opt("SendKeyDownDelay", 50)

;---------------------------------------------------------------------------------------------

WinActivate ( "EVE")
Do
until checkmodule() = 0
;--------------------------------------------------------------------------
MsgBox ( 0 , "end script" , "Х**" )
;-----------------------------------------Используемые функции-------------------------------------------
Func checkmodule ()
$check1=0
$check2=0 
$check=0
    pixelSearch (810, 781, 812, 783, 0xAEABA4 or 0x95998C , 10 ); Поиск ативности модуля
    If Not @error Then
     $check1=1
    endif
   sleep (250)
   pixelSearch (810, 781, 812, 783, 0xAEABA4 or 0x95998C , 10 ); ждем 0.25 сек и пороверяемп повторно ON
    If not @error Then
     $check2=1
    endif
 if $check1 or $check2 then
    $check=1
 EndIf
 MsgBox ( 0 , "не знаю" , "пароль = "&$check )
 Return $check
EndFunc
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
А в итоге всё-равно придёшь к тому что в первом сообщении, ну может только вторую проверку после мелкой паузы оставишь...
 

Spanishpilot

Новичок
Сообщения
8
Репутация
0
:shok: а вот ту совсем непонятно почему приду к первому посту? Там непонятная мне функция "CheckPixel" а то что ты показал, просто и понятно, и работает :ok:
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Специально же в посте в первой же строчке указан линк на тему с функцией, и описанием что она делает и почему-зачем. И вообще, весьма и весьма полезная функция. До сих пор ей пользуюсь.
 

AllWay

Знающий
Сообщения
16
Репутация
9
Как боту узнать что лазер активен?
Цель: найти пульсирующие зеленые пикселы активности в модуле. Если этих пикселей не найдено - включить модуль. Координаты для проверки берутся в виде прямоугольника в верхней части каждого модуля, с захватом пространства над модулем (используется настройка - черный экран). Цвет пикселов подбирается опытным путем с использованием утилиты AutoIt Window Info
lasercheckhere1.jpg

Проблема: активность модуля в виде пульсации, возможна проблема при проверке (в момент затухания)
Решение: Выполнять проверку в течении определенного времени (временной интервал выбирается с учетом того, чтобы в него попали 2-3 цикла пульсации активности. Временной интервал задается циклом FOR-NEXT)
Если в течении этого времени пикселов в пульсации не обнаружено - считать что модуль неактивен.
Применительно к ICE Harvester-ам я использовал такую проверку:

Код:
Func CheckLaserRun() ;Проверить активность лазеров, если неактивны - активировать
; Проверить 1ый лазер
For $f=1 to 3000  ;3000 раз проверяет наличие пульсирующего пиксела (для мощных машин это значение надо поднять ориентировочно до 25-50000?)
PixelSearch( 527, 850, 548, 865, 0x395239, 3) ;L1 - ищем пульсирующий зеленый пиксел активности в лазере (координаты для PixelSearch в виде прямоуголька берутся в верхней части модуля)
If Not @error Then
;MsgBox(64,"","Лазер F1 не активен", 2); 
$L1 = 1 ; пиксел найден - присвоить переменной значение 1
ExitLoop ;если пиксел найден - выход из цикла проверки
Else
$L1 = 0 ; пиксел НЕ найден - присвоить переменной значение 0
EndIf
Next
	
; Проверить 2ой лазер
For $f=1 to 3000
PixelSearch( 576, 850, 600, 865, 0x395239, 3) ;L1 - ищем пульсирующий зеленый пиксел в лазере
If Not @error Then
;MsgBox(64,"","Лазер F2 не активен", 2); 
$L2=1 ; пиксел найден - присвоить переменной значение 1
ExitLoop ;если пиксел найден - выход из цикла проверки
Else
$L2=0 ;пиксел НЕ найден - присвоить переменной значение 0
EndIf
Next

;Проверка переменный	, активация модулей при условии
If $L1=0 Then 
Opt("SendKeyDownDelay", 100) ; нажать и удерживать кнопку 100 миллисекунд 
Send("{F1}") ;Активировать лазер №1 (F1)
;MsgBox(64,"","Активировать лазер F1", 2); 
Else
MsgBox(64,"","Все нормально работаем дальше", 2); 
EndIf
If $L2=0 Then
Opt("SendKeyDownDelay", 100) ; нажать и удерживать кнопку 100 миллисекунд 
Send("{F2}") ;Активировать лазер №1 (F2)
;MsgBox(64,"","Активировать лазер F2", 2); 
Else
;MsgBox(64,"","Все нормально работаем дальше", 2); 
EndIf
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Чем же тебя не устроила бегущая белая полоска?
shocked.png
 

AllWay

Знающий
Сообщения
16
Репутация
9
Belfigor сказал(а):
Чем же тебя не устроила бегущая белая полоска?
shocked.png
При копке с бонусами Orca эта белая полоска вела себя непредсказуемо. При 5 открытых клиентах это приводило к ложному срабатыванию. В момент активации нового цикла, белая полоска не отображалась в течении долей секунды, это в принципе было достаточно чтобы ICE Harvester считался ботом "неактивен". Поэтому я использовал настройки клиента без отображения белой полоски, только пульсация. На пульсацию не влияет момент смены цикла.
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Если бы не одно НО. Ты всё-равно проверяешь минимум два раза с некоторым промежутком времени. Так вот этого промежутка вполне должно хватать, чтобы первые пиксели полоски прорисовались, и не было ложного срабатывания "лазер выключен".
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
+1. 15 окон контролит бот, ложного срабатывания не было ни разу
meaw.png
 

AllWay

Знающий
Сообщения
16
Репутация
9
В предлагаемом коде от уважаемого SirMaksFromEho, есть зависимость от 4 функций:
ИМХО
TrimColor - вычисляет наличие светлых точек (грубо говоря);
CheckPixel - обрабатывает данные TrimColor сравнивает с эталонными, присваивает значения;
CheckLaser - сравнивает значения CheckPixel, готовит данные для LaserPress;
LaserPress - запускает лазеры;
Не говоря о других зависимостях и координатах для всего этого хозяйства...
Я, оптимизировал свой код, сделав его как говорится "и нашим и вашим" ;)

PixelSearch( ..., ..., ..., ..., 0xFFFFFF, 156) при условии widescreen on - ищет 156 оттенков белого в заданной области, которые отсутствуют при неактивном модуле. 156 оттенков я подобрал опытным путем "под себя". Для верности задается 2ая проверка для каждого модуля.
Для координат PixelSearch я взял первую активную точку начала цикла с отскоком в 5 пикселей лево-право-верх.
ИТОГ:
1.PixelSearch выполняет (по сути) аналогичную работу TrimColor
2.Более читабельный код для новичка. (каковым собственно и являюсь :-[ )
Код:
Func CheckLaserRun() ;Проверить активность лазеров, если неактивны - активировать
For $f=1 to 2
PixelSearch( 531, 895, 541, 901, 0xFFFFFF, 156) ;L1 - ищем оттенки белого в белой полоске цикла модуля (нижняя часть круга иконки)
If Not @error Then
;MsgBox(64,"","Лазер F1 не активен", 2); 
$n=1
ExitLoop
Else
$n=0
EndIf
Next
	
For $f=1 to 2
PixelSearch( 582, 895, 592, 901, 0xFFFFFF, 156) ;L2 - ищем оттенки белого в белой полоске цикла модуля (нижняя часть круга иконки)
If Not @error Then
$b=1
ExitLoop
Else
$b=0
EndIf
Next
	
;;;Блок проверки на включение № лазера 

If $n=0 and $b=0 Then 
Opt("SendKeyDelay", 0)          ;20 milliseconds
Opt("SendKeyDownDelay", 100)
Send("{F1}{F2}") ;Включить лазеры 1-2
Else
If $n=0 And $b=1 Then
Opt("SendKeyDownDelay", 100)
Send("{F1}") ;Включить лазер 1
Else
If $n=1 And $b=0 Then
Opt("SendKeyDownDelay", 100)
Send("{F2}") ;Включить лазер 2
EndIf
EndIf
EndIf
EndFunc


Belfigor сказал(а):
+1. 15 окон контролит бот, ложного срабатывания не было ни разу
meaw.png
15 ОКОН?! Какая конфигурация железа или какие настройки евы позволяют запустить такое количество окон? Поделись опытом пожалуйста.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
На счет конфигурации я не узнавал, бот работает на машине в офисе у клиента, знаю только что в том офисе стоит несколько рендер ферм и один большущий кластер, вот видимо на одной из этих машин и работает. Да в принципе если я себе на компьютере поменяю деффектную видяху то и у меня окон 10-12 он до сих пор будет на минимальных настройках тянуть. Вот текущий конфиг который собрал с моего компа клиент x-fire:
Manufacturer:
System manufacturer
Processor:
Intel(R) Core(TM)2 Extreme CPU Q6850 @ 3.00GHz (4 CPUs)
Memory:
4096MB RAM
Hard Drive:
8 TB
Video Card:
NVIDIA GeForce 8800 Ultra
Monitor:
Apple Cinepa HD 30"
Sound Card:
SoundMAX HD Audio
Speakers/Headphones:
Keyboard:
Logitech G15
Mouse:
Logitech G9
Mouse Surface:
Operating System:
Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.091208-2036)
Motherboard:
Computer Case:

Добавить оперативки и сменить видяшку и можно считать компьютер мощным.
 
Верх