Что нового

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

ynbIpb

Скриптер
Сообщения
399
Репутация
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 586
Репутация
934
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 586
Репутация
934
Re: Lineage II, работа с показателями жизни

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

ynbIpb

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

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

Belfigor

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

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

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

ynbIpb

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

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

Belfigor

Модератор
Локальный модератор
Сообщения
3 586
Репутация
934
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
 
Автор
ynbIpb

ynbIpb

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

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

Belfigor

Модератор
Локальный модератор
Сообщения
3 586
Репутация
934
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 586
Репутация
934
Re: Lineage II, работа с показателями жизни

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

ynbIpb

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

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


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

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

Belfigor

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

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

ynbIpb

Скриптер
Сообщения
399
Репутация
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 точке в квадрате и возвращаться результат.
Ну это пока только в голове, в коде ещё не тестил...
Ох-хо-хо, у меня такой же концепт на ОКР тока для шрифта евы валяецо уже месяц, всё руки не дойдут никак написать.
Просто удивилсо. Очень грамотно описано.
 
Автор
ynbIpb

ynbIpb

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

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

XevaloO

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

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

Yashied

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

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

Belfigor

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

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