Ищу обучающие ресурсы скриптингу на Yoko Injection !
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
14 января 2017 15:05
Сообщение #1
Добрый день, задался неподъмной целью написать скрипт на городские работы на минок через рекол руны, так как после нескольких дней поисков мне помогли найти скрипт на StealthUO без перелетов К тому же саму эту программу я в глаза ни разу не видел и не использовал.
В идеале хотелось, что бы чар облетал все точки и делал работу (если точка занята - ждал). Опыт скриптинга около нулевой. Из опыта кодинга есть только небольшой опыт на Java, хотя особо это мне не помогает. Хотелось бы справиться дней за 10, но как получиться !

В данный момент ищу обучающие ресурсы (если таковые имеются по скриптингу на Yoku). Уже нашел не плохой гайд на yoko.com.ua, откуда мы с вами качаем этот самый Inject. Но, вот http://yoko.com.ua/help/ у меня не открывается, точнее открывается, но выводит на экран какие то иероглифы. Скорее всего дело в кодировке, но я не уверен (и не знаю, что делать !!!). В общем буду рад любой помощи в поиске данных ресурсов.

В последующем буду выкладывать в эту тему мои жалкие попытки скриптинга и вопросы по этому самому скриптингу !
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
14 января 2017 15:15
Сообщение #2
Лучше выкладывать на yoko "жалкие попытки" Там можно корреитировать свои скрипты, да и форум больше под кодинг подходит, нет ограниения по размещению кода как тут например, отступы по нормальному встают.
А сюда уже готовые скрипты заливай.

ЗЫ help не поднялся после обновления движка форума. Посмотрю что там можно сделать. И там есть уроки скриптового языка. Правда на старую версию но для основ пойдет. Я по ним пару ребят очень далеких от программирования натаскал писать луты и боевые скрипты самостоятельно :)

PPS
Старый help по инжекту для 7** версии
Yoko_Help.CHM

Новый help по инжекту с описанием новых команд, правда пока что не доделанный.
Injection.chm

Если на Windows 7-10 файл открывается белым полотном надо кликнуть правой кнопкой, свойства, подробно, Удаление свойств и личной информации, и нажать ОК. Копию можно удалять а полученный файл будет открываться как надо.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
14 января 2017 15:40
Сообщение #3
Большое спасибо !
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
15 января 2017 04:52
Сообщение #4
Написал простыню текста. Просто сверху вниз, без функций и переменных. Самый что ни на есть обычный топорной хардкод. Пособие по тому, как кодить не нужно :dirol: По идее должно летать по рунам и юзать все 11 станков в городе Минок. Из проверок есть только чек на физл рекола (1 раз), на занятость места (тогда пробуем другое) и на простой по времени. Гвардов ставим на спам в пилоте.

В общем с богом, сейчас буду проверять. Естественно буду продолжать учится и в итоге напишу что то достойное !
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
15 января 2017 09:06
Сообщение #5
ты главное не показывай никому :crazy: :bye:

Гости
Сообщений: 38
Рег. 27.06.2014
15 января 2017 11:50
Сообщение #6
Цитата: Mirage
никому
КРЫСА
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
15 января 2017 12:55
Сообщение #7
Vagabond,
и не пиши :no2:
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
15 января 2017 13:09
Сообщение #8
Почему не писать то ? Сюда по тому,что я увидел ручками делают от силы процентов 15 людей, все остальное боты, причем еще и без гильдий (т.е. Твинки).

П.С. Скрипт отработал, сегодня буду уже что то более гибкое писать !
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
15 января 2017 14:10
Сообщение #9


Ну то что он ГОВОРИТ я не услышу всего скорее :) Ребят, вы какие то напряженные.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
15 января 2017 16:09
Сообщение #10
:diablo:

Как поставить неравенство или отрицание в условном операторе ? К примеру есть условие (If a == b), как поставить if (a не равно b). И второй, более важный пример:

if UO.InJournal("The spell fizzles") then
.... код
end if

Как сделать так, что бы было отрицание этой фразы ? Т.е. если я не увидел этого в журнале - то делай то, что мне нужно !

П.С. Почему иногда пишут endif а иногда end if. Есть ли разница ?
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 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()
:derisive:
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 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 ?)
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 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
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 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. Тут пока придумал вот это, но совршенно не могу понять, почему оно не работает.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 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
Вот смотри набросал пример как можно сделать перебор.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 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


Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 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 руну на точку, летим туда, маркаем её что бы она не кончалась и после выполнения заказа кладем обратно в сундук, беря другую руну...

ЗЫ а так это практически полный аналог скупки, алгоритм прыжков можно взять из оттуда.

ЗЗЫ если ты совсем до этого не писал на инжекте то через пару недель можно будет у тебя некоторые приемы заимствовать :friends:
И я бы на твоем месте лучше все таки обратил внимание на стелс. Там обычный паскаль а не недобейсик. И ходилка там четкая. Руны в одном городе можно даже не использовать - чар будет сам ходить, сам двери открывать...
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
21 января 2017 23:25
Сообщение #18
Можно ли как то передать в функцию аргумент из вне ?

К примеру я создаю скрипт, который работает в реальном времени. По сути он ничего не делает, только слушает мои команды. У меня есть вунтри еще одна функция, допустим SubRecall (rune, time). И я хочу из вне передавать разные значения этой самой time, это возможно ? Т.е. из самой игры.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 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) более подробно напиши там пара вариантов еще есть но смотря что именно ты хочешь получить в итоге.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
22 января 2017 02:14
Сообщение #20
Не совсем понял.

Обьясню по другому. У меня есть макрос на крафт чего то с фиксированной переменной Integer (числовая в общем, не знаю как тут называется). Один скрипт содержит в себе много других. К примеру я делаю load всего крафтового скрипта в инжекте и остальные команды ввожу из самой игры. К примеру ,exec CraftLesseHeal или ,exec CraftBow и т.д. Проблема в том, что число едениц которое мне нужно скрафтить уже вшито, а число меняется каждый день. Как передать это число (сегодня 20, завтра допусти захочу 31 и т.д.) из самой игры.
Последние посетители (0):

 
Сейчас: 20 мая 2024 00:59