Что нового

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

ynbIpb

Скриптер
Сообщения
398
Репутация
109
Вопрос по поводу Lineage2
В последней версии создатели игры усложнили определение уровня HP\MP через пиксели. Полоска стала не однородного цвета в длинну, цифры перекрывают полоску целиком по высоте.
Есть идеи как эфективно определять уровни в такой ситуации?

----
В старых версиях всё было проще. Цифры не перекрывали полоску по краям и она была одного цвета в длинну.

Сканированием верхнего края полосы добивался результата вот так:
Код:
Func ControlHP($HPx, $HPy, $len, $color) ; передаём в функции координаты, длинну и цвет
Local $color2 = $color
Local $HPx2 = $HPx
While $color = $color2
$HPx2 += 1
$color2 = Hex(PixelGetColor($HPx2, $HPy), 6)
WEnd
$HPx2 -= 1 
$HPx2 -= $HPx 
$Percent = $HPx2 * 100 / $len 
$Percent = Ceiling ($Percent)
Return $Percent
EndFunc
 

Belfigor

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

Вынес сообщение в отдельную тему, ну и хочу представить вам функцию написанную Archy26, мы используем ее для обработки пикселя в монохромном режиме, то есть нам не важен цвет пикселя, все что мы обрабатываем - это его яркость:
Код:
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

Получая цвет в формате 0x000000 функция возвращает значение яркости от 0 до 255, тем самым отпадает проблема со всякими бликами и переливаниями интерфейса.

Далее еще одно, более актуальное и механизму и по скорости работы решение - использование PixelSearch, определить Pixelsearch высотой в 1 пиксель и шириной на одну полоску и задать ему поиск цвета в достаточно широком диапазоне, далее. Приравнять сам пиксельсерч к какой-нибудь переменной, далее когда PS находит нужный цвет он вернет в переменную в [0] значение Х которое будет отражать первый найденный пиксель подходящего цвета. Далее мы можем посчитать локальное расположение этого пикселя на самой полоске и из этого вычислить % хп, мп и сп.

Второй способ (как и первый но все же я бы выбрал второй) позволяет обойти эти самые цифры, они просто неподойдут под нужный цвет. Так же я бы порекомендовал просто личить их из памяти :smile:. Lineage II думаю ничем особенным от остальных ммо игр не отличается (таких как WoW, Allods и тд), поэтому хранит свои данные в памяти процесса, а пользователь может их оттудова успешно извлеч при желании и использовать в своих корыстных целях.

Ниже собственно приведен скрин с ранних времен ЗБТ Аллодов.

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

Я бы остановился на варианте с PixelSearch

Собственно вот пример поиска % заполненности полоски с помощью PSearch
Код:
Func _WinGetMyCargoStatus()
        Dim $MyCargoLeftTopX = 775, $MyCargoLeftTopY = 591, _
        $CargoStatusBarLTX = $MyCargoLeftTopX + 127, $CargoStatusBarLTY = $MyCargoLeftTopY + 61, $CargoStatusBarRBX = $CargoStatusBarLTX + 98, $CargoStatusBarRBY = $CargoStatusBarLTY + 4, _
        $CargoStatusBarCol = 0x010E12, $CargoStatusBarShade = 5
        $FullCargoStatusBar = PixelSearch($CargoStatusBarLTX, $CargoStatusBarLTY, $CargoStatusBarRBX, $CargoStatusBarRBY, $CargoStatusBarCol, $CargoStatusBarShade)
        If @error Then
            Return 100
        Else
            $FullCargoPercent = Round((($FullCargoStatusBar[0] - $CargoStatusBarLTX) * 100 / 99),0)
            Return $FullCargoPercent
        EndIf
    EndFunc
 

CROL

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

а возможно ли преобразовать изображение в значение? ну как на рисунке, там же показано кол-во хп цифрой, может возможно преобразовать этот кусок изображения в текстовое значение или нет?
 

Belfigor

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

Что тебе даст это значение? И да, если ты можешь посчитать % то ты можешь посчитать и точное число.
 
Автор
Y

ynbIpb

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

Спасибо за развёрнутый ответ, поэкспериментирую с приведёнными функциями.
Вобщем из памяти тырить данные не получится, так как игру оберегает GG (GameGuard), хотя пока GG жив он не даёт даже считать цвет с окна, не говоря уже о эмуляции мыши и клавы, всё блочит наглухо.
Народные умельцы отключают ГГ, тут уже можно поработать с пикселями, но на многих не официальных серверах админы вешают сомадельную защиту, которая опятьже не даёт читать память процесса.
а возможно ли преобразовать изображение в значение?
Были такие мысли но думаю очень много времени будет тратиться на распознавание цифр, так как нужно распознать не только текущее значение, но и максимальное, чтоб высчитать процент.
Ещё у меня такая идея по обходу цифр: разбить полоску на 20 кусков и используя PixelSearch искать нужный цвет в каждом квадрате поочерёдно, но опять же цвет не один, и уже будет не точность в процентах, так как шаг будет 5%
 

Belfigor

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

<<<Репо кнопка вот с этой стороны

Разбивать поле на сколько-то кусков, такое имеет смысл из всех известных мне ммо игр только у нас в еве, потому что полоски ХП у нас полукругом расположены. В ла2 же хватит одного псерча по горизонтали на всю полоску хп
 
Автор
Y

ynbIpb

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

ммм...
Поиск проводится сверху вниз и слева направо, после первого удачного пиксела функция возвращает результат.
А нужно наоборот, чтоб читал с конца полоску. Как его заставить?
Репо кнопка вот с этой стороны
ах да как эт я забыл ;) нажал.
 

Belfigor

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

Можно задать как искомый - цвет бэкграунда "без хп", и обыскивая слева на право он будет возвращать первую точку где начинается бэкграунд. Ну или же по средством For...Next цикла инвертировать поиск путем поочередного сканирования области в 1 пиксель справа на лево


Код:
$col = "Цвет бэкграунда без хп"
$x = "Х координата левой стороны полоски хп"
For $i = "Х координата правой стороны полоски хп" To $x Step -1
	PixelSearch($x - $i, $y, $x - $i, $y, $col, 10)
	If Not @error Then
		Return "возвращаем % хп"
		ExitLoop
	EndIf
Next
 
Автор
Y

ynbIpb

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

блин точно! тормозю...
но тут ещё одна хитрость при снижении хп ниже 30-40% полоска начинает мигать то цвет бэкгроунда, то свой цвет. ;D
 

Belfigor

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

ynbIpb сказал(а):
блин точно! тормозю...
но тут ещё одна хитрость при снижении хп ниже 30-40% полоска начинает мигать то цвет бэкгроунда, то свой цвет. ;D
Ну теоретически если ниже 30-40% то пора лечиться. А так, в зависимости от того с какой частотой начинает мигать полоска можно сделать так, что когда хп дошли до этого уровня, включается цикл который сканирует полоску хп от этих самых 30-40% до нуля каждый пиксель по 3-4 раза и если все 4 раза вернулось значение бекграунда то переходит левее, если же хотябы 1 значение <> бэкграунд значит мы нашли что искали и возвращаем опять же %
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Lineage II, работа с показателями жизни

Вот я тут посмотрел... И сдаётся мне, что цвет фона пиксельсёрч может найти и в тени от цифр, и результат работы будет неправильный. Так что имхо, надо делать две проверки в цикле - сначала ищем цвет фона, а потом от той точки и правее - цвет полной полоски на том уровне. Если нашли, от найденной точки вправо снова ищем цвет фона, а от неё - цвет полной. До тех пор, пока цвет полной будет искаться. Как только не найден - всё, это действительно край.
Кроме того, хоть цифры и на всю высоту - подумаешь! Зато полоска значительно длиннее прежней и цифры на ней по горизонтали занимают намного меньше места.

Кроме того, саму линейку жизни можно разбить условно на сколько-то участков и проверять конкретно яркость пикселей, чтобы она была в пределах плюс-минус. CheckPixel. Разбить таким образом, чтобы средние контрольные точки попадали как раз на слева-справа от символа "/". А цифры - не попадали в область контрольных точек. Тогда, используя мою функцию, как только будет найдена точка темнее, или светлее в момент мигания - значит вот тут где-то и граница.
Кстати, во время мигания меняется и цвет ещё заполненной части?
Засечь кстати время мигания, и вставить небольшие паузы в цикл проверки, чтобы не получилось проверить до 100% в момент мигания и яркости как у нормальной полной полосы. Засечь время одного мигания, разделить на количество контрольных точек, и ещё на 4 (типа половина времени прохождения цвета от яркого к тёмному) и вставить такие sleep, не забыв умножить на 1000 (sleep указывается в милисекундах, ага).
 

Belfigor

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

Вы бы показали кстати как полоска например хп при 5% выглядит
 
Автор
Y

ynbIpb

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

Lexx98 сказал(а):
Зато полоска значительно длиннее прежней и цифры на ней по горизонтали занимают намного меньше места.
неее, она расширяется руккми за край окна, это было во всех версиях. Естественно я её растянул на максимум, чтоб удобнее читать.
Кстати, во время мигания меняется и цвет ещё заполненной части?
Ну она просто меняет свой цвет на цвет бэкграунда. Да думаю можно просто сделать двойную проверку через паузу.
Belfigor сказал(а):
Вы бы показали кстати как полоска например хп при 5% выглядит
Я сейчас не дома, по этому не могу полномасштабных тестов проводить, сейчас просто собираю все советы и идеи. Из скринов ещё есть вналичи только это:


Ещё мысли вот такие:
1. Всётаки вернуться к распознанию 4х цифр, максимальное значение можно и не считать, а задавать в ручную, благо оно не часто меняется. А эти цифры может занести в базу по пиксельчексумм и сравнивать?

2. Если чар выделяет сам себя в таргет, то появляется ещё окошко с полосами хп\мп и чистенькие без надписей, по ним очень легко считать, но есть минусы: во время боя чтоб проверить своё хп придётся снимать таргет с моба и смотреть на себя, а потом не факт что в таргет попадёт этот же моб а не соседний, ну и затраты времени больше...
 

Belfigor

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

Пиксельчексумм ето корявая вещь, в игре ее хз где можно будет использовать, чексумма имхо будет автоматом меняться раз в определенный промежуток времени. Можешь побаловаться с имедж серчем, но я бы остановился на варианте с пиксельсерчем
 
Автор
Y

ynbIpb

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

Да, пиксельчексумм тут не подойдёт.
И так я проанализирповал цифры. что мы имеем:

4 фрагмента, положение их всегда одно (если не двигать окошко с полосками)
Собрал в кучу все цифры и постарался выявить у них уникальные светлые места в этом квадрате 5х8
(кликнуть для увеличения)
Квадраты 5х8 обведены зелёным, уникальные точки синим. Вот только тройку не могу отличить от восьмёрки по белым точкам.
По идее достаточно создать 10 функций, в которых будет проверяться яркость 1-3 точке в квадрате и возвращаться результат.
Ну это пока только в голове, в коде ещё не тестил...
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Re: Lineage II, работа с показателями жизни

ynbIpb сказал(а):
Да, пиксельчексумм тут не подойдёт.
И так я проанализирповал цифры. что мы имеем:

4 фрагмента, положение их всегда одно (если не двигать окошко с полосками)
Собрал в кучу все цифры и постарался выявить у них уникальные светлые места в этом квадрате 5х8
(кликнуть для увеличения)
Квадраты 5х8 обведены зелёным, уникальные точки синим. Вот только тройку не могу отличить от восьмёрки по белым точкам.
По идее достаточно создать 10 функций, в которых будет проверяться яркость 1-3 точке в квадрате и возвращаться результат.
Ну это пока только в голове, в коде ещё не тестил...
Ох-хо-хо, у меня такой же концепт на ОКР тока для шрифта евы валяецо уже месяц, всё руки не дойдут никак написать.
Просто удивилсо. Очень грамотно описано.
 
Автор
Y

ynbIpb

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

Да пока всё в голове крутится, в октябре буду дома и возьмусь за код.
Вернёмся к PixelSearch.
оказывается в Бэте они ввели фичу реверс поиска.
Вот тут показали пример, но только по вертикали: Reverse PixelSearch
Сам пробовал по горизонтали не пашет (((
 

XevaloO

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

Так и что, все по теме умерло? И есче чего хотел спросить, что в автоите всего 3 команды работы с изображением? search get and sum?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Re: Lineage II, работа с показателями жизни

XevaloO сказал(а):
И есче чего хотел спросить, что в автоите всего 3 команды работы с изображением? search get and sum?
А что еще нужно? Более того, я таких команд не знаю (search, get and sum).
 

Belfigor

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

Ага, и из них можно состряпать уже свои команды выполняющие определенные функции. "Ex" версии так сказать
 
Верх