Что нового

[Симулятор] бота для рыбалки

Terrera

Новичок
Сообщения
8
Репутация
0
Вот у меня возник интерес и необходимость в боте к одной игре. К сожалению я по поиску её не нашел (странно что её нет тут, хотя она достаточно вроде популярная). Уровень программирования средний (Delphi, C++) имел дело с мат. вычислениями больше. Почитав форумы, и Auto Help File создал Хелоу Ворд и т.д скрипты все круто. Вопрос такой: Накидайте плиз каркас (что за чем должно быть в скрипте какие функции лучше использовать). Дальше я думаю, разберусь.
Принцип такой. Эмулятор рыбной ловли. Стандартная неподвижная картинка. Поплавок, который дёргаться (всегда в одном и том же месте). После клева необходимо нажать пробел. Потом идет выуживание, индикаторы нагрузки лески и удочки. От зеленого к красному переход. Нельзя заходить за желтую границу (индикаторы тоже всегда в одном и том же месте). Принцип выуживание, к примеру, 3 раза нажать леску 1 раз удочку до желтого индикатора (бот должен быть очень чувствителен за доли секунды может перейти от зеленого к красному индикатор). Это все вроде не сложно(подобных симуляторов нажатий и поиска цвета и т.д видел много). Далее инетересней, в силу защиты наверно игра сделана так что постоянно в ходе ловли всплывают окно НО фишка в том что если становиться активным любое другое окно(в винде или в скайпе то все окна автоматически исчезаю кроме маин виндоу). Как бы посмотреть название всплывающих окон нет возможности. Но они всегда в одном и том же месте. Нужно считывать информацию о весе пойманной рыбы, и выполнять те или иные действия. Как альтернатива можно записывать в лог данные, и считывать из текстового файла (путь заранее известен).
Как бы задачи такие первоначальные у бота. Возможно, для начала и просто.
1.Закинуть удочку (определённая кнопка).
2.Когда клюнуло подсечь (кнопка).
3.Вытащить(1-2 кнопки) если индикатор зашкалил сбросить ненужную тяжелую рыбу(кнопка)
4.после того как вытащил нажать комбинацию кнопок.
И все это зациклить.
Ещё такой вопрос. Можно ли разработать интерфейс для вноса переменных( типа разные значения, делай то и то сейчас в данный момент и т.д)или проще написать для разного случай отдельную программу.
 

Belfigor

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

Terrera

Новичок
Сообщения
8
Репутация
0
не увидев игру, нельзя сказать как лучше сделать. А лучше видео процесса на ютубе
http://rus-fishsoft.ru/forum/index.php?showtopic=121&st=20

Игра клиентская, пытался найти ячейку памяти весов вновь пойманной рыбы на примере [Iris Online] iWalker. Потрошим память игры. Пытаемся написать бота. Не получается… скорей всего из-за того что идет автоматические освобождение памяти когда окошко закрывается. Могу предоставить изображение поплавков и когда уже клюнуло и любую другую информацию. Так же могу зарегать триа аккаунт для пробы в живую
 

running-frag

why me?
Сообщения
441
Репутация
60
каркас, может натолкнёт тебя на какие нить мысли ;)
Код:
Func _fishing ()
   
   While 1
	  _throw_rod ()							; закидываем удочку
	  
	  While Not (_pecks ()) 				; если не клюёт, ждём
		 Sleep (500)
	  WEnd
	  
	  If Not (_hook ()) Then ContinueLoop	; подсекаем, если функция вернула False (не смогли подсечь или сорвалось) тогда начинаем цикла сначало
	  _take_loot ()							; забираем лут, попутно выбрасывая что ненужно
	  _post_action ()						; действия после полного цикла ("после того как вытащил нажать комбинацию кнопок.")
	  
	  If _counter () Then Return			; если мы превысили срок (по времени), обьём (по инвентарю) или чего ещё, тогда выходим из цикла (функции)
   WEnd
   
EndFunc


Func _throw_rod ()
   ; тут действия, закидаем удочку
EndFunc


Func _pecks ()								; Return False если НЕ клюёт
   ; тут действия, проверка клюёт ли
EndFunc

Func _hook ()								; Return True если вытянули лут куда то поближе к чару (не знаю механику)
   ; тут действия, подсекаем рыбу
   ; так же тут датчики смогли ли сделать это действие исправно
EndFunc

Func _take_loot ()							; Return none
   ; тут действия, вытаскиваем лут с проверкой на индикатор "тяжести"
EndFunc
   
Func _post_action ()						; Return none
   ; тут действия, после вытаскивания лута
EndFunc

Func _counter ()
   ; тут циклические опции, что то типо "счётчик циклов" или времени
EndFunc
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
каркас, может натолкнёт тебя на какие нить мысли
принцип понятен. Освная функция, которая вызывает другие функции от события. осталось определиться на данный момент какой вариант выбрать для определения события "клюнуло". В ссылке “полезные советы”есть примеры разберу их.
Благодарю.
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
Вопрос такой. Значит, не удается нажать кнопки G T H с клавиатуры в окне. Если ухожу с этого окна на чат, то все нажимается, как должно быть. Подозреваю, что стоит защита. Если забиваю значение на цифры, все круто с цифрами работает (боюсь спалится). Но есть рабочий .exe с имитацией.Принцип такой, при нажатом правом контере производит имитацию. Возможно, ли посмотреть код в экзешнике? Кстати если запустить его, то получается он жмакает “р” бакспасе вроде.
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
Все прекрасно по каркасу сверху написал, поставил на ночь, супер выловил более 400 рыб.
Научил его кушать, закидывать удочку, ждать поплавок и т.д. Но некорректно работает процесс выуживание.
Должно быть так зажать кнопку пока не появится пиксель. Как только появился нужный пиксель отжать кнопку и зажать другую кнопку пока не появился и это все зациклить до тех пор, пока не появиться другой пиксель.
Я реализовал банальным зажатием на некоторое время. Получается не универсально… Слишком легкую рыбу долго вытаскивает, слишком тяжелую ломает снасти от пере зажатия.
Код:
Func _hook ()                               
Opt("SendKeyDownDelay", 2000)
	Send("{NUMPAD1}")
             
 Opt("SendKeyDownDelay", 1000)
	Send("{NUMPAD2}")
	Send("{NUMPAD3}")
	$start = PixelSearch (329,271,329,271,0xF4F3DF,30)
	$k=$k+1
	If $k=7  Then _take_loot ()
	if @error then _hook()
	EndIf
EndFunc
 

running-frag

why me?
Сообщения
441
Репутация
60
если я правильно всё понял, для начало лезем в справку
Код:
Send () ; тыкни на функцию

и вычитываем там вот что
Код:
Send("{a down}") ;Holds the A key down
Send("{a up}") ;Releases the A key

другими словами цикл ожидания (как я понимаю) должен быть как то так (один из двух вариантов, я бы предпочёл первый VAR_1)
Код:
Send ("{a down}")						; зажимаем клавишу


#region====== VAR_1 (избегаем While)
	Global $iWait = 10						; глобальная настройка (опция)
											; умереть в цикле нереально, т.к. выйдем из него по истечении $iWait
	For $i = 1 To $iWait					; 10 циклов (т.к. опции)
		If _check () Then ExitLoop			; дострочный выход если проверка отдала True
			
			... 
			
		Sleep (1000)						
	Next
#endregion=== VAR_1


#region====== VAR_2
	While True
		If _check () Then ExitLoop			; функция зациклена пока не произойдёт проверка и вернёт True
			
			... 
			
		If _check_global () Then ExitLoop 	; фукнция контроля (что б мы не умерли в этом цикле, таймер, кол. циклов и др. проверки)
			
			... 
			
		Sleep (1000)
	WEnd
#endregion=== VAR_2


Send ("{a up}")							; отжимаем клавишу
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
Все супер. Использовал первый пример, работает как надо. Только там получается маленький косяк. Невозможно вызывать функцию во время зажатой кнопки, ну ничего я вместо вызова функции сделал банальную проверку пикселя. Ну ещё подумаю как сделать универсальней и практичней. А так очень рад результату. Скажем так я добился того что бот делает выуживание лучше меня… это невероятно. Ура моя первая программа на AutoIt. Бот превзошёл все мои ожидания.
Скажу так, что благодаря форуму (поиску), и небольшой помощи, возможно, сделать то, что вы хотите. Огромное количество информации на форуме, огромное количество примеров.
Особая благодарность running-frag.
Тему можно закрывать. Задача выполнена. Я б конечно выложил свой код но я думаю что над ним ещё недели работать. Пока что там кашка. :-[
 

running-frag

why me?
Сообщения
441
Репутация
60
а почему фукнция не выполняется? :scratch:

Код:
Send ("{a down}")                       ; зажимаем клавишу


#region====== VAR_1 (избегаем While)
    Global $iWait = 10                      ; глобальная настройка (опция)
                                            ; умереть в цикле нереально, т.к. выйдем из него по истечении $iWait
    For $i = 1 To $iWait                    ; 10 циклов (т.к. опции)
        If _check () Then ExitLoop          ; дострочный выход если проверка отдала True
           
        Sleep (1000)                       
    Next
#endregion=== VAR_1

Send ("{a up}")                         ; отжимаем клавишу

Func _check ()
	MsgBox (0,0, "function done")
	Return True
EndFunc

всё должно работать
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
а почему фукнция не выполняется?
точно работает... видать я не правильно просто задавал функцию. не возвращай значение Истины...
кстати... у меня такой прикол если вызываю
Send ("{a down}") ни чего не получается, но если вызываю Send ('{a down}') все работает.
мне кажется что "" вызывает символ а '' само нажатие. ну или может просто у меня так в игре. Да я на самом деле боюсь использовать много функций… идет потеря времени в выполнение скрипта мне так кажется… ну в любом случае буду тестировать, тестировать и тестировать… Методом математического тыка)))))
 

running-frag

why me?
Сообщения
441
Репутация
60
для оптимизации хорошо используются две функции таймера
Код:
Local $_init
Local $_diff


$_init = TimerInit ()					; запускаем таймер (расчёт в милисекундах)
For $i = 1 To 1000
	;ConsoleWrite ($i&@CR) ; разкоменнтируй если хочешь увидеть практическую разницу в таймере
Next
$_diff = TimerDiff ($_init)				; конец таймера (разница между текущим временем и временем запуска)


MsgBox (0,0, "выполнено за ф"& $_diff &" мс") ; 1000 мс = 1 сек, 0.1 мс = 0.0001 сек

главное не путать МИЛИсекунды с секундами :smile:


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

с кавычками не сталкивался, у меня всегда работает с двойными ("...")
 
Автор
T

Terrera

Новичок
Сообщения
8
Репутация
0
Ребят помогите прочитать память. Значит дело такое. я определяю вес рыбы по 3 характеристикам. когда клюнуло я четко вижу изгиб удочки, нагрузку на катушку и на удочку. можно сделать вывод что после того как клюнуло и перед тем как вытащил рыбу уже известен точный или приблизительный вес. более того от того как клюнуло, или как тянет можно определить вид рыбы. В идеале мне нужен маленький скрипт который сообщение показывал какой примерный вес рыбы. я в свой скрипт потом вставлю как функцию определения.
и ещё скрипт после того как вытащил рыбу какой вид рыбы и точный вес.
Благодарю кто откликнется. дам ссылку где скачать клиент и с 15 дневным триал акк зарегистрирую!!!
 

Andrei7

Новичок
Сообщения
72
Репутация
3
Привет автор :smile: раньше сам пробовал заниматься написанием бота для этой игры, только на другой проге. так и забросил :smile: хотел бы у тебя исходников попросить... дай плиз
 
Верх