Что нового

[Lineage II] работа с показателями жизни

Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Затеял что-то типа вспомогательной утилитки для распознования цифр.
l2ocr.png

Будет рисовать пиксели из этих четырёх квадратов, и сразу же на них их яркость. удобно для анализа. видимо яркость больше 130 будет означать, что на этом месте есть кусок от белой цифры.
-----------------------

Переработал полностью, оптимизировал:
1111li.png

Код пока не выкладываю, ибо не готово ещё...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

Выглядит красиво :smile:
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Вобщем доделал распознавалку.
Но! так как нет возможности опробовать в реальных боевых условиях (мешает GG), используется имитатор окна игры со скриншотом.
Запустить lineage_windouw.au3
Запустить Gracia_Plus_OCR.au3, нажать "Check", как появится изображение, нажать "Recognize"
Создано чисто для понятия принципа работы концепта.
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Готовый образец
Код:
AutoItSetOption ( "PixelCoordMode" , 2); читать пиксели с клиентской области окна
AutoItSetOption ( "MouseCoordMode" , 2); координаты клиентской области окна
Global $dig_pos[4][2];объявляем массив, где будут содержаться координаты левого верхнего угла блока с цифрами
$dig_pos[0][0] = 69 ; координата X первой цифры (отсчёт с нуля, горизонталь)
$dig_pos[0][1] = 38 ; координата Y первой цифры (отсчёт с нуля, вертикаль)
$dig_pos[1][0] = $dig_pos[0][0] + 8 ; координата X второй цифры
$dig_pos[1][1] = $dig_pos[0][1] ; координата Y второй цифры
$dig_pos[2][0] = $dig_pos[0][0] + 16 ; координата X третьей цифры
$dig_pos[2][1] = $dig_pos[0][1] ; координата Y третьей цифры
$dig_pos[3][0] = $dig_pos[0][0] + 24 ; координата X четвёртой цифры
$dig_pos[3][1] = $dig_pos[0][1] ; координата Y четвёртой цифры
Sleep(4000)
WinActivate ("Lineage II")
sleep(1000)
$begin = TimerInit()
$ocr = _OCR()
$dif = TimerDiff($begin)
$dif = $dif / 1000
MsgBox (0, "", "Число: "&$ocr&@CRLF&"Время: "&$dif&" сек.")

Func _OCR()
Local $result = ""
$result &= Recognize($dig_pos[0][0], $dig_pos[0][1])
$result &= Recognize($dig_pos[1][0], $dig_pos[1][1])
$result &= Recognize($dig_pos[2][0], $dig_pos[2][1])
$result &= Recognize($dig_pos[3][0], $dig_pos[3][1])
Return $result
EndFunc


Func Recognize($startposX, $startposY)
Local $x = $startposX, $y = $startposY
; проверяем сначала, а есть ли цифра?
$dig_exists = PixelGetColor ($x+2, $y+7)
$dig_exists = Hex($dig_exists, 6); преобразуем в HEX типа FFFFFF
$dig_exists = TrimColor($dig_exists); определяем яркость пикселя
If $dig_exists < 100 Then Return "" 
Local $colors[17];объявляем массив цветов
; получаем цвета пикселей в десятичном виде и сразу же преобразуем в HEX типа FFFFFF
$colors[0] = Hex(PixelGetColor ($x-1, $y+5), 6); 4
$colors[1] = Hex(PixelGetColor ($x, $y), 6); 7
$colors[2] = Hex(PixelGetColor ($x, $y+1), 6); 3
$colors[3] = Hex(PixelGetColor ($x, $y+2), 6); 8, 9
$colors[4] = Hex(PixelGetColor ($x, $y+3), 6); 3, 5
$colors[5] = Hex(PixelGetColor ($x, $y+5), 6); 8
$colors[6] = Hex(PixelGetColor ($x, $y+6), 6); 3, 6
$colors[7] = Hex(PixelGetColor ($x, $y+7), 6); 2
$colors[8] = Hex(PixelGetColor ($x+1, $y+3), 6); 5
$colors[9] = Hex(PixelGetColor ($x+2, $y+1), 6); 1, 6
$colors[10] = Hex(PixelGetColor ($x+2, $y+2), 6); 1
$colors[11] = Hex(PixelGetColor ($x+2, $y+4), 6); 8
$colors[12] = Hex(PixelGetColor ($x+2, $y+6), 6); 7
$colors[13] = Hex(PixelGetColor ($x+3, $y+5), 6); 9
$colors[14] = Hex(PixelGetColor ($x+4, $y+2), 6); 9
$colors[15] = Hex(PixelGetColor ($x+4, $y+7), 6); 2
$colors[16] = Hex(PixelGetColor ($x+5, $y+3), 6); 0
For $i = 0 to 16 ; определяем из всех цветов их яркость
$colors[$i] = TrimColor($colors[$i])
Next
If $colors[16] >= 130 Then Return "0"
If $colors[0] >= 130 Then Return "4"
If $colors[9] >= 130 And $colors[10] >= 130 Then Return "1"
If $colors[7] >= 130 And $colors[15] >= 130 Then Return "2"
If $colors[2] >= 130 And $colors[4] < 100 And $colors[6] >= 130 Then Return "3"
If $colors[4] >= 130 And $colors[8] >= 130 Then Return "5"
If $colors[6] >= 130 And $colors[9] >= 130 Then Return "6"
If $colors[1] >= 130 And $colors[12] >= 130 Then Return "7"
If $colors[3] >= 130 And $colors[5] >= 130 And $colors[11] >= 130 Then Return "8"
If $colors[3] >= 130 And $colors[13] >= 130 And $colors[14] >= 130 Then Return "9"
; если ни одна цифра не совпала, возвращаем пустоту
Return ""
EndFunc

; ------------------- TrimColor --------------------
Func TrimColor($TargetTrim); передать цвет в формате Hex 000000 RGB
Dim $a, $as, $as1, $as2, $a_fin
$a = $TargetTrim
$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
 

xamd

AION bot developer
Сообщения
66
Репутация
24
Re: Lineage II, работа с показателями жизни

А как бы зачем усложнять? Считайте из памяти эти значения!
Чуть позже, как допишу своего бота, выложу базовые скрипты с разбором функций, дам линк
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

Юзайте Номад Мемори
http://autoit-script.ru/index.php?topic=1607.0
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Я думал об этом, но всяческие защиты типа Frost скорее всего не дадут нам читать память процесса. А ещё я не смог артманей найти в памяти адреса. Если кто подскажет попробую.
 

xamd

AION bot developer
Сообщения
66
Репутация
24
Re: Lineage II, работа с показателями жизни

Фрост обходится как 2 пальца.
В инете можно найти.

P.S. Извини, не скажу как (на то есть веские причины).
Ибо если информация попадет в широкие источники, иннова узнает и пофиксит.
Если пофиксит - накроется моя лазейка и мой бот Айона иже с ней.

Я искал дня 2, на 2 день нашел за 30 минут )
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Ну я имел ввиду подсказать как искать адреса в памяти артманей (какие параметры поиска задать). Но если всётаки фрост это не даёт делать то не буду заморачиваться.
 

xamd

AION bot developer
Сообщения
66
Репутация
24
Re: Lineage II, работа с показателями жизни

FROST не дает.

Ла2 юзает DMA, так же как и AION, поэтому канители будет много, если только не найдешь готовые оффсеты.

Про оффсеты ты можешь почитать в соседней теме, поиск в помощь.
Поверь, если хочешь написать бота, то игра стоит свеч.

Если нужна доп инфа - пиши, помогу, чем смогу.
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Решил тут позагоняться с рыбалкой в Lineage2, Анализ уровня жизни рыбы.
Вот что пока имею:
Код:
; -----------------------------------------------------------------------------------
; AutoIt Version: 3.3.6.1
; Author: ynbIpb
; Script Function: Получение значения HP рыбы из окна игры Lineage 2 Gracia
; -----------------------------------------------------------------------------------
AutoItSetOption ( "PixelCoordMode", 2);относительные координаты клиентской области активного окна
AutoItSetOption ( "MouseCoordMode", 2)
AutoItSetOption ( "TrayAutoPause", 0); отключить автопаузу при клике в трее

; определение координат окна рыбалки
Global $FishPosX = "" ; объявляем переменные для координат окна рыбалки
Global $FishPosY = ""
$options_ini = @ScriptDir & "\options.ini"
If FileExists ($options_ini) Then
	$gamedir = IniRead ($options_ini, "settings", "gamedir", "")
	$WindowsInfo_ini = $gamedir & "\system\WindowsInfo.ini" ; полный путь к файлу игры WindowsInfo.ini
	If FileExists ($WindowsInfo_ini) Then
		$FishPosX = IniRead ($WindowsInfo_ini, "FishViewportWnd", "posX", "" )
		$FishPosY = IniRead ($WindowsInfo_ini, "FishViewportWnd", "posY", "" )
	Else
		TrayTip ( "Ошибка!", "Невозможно найти файл игры WindowsInfo.ini", 3, 3)
		Sleep(3000)
		Exit
	EndIf
Else
	TrayTip ( "Ошибка!", "Невозможно найти файл options.ini", 3, 3)
	Sleep(3000)
	Exit
EndIf
TrayTip ( "отладка", "Координаты: "&@CRLF& "X: "&$FishPosX&@CRLF& "Y: "&$FishPosY, 3, 1)
Sleep(3000)


Global $L2_win = WinGetHandle ("Lineage II", "")
If $L2_win = "" Then Exit; если вернулась пустота, значит окна не существует. выход
WinActivate ($L2_win)
Sleep (3000)
$begin = TimerInit()
$percent = ControlHP($FishPosX + 19, $FishPosY + 257, 228)
$dif = TimerDiff($begin)
$dif /= 1000
$dif = Round ($dif , 2) 
TrayTip ("отладка", "полоса HP рыбы: " & $percent & " %"& @CRLF & "Время отработки: " & $dif & " сек.", 3, 1)
sleep(5000)

Func ControlHP($HPx, $HPy, $len) ; передаём в функцию координаты и длинну
Local $color
Local $HPx2 = $HPx
While 1
$color = Hex(PixelGetColor($HPx2, $HPy), 6)
$brightness = TrimColor($color)
If $brightness >= 80 Then ; если больше или равно 80, то это синяя полоса
$HPx2 += 1
Else
ExitLoop
EndIf
sleep(10)
WEnd
$HPx2 -= $HPx 
$Percent = $HPx2 * 100 / $len 
$Percent = Ceiling ($Percent)
Return $Percent
EndFunc

; функция возвращает яркость цвета
Func TrimColor($TargetTrim); передать цвет в формате Hex 000000 RGB
Dim $a, $as, $as1, $as2, $a_fin
$a = $TargetTrim
$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

Проблема в том, что время отработки анализа полосы 2.33 сек. Это очень много. В реальном окне игры вообще 5.44 сек. Может у меня комп голючит, если у кого есть возможность, проверьте какое время у вас. Или может есть альтернативные идеи работы с этим показателем?
Содержимое options.ini
Код:
[settings]
gamedir=D:\Games\LineageII
Настройки в WindowsInfo.ini под скрины в имитаторе окна игры
Код:
[FishViewportWnd]
posX=10
posY=87
Тут всё в архиве: fishing.rar
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

ХП бар рыбы в студию, желательно весь скрин целиком и на нем как-нибудь обвести хп бар рыбы :smile:
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

окошко рыбы:
shot00003ve.png

Весь скрин целиком в формате BMP в архиве с имитатором окна игры постом выше.
так как цвет полосы не однородный, использую всё туже функцию с яркостью.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

А собственно встречный вопрос, что мешает тебе пользоваться пиксельсерчем? В миллион раз быстрее и так же надежно в этой ситуации.


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

Нежели ты будешь использоваться пгк на каждый пиксель по ширине, проще использовать 1 пиксельсерч, разница в том что одна строчка пиксельсерча заменит все те строки заключенные в твой While When цикл. Тобишь в место сотни ПГК ты 1 ПС используешь, результат будет одинаковым.
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Я избрал путь определения яркости, так как полоса жизни даже в длинну имеет неоднородный цвет он плавно перетекает в другой (точнее меняет свою яркость). Попробую поиграться с параметром shade-variation в функции PixelSearch
небольшая выборка пикселей слева направо:
Цвет: 027EB5, яркость: 103
Цвет: 0180B8, яркость: 104
Цвет: 0181B9, яркость: 105
Цвет: 0181BA, яркость: 105
Цвет: 0082BB, яркость: 106
Цвет: 0083BC, яркость: 106
Цвет: 0083BD, яркость: 107
Цвет: 0083BD, яркость: 107
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

Исходя из твоего скрина, меняет цвет полоска только по высоте. Тем более что мешает тебе искать темный цвет отсутствующего хп?
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: Lineage II, работа с показателями жизни

Что-то типа этого:
Код:
Func ControlHP($HPx, $HPy, $len) ; передаём в функцию координаты и длинну
Local $color = 0x291313 ; искать красный цвет RGB
$position = PixelSearch ($HPx, $HPy, $len, $HPy, $color, 4, 2); разброс яркости 4, шаг поиска каждый второй пиксель
If IsArray ($position) Then
$position[0] -= $HPx 
$Percent = $position[0] * 100 / $len 
$Percent = Ceiling ($Percent)
Return $Percent
EndIf
Return 0
EndFunc

В длинну полоса тоже меняется, но незначительно.
Пока сервак лежит, проверил на скриншоте всё ок. скорость 0.04 сек
Нужно получить ещё два скриншота с полностью красной и полностью синей полосой, чтоб определить максимальный разброс яркости каждого цвета. Ещё можно увеличить шаг поиска, так как убавление и прибавление полосы тоже имеет свой шаг и он постоянный.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Lineage II, работа с показателями жизни

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

shm_alex

Новичок
Сообщения
34
Репутация
4
Re: Lineage II, работа с показателями жизни

Belfigor сказал(а):
Код:
Func TrimColor($TargetTrim)
#cs TrimarkColor - Comment Start
Исползуется для получения из цвета в формате RGB значение яркости пикселя. Возвращает значение от 0 до 255.
Скорость:
Функция выполняется за ~0.06-0.10 мс.
#ce TrimColor - Comment End
Dim $a, $as, $as1, $as2, $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 brightness( $iColor)
	local $Red=BitShift(BitAND(Int($iColor),0x00FF0000),16)
	local $Green=BitShift(BitAND(Int($iColor),0x0000FF00),8)
	local $Blue=BitAND(Int($iColor),0x000000FF)
	return Int(Sqrt(($Red*$Red+$Green*$Green+$Blue*$Blue)/3))
EndFunc
 

Dizelist

Новичок
Сообщения
17
Репутация
1
Re: Lineage II, работа с показателями жизни

помогите распознать цифры
3qog8bT7qk6POcWMJhxiqA.bmp
 
Верх