|
|
|
Создал Бот для Русской рыбалки, Игра Русская рыбалка. Ловля карпа. |
|
|
Strannik |
4.8.2015, 13:37
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Версия 2.0 Карп что добавлено: теперь пользовтелю ненадо НИЧЕГО настраивать в боте. Ему надо только зайти на локацию и достать удочку, проверить есть ли наживка и еда... Включаем бот и все) Функциональность пока без изменений (ловит, перезабрасывает, ест) Планируется: продажа рыбы, закупка еды и наживки, расширение мест ловли КАРП 2.0
Код set linedelay 1 //установить задержку в 1 мсек. // включение и настройка бота // необходимо достать удочку и забросить в место ловли // затем запускаем бот и следуем указаниям // раздел проверки нужны ли начальные параметры if #zabros > 0 and #eda > 0 and #cotel > 0 and #upotrebit > 0 goto eda else end_if // этот раздел посвящен заданию начальных параметров set #handlePilot findwindow () log #handlePilot log close log clear log open set #logSizeX 300 set #logSizeY 200 set #handleLog 0 while #handleLog = 0 set #handleLog findwindow (Log Window) end_while set #x (screenwidth - #logSizeX) / 2 set #y screenheight / 4 set windowpos 1 1 #logSizeX #logSizeY #handleLog log mode compact // окно заброса // карп 562, 329 set #ownerHandle findwindow (Рыбхоз: Карповая заводь) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #zabros getwindow (#tmp next) set #carpX 562 set #carpY 329 set #fiderX #carpX - 32 //дельта места заброса и конца фидера на карпа set #fiderY #carpY - 44 // окно - полоса еды set #ownerHandle findwindow (Рыбхоз: Карповая заводь) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #eda getwindow (#tmp next) // окно - бегунок лески set #ownerHandle findwindow (Рыбхоз: Карповая заводь) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #LeskaW getwindow (#tmp next) // окно - бегунок удочки set #ownerHandle findwindow (Рыбхоз: Карповая заводь) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #udaW getwindow (#tmp next) // окно - котелок set #ownerHandle findwindow (Рыбхоз: Карповая заводь) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #cotel getwindow (#tmp child) // окно употребить set #ownerHandle findwindow (Продукты) set #tmp getwindow (#ownerHandle child) set #tmp getwindow (#tmp next) set #tmp getwindow (#tmp next) set #upotrebit getwindow (#tmp next) // конец поисков окон //хотим ли есть? :eda set workwindow #eda //окно полосок с едой get color #edacolor 27, 53 //координаты голода if #edacolor = 13032663 // цвет голода log Кушаю set #handleWin findwindow (Продукты) showwindow #handleWin wait random (1000) + 300 set workwindow #upotrebit left 10 10 send {space} goto eda else end_if // Начало заброса :zabros wait random (1000) + 500 log Забрасываю Удочку set workwindow #zabros //проверяем первый ли заброс set #a #a + 1 if #a = 1 move #carpX #carpY left #carpX #carpY goto klev end_if set #z random (2) if #z = 1 log забросил мышкой move #carpX #carpY left #carpX #carpY else send t log забросил кнопкой end_if :klev // цикл клева set #j #j + 1 if #j > 300 log возвращаюсь в начало (возможно есть проблемы) set #j 0 goto nachalo end_if wait random (1000) + 1500 get color #uda #fiderX, #fiderY// надо всегда проверять место заброса if #uda = 255 // цвет удочки goto klev else log Клюнуло, ВЫВАЖИВАЕМ! end_if //вываживаем start_script 1 start_script 2
// проверка улова :ulov set #b #b + 1 //увеличение счетчика if #b > 1500
Log не вываживается, либо сорвалась goto nachalo //сачек end_if set #a #a + 1 //увеличение счетчика if #a > 50
send f //сачек set #a 1 end_if set #zabros workwindow move #fiderX #fiderY set #w windowfromcursor set workwindow #w if #w = #zabros// хендл окна заброса goto ulov else set #riba #riba + 1 log поймалась #riba рыбка stop_script 1 stop_script 2 wait random (1000) + 400 set #var findwindow (Садок) set workwindow #var send {Space} wait random (1000) + 400 end_if :nachalo stop_script 1 stop_script 2 log начинаем все поновой set #j 0 set #b 0
script 1
Код set linedelay 1 //установить задержку в 1 мсек. set workwindow #LeskaW.4 send_down g :leska get color #leska 21, 7 // цвет полосы лески if #leska = 4488494 // цвет без нагрузки send_up g else goto leska end_if
script 2
Код set linedelay 1 //установить задержку в 1 мсек. set workwindow #udaW.4 send_down h :palka get color #palka 18, 7 // цвет полосы лески if #palka = 4488494 // цвет без нагрузки send_up h else goto palka end_if
Порядок запуска: качаем юпилот (можно прямо тут на форуме), открываем вкладку со скриптами и там делаем 3 вкладки со скриптами. Далее запускаем игру, затариваемся наживкой и едой, заходим на локацию Рыбхоз - карповая заводь. Достаем Донку, включаем бот... Надо открыть все 3 скрипта в пилоте, чтобы они так и назывались (0, 1, 2) Далее так же планирую привязать их к окну пилота, чтобы при запуске пилота сразу подгружались эти скрипты. Предыдущие версии версия 1.0
Готова версия 1.0 кодовое название КАРП Вот собственно версия которая будет работать у всех. Бот запрашивает место ловли, затем сам ловит рыбу, сам кушает, сам достает сачек. Ведет посчет количества выловленной рыбы. Делает перезабросы и т.д. Пользователю остается следить чтобы была наживка и еда в наличии, ну и своевременно продавать рыбу. Локация, пока только рыбхоз - карповая заводь. Планирую дальше: минимизировать запросы от пользователя, сделать возможность боту самому пополнять запасы наживки и еды, а так же продавать выловленную рыбу. Плюс расширить места ловли (или сделать их универсальными) [spoiler=script 0] Код // включение и настройка бота // необходимо достать удочку и забросить в место ловли // затем запускаем бот и следуем указаниям // раздел проверки нужны ли начальные параметры if #zabros > 0 and #eda > 0 and #cotel > 0 and #upotrebit > 0 goto eda else end_if // этот раздел посвящен заданию начальных параметров set #handlePilot findwindow () log #handlePilot log close log clear log open set #logSizeX 300 set #logSizeY 200 set #handleLog 0 while #handleLog = 0 set #handleLog findwindow (Log Window) end_while set #x (screenwidth - #logSizeX) / 2 set #y screenheight / 4 set windowpos 1 1 #logSizeX #logSizeY #handleLog log mode compact // 1 ищем необходимые окна - место заброса // карп 562, 329 set workwindow 0 showwindow #handlePilot log Укажите точку заброса (Ctrl+A) while workwindow = 0 wait 100 showwindow #handlePilot end_while
set #zabrosX defX set #zabrosY defY set #zabrosAX defxabs set #zabrosAY defyabs set #carpX 562 set #carpY 329 set #fiderX #carpX - 32 //дельта места заброса и конца фидера на карпа set #fiderY #carpY - 44 set #zabros workwindow // 2 ищем необходимые окна - окно игры и пилота в строке пуск set workwindow 0 showwindow #handlePilot log Укажите положение окна игры в строке пуск (Ctrl+A) while workwindow = 0 wait 100 showwindow #handlePilot end_while set #igraX defxabs set #igraY defyabs set workwindow 0 showwindow #handlePilot log Укажите положение окна UoPilot в строке пуск(Ctrl+A) while workwindow = 0 wait 100 showwindow #handlePilot end_while set #pilotX defxabs set #pilotY defyabs // 3 ищем необходимые окна - полоса еды set workwindow 0 showwindow #handlePilot log Укажите на полоску еды в ее середину (Ctrl+A) while workwindow = 0 wait 200 showwindow #handlePilot end_while set #edaX defX set #edaY defY set #eda workwindow move 416, 31 //относительные коорд рядом с бегунком лески get mouse_pos #leskaRX #leskaY abs//считываем абсолютные координаты окна рядом с леской set #leskaX #leskaRX + 1 move #leskaX #leskaY abs set #LeskaW windowfromcursor move 416, 12 //относительные коорд рядом с бегунком удочки get mouse_pos #udaRX #udaY abs//считываем абсолютные координаты окна рядом с леской set #udaX #udaRX + 1 move #udaX #udaY abs set #udaW windowfromcursor // 4 ищем необходимые окна - котелок set workwindow 0 showwindow #handlePilot log Укажите на котелок(Ctrl+A) while workwindow = 0 wait 100 showwindow #handlePilot end_while set #cotelX defX set #cotelY defY set #cotel workwindow set workwindow #cotel move #cotelX #cotelY left #cotelX #cotelY wait 400 // 5 ищем необходимые окна употребить set workwindow 0 showwindow #handlePilot log Укажите на кнопку употребить (Ctrl+A) while workwindow = 0 wait 100 showwindow #handlePilot end_while set #upotrebitX defX set #upotrebitY defY set #upotrebit workwindow send {Space}
// конец раздела начальных параметров //хотим ли есть?
:eda set workwindow #eda //окно полосок с едой get color #edacolor 27, 53 //координаты голода if #edacolor = 13032663 // цвет голода log Кушаю set #handleWin findwindow (Продукты) showwindow #handleWin wait random (1000) + 300 set workwindow #upotrebit left 10 10 send {space} goto eda else end_if // Начало заброса :zabros wait random (1000) + 500 log Забрасываю Удочку set workwindow #zabros //проверяем первый ли заброс set #a #a + 1 if #a = 1 move #carpX #carpY left #carpX #carpY goto klev end_if set #z random (2) if #z = 1 log забросил мышкой move #carpX #carpY left #carpX #carpY else send t log забросил кнопкой end_if :klev // цикл клева set #j #j + 1 if #j > 30 log возвращаюсь в начало (возможно есть проблемы) set #j 0 goto nachalo end_if wait random (1000) + 1500 get color #uda #fiderX, #fiderY// надо всегда проверять место заброса if #uda = 255 // цвет удочки goto klev else log Клюнуло, ВЫВАЖИВАЕМ! end_if
//вываживаем start_script 1 start_script 2
// проверка улова :ulov set #b #b + 1 //увеличение счетчика if #b > 150
Log не вываживается, либо сорвалась goto nachalo //сачек end_if set #a #a + 1 //увеличение счетчика if #a > 10
send f //сачек set #a 1 end_if move #zabrosAX #zabrosAY abs set #w windowfromcursor set workwindow #w if #w = #zabros// хендл окна заброса goto ulov else set #riba #riba + 1 log поймалась #riba рыбка stop_script 1 stop_script 2 wait random (1000) + 400 set #var findwindow (Садок) set workwindow #var send {Space} wait random (1000) + 400 end_if :nachalo stop_script 1 stop_script 2 log начинаем все поновой set #j 0 set #b 0 move #igraX, #igraY abs set #w windowfromcursor set workwindow #w left #igraX, #igraY abs wait random (300) move #pilotX, #pilotY abs left #pilotX, #pilotY abs wait random (300)
script 1
Код set workwindow #LeskaW.0 send_down g :leska get color #leska 21, 7 // цвет полосы лески if #leska = 4488494 // цвет без нагрузки send_up g else goto leska end_if
script 2
Код set workwindow #udaW.0 send_down h :palka get color #palka 18, 7 // цвет полосы лески if #palka = 4488494 // цвет без нагрузки send_up h else goto palka end_if
[/spoiler] версия 0.0
Решил попробовать написать простенький бот для такой незатейливой игры как Русская рыбалка. Бот конечно получился под меня, т.к. координаты завязаны на абсолютные значения моего экрана. Впринципе любой кто немного соображает сможет перенастроить под себя перебив клики мышкой. Если заморочиться то можно сделать бот с привязкой к окну, и вычислением координат от краев, но это если только делать не для себя а, например на продажу. Итак. Бот сам ест, сам забрасывает донку, когда клюет он выуживает рыбу и достает ее сачком, далее заного проверяет не голодны ли вы и все по новой. Я его сделал для ловли карпа на локации Рыбхоз. Карповая заводь. за 1 час безостоновочной работы (пака я уехал на обед с работы) он выловил на 800к зачетного карпа. максимальный вес 36кг за шт. Главное чтобы была наживка и еда в наличии и хорошая снасть. С какими проблемами я столкнулся: 1) Бот категорически не хотел выполнять команду Send на домашнем компе (перелопатив форум понял что это скорее всего из-за системы, поэтому тупо сделал все на ноуте, на котором команда выполнялась отлично) 2) после вылва рыбы, закрытия окна с уловом, он категорически не хотел забрасывать удочку заново. Долго парился как это исправить (и привязку окна под курсором и просто прописывая номер активного окна, бот не закидывал удочку, а просто как-будто игнорировал эти строки. (исправил таким образом: в конце скрипта запускал другой скрипт, который просто переключит на рабочем столе окна, тыкнет на окно рыбалки и опять на окно юпилота, далее сам остановиться и запустит скрипт основной, а тот в свою очередь заного поймает окно рыбалки и все начинает работать. вот собственно сам код. (с радостью приму предложения по оптимизации и конструктивную критику.) [spoiler=скрипт основной] Код set #w windowfromcursor set workwindow #w
//проверка еды send_up f :eda get color #eda 196, 620 abs // надо всегда проверять место заброса if #eda = 13032663 // цвет нет еды move 340, 695 abs left 340, 695 abs wait 1s move 854, 444 abs left 854, 444 abs wait 1s left 916, 191 abs move 916, 191 abs wait 300 goto eda else wait random (1000) end_if wait random (400) // начало ловли move 757, 359 abs set #w windowfromcursor set workwindow #w left 757, 359 abs wait 1s //send t // нажать t wait random (1000) // set $a 0 // для старта условного цикла нужна переменная $a с значением 0 :klev // цикл клева get color #uda 725, 320 abs// надо всегда проверять место заброса if #uda = 255 // цвет удочки в абс коорд goto klev else send_down g end_if //начало выуживания :leska set #a #a + 1 //увеличение счетчика if #a > 50 goto nachalo //перейти на метку end_if set #w windowfromcursor set workwindow #w get color #leska 648, 570 abs // цвет полосы лески if #leska = 7117147 // цвет без нагрузки send_up g send_down h wait 400 send_up h send_down g goto leska else
goto ulov end_if
//goto ulov :palka get color #palka 622, 555 abs // цвет полосы удочки if #palka = 4356908 // цвет без нагрузки send_up h
send_down g send_down f else end_if
//проверка вылова :ulov send f get color #ulov 443, 88 abs// цвет полосы окна if #ulov = 1328284 // цвет окна move 443, 88 abs set #w windowfromcursor set workwindow #w
send {Space} wait random (1000)
//set workwindow 591816
else goto leska end_if send_up f
wait random (1000) :nachalo start_script 2 end_script // завершиние работы скрипта закоментированно, поэтому работать код будет до ручного выключения
[/spoiler]
|
|
|
|
Strannik |
4.8.2015, 14:17
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Цитата(DarkMaster @ 4.8.2015, 14:55) Тему прилепил. Кодебоксы лучше заменить на код+спойлер.
спасибо, сейчас исправлю. Строго не судите, 1й скрипт в жизни написал, который работает (IMG: style_emoticons/default/biggrin.gif)
|
|
|
|
cirus |
4.8.2015, 15:07
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27353
Пользователь №: 16.971
Возраст: 29
|
|
|
|
|
DarkMaster |
4.8.2015, 15:20
|
Модератор UOPilot
Сообщений: 9.596
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28801
Пользователь №: 11.279
|
Цитата Скажите, а есть в юпилот возможность, чтобы скрипт запрашивал перед певрым забросом удочки ввод координат? допустим мы нажимаем старт скрипта, и выскакивает окно куда втавятся координаты после нажатия Ctrl+A. тогда если переделать приаязки кликов мыши не к абсолютным координатам а к краям окна, то можно сделать бот универсальный для любой локации, остается лишь достать удочку и указать место заброса. Можно чуть схитрить. Можно присвоить переменной рабочего окна wokwindow, скажем, -1 и ждать пока изменится значение этой переменной. Пользователь же нажмет ctrl+a в нужную точку и ее можно будет использовать непосредственно в скрипте.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd: Kov____ Писать в личку.
|
|
|
|
Strannik |
4.8.2015, 16:16
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Цитата(cirus @ 4.8.2015, 16:07) интересная команда, спасибо. эх, буду наверное завтра начинать писать нормальный красивый код для использования любым пользователем. А то в моем много оставшейся от черновой версии ненужных коментов и строк которые по факту не используются а пропускаются переходами. Цитата(DarkMaster @ 4.8.2015, 16:20) Можно чуть схитрить. Можно присвоить переменной рабочего окна wokwindow, скажем, -1 и ждать пока изменится значение этой переменной. Пользователь же нажмет ctrl+a в нужную точку и ее можно будет использовать непосредственно в скрипте.
Кстати можно вначале сделать проверку на переменную wokwindow и если она как раз скажем -1 изначально то соответственно запросить prompt и указать точку заброса, там и окно подвяжется и точка заброса определится. Единственное надо продумать удобный способ в случае необходимости эту точку поменять не перезапуская пилот. P.S. на данный момент за 2 часа работы бота я нафармил денег больше чем за 2 вечера игры) Надеюсь не забанят, хотя игра так себе, интересен скорее сам процесс написания бота, нежели игра.
|
|
|
|
Strannik |
5.8.2015, 15:52
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Цитата(DarkMaster @ 4.8.2015, 18:05) Я для такого запроса использовал вывод в лог. Тут есть пример: http://forum.uokit.com/index.php?showtopic=26742Начинаю потихоньку въезжать в тему с окнами. теперь только понял почему бот работает в абсолютных координатах... Собственно вопрос такой. Написал небольшой код для проверки уровня еды Код :eda set workwindow 395278 //окно полосок с едой get color #eda 28, 77 //координаты голода if #eda = 13032663 // цвет голода set workwindow 5636428 //окно с котелком move 36, 64 left 36, 64 wait random (1000)+ 1000 set workwindow 66808 //окно кнопки употребить move 854, 444 abs left 854, 444 abs wait 1s send {Space} goto eda else end_if end_script
Все работает, но только пока я не закрою игру, игру если открыть хендлы обновятся... Соответственно хендлы я нашел через сканер. Как можно найти хендлы этих окон скриптом? Допустим я открыл игру, нажал ctrl+a в любом месте дальше бот работает... Почитал тему твою, я так понимаю там окна называться как-то должны(иметь текстовое название, у меня я так понимаю только родительское окно имеет его). Сканер пишет только хендлы, никакого текста в окнах нет. http://clip2net.com/s/3lJje2p
|
|
|
|
Strannik |
5.8.2015, 19:13
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Цитата(DarkMaster @ 5.8.2015, 17:12) Итог - вам дан скрипт, который возвращает хендл того самого окошка без названия.
Просто судя по скрипту, вы хендлы задаете сразу, а потом идет проверка действительно ли 2е окно дочернее? У меня в игре все кнопки это отдельные окна. и в некоторых открываются меню. Всего я насчитал порядка 5ти нужных мне кнопок, но проблема в том что 2 из них нажимаются в всплывающем меню, которое если у пользователя запрашивать показать его c помощью Ctrl+A, при переходе на окно пилота - будет закрываться. как раз для этого небольшого куска, который я приложил выше. этот способ и не подойдет т.к. там есть это злополучное меню с едой. небольшой кусок для наглядности
Код :eda set workwindow 395278 //окно полосок с едой get color #eda 28, 77 //координаты голода if #eda = 13032663 // цвет голода set workwindow 5636428 //окно с котелком (меню всплывающее) move 36, 64 left 36, 64 wait random (1000)+ 1000 set workwindow 66808 //окно кнопки употребить (внутри всплывающего меню) move 854, 444 abs left 854, 444 abs wait 1s send {Space} goto eda else end_if end_script
есть мысли как это обойти? Вот скрины с действиями в них очень наглядно показано чего я добиваюсь. http://clip2net.com/s/3lJZfjW далее http://c2n.me/3lJZQydМожет так сделать? навести мышь билзко к котелку в окне с бегунками здоровья, далее считать абсолютные координаты мыши? (если так можно) далее прибавить к этим координатам координаты чтобы сместиться гарантировано на нужную кнопку, потом считать хендл окна под курсором... и т.д. получается мы работаем в абсолютных координатах, но не привязаны к положению окна.
|
|
|
|
Strannik |
10.8.2015, 15:22
|
Neophyte
Сообщений: 33
Регистрация: 4.8.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.574
Возраст: 28
|
Цитата(DarkMaster @ 6.8.2015, 21:54) Можно убрать и использовать defx и defy зарезервированные переменные. Они содержат в себе координаты, которые забирались по ctrl+a. Т.е. имхо более корректно будет заменить на: Код set #zabrosX defX set #zabrosY defY Спасибо за пример, принял к исправлению. Почти закончил неплохой вариант скрипта, осталось концовку подправить. Хочу вообще уйти от абсолютных координат, а для этого надоа обойти проблему: когда рыба выловлена у меня выскакивает окно. по сути его надо обнаружить, закрыть и начать скрипт снова. Как определить выскочило окно или еще нет. раньше я распознавал цвет в точке где выскакивает это окно, но тогда использовал абсолютные координаты. Как еще можно это сделать? может чтото типа showwindow?
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|