Что нового

WinGetHP Модуль

Как по вашему лучше чтобы из модуля возвращалась инфа?


  • Всего проголосовало
    23

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
WinGetHP v1.0
Код:
Opt("MustDeclareVars", 1)
Opt("PixelCoordMode",0)
Opt("MouseCoordMode",0)
Dim $Name = "WinName", _
	
Dim $pi = 3.14159265358979, _
	$WinGetHealth[6], _					;Различная малодинамичная инфа о WinGetHealth
	$Col, _								;Сюда приходит инфа о найденном цвете
	$WinSearchHUD, _					;Сюда приходит инфа о расположении HUDa
	$HPStatus[4] , _ 					;Инфа о Шилде, Арморе и Структуре корабля
	$WinSearchHealth[7]					;Инфа относящаяся к поиску
	
	$WinGetHealth[3]	=	0xE71B1B	;Красный цвет покоцанности худа
	$WinGetHealth[4]	=	5			;Шейдер краснава цвета покоцанности
	$WinGetHealth[5]	=	67			;Радиус окружности
	
	$WinSearchHealth[1] = 571
	$WinSearchHealth[2] = 757
	$WinSearchHealth[3] = 0x9E9E9E
	$WinSearchHealth[4] = 5
	$WinSearchHealth[5] = 67
	$WinSearchHealth[6] = 69

	
WinActivate($Name)
WinWaitActive($Name)

WinGetHPTest()

Func _WinGetHealth()
	For $ii = 1 To 3 Step 1
		For $i = 360 To 80 Step -1
			$WinSearchHUD = PixelSearch($WinSearchHealth[1]-10, $WinSearchHealth[2], $WinSearchHealth[1]+10,$WinSearchHealth[2], $WinSearchHealth[3], $WinSearchHealth[4]) ;Ищем треугольник справа от худа
			If @error Then 
				Return "Немогу найти треугольник HUDa" 
			Else
				$WinGetHealth[1] = $WinSearchHUD[0] - 58 ;Если нашли тругольник то определяем где находится центр худа
				$WinGetHealth[2] = $WinSearchHUD[1] - 66
				$Col = PixelSearch(($WinSearchHealth[5])*Cos($i*$pi / 180)+$WinGetHealth[1]+1, _ ;Методично ищем серый цвет справа на лево по дуге
									($WinSearchHealth[6])*Sin($i*$pi / 180)+$WinGetHealth[2]-1, _ 
									($WinSearchHealth[5])*Cos($i*$pi / 180)+$WinGetHealth[1]+1, _ 
									($WinSearchHealth[6])*Sin($i*$pi / 180)+$WinGetHealth[2]-1, _ 
									$WinSearchHealth[3], $WinGetHealth[4])
				If Not @error Then ExitLoop ;Если нашли завершаем цикл
			EndIf
		Next
		$HPStatus[$ii] = 100-Round(((360-$i)/180*100),0) ;Записываем процентное число полученное после проверки этой дуги
		$WinSearchHealth[5] = $WinSearchHealth[5] - 10 ;Уменьшаем радиус поиска на 10 пикселей тем самым переходя на следующую дугу
		$WinSearchHealth[6] = $WinSearchHealth[6] - 10
	Next
	$WinSearchHealth[5] = 67 ;Обнуляем обратно область поиска
	$WinSearchHealth[6] = 69
	Return $HPStatus
EndFunc

Func WinGetHPTest()
	While WinActive($Name)
		_WinGetHealth()
		ToolTip($HPStatus[1]&@CRLF&$HPStatus[2]&@CRLF&$HPStatus[3], 0,0)
	WEnd
EndFunc


Сканирование идет от внешней дуги ХУДа к внутренней, Шилд>Армор>Структура, справа на лево в поисках серого цвета.
Скорость не самая лучшая, чем сильнее побит корабль тем дольше скан потому что сканирование дуги проходит от начала и до того момента как будет найден серый цвет. Потом еще переделаю и выложу версию с возвратом значения капы.
Примерная погрешность модуля 5% так что он возвращает не идеальные данные а как правило на 5% меньше фактического. Так же желающим предлагается модифицировать скорость работы так, что если шилд > 10% то армор и структуру мы ваще не сканируем, ну или я потом сам другую версию уже выложу когда будет время :smile:

Другие версии и модификации:
WinGetHP v2.8
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: WinGetHP

Могу предложить небольшую помощь :-[ (ну, во всяком случае, мне так кажется):
Красный цвет - это жизнь? Чем его меньше, тем меньше жизни?)))
Можно немодифицированный записями скрин? А лучше несколько.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

чем больше красного тем меньше жизней, вот немодифицированный скрин:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: WinGetHP

Упс... Неправильно сказал. Нужен-то скрин в png (ну или в другом формате без потери качества).

Потом попробую написать скрипт. Это немного трудновато, поскольку у меня нет EVE Online.

За счёт чего собираюсь увеличить скрость:
1) Дихотомия или двоичный поиск.
:
Всего 62 деления (если я правильно посчитал). Проверяем 31. Если серое - тоже самое для 32-62, иначе 1-30.

2) Отсутствие PixelSearch. Вместо этого работать с конкретными пикселями. Или группамми 3*3
Относительныее координаты пикселей будут хранится в массиве - не нжды использовать синусы и косинусы.


Надеюсь, что-нибуь из этого прокатит ;D
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

Плохо представляю как это будет работать в самой EVE, но вот скрин:
 

Archy26

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

SyDr сказал(а):
Упс... Неправильно сказал. Нужен-то скрин в png (ну или в другом формате без потери качества).

Потом попробую написать скрипт. Это немного трудновато, поскольку у меня нет EVE Online.

За счёт чего собираюсь увеличить скрость:
1) Дихотомия или двоичный поиск.
:
Всего 62 деления (если я правильно посчитал). Проверяем 31. Если серое - тоже самое для 32-62, иначе 1-30.

2) Отсутствие PixelSearch. Вместо этого работать с конкретными пикселями. Или группамми 3*3
Относительныее координаты пикселей будут хранится в массиве - не нжды использовать синусы и косинусы.


Надеюсь, что-нибуь из этого прокатит ;D
Прошу прощения, что врываюсь в вашу активную беседу, однако, хочу внести своё веское:
Судя по-вашему заявлению, вы собираетесь использовать PixelGetColor, который сам по-себе работает медленнее PixelSearch. Учитывайте это в своих планах. Однако, если у вас есть другие идеи, с жадностью и интересом жду их воплощения.
PS: ну или хотя бы концепт.
PPS: Кстати - EVE-online отличная игра. Там есть 14-ти дневный триал. :smile:
Правда клиент весит более 4GB. Но в неё полроссии играет. Я уверен, в медиарессурсах вашего провайдера, кто-то наверняка уже выложил установочники клиента :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: WinGetHP

1) Сколько времени примерно работает текущая реализация?
3) Что-то где-то видел в ваших разговорах, про то, что пиксели в сторону сползают. Так?

Концепт:
Нумеруем хиты/полоски жизни или как там оно ещё называется. (От 1 до 60).
Проверяем 30 элемент. Если серый -> для проверки 31 - 60. Если красный -> проверяем 1 - 30. И т. д.
http://ru.wikipedia.org/wiki/Двоичный_поиск
 

Archy26

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

SyDr сказал(а):
1) Сколько времени примерно работает текущая реализация?
3) Что-то где-то видел в ваших разговорах, про то, что пиксели в сторону сползают. Так?
1) Бельфигор появится - скажет результаты тестов. Я сейчас занимаюсь другой темой.
3) В сторону сползают не сами пиксели, а элементы интерфейса. Если вы уже нашли элемент - пиксели в нём никуда не денутся. Или мы не об этом говорим?

SyDr сказал(а):
Концепт:
Нумеруем хиты/полоски жизни или как там оно ещё называется. (От 1 до 60).
Проверяем 30 элемент. Если серый -> для проверки 31 - 60. Если красный -> проверяем 1 - 30. И т. д.
http://ru.wikipedia.org/wiki/Двоичный_поиск
OMG! Должно сработать. Стыдно признавать, но я не профессиональный программист и таких вот например вещей, просто не знаю. К сожалению высокий КИ не прибавит знаний, если их нет :smile:

Вопросов больше не имею. концепт хорош. нада поглядеть что получится.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

По факту время проверки зависит от того как мы будем проверять. Тут в данный момент проверка состоит из 180 шагов на каждой дуге. Дуги три. Если мы увеличи шаг с 1 до 3-х мы в 3 раза сократим время поиска.
Сама же проверка не имеет определенной длительности ибо она зависит от того сколько жизней в данный момент у корабля. Чем меньше красного тем быстрее идет проверка.
 

Lexx98

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

Метод деления отрезка пополам - под таким примерно названием подобный способ известен мне.
Чтобы найти точное деление из 64 отрезков, понадобится что-то около 6 проверок. На все три показателя - 18. 18 PixelSearch и всё, все показатели здоровья найдены.
Суть примерно следующая.
Шаг 1 - проверяем середину - если серая, проверяем правую половину, красная - левую.
Шаг второй - проверяем середину середины (дуга в 90 градусов), дальнейшие условия смотреть в шаге 1.
Шаг 3 - проверяем уже дугу в 45 градусов посередине.
Шаг 4 - дуга в 23 градуса.
Шаг 5 - 12
Шаг 6 - 6 - и тут будет либо в правой 3 градусной дуге, либо в левой. 3 градуса это 60-я часть от 180, если полосок там около 60, то собственно всё.

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

Если вдруг секторов оказывается больше 64-х, то 7-й шаг обеспечивает поиск среди 128-ми, а больше там точно их нет.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

Суть в том что единственная загвоздка в реализации такова принципа - это то что обламывает координаты каждого пикселя туда загонять :(. Гораздо бстрее и ленивее было прописать через синус и косинус

Хотя можно и так сделать, завтра покурю.
 

Archy26

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

Lexx98 сказал(а):
Метод деления отрезка пополам - под таким примерно названием подобный способ известен мне.
Чтобы найти точное деление из 64 отрезков, понадобится что-то около 6 проверок. На все три показателя - 18. 18 PixelSearch и всё, все показатели здоровья найдены.
Суть примерно следующая.
Шаг 1 - проверяем середину - если серая, проверяем правую половину, красная - левую.
Шаг второй - проверяем середину середины (дуга в 90 градусов), дальнейшие условия смотреть в шаге 1.
Шаг 3 - проверяем уже дугу в 45 градусов посередине.
Шаг 4 - дуга в 23 градуса.
Шаг 5 - 12
Шаг 6 - 6 - и тут будет либо в правой 3 градусной дуге, либо в левой. 3 градуса это 60-я часть от 180, если полосок там около 60, то собственно всё.

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

Если вдруг секторов оказывается больше 64-х, то 7-й шаг обеспечивает поиск среди 128-ми, а больше там точно их нет.
Собственно об этом и написал SyDr, или я вас неправильно понял обоих
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: WinGetHP

Угумс... Примерно так и есть. Вот функция. Массив $aCoord содержит инфу, необходимую для проверки.
Функция IsRed должна возвращать True, если указанный элемент красный, иначе False.
Замечание: если полоска полностью серая или красная - функция не может вернуть верный результат. Можно добавить "искуственные" элементы в массив или делать проверку.
Функция возвращает номер первого красного элемента.

Код:
Func _GetHealth($aCoord, $nStart = 1, $nEnd = 60)
	Local $nCurrent

	Do
		$nCurrent = Floor(($nStart + $nEnd) / 2)
		If _IsRed($aCoord[$nCurrent]) Then
			$nEnd = $nCurrent - 1
		Else
			$nStart = $nCurrent + 1
		EndIf
	Until $nStart < $nEnd
	
	Return $nStart
EndFunc
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

Код выглядит вполне красиво и понятно, завтра потестим как это будет работать в игре :smile:
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
Re: WinGetHP

Собсно вот:
WinGetHP v2.8
Код:
#include "_Log v0.3.au3"
#include "Test POS_Trim.au3"
Opt("PixelCoordMode",0)
Opt("MouseCoordMode",0)
Dim $Hud[7][2][61]
WinActivate("EVE")
WinWaitActive("EVE")
Dim $HUD[5][2][62]
Dim $HT[2] = [572, 748]; В идеале в переменную $HT пиксельсерч должен возвращать координаты верхнего угла треугольника HUDa. Но поскольку было очень лень писать псерч они были заданы массивом :))
Dim $HUD[5][2][61]=[[[""],[""]],[[100,--9,--9,--9,--8,--8,--6,--6,--4,--4,--1,-0,-2,-4,-7,-9,-11,-14,-16,-19,-22,-26,-29,-32,-35,-39,-42,-46,-50,-54,-56,-61,-64,-68,-71,-74,-78,-82,-85,-88,-91,-95,-98,-100,-103,-106,-108,-111,-113,-115,-117,-119,-120,-122,-123,-123,-123,-125,-125,-126,-126],[110,-59,-62,-66,-69,-73,-76,-80,-83,-87,-89,-93,-96,-99,-101,-104,-107,-109,-112,-114,-116,-117,-119,-120,-122,-123,-124,-124,-126,-125,-125,-125,-126,-125,-124,-124,-122,-122,-120,-118,-117,-116,-114,-111,-109,-107,-104,-102,-99,-96,-93,-90,-86,-83,-80,-80,-76,-73,-69,-66,-62]],[[200,--1,-0,-0,-1,-1,-1,-2,-3,-6,-5,-8,-9,-12,-14,-15,-18,-20,-22,-25,-27,-30,-33,-36,-39,-42,-45,-48,-51,-54,-57,-60,-63,-66,-69,-72,-75,-78,-81,-84,-87,-89,-92,-95,-97,-99,-102,-104,-107,-108,-111,-110,-113,-114,-115,-116,-117,-118,-119,-118,-118],[210,-59,-62,-65,-68,-71,-74,-77,-80,-82,-86,-88,-91,-93,-95,-98,-100,-102,-104,-106,-108,-109,-110,-112,-113,-114,-115,-115,-116,-116,-116,-116,-116,-116,-116,-115,-114,-113,-112,-111,-109,-107,-106,-105,-102,-100,-98,-96,-94,-91,-89,-85,-83,-80,-77,-74,-71,-68,-65,-62,-59]],[[300,-9,-9,-9,-9,-10,-10,-11,-12,-14,-14,-16,-17,-19,-20,-22,-24,-26,-28,-30,-32,-35,-37,-39,-42,-44,-47,-49,-52,-55,-57,-60,-62,-65,-68,-70,-73,-75,-77,-80,-83,-85,-87,-89,-91,-93,-95,-97,-98,-100,-102,-103,-106,-106,-106,-108,-108,-106,-109,-108,-109],[310,-59,-61,-64,-67,-69,-72,-74,-77,-79,-82,-84,-86,-88,-90,-92,-94,-96,-97,-99,-100,-101,-103,-104,-105,-105,-106,-107,-107,-107,-107,-107,-107,-107,-107,-106,-106,-104,-102,-102,-102,-100,-99,-97,-95,-94,-92,-90,-88,-86,-84,-82,-80,-77,-74,-72,-69,-66,-64,-61,-59]],[[400,-59,-50,-43,-38,-35,-35,-37,-43,-50,-58,-67,-75,-80,-83,-82,-79,-74,-67],[410,-81,-79,-75,-69,-61,-52,-45,-38,-34,-32,-34,-38,-44,-53,-61,-69,-75,-79]]]
Dim $HP[5];Сюда возвращаются данные о текущем статусе корабля [1]-шилд, [2]-армор,[3]-структура,[4]-капа. (Капа писалась под равен и все корабли со схожим капа полем (18 делений) больше еще куда не шло, но когда полей меньше - теряется точность.

While WinActive("EVE")
	_GetHealth()
	ToolTip($hp[1]&@CR&$hp[2]&@CR&$hp[3]&@CR&$hp[4],0,0)
WEnd
	
Func _IsRed($a, $Coord)
		If TrimarkColor("0x"&Hex(PixelGetColor($HT[0]+$HUD[$a][0][$Coord], $HT[1]+$HUD[$a][1][$Coord]), 6)) < 100 Then Return False;Если возвращаемое значение <100 значед мы видим что точка красная
		Return True
EndFunc
	
Func _GetHealth();Сбор данных о текущей точке на HUD'e
  	Local $nCurrent, $nStart, $nEnd
	For $i = 1 To 4	Step 1
		If $i = 4 Then
			$nStart = 1
			$nEnd = 18
		Else
			$nStart = 1
			$nEnd = 60
		EndIf
		Do
			$nCurrent = Floor(($nStart + $nEnd) / 2)	;Вычисляем текущую точку которую надо (Округляем сумму начала проверки и конца) и делим на два
			If _IsRed($i, $nCurrent) Then
				$nEnd = $nCurrent - 1
			Else
				$nStart = $nCurrent + 1
			EndIf
		Until $nStart > $nEnd
		$HP[$i] = 100-Round(($nStart)/60*100);записываем данные о шилде арме и структуре
		If $i = 4 Then 
			For $ii = 1 To 18 Step 1
				PixelSearch($HT[0]+$HUD[4][0][$ii], $HT[1]+$HUD[4][1][$ii], $HT[0]+$HUD[4][0][$ii], $HT[1]+$HUD[4][1][$ii], 0x909090, 30)
				If not @error Then 
					$HP[$i] = 100-Round(($ii)/18*100);Записываем данные о капе (Ломало уже включать ее в двоичный поиск поетому она тупо сканит 18 точек и найдя первую не серую возвращает ее значение.
				EndIf	
			Next
		EndIf
	Next
	Return $HP;Возвращаем массив с данными
EndFunc

Тестил у себя, работает как часы, намного лучше и быстрее чем первый вариант.
 

xexe

Новичок
Сообщения
11
Репутация
2
#include "_Log v0.3.au3"
#include "Test POS_Trim.au3"
Я так понемаю для простых смертных эти недоступны?
Без них много переменных без которых не запускается нечего.

П.С. вот бы массивы до конца понять :smile:
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
все что выкладывалось мною на форуме, ссылается так или иначе фигурировавшие на форуме скрипты. И в любом случае 2 выше упомянутых скрипта никак не связаны с текущим модулем.
 

DJ_Tommy

Продвинутый
Сообщения
234
Репутация
57
xexe сказал(а):
#include "_Log v0.3.au3"
#include "Test POS_Trim.au3"
Я так понемаю для простых смертных эти недоступны?
Без них много переменных без которых не запускается нечего.

П.С. вот бы массивы до конца понять :smile:
А что вам массивы? Это просто набор координат (или смещений координат) проверочных точек. Тут главное логика, а она в полной мере отражена в данном топике.

А вообще - попробуй вот так. Здесь убраны инклуды - они не нужны, подставил правда свои координаты, добавлена функция тримаркколор которая http://autoit-script.ru/index.php?topic=62.0в другой теме была, убран выход по отсутствию активного окна евы. Ну еще советую ставить отсчет координат от границ экрана а не абсолютные. Плюс не забывайте - имя окна по умолчанию EVE, а многие делают EVE - имя чара.

Код:
Opt("PixelCoordMode",0)
Opt("MouseCoordMode",0)
Dim $Hud[7][2][61]
WinActivate("EVE")
WinWaitActive("EVE")
Dim $HUD[5][2][62]
Dim $HT[2] = [741, 737]; В идеале в переменную $HT пиксельсерч должен возвращать координаты верхнего угла треугольника HUDa. Но поскольку было очень лень писать псерч они были заданы массивом :))
Dim $HUD[5][2][61]=[[[""],[""]],[[100,--9,--9,--9,--8,--8,--6,--6,--4,--4,--1,-0,-2,-4,-7,-9,-11,-14,-16,-19,-22,-26,-29,-32,-35,-39,-42,-46,-50,-54,-56,-61,-64,-68,-71,-74,-78,-82,-85,-88,-91,-95,-98,-100,-103,-106,-108,-111,-113,-115,-117,-119,-120,-122,-123,-123,-123,-125,-125,-126,-126],[110,-59,-62,-66,-69,-73,-76,-80,-83,-87,-89,-93,-96,-99,-101,-104,-107,-109,-112,-114,-116,-117,-119,-120,-122,-123,-124,-124,-126,-125,-125,-125,-126,-125,-124,-124,-122,-122,-120,-118,-117,-116,-114,-111,-109,-107,-104,-102,-99,-96,-93,-90,-86,-83,-80,-80,-76,-73,-69,-66,-62]],[[200,--1,-0,-0,-1,-1,-1,-2,-3,-6,-5,-8,-9,-12,-14,-15,-18,-20,-22,-25,-27,-30,-33,-36,-39,-42,-45,-48,-51,-54,-57,-60,-63,-66,-69,-72,-75,-78,-81,-84,-87,-89,-92,-95,-97,-99,-102,-104,-107,-108,-111,-110,-113,-114,-115,-116,-117,-118,-119,-118,-118],[210,-59,-62,-65,-68,-71,-74,-77,-80,-82,-86,-88,-91,-93,-95,-98,-100,-102,-104,-106,-108,-109,-110,-112,-113,-114,-115,-115,-116,-116,-116,-116,-116,-116,-116,-115,-114,-113,-112,-111,-109,-107,-106,-105,-102,-100,-98,-96,-94,-91,-89,-85,-83,-80,-77,-74,-71,-68,-65,-62,-59]],[[300,-9,-9,-9,-9,-10,-10,-11,-12,-14,-14,-16,-17,-19,-20,-22,-24,-26,-28,-30,-32,-35,-37,-39,-42,-44,-47,-49,-52,-55,-57,-60,-62,-65,-68,-70,-73,-75,-77,-80,-83,-85,-87,-89,-91,-93,-95,-97,-98,-100,-102,-103,-106,-106,-106,-108,-108,-106,-109,-108,-109],[310,-59,-61,-64,-67,-69,-72,-74,-77,-79,-82,-84,-86,-88,-90,-92,-94,-96,-97,-99,-100,-101,-103,-104,-105,-105,-106,-107,-107,-107,-107,-107,-107,-107,-107,-106,-106,-104,-102,-102,-102,-100,-99,-97,-95,-94,-92,-90,-88,-86,-84,-82,-80,-77,-74,-72,-69,-66,-64,-61,-59]],[[400,-59,-50,-43,-38,-35,-35,-37,-43,-50,-58,-67,-75,-80,-83,-82,-79,-74,-67],[410,-81,-79,-75,-69,-61,-52,-45,-38,-34,-32,-34,-38,-44,-53,-61,-69,-75,-79]]]
Dim $HP[5];Сюда возвращаются данные о текущем статусе корабля [1]-шилд, [2]-армор,[3]-структура,[4]-капа. (Капа писалась под равен и все корабли со схожим капа полем (18 делений) больше еще куда не шло, но когда полей меньше - теряется точность.

While 1
    _GetHealth()
    ToolTip($hp[1]&@CR&$hp[2]&@CR&$hp[3]&@CR&$hp[4],0,0)
WEnd
    
Func _IsRed($a, $Coord)
        If TrimarkColor("0x"&Hex(PixelGetColor($HT[0]+$HUD[$a][0][$Coord], $HT[1]+$HUD[$a][1][$Coord]), 6)) < 100 Then Return False;Если возвращаемое значение <100 значед мы видим что точка красная
        Return True
EndFunc

Func TrimarkColor($TargetTrim)
;cs TrimarkColor - Comment Start
;Исползуется для получения из цвета в формате RGB значение яркости пикселя. Возвращает значение от 0 до 255.
;Скорость:
;Функция выполняется за ~0.06-0.10 мс
;(с) Archy26 :)
;#ce TrimarkColor - Comment End
Dim $a, $a_fin
$a = Hex($TargetTrim, 6)
$a_fin = (Dec(StringTrimRight($a, 4)) + Dec(StringTrimLeft(StringTrimRight($a, 2), 2)) + Dec(StringTrimLeft($a, 4)))/3
$TargetTrim = Round($a_fin, 0)
Return $TargetTrim
EndFunc
Func _GetHealth();Сбор данных о текущей точке на HUD'e
    Local $nCurrent, $nStart, $nEnd
    For $i = 1 To 4 Step 1
        If $i = 4 Then
            $nStart = 1
            $nEnd = 18
        Else
            $nStart = 1
            $nEnd = 60
        EndIf
        Do
            $nCurrent = Floor(($nStart + $nEnd) / 2)    ;Вычисляем текущую точку которую надо (Округляем сумму начала проверки и конца) и делим на два
            If _IsRed($i, $nCurrent) Then
                $nEnd = $nCurrent - 1
            Else
                $nStart = $nCurrent + 1
            EndIf
        Until $nStart > $nEnd
        $HP[$i] = 100-Round(($nStart)/60*100);записываем данные о шилде арме и структуре
        If $i = 4 Then 
            For $ii = 1 To 18 Step 1
                PixelSearch($HT[0]+$HUD[4][0][$ii], $HT[1]+$HUD[4][1][$ii], $HT[0]+$HUD[4][0][$ii], $HT[1]+$HUD[4][1][$ii], 0x909090, 30)
                If not @error Then 
                    $HP[$i] = 100-Round(($ii)/18*100);Записываем данные о капе (Ломало уже включать ее в двоичный поиск поетому она тупо сканит 18 точек и найдя первую не серую возвращает ее значение.
                EndIf   
            Next
        EndIf
    Next
    Return $HP;Возвращаем массив с данными
EndFunc
 

sapa

Новичок
Сообщения
3
Репутация
0
Если я правильно понимаю, то версия 2.8 привязана к определенному разрешению? И чтобы все работало на другом разрешении, то надо править массив $HUD
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 574
Репутация
934
sapa сказал(а):
Если я правильно понимаю, то версия 2.8 привязана к определенному разрешению? И чтобы все работало на другом разрешении, то надо править массив $HUD
Нет. Оно привязано к HUD. Но если другой скрипт написан не под 1024х768, логичнее подправить свой скрипт под нормальное разрешение, нежели запускать бота в разрешении отличном от 1024х768.
 
Верх