Что нового

[Lineage II] различение одинаковых окон

trizorka

Новичок
Сообщения
53
Репутация
4
Доброго времени суток, прошу прощение, если тема не понравится модератору.
Игра lineage II, есть два окна овер и основа хавк (постоянно активное окно). Запускаю скрипты так: делаю активным первое окно, включаю скрипт для овера, делаю активным второе - включаю скрипт для хавка. Скрипты работают, но есть проблема. PixelSearch и PixelGetColor ищутся на любом активном окне ла2 (активное окно хавка и у него не хватает цп, то овер заливает цп; активное окно овера и у него не хватает цп, то он заливает его). Если окно ла2 закрыть, то соответствующий скрипт тоже закроется. Как мне сделать, что бы первый скрипт правильно работал только на первом окне, и второй - на втором?

для овера

Код:
Global $hWnd = WinGetHandle("[CLASS:l2UnrealWWindowsViewportWindow]")
HotKeySet("{NUMPAD2}", "mana")
HotKeySet("{NUMPAD0}", "CP")
HotKeySet("{NUMPAD1}", "buff")
HotKeySet("^{NUMPAD2}", "mana")
HotKeySet("^{NUMPAD0}", "CP")
HotKeySet("^{NUMPAD1}", "buff")
While True
	If PixelGetColor(63, 486) = 0x102442 Then 
 ControlSend($hWnd, "","", "{F10}") ; если значение мп упало, то юзаются мп банки
 EndIf
 Sleep(100)
If WinExists($hWnd) Then ; если окно ла2 закрывается, то скрипт перестает работать
	Sleep(10)
Else
	Exit
EndIf

	Sleep(10)
	WEnd
Func mana ()
ControlSend($hWnd, "","", "{F10}")
EndFunc

Func CP ()
	ControlSend($hWnd, "","", "{F12}")
EndFunc

Func buff ()
	ControlSend($hWnd, "","", "{F11}")
EndFunc


для хавка

Код:
Global $Paused
Local $hWnd = WinGetHandle("[CLASS:l2UnrealWWindowsViewportWindow]")

While True
PixelSearch( 161, 459, 164, 462, 0x524331,"", "", $hWnd ) ;если значение цп упало, то юзаются нумпад 0, и овер заливает цп
If Not @error Then
	Sleep(300)
Send("{NUMPAD0}")
EndIf
 If WinExists($hWnd) Then  ; если окно ла2 закрывается, то скрипт перестает работать
	Sleep(10)
Else
	Exit
	EndIf
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] различение одинаковых окон

Код:
$hWnd_array = WinList("[CLASS:l2UnrealWWindowsViewportWindow]")
$hWnd1 = $hWnd_array[1][1]  ; для первого скрипта
$hWnd2 = $hWnd_array[2][1]  ; для второго скрипта
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
Re: [Автоматизация] различение одинаковых окон

не помогло.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] различение одинаковых окон

У меня работает если заголовок окна точный "title" прописать, а не "[CLASS...]"
Запусти вот такой скрипт
Код:
#include <array.au3>

$hWnd_array = WinList("[CLASS:l2UnrealWWindowsViewportWindow]")

_ArrayDisplay($hWnd_array)
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
вместо $hWnd_array = WinList("[CLASS:l2UnrealWWindowsViewportWindow]") подставить $hWnd_array = WinList("Lineage II") ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, в параметрах WinList поставить то что Au3Info пишет в
Код:
>>>> Window <<<<
Title:
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
Au3Info пишет Lineage II, подставил - не помогло. Как и было до этого. Может по пид окна различить? Я пробовал, тоже не вышло.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты вот это запусти как отдельный скрипт.
Код:
#include <array.au3>
$hWnd_array = WinList("Lineage II")
_ArrayDisplay($hWnd_array)

Что показывает?
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
[1]|Lineage II (Running)|0x000B14FE
[2]|Lineage II (Running)|0x000314BC
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Замечательно!

Значит в первый свой скрипт ты вставляешь код
Код:
$hWnd_array = WinList("Lineage II")
$hWnd = $hWnd_array[1][1]


Во второй свой скрипт
Код:
$hWnd_array = WinList("Lineage II")
$hWnd = $hWnd_array[2][1]
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
я это уже прописывал после твоего второго комментария.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Так может тебе просто нужно выставить
Код:
Opt("PixelCoordMode", 0)

?
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
Сделал это
Код:
Opt("PixelCoordMode", 0)
Отнял от координат PixelSearch и PixelGetColor координаты окна. Работает как и до этого. Как сделать что бы PixelSearch работало только на одном окне? Пробовал изменять титл окна, что-то не получилось, может защита не дает.
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
в той задачи не задействована функция PixelSearch, а мне она как раз нужна, она ищет на любом активном окне ла2... нужно только на одном.
 

running-frag

why me?
Сообщения
441
Репутация
60
Мда, тугова то что то у вас идёт.

1. Запоминаешь идентификаторы окон. Либо по Handle, либо по имени окна (WinGetTitle), либо как нить ещё (не пробывал писать ботов под л2 поэтому не скажу точно, но уверен на 100% что это можно решить).
2. Записуешь эти идентификаторы в массив.
3. Устанавливаешь опции скрипта
Код:
Opt ("MouseCoordMode",		2)	
Opt ("PixelCoordMode",		2)

4. Расчёты делаешь относительно окна (согласно опциям выше).
5. Переключаешься по окнам согласно массиву с индентификаторами, так же и определяешь какие функции согласно этим индентификаторам.

Что не получается то? :-X

PS: Прочитал с начало топик, чего то не вопроса, ни проблемы, неочём как то топик.


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

По поводу рабочей зоны PixelSearch() . . . Получаем (или сам задаём) нужные параметры в переменные, переменные подставляем в PixelSearch() (ключевым моментом является две опции Opt() указанные выше). Так же можем попутно менять размеры окна сами (функция WinMove()).
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
4. Расчёты делаешь относительно окна (согласно опциям выше). Получается относительно координат клиентской области определяемого окна. А как мне эти координаты то добыть?
 

running-frag

why me?
Сообщения
441
Репутация
60
Посмотри у меня в подписи Big Boss Inform. Это если "по быстрому заюзать готовое" (компилишь и используешь ехе). Там же реализация данной функций в виде .au3 файла.
 
Автор
T

trizorka

Новичок
Сообщения
53
Репутация
4
Не разобрался с координатами. У меня окно Position (-2;398) Size (1284;587)
Код:
PixelSearch(60, 484, 64, 487, 0x102442,"", "", $hWnd)

. Если бы PixelCoordMode = 0, то тут понятно сразу. Получиться
Код:
PixelSearch(60+2, 484-398, 64+2, 487-398, 0x102442,"", "", $hWnd)

При PixelCoordMode = 0 не работало, я думаю что при =2 тож. PixelSearch работает на любом активном окне, а мне нужно что бы на конкретном, вот в чем вопрос.
 

Belfigor

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

Координаты относительно угла окна или же клиентской области приложения удобнее всего определять с помощью поставляемой в комплекте Au3Info. Там просто в меню сверху надо выбрать соответствующий пункт.
 
Верх