Что нового

Бот на LP в Haven and Hearth

RusScout

Новичок
Сообщения
6
Репутация
0
Приветствую, Господа.
Есть онлайн-игра http://www.havenandhearth.com
Помогите пожалуйста написать бота для циклической рубки деревьев. Желательно самым простым способом. Пытаюсь через цвет пикселя дерева, но не получается.
Заранее спасибо. Надеюсь на помощь.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 590
Репутация
938
Эхх, хотел поиграться в эту но не сумел ее запустить. Там какой-то хитрый способ установки :smile:
 
Автор
R

RusScout

Новичок
Сообщения
6
Репутация
0
Здравствуйте.
Для начала продумал самого простого бота, который будет с помощью мышки и горячих клавиш валить лес. Как просто искать пиксели - я разобрался вроде, подскажите пожалуйста - как дать команду перенести курсор на точку с этим пикселем определенного цвета? ПРосто я подумал, что самый удобный варинт определять, что это дерево - пиксель цвета листвы.
Заранее, спасибо за ответ.
С уважением, Владимир.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
RusScout [?]
как дать команду перенести курсор на точку с этим пикселем определенного цвета?
Например, так
Код:
$aPos = PixelSearch(0, 0, 20, 300, 0xFF0000)
;$aPos[0] x координата найденного пикселя
;$aPos[1] y координата найденного пикселя
MouseMove($aPos[0], $aPos[1]) ;перемещает курсор в эту точку
 
Автор
R

RusScout

Новичок
Сообщения
6
Репутация
0
А как тогда дать команду перейти на другой такой же пиксель? Просто у меня он находит, и все, цикл на нем, возможно ли, чтобы он по программе переходил на другой такой же пиксель?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
RusScout
Попробуйте разбить Вашу картинку на квадраты и ищите по очереди в цикле.
Так у меня ищет пиксели на рабочем столе. Только цвет на свой поменяйте и размер квадратов подберите.
Код:
Sleep(2000); только чтобы успеть свернуть окно SciTE
$iStepX = @DesktopWidth / 25
$iStepY = @DesktopHeight / 25
$iCount = 0
HotKeySet('{Esc}', '_Exit')
For $i = 0 To 24
	For $j = 0 To 24
		$aPos = PixelSearch($i * $iStepX, $j * $iStepY, $i * $iStepX + $iStepX, _
				$j * $iStepY + $iStepY, 0x947C40)
		If Not @error Then
			MouseMove($aPos[0], $aPos[1])
			$iCount += 1
			ToolTip('Найдено ' & $iCount & ' пикселей', 0, 0)
			Sleep(200)
		Else
			ContinueLoop
		EndIf
	Next
Next
ToolTip('Найдено ' & $iCount & ' пикселей' & @CRLF & 'Поиск закончен', 0, 0)
Sleep(3000)
Exit
Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
R

RusScout

Новичок
Сообщения
6
Репутация
0
Спасибо за помощь. Теперь пытаюсь симулировать нажатие верхней цифровой клавиши "1", а не получается. И ещё - вроде настроено, чтобы он работал только с открытым окном, но он все-равно стремится выскочить из окна игры на рабочий стол - как его ограничить окном игры?.
UPD. А возможно ли искать не пиксель, а определенный квадрат? Просто в игре растения - это спратовая картинка. Просто задать квадрат, который будет окрашен как середина растения и на основе этих данных он будет выбирать только деревья?
Заранее спасибо за ответ.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
RusScout [?]
Теперь пытаюсь симулировать нажатие верхней цифровой клавиши "1"
Вот Вам пример с функцией Send():
Код:
#include <Misc.au3>
; код следующих 5-и строк и последних 3-х строк только для того, чтобы не вставлялись
; ненужные единицы в SciTE.
$i = 0
If WinActive('[Class:SciTEWindow]') Then
	WinSetState('[Class:SciTEWindow]', '', @SW_MINIMIZE)
	$i = 1
EndIf

Send('{1 down}')
If _IsPressed('31') Then
	ToolTip('Кнопка 1 нажата', 0, 0, 'down', 1, 1)
Else
	ToolTip('Кнопка 1 не нажата', 0, 0, 'down', 1, 1)
EndIf
Sleep(3000)
Send('{1 up}')
If _IsPressed('31') Then
	ToolTip('Кнопка 1 нажата', 0, 0, 'up', 1, 1)
Else
	ToolTip('Кнопка 1 не нажата', 0, 0, 'up', 1, 1)
EndIf
Sleep(3000)
If $i Then
	WinSetState('[Class:SciTEWindow]', '', @SW_RESTORE)
EndIf
Для одноразового нажатия достаточно Send('1'):
Код:
Run('notepad.exe')
$hWin = WinWait('[Class:Notepad]', '', 3)
If Not $hWin Then
	MsgBox(16, 'Error', 'Что-то нет блокнота.')
	Exit
EndIf
WinActivate($hWin)
For $i = 1 To 10
	Send($i)
	Send('{ENTER}')
	Sleep(500)
Next
Send('bye...')

А это пример с функцией ControlSend()
Код:
Run('notepad.exe')
$hWin = WinWait('[Class:Notepad]', '', 3)
If Not $hWin Then
	MsgBox(16, 'Error', 'Что-то нет блокнота.')
	Exit
EndIf
WinSetState($hWin, '', @SW_MINIMIZE)
For $i = 1 To 10
	ControlSend($hWin, '', 'Edit1', $i) ;Handle и ClassnameNN
	ControlSend('[Class:Notepad]', '', '[CLASS:Edit; INSTANCE:1]', '{ENTER}');Class и Advanced (Class)
	Sleep(500)
Next
ControlSend('Безымянный - Блокнот', '', 15, 'bye...');Title и ID
WinSetState($hWin, '', @SW_RESTORE)
Как говорится, почувствуйте разницу. :smile:
RusScout [?]
но он все-равно стремится выскочить из окна игры на рабочий стол
Наверное, где-то так:
Код:
Opt('PixelCoordMode', 2)
Opt('MouseCoordMode', 2)

$hWin = WinGetHandle('Ваше окно')
$aWin = WinGetClientSize($hWin)
$iStepX = $aWin[0] / 25
$iStepY = $aWin[1] / 25
;...
$aPos = PixelSearch($i * $iStepX, $j * $iStepY, $i * $iStepX + $iStepX, _
                $j * $iStepY + $iStepY, 0x947C40, 0, 1, $hWin)
;...
 
Автор
R

RusScout

Новичок
Сообщения
6
Репутация
0
Ага. Спасибо. Вроде получается, но стоит уже другая задача - научится определять предметы и ресурсы от земли. Ибо он путается, потому что такой цвет есть и на земле, и на дереве. Вот я и ищу выход, чтобы он мог определять не просто цвет пикселя, а совокупность пикселей. Подскажите пожалуйста, как это лучше сделать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 590
Репутация
938
http://autoit-script.ru/index.php?topic=182.0


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

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

RusScout

Новичок
Сообщения
6
Репутация
0
Приветствую.
Спасибо за совет. Как я понял, тут код скрипта я должен адаптировать под себя и свои задачи и вставить в свой код?
Тяжеловато, сейчас подумал, попробую написать простой скрипт для копания в земле а когда наступает усталость и голод - просто посчитать по своему таймеру и просто брать управление в свои руки, отдыхать и питаться, и потом заново запускать скрипт на копание. Подскажите пожалуйста - как мне сделать так, чтобы действия в скрипте повтарялись определенное время? Можно например, цикл поставить на i=х раз, где с каждым прохождением цикла i+1, но я должен буду тогда посчитать время цикла, чтобы понять - сколько i мне нужно... А можно ли просто определенное время для скрипта поставить?
С уважением, Владимир.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
RusScout [?]
Можно например, цикл поставить на i=х раз
Здесь посмотрите Организация повтора части cкрипта.
А можно ли просто определенное время для скрипта поставить?
Код:
$iStart = TimerInit()
$i = 0
While 1
	$i += 1
	ToolTip($i, 0, 0)
	Sleep(100)
	If TimerDiff($iStart) >= 30000 Then;30 секунд
		ExitLoop
	EndIf
WEnd
MsgBox(64, '', 'Закончили через 30 секунд.')
 
Верх