CheckLag()
Moderators: Murderator+, Murderator
CheckLag()
Как используется данная процедура, и для чего? У меня после каждого сейва слетает тинкер на браслеты....Попытался впихнуть туда CheckLag()...но так и не понял как это делается...во всех случаях скрипт делал функцию и останавливался на этом...а как ее правильно использовать? Расскажите пжалста

-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
Использование процедуры checklag() гарантирует, что после её вызова Injection получит все данные которые должен был отправить сервер до вызова этой процедуры.
На примере простейшего скрипта:
Запускаем, смотрим - сначала в журнале появляется сообщение от инжекта, что персонаж покушал, а затем сообщение от сервера, что был использован предмет.
Ставим checklag:
Запускаем, смотрим журнал - сначала в журнале появляется сообщение от сервера, что был использован предмет, затем в журнале появляется название сумки персонажа (обычно Backpack или backpack, чтобы не было проблем с регистром - в функции checklag лучше при поиске в журнале использовать без первой буквы) и только затем сообщение "Персонаж покушал".
Собственно говоря, стоит отметить тот факт, что в некоторых ситуациях при неправильной работе с журналом функция checklag() может приводить к непредсказуемым последствиям. Да и вообще, я бы на месте администратора, который решил бороться с Injection - весьма сомнительно относился к игрокам, который делают клац на бекпак каждые 5 секунд -) За сим на примере того же скрипта, я бы использовал следущую конструкцию:
Логика простая:
1. Удалим из журнала Injection сообщение о том, что персонаж покушал.
2. Используем еду.
3. Ждём пока в журнале появится сообщение о том, что персонаж покушал.
В этом случае, к слову - ещё и трафика используется эдак на два пакета меньше -) Но это не суть принципиально.
К вопросу о том, зачем чистить журнал и почему не использовать uo.deletejournal:
1. При использовании uo.deletejournal - мы удаляем все записи из журнала Injection, что может привести к некорректной работе других запущенных скриптов.
2. Казалось бы можно вообще не чистить журнал и использовать uo.lastmessage() - но это заблуждение. Пока скрипт ждёт положенные wait(100), дабы не подвесить компьютер - вполне может придти не одно сообщение, а несколько и нужное можно упустить.
Раз уж я завёл речь про работу с журналом, стоит заметить - не все игроки любят и уважают игроков стоящих (а тем более ходящих) на макросе. И конструкция приведённая в последнем примере будет не стабильной, если кто-нибудь будет флудить ключевым словом. Тоже самое касается, к слову, и функции checklag(). По этому лучше проверять не только наличие сообщения но и того, кто нам его послал, а обидчиков записывать в файлик, дабы потом отомстить -)
Ммм.. я на все вопросы ответил ?)
На примере простейшего скрипта:
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
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
Понятно, но почему скрипт не идет дальше, после вызова CheckLag()? Ставлю так:
без процедуры CheckLag() работает на ура, но при сэйве сбивается, а с CheckLag() делает 1 неклас, делает чеклаг и все...непонимаю...
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 неклас, делает чеклаг и все...непонимаю...

-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
Я вам отступы немного проставил.. В следущий раз перед постингом пользуйтесь ссылкой в моей подписи - ваш код ещё читать нужно..
Касательно вопроса - покажите код функции CheckLag, я же не знаю, что у вас там такое понаписано..
Касательно вопроса - покажите код функции 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
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
Code: Select all
sub CheckLag()
UO.DeleteJournal()
UO.Click('backpack')
repeat
wait(100)
until UO.InJournal('Backpack')
end sub

-
- Posts: 247
- Joined: 2008-09-12 05:07:34
-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
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
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
Я хотел сделать так:
вставить чеклаг, чтобы проверить ответ сервера (сейв или нет, если сейв, чтобы ждал его конца, а потом открывал меню крафта), иначе он тупо тыкает все время пока идет сейв на тинкер тулс и ждет открытия меню крафта...после сейва вся эта ботва открывается и скрипт слетает...и начинает вечно ждать сообщения об удачной или неудачной попытке изготовления, которая никогда не происходит...вот чего я хотел добится..
Скрипт не весь, но я привел только интересующую меня часть, все остальное я вполне могу разобрать сам и никаких ошибок там нет...
Как я понимаю чеклаг должен заставлять ждать ответа от нажатия на сумку, и как ответ получен переходить дальше, в данном случае на крафт очередного ожерелья, но после получения ответа скрипт перестает работать совершенно... а вот почему мне не совсем понятно...
вставить чеклаг, чтобы проверить ответ сервера (сейв или нет, если сейв, чтобы ждал его конца, а потом открывал меню крафта), иначе он тупо тыкает все время пока идет сейв на тинкер тулс и ждет открытия меню крафта...после сейва вся эта ботва открывается и скрипт слетает...и начинает вечно ждать сообщения об удачной или неудачной попытке изготовления, которая никогда не происходит...вот чего я хотел добится..
Скрипт не весь, но я привел только интересующую меня часть, все остальное я вполне могу разобрать сам и никаких ошибок там нет...
Как я понимаю чеклаг должен заставлять ждать ответа от нажатия на сумку, и как ответ получен переходить дальше, в данном случае на крафт очередного ожерелья, но после получения ответа скрипт перестает работать совершенно... а вот почему мне не совсем понятно...

-
- Posts: 247
- Joined: 2008-09-12 05:07:34
Дружище, я бы не был так уверен в безошибочности остальной части скрипта. Как раз таки здесь, насколько я вижу, ошибок и нет, и чеклаг тут нах ненужен. Во первых, меню тинкера открывает клиент, а не сервер, так что если это происходит во время сейва, ничего страшного, затем скрипт ждёт ответа от сервера You put или Tinkering failed, во время сейва ответа небудет, так что скрипт благополучно сейв переживёт.
-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
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
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