Урок 5. Работа с журналом инжекта
Пока писал, понял… писатель из меня никакой. Может, кто допишет.
А пока пользуемся тем что есть
Напишем простую программку. Она открывает банк и мешочек в нем
Code:
UO.Say("Bank") ;
UO.UseObject(0x01258856) ;
Пробуем, банк откроется, а вот мешочек нет. Дело в том, что ответ от сервера придет не мгновенно.
Переделаем...
Code:
UO.Say("Bank") ;
wait(1000)
UO.UseObject(0x01258856) ;
Все открылось. И будет открывается почти всегда. Только не устойчиво к лагам и сейвам.
Заменим статическую паузу на динамическую
Code:
UO.Say("Bank") ;
CheckLag()
UO.UseObject(0x01258856) ;
Вот и сама функция.
Code:
sub CheckLag()
UO.DeleteJournal() ; вытрем все сообщения в журнале (Inj, но не клиента)
UO.Click('backpack') ; одиночный клик по вашему backpack
; ждем сообщения в журнале
repeat
wait(100)
until UO.InJournal("Backpack")
; этот цикл завершится, если это сообщение появится.... замечу "Backpack" и "backpack"
; регистр важен Пишите точно что ждете
end sub
Многие с невероятным рвением тут же заменят все wait(ххх) на CheckLag(). ЧТО в корне не правильно
И точно не круто. Эта замечательная функция создана вовсе ни как универсальная динамическая пауза.
И у wait(ххх) есть свое назначение
Code:
UO.DeleteJournal() ; вытрем все сообщения в журнале
UO.Say("Bank") ;
; ждем сообщения в журнале
repeat
wait(100)
until UO.InJournal("your Bank Box")
; открываем мешок
UO.UseObject(0x01258856) ;
CheckLag() ; тут уместно так как мешок нам не сообщит что открыт
Теперь все пашет как часы. Это только на первый взгляд. Все рухнет, если мы не у банка и нет мешочка.
А любая программа считается рабочей пока не найдены условия когда она работать не сможет...
А они найдены. Далее правьте сами....
Рассмотрим теперь команды
Вот эта наверное самая главная
showjournal отобразить журнал Injection
Синтакс: ,showjournal [lines_num]
none uo.showjournal([lines_num])
Отображает в текстовом окне последние lines_num строк настоящего журнала Injection (по умолчанию 10).Забиндим ее на клаву.. И будем всегда готовы ее нажать.
Только во время выполнения скрипта ее нажатие без смыслено по причине вот этой команды
DeleteJournal Очистка журнала
Синтакс: none uo.DeleteJournal()
Очищает журнал Injection. Учтите что журнал един для всех скриптов запущенных в данном экземпляре инжекта/клиента.
Команда выполняется чтобы отсечь уже отработанные варианты для команды InJournalПо этой причине будем чистить журнал не напалмом, а скальпелем
Code:
sub CheckLag()
DeleteJournal("Backpack") ; вытрим ТОЛЬКО нужные нам сообщения в журнале
UO.Click('backpack') ; одиночный клик по вашему backpack
; ждем сообщения в журнале
repeat
wait(100)
until UO.InJournal("Backpack")
end sub
Вот скальпель
Code:
sub DeleteJournal(msg) ; msg это параметр, см. выше как его передают
var nom=UO.InJournal(msg) ; ищем сообщение и в переменную его
if nom>0 then
UO.SetJournalLine(Nom - 1," ----- 8< ----- ") ; подменим сообщение
DeleteJournal(msg) ; вызов функцией самой себя, рекурсия
endif
endsub
InJournal Поиск в журнале текста
Синтакс: number uo.InJournal(text)
Ищет в журнале Injection строку, в которой встречается text, и возвращает её номер плюс 1, или возвращает 0 если
такая строка с момента последнего удаления журнала DeleteJournal не обнаружена. Номер может быть использован в
дальнейшем для функций Journal, JournalSerial, SetJournalLine (не забыть отнять единицу).
Максимальная длина журнала на данный момент 100 строк. Просмотреть последние строки журнала можно командой showjournal.SetJournalLine Строка журнала: перезапись
Синтакс: none uo.SetJournalLine(number,text)
Перезаписывает текст в строке журнала номер number новым текстом text. Получить текст можно командой Journal.Вот еще важная команда, думаю что в ее описании достаточный пример
JournalSerial Обьект связаный со строкой журнала
Синтакс: object uo.JournalSerial(number)
Возвращает сериал обьекта object связаного со строкой журнала номер number. Обычно это обьект, который произнёс
данную строку. Системные сообщения имеют обычно сериал 0x01010101. Для чтения данной строки используется Journal.
Так как функция Injournal возвращает номер строки в журнале +1, то можно воспользоваться например подобной комбинацией: Code:
var name=uo.GetName(uo.JournalSerial(uo.InJournal("хавчик")-1))
if name<>"" then
uo.print(name+", хочешь кушать? :)")
Устаревшие команды .. Так для общего развития
LastMessage Последняя строка журнала
Синтакс: text uo.LastMessage()
Возвращает последнюю строку журнала Injection. Journal(0) возвращает то же что и LastMessage. Предпочтительно
использовать функцию InJournal для проверок в журнале.Journal Строка журнала
Синтакс: text uo.Journal(number)
Возвращает строку журнала Injection номер number. Journal(0) возвращает то же что и LastMessage. Предпочтительно
использовать функцию InJournal для проверок в журнале.Теперь рассмотрим более подробно приемы работы с журналом..
Вот скрипт который делает ключи.
Ждет сообщения сделал - не сделал
Code:
sub Tinker()
UO.CancelMenu()
UO.AutoMenu('Tinkering','Keys')
UO.AutoMenu('Keys','Iron key')
repeat
DeleteJournal("You put")
DeleteJournal("fail")
UO.Usetype(0x1EBC)
repeat
wait(100)
until UO.InJournal("You put") or UO.InJournal("fail")
until UO.Dead()
end sub
Вроде все работает, с максимальной скоростью, только если инструмент разрушится .... Зависнем
Code:
sub Tinker()
var LastTimer
UO.CancelMenu()
UO.AutoMenu('Tinkering','Keys')
UO.AutoMenu('Keys','Iron key')
repeat
if UO.Count(0x1BEF) and UO.Count(0x1EBC) then
DeleteJournal("You put")
DeleteJournal("fail")
DeleteJournal("You broke your tools")
LastTimer=UO.Timer()
UO.Usetype(0x1EBC)
repeat
wait(100)
until UO.InJournal("You put|fail|You broke your tools") or UO.Timer()>LastTimer+50
else
UO.CancelMenu()
return
endif
until UO.Dead()
end sub
Изменения. Скрипт теперь в формате инжи 505.хх Добавлено сообщение инструменту кирдык.
Добавлен таймер для исключения зависания. Проверка возможности крафта и выход из цикла.