Что нового

Небольшой скрипт для WoW, автоматизация атаки цели.

Nurgllz

Новичок
Сообщения
26
Репутация
2
Код:
Global $WinName = "World of Warcraft"
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
HotKeySet("{Pause}", "TogglePause")
HotKeySet("^{Pause}", "_Exit")
HotKeySet("{F1}", "Wait")
Global $Paused
Sleep(500)
Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(500)
        ToolTip('Paused',180,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
	MsgBox(0,"","Выход")
	Exit
EndFunc

While 1
	TogglePause()
	Sleep(100)
WEnd

WinActivate($WinName)
WinWaitActive($WinName)

Func Wait()
While 1
ToolTip('Waiting',180,0)
Sleep(200)
$wait1 = PixelSearch( 300, 55, 310, 65, 0x009000 )
If Not @error Then CheckTypeTarget()
Wend
EndFunc

Func CheckTypeTarget(); Проерка цели, если можно атаковать то переход в функцию проерки дистанции
ToolTip('Проверка типа цели',180,0)
PixelSearch( 310, 41, 310, 41, 0x00D000, 5) ; Green Color
If Not @error Then Wait()
PixelSearch( 305, 41, 305, 41, 0xBF0000, 5) ; Red
If Not @error Then CheckHP()
EndFunc

Func CheckHp(); Если есть хп то проверить дистанцию
Do
ToolTip('Проверка хп',180,0)
Sleep(100)
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если у цели хп то проверить дистанцию
Until Not @error
DistCheck()
EndFunc

Func DistCheck() ; Если допустима атака то переход в функцию атаки
While 1
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
ToolTip('Проверка дистанции',180,0)
PixelSearch( 244, 967, 244, 967, 0xFF1A1A, 5) ; Red
If @error Then Atack()
Wend
EndFunc

Func Atack()
ToolTip('Атака',180,0)
PixelSearch( 300, 55, 310, 65, 0x009000 ) ; Если есть хп атаковать
If Not @error Then
Send("1")
EndIf
While 1
ToolTip('Каст',180,0)
Sleep(200)
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
PixelSearch( 732, 810, 732, 810, 0x06A602, 10); Если прошел каст то проверить дистанцию
If Not @error Then DistCheck()
PixelSearch( 883, 809, 883, 809, 0xBA0000, 10); Если не прошел каст то проверить дистанцию
If Not @error Then DistCheck()
WEnd
EndFunc


Сделал макрос из-за унылого нажимания 1-й кнопки в данжах, теперь это делает макрос)
Если есть идеи по улучшению или поможете улучшить/упростить макрос буду рад их услышать(прочитать).
Ещё не ввел проверку не агро-мобов и дружественных целей в остальном вроде все так.

Вот скрин и небольшие пояснения, не знаю чем именно, но может кому-нибудь поможет)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Небольшой макрос для WoW, автоматизация атаки цели.

Ну тогда читайте:
1. Чтобы не было путаницы с внутренними макросами WoW, предлагаю назвать это дело скриптом.
2. Для того чтобы его удобнее было читать, отформатируйте его как следует и поставьте в теги
Код:
[autoit][/autoit]
3. Функция CheckHP(), если у цели нет хп, скрипт зависнет в этом месте до следующего моба у которого есть хп.
4. На лицо рекурсия, тоесть функция а вызывает функцию б, которая в свою очередь снова вызывает функцию а, которая опять вызывает функцию б, которая... В конце концов вылетит ошибка. Используйте Return.
5. Вместо
Код:
While 1
	TogglePause()
	Sleep(100)
WEnd

напишите
Код:
While 1
	Check()
	Sleep(100)
WEnd

и сотрите из функции TogglePause() вызов функции Check(). Лишнее.
 
Автор
N

Nurgllz

Новичок
Сообщения
26
Репутация
2
функция TogglePause() нужна для того чтобы приостановить скрипт, он просто не всегда нужен. Иногда приходится ручками действовать ;)
По поводу 3-го пункта, вроде все работает, я пока не могу сказать что его долго тестил, но с этой функцией все норм.
Не асилил 5-й пункт)))

ПС нашел ошибку.... не может найти зеленую полоску при завершении каста....
Код:
Func Atack()
ToolTip('Атака',180,0)
PixelSearch( 300, 55, 310, 65, 0x009000 ) ; Если есть хп атаковать
If Not @error Then
Send("1")
EndIf
While 1
ToolTip('Каст',180,0)
Sleep(200)
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
PixelSearch( 732, 810, 732, 810, 0x06A602, 10); Если прошел каст то проверить дистанцию
If Not @error Then DistCheck()
PixelSearch( 883, 809, 883, 809, 0xBA0000, 10); Если не прошел каст то проверить дистанцию
If Not @error Then DistCheck()
WEnd
EndFunc


В принципе можно решить проблему просто поставив слип под время каста, но его могут сбить т.е. время каста увеличится... в общем возникла проблемка...
 
Автор
N

Nurgllz

Новичок
Сообщения
26
Репутация
2
Код:
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна



While 1
ToolTip('Каст',180,0)
PixelSearch( 705, 808, 919, 812, 0xCF0000); Если не прошел каст то проверить дистанцию
If Not @error Then 	MsgBox(0,"","Каст прошел")
Sleep(100)
PixelSearch( 705, 808, 919, 812, 0x00CF00); Если прошел каст то проверить дистанцию
If Not @error Then 	MsgBox(0,"","Каст не прошел")
Sleep(100)
WEnd
EndFunc

если вот так ставлю то работает идеально, если в 1-м скрипте заменяю
Код:
MsgBox(0,"","Каст прошел")
на
Код:
atack()
то не пашет, почему?????)
уже задолбался с ним....
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Поставьте
Код:
atack()

а в начале этой функции допишите
Код:
MsgBox(0,"","Каст прошел")

Вот так:
Код:
Func atack()
	MsgBox(0,"","Каст прошел")
	...
EndFunc


Если MsgBox сработает, значит функция atack() вызвается.
Тогда ошибка уже где то в ней. (в atack()).
 
Автор
N

Nurgllz

Новичок
Сообщения
26
Репутация
2
Уже все протестил ошибка именно в этой части...
Точнее не ошибка... А почему то он то ли не успевает поймать цвет то ли ещё что... Может привисает ненадолго.

ПС
Код:
ToolTip('Каст',180,0)
когда тестил обычно выставлял небольшой делэй чтобы видеть как там работает макрос.
 
Автор
N

Nurgllz

Новичок
Сообщения
26
Репутация
2
Пообщался с Belfigor и он подкинул мне одну идею, в общем скрипт заработал идеально))))) Буду тестить, ну а пока выкладываю вариант которым сам пользуюсь. Должен работать на разрешении 1680х1050.
Код:
Global $WinName = "World of Warcraft"
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
HotKeySet("{Pause}", "TogglePause")
HotKeySet("^{Pause}", "_Exit")
HotKeySet("{F1}", "Wait")
Global $Paused
Sleep(500)
Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(500)
        ToolTip('Paused',180,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
	MsgBox(0,"","Выход")
	Exit
EndFunc

While 1
	TogglePause()
	Sleep(100)
WEnd

WinActivate($WinName)
WinWaitActive($WinName)

Func Wait()
While 1
ToolTip('Waiting',180,0)
Sleep(200)
$wait1 = PixelSearch( 300, 55, 310, 65, 0x009000 )
If Not @error Then CheckTypeTarget()
Wend
EndFunc

Func CheckTypeTarget(); Проерка цели, если можно атаковать то переход в функцию проерки дистанции
ToolTip('Проверка типа цели',180,0)
PixelSearch( 310, 41, 310, 41, 0x00D000, 5) ; Green Color
If Not @error Then Wait()
PixelSearch( 305, 41, 305, 41, 0xBF0000, 5) ; Red 0xD3D000
If Not @error Then CheckHP()
PixelSearch( 310, 41, 310, 41, 0xD3D000, 5) ; yellow Color
If Not @error Then CheckHP()
EndFunc

Func CheckHp(); Если есть хп то проверить дистанцию
Do
ToolTip('Проверка хп',180,0)
Sleep(100)
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если у цели хп то проверить дистанцию
Until Not @error
DistCheck()
EndFunc

Func DistCheck() ; Если допустима атака то переход в функцию атаки
While 1
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
ToolTip('Проверка дистанции',180,0)
PixelSearch( 244, 967, 244, 967, 0xFF1A1A, 5) ; Red
If @error Then Atack()
Wend
EndFunc

Func Atack()
ToolTip('Атака',180,0)
PixelSearch( 300, 55, 310, 65, 0x009000 ) ; Если есть хп атаковать
If Not @error Then
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
Send("1")
CheckCast1()
EndIf
EndFunc



Func CheckCast1()
ToolTip('Каст',180,0)
PixelSearch( 300, 55, 310, 65, 0x009000 ); Если нет хп то вернуться в функцию wait
If @error Then Wait()
Sleep(100)
ToolTip('Каст',180,0)
PixelSearch( 683, 795, 695, 821, 0xAAAAAA ); Если нет хп то вернуться в функцию wait
If @error Then Atack()
PixelSearch( 705, 808, 919, 812, 0xCF0000); Если не прошел каст то проверить дистанцию
If Not @error Then 	Atack()
CheckCast2()
EndFunc

Func CheckCast2()
PixelSearch( 705, 808, 919, 812, 0x008F00, 10); Если прошел каст то проверить дистанцию
If Not @error Then 	Atack()
CheckCast1()
EndFunc

:IL_AutoIt_1:
ПС может где то напартачил с коментами или ещё чем, дописывал скрипт после долгой бессонной ночи, если что пишите исправлю.
 
Верх