Что нового

[Легенда: Наследие Драконов] Обсуждение процесса написания бота.

zoxer1

Знающий
Сообщения
72
Репутация
6
Здравствуйте!
С AutoIt знаком не так давно. Хочу написать простенький скрипт для сбора ресурсов, а именно травы. Все делается на крине, открытым в Паинте. Понятно, что саму траву надо искать по цвету пикселя с помощью PixelSearch... Узнаю цвет пикселя травы, запускаю скрипт - находит этот самый кустик с которого и узнавал цвет пикселя. Теперь, закрашиваю этот кустик черным цветом (рядом находится другой кустик) дабы проверить найдет ли его... Результат - не находит :'( Выяснилось, что у второго кустика НЕТ искомого пикселя. хотя на глаз цвета теже.

Теперь созрел вопрос:
Как за один проход по области экрана искать несколько значении цвета пикселя? если их заранее занести в какой нить массив? Или есть какое-нибудь другое решение?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Параметр Shade у PixelSearch, воспользуйся им.
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

спасибо за совет! вроде нашел оптимально значение Shade-variation и нормальный цвет, чтоб по земле не тыкал...
теперь встал такой вопрос:
например в области на которой идет поиск пикселей имеются 5-10 пикселей соответствующих искомому значению цвета пикселя.
Теперь... как записать координаты всех точек в массив? желательно одним проходом.

На сбор ресурсов в игре конкуренция большая и поэтому важно скорость выполнения поиска....
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Ты ищешь на экране каждый раз в одной и той же области? Если да то тебе сперва надо написать себе функцию продолжающую поиск после нахождения удовлетворяющего пикселя. Тогда ты сможешь просто в цикле For...Next забивать координаты этих пикселей в массив. Но разве не более рациональным решением будет просто искать перед тем как ее поднять? Я понимаю так что трава разбросана по земле, обнаружив ее тебе сначала переместиться, потом взять ее. Если твой список трав будет содержать координаты объектов на момент поиска, то пока ты брал одну траву, кто-то может уже утащить траву в другом месте, в таком случае чар побежав в другое место из списка, траву может там уже не обнаружить. Мне кажется схема "нашел, пошел взял, снова ищу" более рациональная и эффективна.
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

да
Belfigor сказал(а):
Ты ищешь на экране каждый раз в одной и той же области?
да

ну у меня сейчас так и делает: схема "нашел, пошел взял, снова ищу". просто там на кустик уже может налетели травники. над кустиком появляется статус в кружочке с кол-вом травников, пытающихся скосить эту травку. Сейчас на данный момент скрипт ищет и находит первый попавшийся соответствующий пиксель... нашел траву - она занята - новый поиск - опять же находит этот же кустик, который уже занят! забивая в массив координаты я думал сделать статус каждому кустику в массиве, т.е. например cord_x[n], cord_y[n] и status[n] <---- тут если будет 1, то можно косить..(после обновления инфы про кустик) если 0 то идем дальше n+1. ну типо этого.. не много хоть научить "бота" думать =)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Скрин дай занятого кустика. Ты ищешь ближайший кустик или же первый с левого верхнего угла?
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

кустик который находится правее - занятый.. а левее свободный.
поиск веду с помщью PixelSearch, процесс поиска незнаю :'( думаю, процесс поиска идет с верхнего левого угла до нижнего правого. Домой приду скину скрипт которым щас пользуюсь.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

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

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Спасибо за ответы!
по вашему совету разделил поле на сектора (квадраты). веду поиск по квадратам. реально помогает :rofl:
на данный момент пришел к такому скрипту
Код:
#include <IsPressedEx.au3>
WinWaitActive("Легенда: Наследие Драконов")
$StartCoordX = 250
$StartCoordY = 182
$EndCoordX = 998
$EndCoordY = 930
$SearchColor = 0xFF6BFF;0x4C7F3D
$Find = 0 ; переменная Нашел-Нет
$Hunt = 0 ; переменная локации

HotKeySet("!x", "_Quit")
$hU32_DllOpen = DllOpen("User32.dll")

CheckArea ()

Search()
While 1
	$iRet = _IsPressedEx("[:ALLKEYS:]", $hU32_DllOpen)
	Sleep(10)	
WEnd

;Search()
Func Search()
	$YSector = 0
	$Find = 0
	ToolTip("Начинаю поиск", 100, 300)
	While $YSector <= 19 AND $Find <> 1
		$XSector = 0
		While $XSector <= 19 AND $Find <> 1		
			ToolTip("Сканирование", 100, 300)
			$AlfaX = ($EndCoordX - $StartCoordX) / 20 
			$AlfaY = ($EndCoordY - $StartCoordY) / 20 
			$coord = PixelSearch( $StartCoordX+$AlfaX * $XSector, $StartCoordY+$AlfaY * $YSector, $StartCoordX+$AlfaX * ($XSector+1), $StartCoordY+$AlfaY * ($YSector+1), $SearchColor, 10 );
			If Not @error Then
				BusyTest ($coord[0], $coord[1])			
			EndIf
			$XSector = $XSector + 1
		WEnd
		$YSector = $YSector + 1
	WEnd
	If $Find = 0 Then
		HuntArea ()
	EndIf
EndFunc


Func BusyTest ($Cord_X, $Cord_Y) ; проверка на занятость кустика 
	$busy = PixelSearch($Cord_X-30, $Cord_Y-30, $Cord_X+20, $Cord_Y+20, 0xFFEB00, 15)
	If NOT @error Then
		$Find = 0
	Else
		ToolTip("Найден!!!", 100, 300)
		MouseMove($Cord_X , $Cord_Y)
		Sleep(Random(100, 200))
		MouseClick("left")
		Sleep(Random(100, 200))
		MouseClick("left")
		$Find = 1
		Sleep(Random(18000, 19000))
		If PixelGetColor ( 656, 592 ) = 16777168 Then
			MouseMove(623, 596)
			Sleep(150)
			MouseClick("left")
			Sleep(800)
		EndIf
		
		Search()
	EndIf	
EndFunc

Func CheckArea ()
	ToolTip("ПРоверка локации", 100, 300)
	If PixelGetColor ( 596, 135 ) = 10354688 Then
		$Hunt = 0
	EndIf
	
	If PixelGetColor ( 597, 149 ) = 10682368 Then
		$Hunt = 1
	EndIf
	
	If PixelGetColor ( 622, 148 ) = 11927552 Then
		$Hunt = 2
	EndIf
	
	If PixelGetColor ( 623, 137 ) = 11927552 Then
		$Hunt = 3
	EndIf
EndFunc

Func HuntArea ()
	ToolTip("Переход...", 100, 300)
	Select
		Case $Hunt = 0
			MouseMove(569, 155)
			Sleep(Random(150, 200))
			MouseClick("left")
		Case $Hunt = 1
			MouseMove(644, 158)
			Sleep(Random(150, 200))
			MouseClick("left")
		Case $Hunt = 2
			MouseMove(644, 135)
			Sleep(Random(150, 200))
			MouseClick("left")
		Case $Hunt = 3
			MouseMove(571, 137)
			Sleep(Random(150, 200))
			MouseClick("left")			
	EndSelect
	$Hunt += 1
	If $Hunt > 3 Then
		$Hunt = 0
	EndIf
	Sleep( Random(500, 2000))
	Search()
EndFunc

Func _Quit()
	DllClose($hU32_DllOpen)
	Exit
EndFunc


скрипт работает нормально все ищет =)
возникает проблема
играю с клиента игры, там есть возможность открыть страницу охоты в новой вкладке и вся локация о хоты находится перед глазами (не надо прокручивать скролом) Вот там то и веду поиск. Теперь при добыче ресурса на меня могу напасть - бой будет идти в главном окне. Как сделать функцию проверки скажем каждые 5-10 сек. не переключаясь в главную вкладку?

пример окна кидаю ниже

З.Ы.: скрипт конечно как бы "топорный" может как то можно переделать, чтоб работало быстрее ?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

То что на тебя напали как-то фиксируется в клиенте?
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

клиент издает звук, эмммм как будто USB флешку воткнули в комп ;D и в панели задач маргает пару раз!
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

А какие-то другие более удобные индикаторы не появляются?
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

ну если только меняется главное окно =) в режим боя
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Лучше скинь скрины где ты собираешь траву и на тебя никто не напал и когда ты собираешь траву а тебе атаковали.
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

момент нападения ни чем не отличается от момента добычи... просто следующий кустик говорит что я нахожусь в бою. и возле первого кустика (который я косил при нападении) находится крип (моб) с пометкой что он в бою
скрины:
1. добыча обычная
2. нападение
3. ошибка - следующий кустик после нападения

з.ы.: если сделать проверку на ошибку (скрин 3) то можно и слить бой по таймауту. ведь следующий кустик может не появится довольно долго время, а на 1 удар дается 20сек - через 3 удара проигрыш по таймауту...
и как прибавить репутацию на форуме? =)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

А распознавать скелета возле того места где ты добываешь траву пробовал? Ну или же привязаться к самому сообщению что ты в бою?
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Re: [Автоматизация] Бот для Легенды Наследия Драконов

1. Распознавать возле кустика думаю не получится.. потому что там могут другие нападать на мобов.
2. по сообщению надо переключатся на главное окно и в чате искать строчку о нападении..

придеться наверное каждые 10сек переключатся на главное окно и смотреть там не изменилось ли на окно боя
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: [Автоматизация] Бот для Легенды Наследия Драконов

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Ну или в память клиента впиваться. Но у них клиент - это просто браузер ихней разработки.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: [Автоматизация] Бот для Легенды Наследия Драконов

Точно. Поэтому удобнее играть через браузер. Хоть координаты элементов можно посчитать, доступ к переменным и html получить. И кликать уже только по флэшу
 
Верх