CheckLag()

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Hairyness
Posts: 29
Joined: 2006-02-08 05:50:40
Location: third planet from sun
Contact:

CheckLag()

Post by Hairyness »

Как используется данная процедура, и для чего? У меня после каждого сейва слетает тинкер на браслеты....Попытался впихнуть туда CheckLag()...но так и не понял как это делается...во всех случаях скрипт делал функцию и останавливался на этом...а как ее правильно использовать? Расскажите пжалста
Image
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Использование процедуры checklag() гарантирует, что после её вызова Injection получит все данные которые должен был отправить сервер до вызова этой процедуры.

На примере простейшего скрипта:

Code: Select all

sub eatChar()
uo.usetype( 'food' )
uo.print( 'Персонаж покушал' )
endsub


Запускаем, смотрим - сначала в журнале появляется сообщение от инжекта, что персонаж покушал, а затем сообщение от сервера, что был использован предмет.

Ставим checklag:

Code: Select all

sub eatChar()
uo.usetype( 'food' )
checklag()
uo.print( 'Персонаж покушал' )
endsub

Запускаем, смотрим журнал - сначала в журнале появляется сообщение от сервера, что был использован предмет, затем в журнале появляется название сумки персонажа (обычно Backpack или backpack, чтобы не было проблем с регистром - в функции checklag лучше при поиске в журнале использовать без первой буквы) и только затем сообщение "Персонаж покушал".

Собственно говоря, стоит отметить тот факт, что в некоторых ситуациях при неправильной работе с журналом функция checklag() может приводить к непредсказуемым последствиям. Да и вообще, я бы на месте администратора, который решил бороться с Injection - весьма сомнительно относился к игрокам, который делают клац на бекпак каждые 5 секунд -) За сим на примере того же скрипта, я бы использовал следущую конструкцию:

Code: Select all

sub eatChar()
var msg = "eat was be used"; // сообщение от сервера, что персонаж покушал
deljournal( msg )
uo.usetype( 'food' )
repeat
    wait( 100 )
until uo.injournal( msg )
uo.print( 'Персонаж покушал' )
endsub

Логика простая:
1. Удалим из журнала Injection сообщение о том, что персонаж покушал.
2. Используем еду.
3. Ждём пока в журнале появится сообщение о том, что персонаж покушал.

В этом случае, к слову - ещё и трафика используется эдак на два пакета меньше -) Но это не суть принципиально.

К вопросу о том, зачем чистить журнал и почему не использовать uo.deletejournal:
1. При использовании uo.deletejournal - мы удаляем все записи из журнала Injection, что может привести к некорректной работе других запущенных скриптов.
2. Казалось бы можно вообще не чистить журнал и использовать uo.lastmessage() - но это заблуждение. Пока скрипт ждёт положенные wait(100), дабы не подвесить компьютер - вполне может придти не одно сообщение, а несколько и нужное можно упустить.

Раз уж я завёл речь про работу с журналом, стоит заметить - не все игроки любят и уважают игроков стоящих (а тем более ходящих) на макросе. И конструкция приведённая в последнем примере будет не стабильной, если кто-нибудь будет флудить ключевым словом. Тоже самое касается, к слову, и функции checklag(). По этому лучше проверять не только наличие сообщения но и того, кто нам его послал, а обидчиков записывать в файлик, дабы потом отомстить -)

Ммм.. я на все вопросы ответил ?)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Hairyness
Posts: 29
Joined: 2006-02-08 05:50:40
Location: third planet from sun
Contact:

Post by Hairyness »

Понятно, но почему скрипт не идет дальше, после вызова CheckLag()? Ставлю так:

Code: Select all

sub tinker()
   repeat
      wait(250)
      UO.DeleteJournal()
      LastTimer=UO.Timer()
      uo.findtype('0x1EBC')
      UO.WaitMenu('Tinkering','Jewelry','Jewelry','necklace')
      UO.UseType('0x1EBC')
      while NOT UO.InJournal("You put") AND NOT UO.InJournal("Tinkering failed")
         wait(250)
         CheckLag()
      wend

без процедуры CheckLag() работает на ура, но при сэйве сбивается, а с CheckLag() делает 1 неклас, делает чеклаг и все...непонимаю...
Image
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Я вам отступы немного проставил.. В следущий раз перед постингом пользуйтесь ссылкой в моей подписи - ваш код ещё читать нужно..

Касательно вопроса - покажите код функции CheckLag, я же не знаю, что у вас там такое понаписано..
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Hairyness
Posts: 29
Joined: 2006-02-08 05:50:40
Location: third planet from sun
Contact:

Post by Hairyness »

Code: Select all

sub CheckLag()
   UO.DeleteJournal()
   UO.Click('backpack')
   repeat
      wait(100)
   until UO.InJournal('Backpack')
end sub
Image
Millerbeer
Posts: 247
Joined: 2008-09-12 05:07:34

Post by Millerbeer »

Если это весь скрипт, то к команде Repeat должна быть закрывающая цикл команда Until с условием, а если не весь, то проблема, скорее всего, в остутствующем куске скрипта, т.к. в твоём скрипте чеклаг там ненужен, потому что скрипт и так ждёт от сервера нужные сообщения.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Millerbeer wrote:Если это весь скрипт, то к команде Repeat должна быть закрывающая цикл команда Until с условием, а если не весь, то проблема, скорее всего, в остутствующем куске скрипта, т.к. в твоём скрипте чеклаг там ненужен, потому что скрипт и так ждёт от сервера нужные сообщения.

Дело не в том, что не нужен, а в том, что циклиться ;-) А то, что скрипт не весь - более чем очевидно -)

Hairyness, ну дык попробуй почитать код ?

Code: Select all

цикл: если в журнале нет нужного сообщения
ждём 1/4 секунды
удаляем всё (!) нафиг из журнала
жмём на бекпак
ждём пока сервер отзавётся
переход к началу цикла


Нигде подвоха не видишь?.. Например ситуация может развиваться так:
Ждём 1/4 секунды, за это время получаем нужное сообщение, потом удаляем всё(!) нафих из журнала и..

Перечитайте мой второй пост в теме - я там дал все ответы!
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Hairyness
Posts: 29
Joined: 2006-02-08 05:50:40
Location: third planet from sun
Contact:

Post by Hairyness »

Я хотел сделать так:

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

Скрипт не весь, но я привел только интересующую меня часть, все остальное я вполне могу разобрать сам и никаких ошибок там нет...

Как я понимаю чеклаг должен заставлять ждать ответа от нажатия на сумку, и как ответ получен переходить дальше, в данном случае на крафт очередного ожерелья, но после получения ответа скрипт перестает работать совершенно... а вот почему мне не совсем понятно...
Image
Millerbeer
Posts: 247
Joined: 2008-09-12 05:07:34

Post by Millerbeer »

Дружище, я бы не был так уверен в безошибочности остальной части скрипта. Как раз таки здесь, насколько я вижу, ошибок и нет, и чеклаг тут нах ненужен. Во первых, меню тинкера открывает клиент, а не сервер, так что если это происходит во время сейва, ничего страшного, затем скрипт ждёт ответа от сервера You put или Tinkering failed, во время сейва ответа небудет, так что скрипт благополучно сейв переживёт.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Hairyness wrote:Как я понимаю чеклаг должен заставлять ждать ответа от нажатия на сумку, и как ответ получен переходить дальше, в данном случае на крафт очередного ожерелья, но после получения ответа скрипт перестает работать совершенно... а вот почему мне не совсем понятно...

Я сейчас передумаю быть "не админом" и поставлю тебе в подпись "йа стенко".

Тебе нужен ответ ? - Потрудись и прочитай его. Я тебе дал более чем подробный ответ.
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Post Reply