Yoko

All sides of Injection
It is currently 2017-11-22 18:28:44

All times are UTC+02:00




Post new topic  Reply to topic  [ 18 posts ] 
Author Message
PostPosted: 2005-07-29 20:02:37 
Offline
User avatar

Joined: 2005-07-10 21:53:05
Posts: 458
Урок 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.хх Добавлено сообщение инструменту кирдык.
Добавлен таймер для исключения зависания. Проверка возможности крафта и выход из цикла.


Top
   
 Post subject:
PostPosted: 2005-07-29 20:52:35 
Offline
Expert!
User avatar

Joined: 2005-01-15 19:15:05
Posts: 818
Location: Dragon World
Вполне сносно написал, мне понравилось. Молодец.


Top
   
 Post subject:
PostPosted: 2005-08-25 09:57:40 
Offline
User avatar

Joined: 2004-12-30 12:43:07
Posts: 5
еще бы кто первые уроки показал, как скрипты запустить с инжекта или выполнить простейшие команды, буду очень признателен


Top
   
 Post subject:
PostPosted: 2005-08-25 11:25:56 
Offline
Expert!
User avatar

Joined: 2005-01-15 19:15:05
Posts: 818
Location: Dragon World
В этом разделе есть такое.


Top
   
 Post subject:
PostPosted: 2005-09-18 15:18:15 
Offline
User avatar

Joined: 2005-01-14 20:05:16
Posts: 56
А почему пропущен урок 4? Когда он появиться?


Top
   
 Post subject:
PostPosted: 2005-10-01 12:31:36 
Offline

Joined: 2005-09-04 15:14:21
Posts: 8
Задам этот вопрос в этом топике.

Захотел я написать скрипт, который будет копать и когда будет выкапывать (Iron, Rusty, Copper), то будет сразу их выбрасывать на землю. И я столкнулся с большой проблемой - как обозначить руду, ведь он с одинаковой графикой каждая!
Попытался через цвет - не получилось!

Может я ошибаюсь? Помогите

VAR Iron = '?'
VAR Rusty = '?'
VAR Copper = '?'


Top
   
 Post subject:
PostPosted: 2005-10-01 13:48:00 
Offline
Expert!
User avatar

Joined: 2004-08-11 23:56:17
Posts: 768
Location: The Citadel
Должно получаться через цвет.
uo.findtype( 'type', 'color' )


Top
   
 Post subject:
PostPosted: 2005-10-01 17:43:46 
Offline

Joined: 2005-09-04 15:14:21
Posts: 8
ЧУДЕСА!!! Получилось!
:D Спасибо вам!


Жду 4 урок!!!!


Top
   
 Post subject:
PostPosted: 2006-02-04 15:42:15 
Offline
User avatar

Joined: 2005-08-08 14:02:17
Posts: 12
когда будут ещё уроки то? :( я уже заждался нафиг :( даёш народу ещё уроков???


Top
   
 Post subject:
PostPosted: 2006-02-04 18:14:31 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3211
Ner-Zul wrote:
когда будут ещё уроки то? :( я уже заждался нафиг :( даёш народу ещё уроков???

А чего Вам не ясно? Скажите тему - опишем.


Top
   
 Post subject:
PostPosted: 2006-02-04 20:03:40 
Offline
User avatar

Joined: 2005-08-08 14:02:17
Posts: 12
в каком то из первых уроков был список тем и уроков которые вы хотели написать :) вот плиз всё по этому списку :)


Top
   
 Post subject:
PostPosted: 2006-02-07 18:42:49 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2545
Location: Saint-Petersburg
По причинам, от меня не зависящим, отсутствовал в инете семь месяцев. Вернулся, но Уроки врядли в ближ время буду писать.


Top
   
 Post subject:
PostPosted: 2006-02-08 13:36:27 
Offline
User avatar

Joined: 2005-08-08 14:02:17
Posts: 12
кто ж как не ты? :( ну вот остались мы без уроков :(


Top
   
 Post subject:
PostPosted: 2006-02-08 14:49:57 
Offline

Joined: 2006-02-06 01:28:40
Posts: 2
очень жаль :cry:


Top
   
 Post subject:
PostPosted: 2006-02-08 20:01:18 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2545
Location: Saint-Petersburg
Ner-Zul wrote:
кто ж как не ты? :( ну вот остались мы без уроков :(


Я не говорю, что не буду их писать вообще. Я говорю, что не буду их писать в ближ. время. Ближ. время - это месяца два, максимум три. Потом все равно снова начну играть, ну и на уроки время найдется.


Top
   
 Post subject:
PostPosted: 2006-02-08 21:40:01 
Offline
User avatar

Joined: 2005-08-08 14:02:17
Posts: 12
как же это долго :(


Top
   
PostPosted: 2016-10-23 13:06:29 
Offline

Joined: 2006-03-27 00:03:20
Posts: 19
Подскажите по работе с журналом. Вот так выглядит скрипт:
Quote:
sub kopat()
var where_x,where_y,coords,i,Pickaxe
InfoLogs()
UO.DeleteJournal()
where_x=uo.getx()
where_y=uo.gety()
for i=-2 to 2
uo.findtype('0x0E85')
Pickaxe=uo.getserial("finditem")
if not uo.objatlayer('Rhand') then
uo.equip('Rhand', Pickaxe)
wait(100)
end if
uo.print("Òàéë "+str(i+3)+"/5")
coords="waittargettile "+" 1343 "+str(where_x)+" "+str(where_y+i)+" 0"
uo.exec(coords)
uo.deletejournal()
uo.useobject(Pickaxe) # Çäåñü ïðîïèñûâàåì òèï êèðêè
if uo.injournal("tools") then
wait (500)
next
end if
while (not (UO.InJournal("stop mining") or UO.InJournal("far") or UO.InJournal("must")))
wait(500)
wend
uo.unequip('Rhand')
wait(100)
next
end sub


Но по пещере ходит чар, и кричит все ключевые слова. в связи с этим эффективность скрипта падает в разы. Можно ли каким либо образом указать, цвет сообщения, или указать, что это системные?

Заранее спасибо!


Top
   
PostPosted: 2016-10-23 18:34:41 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2754
Location: Иваново
Да это старый прикол, постоянно так тролили нубоботов :roll:
Тебе нужны 2 команды.

Простой скрипт для примера - по нему конструкция станет ясна я думаю.


Code:
sub main()
   var text = uo.injournal("Where would you like to fish?")  ; ключевая фраза, через | можно писать сразу несколько сообщений типа "You put|is impossible|in your pack"
   UO.DeleteJournal()
   repeat
      wait(100)
   until text && UO.JournalColor(text) == '0x03B2' && UO.JournalSerial(text-1) == '0xFFFFFFFF' ; проверка сработает только на серое и на системное сообщение
end sub

sub text_info() ; скрипт для сбора информации по последний 10 сообщениям в журнале. Показывает серийник произнесшего, цвет сообщения и само сообщение.
   var i
   uo.textclear()
   for i=10 to 0 step -1
      uo.textprint(uo.JournalSerial(i)+"| "+uo.JournalColor(i)+"| "+uo.Journal(i))
   next
   uo.textopen()
end sub

Если сообщение произнесет кто то даже подменив цвет речи то скрипт все равно определит его серийник отличный от системного и не сработает.
Вариант старый но рабочий. Сейчас в 15 инжекте новые фишки появились но я пользуюсь старой пока что.


PS у фразы *Ктототам is attacking you* серийник атакующего соответственно должно быть UO.JournalSerial(text-1) <> '0xFFFFFFFF'

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 18 posts ] 

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited