Ищу обучающие ресурсы скриптингу на Yoko Injection ! |
Ищу обучающие ресурсы скриптингу на Yoko Injection ! |
Сообщений: 305 Рег. 19.12.2016 |
14 января 2017 15:05
Сообщение #1
|
Добрый день, задался неподъмной целью написать скрипт на городские работы на минок через рекол руны, так как после нескольких дней поисков мне помогли найти скрипт на StealthUO без перелетов К тому же саму эту программу я в глаза ни разу не видел и не использовал. В идеале хотелось, что бы чар облетал все точки и делал работу (если точка занята - ждал). Опыт скриптинга около нулевой. Из опыта кодинга есть только небольшой опыт на Java, хотя особо это мне не помогает. Хотелось бы справиться дней за 10, но как получиться ! В данный момент ищу обучающие ресурсы (если таковые имеются по скриптингу на Yoku). Уже нашел не плохой гайд на yoko.com.ua, откуда мы с вами качаем этот самый Inject. Но, вот http://yoko.com.ua/help/ у меня не открывается, точнее открывается, но выводит на экран какие то иероглифы. Скорее всего дело в кодировке, но я не уверен (и не знаю, что делать !!!). В общем буду рад любой помощи в поиске данных ресурсов. В последующем буду выкладывать в эту тему мои жалкие попытки скриптинга и вопросы по этому самому скриптингу ! |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
14 января 2017 15:15
Сообщение #2
|
Лучше выкладывать на yoko "жалкие попытки" Там можно корреитировать свои скрипты, да и форум больше под кодинг подходит, нет ограниения по размещению кода как тут например, отступы по нормальному встают. А сюда уже готовые скрипты заливай. ЗЫ help не поднялся после обновления движка форума. Посмотрю что там можно сделать. И там есть уроки скриптового языка. Правда на старую версию но для основ пойдет. Я по ним пару ребят очень далеких от программирования натаскал писать луты и боевые скрипты самостоятельно :) PPS Старый help по инжекту для 7** версии Yoko_Help.CHM Новый help по инжекту с описанием новых команд, правда пока что не доделанный. Injection.chm Если на Windows 7-10 файл открывается белым полотном надо кликнуть правой кнопкой, свойства, подробно, Удаление свойств и личной информации, и нажать ОК. Копию можно удалять а полученный файл будет открываться как надо. |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
14 января 2017 15:40
Сообщение #3
|
Большое спасибо ! |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
15 января 2017 04:52
Сообщение #4
|
Написал простыню текста. Просто сверху вниз, без функций и переменных. Самый что ни на есть обычный топорной хардкод. Пособие по тому, как кодить не нужно По идее должно летать по рунам и юзать все 11 станков в городе Минок. Из проверок есть только чек на физл рекола (1 раз), на занятость места (тогда пробуем другое) и на простой по времени. Гвардов ставим на спам в пилоте. В общем с богом, сейчас буду проверять. Естественно буду продолжать учится и в итоге напишу что то достойное ! |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 09:06
Сообщение #5
|
ты главное не показывай никому |
|
|
|
15 января 2017 11:50
Сообщение #6
|
|
Цитата: Mirage никому КРЫСА |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 12:55
Сообщение #7
|
Vagabond, и не пиши |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
15 января 2017 13:09
Сообщение #8
|
Почему не писать то ? Сюда по тому,что я увидел ручками делают от силы процентов 15 людей, все остальное боты, причем еще и без гильдий (т.е. Твинки). П.С. Скрипт отработал, сегодня буду уже что то более гибкое писать ! |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 14:10
Сообщение #9
|
Ну то что он ГОВОРИТ я не услышу всего скорее :) Ребят, вы какие то напряженные. |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
15 января 2017 16:09
Сообщение #10
|
Как поставить неравенство или отрицание в условном операторе ? К примеру есть условие (If a == b), как поставить if (a не равно b). И второй, более важный пример: if UO.InJournal("The spell fizzles") then .... код end if Как сделать так, что бы было отрицание этой фразы ? Т.е. если я не увидел этого в журнале - то делай то, что мне нужно ! П.С. Почему иногда пишут endif а иногда end if. Есть ли разница ? |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 16:41
Сообщение #11
|
Не все еще уроки на yoko успел прочитать? ;) a == b a <> b if NOT UO.InJournal( либо if UO.InJournal("The spell fizzles") then действие если выполнено else действие если не выполнено end if Если будешь ожидать фразы либо ожидать отсутствия фразы то можно посмотреть циклы while wend endsub и endif == end sub и end if НО sub main() <> Sub main() |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
15 января 2017 16:45
Сообщение #12
|
И еще раз спасибо. Еще не все дочитал. Пытаюсь паралельно читать и писать. Синтаксис после Java достаточно не приятный для восприятия. Написал примитивную проверку на физл рекола sub OdnaRuna (runa) uo.DeleteJournal() repeat uo.cast('Recall',runa) wait (6000) until NOT UO.InJournal("The spell fizzles") end sub В чем отличия Sub и sub ?) |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 17:39
Сообщение #13
|
Sub в отличии от sub не отображается в выпадающем списке Проверка вполне себе имеет место быть если в ней убрать NOT (он применяется в цикле while как раз). Но я бы лучше подходить комплексно используя несколько условий. Например проверку на ману, реагент, координату чара. Можно добавить проверку на ID сообщения - что бы скрипт не сбил рядом стоящий игрок. Что то навроде: mana=uo.mana lastX=uo.getX() lastY=uo.getY() uo.cast('Recall',runa) repeat wait(100) until UO.InJournal('fizzles') and uo.JournalSerial(uo.injournal('fizzles')-1)== '0xFFFFFFFF' or mana <> uo.mana or (uo.getX()<>lastX and uo.getY()<>LastY) У Зомби (вроде бы его вариант) было объединение нескольких разных циклов, сложновато но если разберешься будет гуд: Sub Recall(i,rune) var b uo.print('Recoll Rune '+str(i)) for b=1 to 10; повторять 10 раз uo.deletejournal() uo.waittargetobject(rune[i]) uo.cast('Recall',rune[i]) if WaitForRecall()==1 then return 1; остановит каст завершит скрипт end if next return 0 end sub Sub WaitForRecall() var Text1=uo.getname()+": The spell fizzles" var mess='',lastX=uo.getX(),lastY=uo.getY() for var v=0 to 200 mess=uo.journal(0) if uo.Journal(0)==Text1 then ; проверка на сообщение return 0 end if if uo.getX()<>lastX OR uo.getY()<>LastY then ; проверка на координату return 1 end if wait(50) next return 0 end sub |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
15 января 2017 21:07
Сообщение #14
|
Я в печали. Кусочек кода застопорил меня. Уже идет третий час. Совершенно не могу понять почему строчка if UO.InJournal("Engelos:Trick")then не выполняется ни при каких условиях. Т.е. что бы я в этот журнал не вписал, всеравно в этот иф не заходит. Teleport(runa) PovtorUZ3(stanok) wait (3000) if UO.InJournal("Engelos:Trick")then Teleport(runa1) PovtorUZ3(stanok) endif Финальные строчки PovtorUZ3(stanok): if UO.InJournal("Рабочее место уже занято!|You can't reach taht.|You can't see the target") then uo.DeleteJournal() uo.ignore('finditem') UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') endif wait (3000) if UO.InJournal("Рабочее место уже занято!|You can't reach taht.|You can't see the target") then UO.Say('Trick') В этой функцие он почему то корректно считывает либое нужное мне значение с журнала в условном операторе if, но как только я возвращаюсь назад - все перестает работать. Такое ощущение, что он почему то не видит этот самый журнал или считает его какой то локальной переменной... Журнал то общий, бред в общем... П.С. Эти костыли я придумал, что бы как-то передать значенией локальной переменной вверх. В Java я бы просто создал статическое, либо же просто создал метод с возвращаемым значением true или false. Тут пока придумал вот это, но совршенно не могу понять, почему оно не работает. |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
15 января 2017 22:40
Сообщение #15
|
1) Имя не показывается в журнале соответственно проверка не выполнится - просто нет такой фразы в игре. 2) в проверке журнала важен регистр и все символы. Если в игре пишется You can't reach taht а в проверке есть точка - проверка не сработает. НО если в проверке чего то не хватает а в игровой фразе есть то сработает => if UO.InJournal("место уже занято|ou can") then вполне достаточно. 3) в нижнем куске ты чего то накрутил лишку хотя идея правильная. Ты сделай отдельными кусками. Чисто поиск и использование инструмента, если занят то ищет и использует другой инструмент. Без движения, свистелок перделок. Потом соберешь все в единый скрипт sub main() deistvie1() deistvie2() deistvie3() end sub Так отлаживать поначалу проще чем с большими скриптами возиться. Где то что то поменяешь в большом и потом сидишь тупишь где запятую пропустил или нолик лишний. А куски ты отдельно можешь проверять. Подход, перелет, использование, еда, лечение если требуется, гвардилка при понижении хитов или атаке на чара. PS sub perebor() Вот смотри набросал пример как можно сделать перебор.uo.DeleteJournal() repeat uo.findtype(type,color,3); цифру поставить по расстоянию между крайними токами. if uo.findcount() then podhod('finditem'); функция подхождения к станку uo.useobject('finditem') if UO.InJournal("какое то сообщение") then uo.DeleteJournal() uo.ignore('finditem') else wait(1000) endif endif wait(100) until uo.dead() endsub |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
17 января 2017 00:58
Сообщение #16
|
Спасибо за советы, идею как мне кажеться я уловил, но на данный момент времени не так много, поэтому до выходных постараюсь прошерстить как можно больше теории и изучить побольше чужого кода. А с пятницы снова в бой с полными силами ! Выложу тот огрызок, которым пользуюсь на данным момент. Совершенно ужастный код, это по сути то, что я слепил под конец первого дня и на что использую сейчас. В дальнейшем планирую каждое отдельное действие вывести в отдельную функцию, убрать все повторы в коде, добавить множество проверок и сделать код более умным (что бы он не реколилися на два метра, а пробовал сперва пройти) и т.д. Запускается командой ,exec Start. Единственное, что нужно менять, это ID рун в sub Start. Должно выглядеть так: OdnaRuna('0x403B2091', '0x2AFA') ; Moon music. Заготовка под город Moonglove. Если в начале стоит OdnaRuna, то нужно маркать так, что бы с этого места вы доставали как минимум до двух (а лучше трех, если возможно) инструментов, а если MnogoRun - то маркайте как хотите, 3 руны у разных инструментов. ПОВТОРЮСЬ. Код нубской, но написал я его всего за 1 день. Поэтому не кидайтесь тапками ! За след выходные выкачу что нибудь по красивее и надежнее. sub Moon() repeat if uo.GetHP() < uo.GetMaxHP() then UO.Say('Guards') endif wait (3000) until uo.Dead() end sub sub Start () uo.ignorereset() uo.DeleteJournal() uo.set('finddistance', '1') OdnaRuna('ID вашей руны', '0x2AFA'); Moon music OdnaRuna('ID вашей руны', '0x160B'); cooking OdnaRuna('ID вашей руны', '0x2130'); Forensic OdnaRuna('ID вашей руны', '0x1865'); Poisoning OdnaRuna('ID вашей руны', '0x1BDF'); lumber OdnaRuna('ID вашей руны', '0x0E2E'); medit OdnaRuna('ID вашей руны', '0x2D4E'); inscript OdnaRuna('ID вашей руны', '0x12CA'); begging MnogoRun('ID вашей руны','ID вашей руны','ID вашей руны','0x1EA6');fishing MnogoRun('ID вашей руны','ID вашей руны','0x403B2091','0x1E2C');snooping MnogoRun('ID вашей руны','ID вашей руны','ID вашей руны','0x11AD');rem trap end sub sub OdnaRuna (runa, stanok) var LastTimer Teleport(runa) PovtorUZ3(stanok) LastTimer=UO.Timer() repeat wait (1000) Until UO.InJournal("Выполнение работы прервано!|Вы успешно справились с работой!") or uo.Dead() or (UO.Timer()>LastTimer+5000) end sub sub MnogoRun (runa, runa1, runa2, stanok) var LastTimer Teleport(runa) uo.DeleteJournal() UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') uo.waitgump(1) wait (3000) if UO.InJournal("Рабочее место уже занято!") then teleport(runa1) uo.DeleteJournal() UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') uo.waitgump(1) wait (3000) endif if UO.InJournal("Рабочее место уже занято!") then teleport(runa2) uo.DeleteJournal() UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') uo.waitgump(1) wait (3000) endif LastTimer=UO.Timer() repeat wait (1000) Until UO.InJournal("Выполнение работы прервано!|Вы успешно справились с работой!") or uo.Dead() or (UO.Timer()>LastTimer+5000) end sub sub PovtorUZ3 (stanok) UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') uo.waitgump(1) wait (3000) if UO.InJournal("Рабочее место уже занято!") then uo.DeleteJournal() uo.ignore('finditem') UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') endif wait (3000) if UO.InJournal("Рабочее место уже занято!|You can't reach taht.|You can't see the target") then uo.DeleteJournal() uo.ignore('finditem') UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') endif wait (3000) uo.ignorereset() end sub sub Teleport(runa) repeat uo.DeleteJournal() uo.cast('Recall',runa) wait (6000) until NOT UO.InJournal("The spell fizzles") uo.useskill('Meditation') wait (1000) end sub |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
17 января 2017 10:17
Сообщение #17
|
Если работает то в целом хорошо. Нормально что сразу стал проверку времени на цикл repeat вешать - многие игнорируют эту полезную шняжку. Можно чуть чуть добавить косметики для сокращения пауз и уменьшения затрат на работу скрипта. Типа того: Sub Moon() repeat if uo.GetHP() < uo.GetMaxHP() then UO.Say('Guards') wait (3000) endif wait (300); меньше думаю не стоит until uo.Dead() end sub Проверять будет чаще, спамить не будет как у некоторых. UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') uo.waitgump(1) wait (3000); вот эта пауза не на месте стоит. if UO.InJournal("Рабочее место уже занято!") then uo.DeleteJournal() uo.ignore('finditem') UO.FindType(stanok,'-1','ground') uo.UseObject('finditem') endif там лучше указать 300 - на проверку занятости. Если проверка не прошла (else) вот там уже несколько секундную паузу делать. Выше я написал пример как использовать несколько рядом стоящих точек OdnaRuna('ID вашей руны', '0x2AFA'); Moon music Можно сделать чуть чуть другим способом - через 1 тип руны и массив типов станков. Алгоритм будет следуюющий. 1) Нашли в сумке тип руны, летим по ней, на месте применяет марк (нам же не надо что бы рунки кончились и пришлось снова облетать перемарчивать) 2) ищем любой тип станка на земле, если нашли подходим и используем 3) если занято, переходим к следующему 4) если все заняты и больше предметов нет летим по следующей руне. 5) летим домой добираем реги скидываем по необходимости шмотки полученные в процессе кача. 1 пункт можно выполнить несколькими вариантами. 1) мешок с рунами таскаем каждый раз с собой - максимально сокращается время перелета, минимизируются затраты на реги, минимальная длинна скрипта но самая высокая опасность сразу потерять все рунки. 2) прыгать по рунам с базы/банка имея в бэкпаке 1 нуби руну на базу/в банк. Код чуть усложница, регов будет тратиться чуть больше но д.же безопасно. Даже если тебя убьют - просто ищешь ближайшего хиллера (небольшая заплатка к скрипту) и восстанавливаешься, добираешь с банка реги на прыжок на базу и продолжаешь скрипт. 3) средний вариант - берем с мешка 1 руну на точку, летим туда, маркаем её что бы она не кончалась и после выполнения заказа кладем обратно в сундук, беря другую руну... ЗЫ а так это практически полный аналог скупки, алгоритм прыжков можно взять из оттуда. ЗЗЫ если ты совсем до этого не писал на инжекте то через пару недель можно будет у тебя некоторые приемы заимствовать И я бы на твоем месте лучше все таки обратил внимание на стелс. Там обычный паскаль а не недобейсик. И ходилка там четкая. Руны в одном городе можно даже не использовать - чар будет сам ходить, сам двери открывать... |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
21 января 2017 23:25
Сообщение #18
|
Можно ли как то передать в функцию аргумент из вне ? К примеру я создаю скрипт, который работает в реальном времени. По сути он ничего не делает, только слушает мои команды. У меня есть вунтри еще одна функция, допустим SubRecall (rune, time). И я хочу из вне передавать разные значения этой самой time, это возможно ? Т.е. из самой игры. |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
21 января 2017 23:48
Сообщение #19
|
sub t1() var i i=1 t2(i) i=2 t2(i) endsub sub t2(x) var j=x uo.print(j) endsub 2) uo.setglobal и uo.getglobal 3) более подробно напиши там пара вариантов еще есть но смотря что именно ты хочешь получить в итоге. |
|
|
|
Сообщений: 305 Рег. 19.12.2016 |
22 января 2017 02:14
Сообщение #20
|
Не совсем понял. Обьясню по другому. У меня есть макрос на крафт чего то с фиксированной переменной Integer (числовая в общем, не знаю как тут называется). Один скрипт содержит в себе много других. К примеру я делаю load всего крафтового скрипта в инжекте и остальные команды ввожу из самой игры. К примеру ,exec CraftLesseHeal или ,exec CraftBow и т.д. Проблема в том, что число едениц которое мне нужно скрафтить уже вшито, а число меняется каждый день. Как передать это число (сегодня 20, завтра допусти захочу 31 и т.д.) из самой игры. |
|
|
|
Сейчас: 23 ноября 2024 10:19 |