Ищу обучающие ресурсы скриптингу на Yoko Injection !
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
2 февраля 2017 10:24
Сообщение #41
Engelos,
Используй в качестве чеклага это:
if UO.ReceiveObjectName('backpack', 20000) then
; ответ от сервера получен
else
; не дождались ответа
end if

Описание команд инжекта скачать Injection.chm
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
2 февраля 2017 10:29
Сообщение #42
Может забить? ;)
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
2 февраля 2017 10:31
Сообщение #43
Цитата: Engelos
В турториале этого нету, нашел несколько вариантов в гугле с обьяснениями, но не тем не менее не понял как его использовать. Перед каждым действием пихать что ли эту проверку ?

Лучше скинь пример, где ты хочешь использовать чеклаг, в большинстве случаев можно обойтись и без него.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
2 февраля 2017 13:37
Сообщение #44
Кода еще нет, на данный момент набрасываю псевдо код паралельно пытаясь разобраться, как заскриптить ту или иную идею.

Скрипт на скупку определнных регов. В паке есть 1 руна к банку и сумка с рунами к вендорам. Начинаем от банка.

sub Test()

Создаем массив с ID нужных нам вендоров.

while (true) - бесконченый цикл, повторяется через определнный срок (10 минут примерно, еще не тестил сколько нужно).

функция 1 - checkRegs(n) (внутри через if проверят реги на рекол, если меньше n - добираем из банка командой grab)

Далее цикл While (условие выхода - пустой finditem)
находим любую руну из сумки
функция 2 - рекол по этой руне, там же проверка зарядов, в случае необходимости марк
функция 3 - используем гамп, и в цикле перебираем id всех вендоров из нашего списка. Вначале каждой итерации очищаем журнал. Если журнал выдает "You can't see the target" то wait (50), если нет то юзаем ,buy buylist, ждем и делаем break.
функция 4 - проверка на вес и на реги. Если больше условного или регов меньше n - испльзуем 5 функцию (рекол к банку, полная выгрузка и загрузка части регов не реколл) Возможно стоит обьденить с первой функций, не суть.
Игнорим найденную руну.
wend

В итоге если по время работы скрипта, особенно при переборе вендоров произойдет сейв будет сбой.

П.С. Где в этом турториале искать checklag ? Я октрываю колонку "Все по алфавиту" и делаю поиск по нужной мне фразе или ее части. Такого там нет. Что я делаю не так ?
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
2 февраля 2017 15:30
Сообщение #45
Engelos,
Массив ID вендоров не нужен, достаточно создать массив с рунами по вендорам. В последних версиях инжекта появилась возможность создавать динамические массивы, пример:
dim Runes[1]
. . .

      if UO.FindType(0x1F14, -1, Container) <> '' then
        Runes = SetArrayLength(Runes, UO.FindCount())
        for Index = 0 to UO.FindCount() - 1
          Runes[Index] = UO.FindItem(Index)
        next
      end if
. . .

Алгоритм скупщика:
- открываем банк
Sub OpenBank()
  UO.Msg('Bank Guards')
  return UO.WaitingForJournalText(Now(), SaveDelay, 'Bank Box')
end sub

- открываем контейнер в банке
Sub OpenBox(Container)
  UO.UseObject(Container)
  return UO.ReceiveObjectName(Container, SaveDelay)
end sub

тут два примера гарантированного открытия, 1й проверяет приход сообщеня в журнал, 2й проверяет приход имени от объекта, в данном случае контейнера (аналог чеклага)

- выгружаем скупленные предметы
- добираем реагенты
- если массив рун пуст, то записываем в него ИД рун по вендорам
пример в самом верху поста

- извлекаем нужную руну из массива RuneVendor = Runes[Index], увеличиваем индекс массива рун Index = Index + 1
- реколимся по найденной руне (завершение рекола можно отследить по изменению координат X,Y персонажа)
- делаем скупку по байлисту UO.Say(',buy ' + BuyList), ждем некоторое время
- рекол к банку
- переход к пункту 1
+ ну естественно должны быть различные проверки на ману, реги, наличие рун, зарядов на рунах и прочее...

Цитата: Engelos
П.С. Где в этом турториале искать checklag ?

Чеклаг это самописный макрос, алгоритм такой, тыкает по бакпаку и ждет прихода сообщения в журнал, в последних версиях инжекта появилась команда ReceiveObjectName, вот ее и используй в качестве чеклага.
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
5 февраля 2017 09:48
Сообщение #46
Спасибо. Посредний пост очень помог, скрипт работает, осталось отладить некоторые детали. Есть пара вопросов. На данный момент имею достаточно примитивный, на рабочий блок покупки. Проблема лишь в одном дефекте, если реги скупаются успешно - то он реколиться сразу, если же нет - то он ждет SaveLag время и только потом летит. Я подозреваю, что все дело в источнике сообщения для журнала. Ибо фразу 'Here you are' говорит сам вендор, а вот 'No items bought.' выдает в журнал сам инжект. Как это можно пофиксить ?

Sub Buy()
      uo.deletejournal()
      uo.waitgump(3)
      UO.Say(',buy ' + BuyList)
   return UO.WaitingForJournalText(Now(), SaveLag, 'Here you are|No items bought.')
end sub  


И второй вопрос, даже скорее уточнение.
Приведу условных пример для ястности.

Sub Test()
var runeType =  0x1F14
var MandrakeRegType = 0x0F86

UO.findtype(runeType, -1, -1)
RuneBank = finditem
UO.findtype(MandrakeRegType, -1, -1)
UO.Cast('Recall', RuneBank)


end sub


Я пологал, что в этом примере переменная RuneBank является по сути ссылкой на обьект, но после того как код отрабоает я попытаюсь портнуться на Mandrake Root реагент, а не на руну. Как это получается ? Ведь если RuneBank это указать на обьект, то переменная не должна меняться, если я делаю еще один поиск findtype. В общем в коде эту проблему я обошел ,просто хочеться понять принцип работы.

Спасибо еще раз !
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
5 февраля 2017 10:43
Сообщение #47
Engelos,
Вместо SaveLag поставь задержку в 3000, этого будет достаточно, если в этот момент будет сейв, то скрипт уйдет в ожидание рекола и после завершение сейва продолжится.

В инжекте нет указателей. В данном случае в RuneBank попадает ИД руны, строка вида '0x12345678'
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
5 февраля 2017 11:04
Сообщение #48
Спасибо, про задержу понял, а вот по второму вопросу - не совсем. Еще раз приведу обновленный пример.

Sub Test()
var runeType =  0x1F14
var MandrakeRegType = 0x0F86

UO.findtype(runeType, -1, -1)
RuneBank = finditem
UO.Cast('Recall', RuneBank); Первый каст
UO.findtype(MandrakeRegType, -1, -1)
UO.Cast('Recall', RuneBank); Второй каст


end sub


В первом реколе все хорошо - мы летим на руну. Во втором же, я почему то пытаюсь лететь на MandrakeRoot регаент. finditem указывает на mandrake, но, я то реколюсь по переменной RuneBank, которой уже присвоил id руны.
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
5 февраля 2017 11:29
Сообщение #49
Engelos,
Работать вообще не должно, здесь ошибка:
RuneBank = finditem

правильно:
RuneBank = UO.GetSerial('finditem')

можно так:
RuneBank = UO.FindType(0x1F14, -1, 'backpack')
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
12 февраля 2017 16:18
Сообщение #50
Как увеличить шрифт в редакторе кода самого инжекта ?
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
12 февраля 2017 17:43
Сообщение #51
Используй редактор Notepad++, файл раскраски под инжект лежит в архиве с автолоадом.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
12 февраля 2017 18:29
Сообщение #52
Понапокупали себе 4K. Теперь мучаются :crazy:
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
19 февраля 2017 17:34
Сообщение #53
Как из одного макроса запустить другой, паралельный (что бы выполннялись не по очереди, а одновременно). На данный момент я пользуюсь формулой UO.Say(',exec ДРУГОЙ МАКРОС'). Есть ли более адекватный способ ?
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
19 февраля 2017 18:06
Сообщение #54
Engelos,
UO.Exec('ДРУГОЙ МАКРОС')
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
19 февраля 2017 22:12
Сообщение #55
   if UO.Weight > (UO.STR * 3.6) then
      UO.CharPrint('self', 0x0026, '[Tracking]:WEIGHTLIMIT!')  
      UO.Exec('terminate Start')
      PlusGlob()
      TeleportHome()
      MoveInBank()
      wait (5000)
      UO.Exec('Start')
   end if


Не работает. Пишет нет такой команнды как Старт. Start - это название того, с чего мой скрипт начинается.
Если пользуюсь uo.say(',exec Start') - то работает.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 февраля 2017 23:38
Сообщение #56
Попробуй вместо
UO.Exec('Start')
использовать или
Start()
либо
UO.Exec('exec Start')
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
20 февраля 2017 01:54
Сообщение #57
Если я напишу Start(), то я из текущей функции прыгну в первую и не завершу эту. В данном примере оно годится, ибо вызов стоит в конце, но в других не подойдет. Второй вариант тоже не работает :(

Я бы пользовался вариантом через uo.say(',exec Method') и не жаловался, но оно может глюкнуть если случайно нажать любую клавишу на кливиатуре. Ибо оно выведет эту клавишу + ,exec Method, получиться что то вроде d,exec Method и ошибка )
Маршал (73319389)13 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
20 февраля 2017 02:03
Сообщение #58
Цитата: Engelos
Если пользуюсь uo.say(',exec Start') - то работает.

Цитата: Mirage
UO.Exec('exec Start')
Старший Лейтенант (6677478)7 лет
Dragonstalker
Сообщений: 305
Рег. 19.12.2016
20 февраля 2017 03:22
Сообщение #59
UO.Exec('exec Start') - действительно получилось. Писал без кавычек, когда пробовал тот же вариант от Миража, вот жеж... Спасибо !
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
20 февраля 2017 08:39
Сообщение #60
Зачем параллельно запущенные функции держать если достаточно после удачной попытки добычи простую проверку на if вес вставить?
Можно запихнуть вот такую штуку подрихтовав под себя:

Sub CheckAll()
   UO.Set('quiet','1')
   if UO.WarMode() then
      UO.WarMode(false)
      wait(100)
   end if
   uo.waitmenu('Tracking', 'Players')
   if uo.WaitingForMenu(250,1,0,'Tracking','Tracking') then
      uo.charprint('self', printcolour, 'ЧЕЛОВЕК')
      Gong(1)
      RuneRecall(Rune)
   endif
   if UO.InJournal('is attacking you') then
      Enemy = UO.JournalSerial(UO.InJournal("is attacking you")-1)
      DeleteJournal('is attacking you')
      uo.charprint('self', printcolour, 'Атака!')
      Gong(2)
      if UO.Count(Invis_T,Invis_C) then
         uo.Usetype( Invis_T,Invis_C )
      endif
      wait(delay2)
      if UO.Count(weapon ) then
         uo.Usetype( weapon )
      endif
      wait(delay2)
      if UO.Count(weapon ) then
         uo.Usetype( shield )
      endif
      wait(delay2)
      UO.Attack( Enemy )
      LastTimer=UO.Timer()
      repeat
         wait( delay2 )
      until uo.dead() or uo.GetX(Enemy)==0 || UO.Timer()>LastTimer+delay3
      uo.Warmode(0)
      wait(delay2)
   end if
   If UO.Life < Uo.Str/2 then
      UO.Msg('.bandageself')
      wait( 2000 )
   endif
   If UO.Weight > MaxVes Then
      UO.Set('quiet','0')
      uo.charprint('self', printcolour, 'Перегруз!')
      RuneRecall(Rune)
   endif
   if UO.WarMode() then
      UO.WarMode(false)
      wait(100)
   end if
end sub


А еще 15 инжа умеет не только вырубать скрипты но и ставить их на паузу - если решишь все таки параллельными потоками пользоваться. Можно продолжать "с места разрыва".

И Ваапще. Я свой почти готовый скрипт выкладывал в общаг (туда только ходилку или леталку дописать надо, да пару функций обновить под новый инжект). И с ходилками/леталками делал паре ребят. Зомбик показывай свой кароче :crazy:
Последние посетители (0):

 
Сейчас: 20 мая 2024 01:09