Что нового

Lineage G Final, пишу кликер.

  • Автор темы Ineren
  • Дата начала
I

Ineren

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

собственно раньше пользовал ACtools - простенький кликер - с простенькими скриптами)
начал разбираться в автоит - оказалось тут все не так просто) собвственно хочу попросить помоши с написанием основного тела скрипта... в ACtools это выглядело примерно так

[box title=ACTools script]
Constants // тут все ясно - косты для окна
xleft1 = 10
xleft2 = 0
xleft3 = 0
y1 = 12
y2 = 0
y3 = 0
end


SetActiveWindow lineage II // выбираем активное окно
delay 2000
Keydown {Esc} 50 // убираем выбранный таргет если есть такой

Keydown {F6} 100 //поднимаем лут (на панели стоит лутпикап)
delay 1000

Loop 5000000 //дофига повторов, нельзя поставить бесконечный цикл... точнее я не разобрался как))
LoadRGB 175, 71 //смотрим цвет в координатах
if {rgbred} < 100 //
Keydown {F11} 100 //если да, пьем HP (стоит на панели на ф11)
end //
Keydown {F7} 100 //некстаргет
delay 500
Keydown {F10} 100 //еще раз на другую кнопку, старая защита на серваке блочила иногда... из-за этого бот дох... (или как вариант макрос на манели /target имя_моба)
LoadRGB 404, 58 //смотрим цвет
if {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100
call combat //если цвет есть (появилось окно-ХП моба), вызываем процедуру
End
delay 200
Keydown {F7} 100 //повторряем... непонятно почему - но с этим повтором стало работать лучше...
delay 500
Keydown {F10} 100
LoadRGB 404, 58
if {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100
call combat
End
End

Procedure combat //процедура которую вызывали
while {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100 //в то время как имеем пикчель нужного цвета, жмем кнопки и проверяем этот пиксель...
LoadRGB 404, 58
Keydown {F8} 100
delay 100
Keydown {F9} 100
end
delay 100
Keydown {F9} 50 //далее лутаем, пьем бутылки, спойлим... все от задачи зависит...
delay 100
Keydown {F6} 100
delay 1000
Keydown {F6} 100
delay 1000
Keydown {Esc} 50
LoadRGB 144, 74
if {rgbred} < 100
Keydown {F11} 100
end
end
[/box]

вот такой был скриптик - и именно с ним мне надо помочь)) хотя бы в черновую направление - а дальше сам разберусь)

в планах сделать еще графическую обвязку))

еще вопросы по возможности реализации...
1 есть у автоита возможность посылать команды в неактивное (например свернутое в трей) окно? просто кликер UOpilot такое делал... возможно ли?
2 бесконечный цыкл... грубо говоря надо посыласть последовательность нажатий в неактивное(?) окно бесконечно))

собственно все) зарание всем огромное спасибо))

ЗЫ да... забыл совсем... клики мышкой не интересуют в принципе... все решается посредством одной клавы...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
По поводу работы со свернутым окном насилуй вот эту тему: http://autoit-script.ru/index.php/topic,50.0.html
Там приведена UDF которая позволяет засылать клики мыши в свернутое окно в игру, как там же упомяналось ее можно переделать вроде бы под работу с клавишами.

Код твой щас прочитаю и выложу в версии автоита.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 528
Репутация
325
Ineren сказал(а):
1 есть у автоита возможность посылать команды в неактивное (например свернутое в трей) окно? просто кликер UOpilot такое делал... возможно ли?
2 бесконечный цикл... грубо говоря надо посыласть последовательность нажатий в неактивное(?) окно бесконечно))
1. Да возможно.
2.
Код:
While 1
;последовательность команд
WEnd
 
Автор
I

Ineren

Гость
Belfigor сказал(а):
По поводу работы со свернутым окном насилуй вот эту тему: http://autoit-script.ru/index.php/topic,50.0.html
Там приведена UDF которая позволяет засылать клики мыши в свернутое окно в игру, как там же упомяналось ее можно переделать вроде бы под работу с клавишами.

Код твой щас прочитаю и выложу в версии автоита.
спасибо огромное) курю тему))

Medic84 сказал(а):
Ineren сказал(а):
1 есть у автоита возможность посылать команды в неактивное (например свернутое в трей) окно? просто кликер UOpilot такое делал... возможно ли?
2 бесконечный цикл... грубо говоря надо посыласть последовательность нажатий в неактивное(?) окно бесконечно))
1. Да возможно.
2.
Код:
While 1
;последовательность команд
WEnd
спасибо)

по поводу второго) признаю - балбес))
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
Вот, там не стал каждый keydown и pixelsearch переделывать, на примере первых свои переделаешь :smile:
Код:
Dim $xleft1 = 10, _ ;Задаем список переменных
	$xleft2 = 0, _ 
	$xleft3 = 0, _ 
	$y1 = 12, _ 
	$y2 = 0, _ 
	$y3 = 0
	
WinActivate("lineage II") ;Делаем окно "lineage II" активным
WinWaitActive("lineage II") ;Ждем пока заданное окно не станет активным

Send("{Esc}") ;убираем выбранный таргет если есть такой
Sleep(50)

Send("{F6}") ;поднимаем лут (на панели стоит лутпикап)
Sleep(1000)

While 1 ;Выполняем до усрачки
	#cs LoadRGB 175, 71  //смотрим цвет в координатах
		if {rgbred} < 100      //
		Keydown {F11} 100  //если да, пьем HP (стоит на панели на ф11)
		end      
		
		Насколько я помню, в ACTool были такие макросы как 
		rgbred rgbblue rgbgreeb rgbblack и тд, которые 
		примерно характеризовали олицетворяемый собою цвет
		В автоите это можно реализовать по средством PixelSearch
	#ce	или же PixelGetColor, я выбираю PixelSearch.
	PixelSearch(175,71,175,71,"Сюда в формате 0xRGB вписать цвет (красный) который надо будет искать", "сюда в виде числа от 0 до 255 вписать разброс по оттенкам GRB")
	If @error Then Send("{F11}") ;Если заданный цвет не найден пьем ХП (стоит на панели на ф11)
	
	;Keydown {F7} 100  //некстаргет
	;delay 500
	Send("F7");некстаргет
	Sleep(500)
	
	;Keydown {F10} 100  //еще раз на другую кнопку, старая защита на серваке блочила иногда... из-за этого бот дох... (или как вариант макрос на манели /target имя_моба)
	Send("{F10}")
	
	;LoadRGB 404, 58  //смотрим цвет
	;if {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100
	;call combat  //если цвет есть (появилось окно-ХП моба), вызываем процедуру
	;End
	;delay 200
	PixelSearch(.........) ;Задать тут необходимые условия для поиска цвета окна ХП моба
	If Not @error Then Combat()
	Sleep(200)
	
	;Keydown {F7} 100 //повторряем... непонятно почему - но с этим повтором стало работать лучше...
	;delay 500
	;Keydown {F10} 100
	Send("{F7}")
	Sleep(500)
	Send("{F10}")
	
;~ 	LoadRGB 404, 58
;~ 	if {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100
;~ 	call combat
;~ 	End
	PixelSearch(.........) ;Задать тут необходимые условия для поиска цвета окна ХП моба
	If Not @error Then Combat()
	Sleep(200)
WEnd




;~ Procedure combat //процедура которую вызывали
;~ while {rgbred} > 100 and {rgbgreen} < 100 and {rgbblue} < 100  //в то время как имеем пикчель нужного цвета, жмем кнопки и проверяем этот пиксель...
;~ LoadRGB 404, 58
;~ Keydown {F8} 100
;~ delay 100
;~ Keydown {F9} 100
;~ end
;~ delay 100
;~ Keydown {F9} 50   //далее лутаем, пьем бутылки, спойлим... все от задачи зависит...
;~ delay 100
;~ Keydown {F6} 100
;~ delay 1000
;~ Keydown {F6} 100
;~ delay 1000
;~ Keydown {Esc} 50
;~ LoadRGB 144, 74
;~ if {rgbred} < 100
;~ Keydown {F11} 100
;~ end
;~ end
Func Combat() ;функция которую вызывали
	While 1  ;в то время как имеем пикчель нужного цвета, жмем кнопки и проверяем этот пиксель...
		;LoadRGB 404, 58
		PixelSearch(404, 58, ...........) ;Проверяем пиксель на наличие нужного цвета
		If @error Then ExitLoop ;Если пиксель нужного цвета по заданным координатам не найден то выходим из цикла	
		
		;Keydown {F8} 100
		;delay 100
		;Keydown {F9} 100
		Send("{F8}")
		Sleep(100)
		Send("{F9}")
	WEnd
	#cs - Все эти нажатия кнопок так же реализуются через Send как и в примерах выше
	delay 100
	Keydown {F9} 50   //далее лутаем, пьем бутылки, спойлим... все от задачи зависит...
	delay 100
	Keydown {F6} 100
	delay 1000
	Keydown {F6} 100
	delay 1000
	Keydown {Esc} 50
	#ce 
	
	;LoadRGB 144, 74
	;if {rgbred} < 100
	;Keydown {F11} 100
	;end
	PixelSearch(144, 74, ...........) ;Проверяем пиксель на наличие нужного цвета (красный)
	If @error Then Send("{F11}");Если пиксель нужного цвета по заданным координатам не найден то пьем бутылку
EndFunc
 
Автор
I

Ineren

Гость
огромное спасибо за скрипт) А ГЛАВНОЕ ЗА КОММЕНТАРИИ))
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
Да не вопрос, спрашивай, тут в соседней теме описан концепт как узнать количество хп в процентах, удобная имхо штука, так же когда разбешеься как использовать PixelSearch, вбей в поисковик по форуму PixelSearchEx, мб удобнее будет чем просто ЗixelSearch :smile:
 
Автор
I

Ineren

Гость
Belfigor сказал(а):
... вбей в поисковик по форуму PixelSearchEx, мб удобнее будет чем просто ЗixelSearch :smile:
вообще кроме твоего сообщения ничего не находит... в справке тоже нет...

появилась проблема,

Код:
PixelSearch (245,75,345,71,"0x791c11", "50")
    	If @error=0 Then Send("{F11}")


в любом случае - найден цвет - не найден - все равно нажимает на кнопку... не понятно почему...

ЗЫ тему про отправку в неактивное окно прокурил полностью... порылся в и-нете... все либо мне не подходит, либо не могу разобраться... у меня там все просто - бесконечно отправлять набор клавиш через заданные промежутки в неактивное окно - все. накидайте плз еще ссылок на темы, а то я что-то не могу ничего путнего найти на просторах и-нета... всего много - но все не то((
 
Автор
I

Ineren

Гость
сделал простой скрипт для проверки - извлекает ли цвет вообще....

Код:
WinActivate("Asterios") 
WinWaitActive("Asterios")
$var = PixelGetColor( 156,89 )
MsgBox(0,"The decmial color is", $var)
MsgBox(0,"The hex color is", Hex($var, 6))


извлекает, но совсем другой, чем я получаю autoit window info...
почему так? эти команды (PixelGetColor, PixelSearch) берут координаты всей области экрана или рабочей области окна??
autoit window info берет координаты всей области экрана...
вообщем какие-то непонятности... и что происходит никак не разберусь((
 
Автор
I

Ineren

Гость
делаю еще скрипт....

Код:
WinActivate("Asterios") 
WinWaitActive("Asterios")
$coord = PixelSearch( 160,70,168,78, 0x824D46 )
If Not @error Then
    MsgBox(0, "X and Y are:", $coord[0] & "," & $coord[1])
EndIf


каждый раз находит но в новых координатах!?!?! это как так?!?! :blink:

жду помощи вообщем :(
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
В PixelSearchEx чтобы он работал не только на моё тестовое изображение тебе надо прописывать различные условия самостоятельно.

В PixelSearch цвет указывается без кавычек, так же и шейдер указывается без кавычек.

Без доп опций команды оперирующие цветами берут данные отнносительно всего экрана.

Каждый раз в новых координатах возможно потому что там плавают цвета в той области поиска которую ты используешь.
 
Автор
I

Ineren

Гость
Belfigor сказал(а):
Каждый раз в новых координатах возможно потому что там плавают цвета в той области поиска которую ты используешь.
а цвета брать... например в градациях серого можно?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
Указываешь хекс своего серого цвета в пиксель серче и через запятую указываешь диапазон цветов, он вернет первый удовлетворивший запросу пиксель.
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
да... в грации финал целая проблема с цветами...
я планирую писать рыбного бота, но и автофайтера тоже буду пытаться, как только реализую распознование ХП в цифрах.
 

vovsla

Осваивающий
Сообщения
546
Репутация
26
сделать графическую обвязку - поможет Koda

есть у автоита возможность посылать команды в неактивное, у меня выглядит так
ControlSend($WorkWindowName, "", "", "чё высылаем"), если 2 окна с одинаковым названием,
то высылаем в хендел окна ControlSend(хендел, "", "", "чё высылаем")

бесконечный цыкл - уже написали как, но говорю сразу, цикл на весь скрипт это плохо,
используй Opt("GUIOnEventMode", 1)

все решается посредством одной клавы - попробуй, у меня не получилось

обсалютно не приемлимо для неактиного окна, Send шлёт в активное:
Send("{Esc}") ;убираем выбранный таргет если есть такой
Sleep(50)
у меня выглядит так:
ControlSend($WorkWindowName, "", "", "{Esc}")
в слипе нет необходимости

этот подход не правильный, и вообще в игровом боте должно быть минимум слипов,
причём слип должен быть не для игровых моментов, а на тот случай если команду не
успевает обработать система и т.п.
Send("{F6}") ;поднимаем лут (на панели стоит лутпикап)
Sleep(1000)

количество хп в процентах (перса):
Func GetHPLevel()
If PixelGetColor(169, 82)=Dec("B50818") Then Return 100
$GetHPLevel=PixelSearch(20, 82, 169, 82, 0x881221)
If @error Then
$GetHPLevel=PixelSearch(20, 82, 169, 82, 0x5A1821)
If @error Then Return 100
EndIf
Return Round(($GetHPLevel[0]-20)*100/149, 2)
EndFunc
ессесно вписываешь свои цифорки
Наличие НР перса B50818
Отсутствие НР перса которое на данный момент восполняется хилкой 0x881221
Отсутствие НР перса 0x5A1821

каждый раз находит PixelSearch( 160,70,168,78, 0x824D46 ) но в новых координатах:
смотря что и где ищем, не забываем, что при абсолютной неподвижности персанажа
колышется трава в анимации, тени и т.п.

команды PixelGetColor, PixelSearch берут координаты всей области экрана
или рабочей области окна в зависимости от настроек,
Opt("PixelCoordMode", 0) - от окна, соответственно в autoit window info нужно включить
Options-->Coord Mode-->Window
советую делать вариант от окна

писать рыбного бота - нет смысла, я тоже сначала хотел, но хорошо отлаженый спойлер
позволит не только купить рыбные дела, но и без особых хлопот в Л2 одтся в А шмот



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

ой, забыл написать, в этой строке
Return Round(($GetHPLevel[0]-20)*100/149, 2)
149 - это разница 169-20 из этой строки
PixelSearch(20, 82, 169, 82, 0x881221)
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
а кто, что думает по поводу борьбы с GG (он же Game Guard)?
он блочит все совтверные попытки эмуляции, а так же чтение пикселей со своего окна.
Теоретические идеи такие есть: написать драйвер виртуальной мышки\клавы, которому какимнибудь способом передавать из скрипта координаты, куда переместить курсор и какие кнопки нажать. Но для этой задачи нужен профессиональный программист, так что скорее всего не реализуемо.
Из более реализуемых идей: сборка девайса, который подключается к COM порту и и управляет реле, которое замыкает контакты от старой мыши, которая подключена как дополнительная, но цвета прикселей мы видеть не будем.
 

vovsla

Осваивающий
Сообщения
546
Репутация
26
не, проще гамать там где нет гг :smile:
 
Автор
V

VitAl2013

Гость
А нельзя ли ...ну так мимолётная мысль... управлять драйвером клавиатуры как программой? В том плане что отслеживать нажатые кнопки в оперативке, ну и потом тамже через _MemoryWrite их "нажимать"?

Или нельзя ли сэмулировать сам GameGuard, либо окно которое он защищает.
 

serivanov

Новичок
Сообщения
9
Репутация
0
Что у вас за команда Keydown {...} ?
Нет такой команды в AutoIt. У меня пишет синтакс. еррор.
Есть команда Send("{...}")
Например, открываю WordPad, запускаю скрипт -

Код:
WinActivate("Документ ") ;Делаем окно Wordpad'a активным
WinWaitActive("Документ ") ;Ждем пока заданное окно не станет активным
Send("{F1}")


И в окне Wordpada запускается справка по F1.

Однако, по такому же скрипту для Линейки, русского сервера, окно игры становится активным, но кнопка F1 не срабатывает.

Код:
WinActivate("Lineage II") ;Делаем окно "lineage II" активным
WinWaitActive("Lineage II") ;Ждем пока заданное окно не станет активным
Send("{F1}")



Почему? ГеймГвард не дает?

И еще. Как сделать, чтобы кнопка нажималась не в активном, а в фотовом окне игры? Нужно знать имя процесса? А как я его узнаю для Линейки?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 566
Репутация
933
WinGetHandle
 
Верх