Page 1 of 1

Проблема со скриптом на БС

Posted: 2006-09-06 08:31:45
by 31337Ghost
Вот, собственно, чуть изменённый моими кривыми ручками скрипт :

Code: Select all

sub Blacksmithing() 
var Exit=0, LastTimer 
var food= '0x097B'
var Timer=UO.Timer()

while Exit<>1
 
ToHide()

if UO.Timer()>(Timer+1200) then 
repeat     
CheckLag() 
uo.UseType(food) 
while not uo.InJournal('full') and not uo.InJournal('stuffed') and not uo.InJournal('hungry') and not uo.InJournal('satiated') and not uo.Dead() 
wait(100)        
wend 
until uo.InJournal('too full') or uo.Dead()
Timer=UO.Timer()
wait(3000)
end if 

uo.FindType('0x1BEF',-1,'backpack') 
if uo.GetQuantity('finditem')<10 then 
uo.FindType('0x1BEF','0x0000','0x401C6058')
wait(1000) 
uo.Grab('200','finditem') 
Endif 
wait(1000) 

uo.DeleteJournal() 
LastTimer=uo.Timer() 
uo.WaitMenu('Blacksmithing','Shield','Shield','buckler') 
uo.UseType('0x1BEF') 
  
while not uo.InJournal('You put') and not uo.InJournal('You have failed') 
wait(500) 
wend 

if uo.InJournal('You have failed') then 
repeat 
wait(100) 
until uo.Timer()>=LastTimer+100 
end if 

uo.FindType('0x1B73',-1,'backpack') 
wait(500) 

if uo.GetQuantity('finditem') then 
uo.WaitTargetObject('finditem') 
uo.UseObject('0x40058A35')
wait(1000)
end if 

wend    
end sub

sub ToHide() 
while not uo.Hidden() 
uo.Useskill('Hiding') 
wait(4000) 
wend 

Трабл состоит в том, что скрипт иногда тупо застревает и не делает ничего, пытался выяснить в каком месте он ступорится - так ничего и не понял... Может где неадо чеклаг или вейт по-больше прописать?

Posted: 2006-09-06 09:09:24
by Edred
Навскидку: в динамические паузы на ожидание сообщения нужно ввести еще ограничение по времени. То есть сюда:

Code: Select all

while not uo.InJournal('full') and not uo.InJournal('stuffed') and not uo.InJournal('hungry') and not uo.InJournal('satiated') and not uo.Dead() 
wait(100)        
wend 
и сюда:

Code: Select all

until uo.InJournal('too full') or uo.Dead()
и сюда:

Code: Select all

while not uo.InJournal('You put') and not uo.InJournal('You have failed') 
wait(500) 
wend 
Организовать просто (можешь посмотреть в моих скриптах). Введи переменную, обнули ее перед циклом ожидания сообщения, а внутри цикла наращивай ее. Ну и в проверку окончания цикла добавь чтобы эта переменная не была больше чего-либо. Это зависит от того, насколько долго то или иное действие у вас на шарде (максимальное время). Скажем, максимум за 3 минуты любая же вещь скрафтится? Значит, такого времени с избытком хватит. Так что если скрипт по какой-либо причине не поймал мессагу, то он не будет тупо висеть в ожидании этой мессаги.

Причем у тебя там где-то еще осталась подобная проверка через lasttimer. Но она не там, где надо.

Второе: После граба и ожидания 1000 мс (это ожидание лучше перенести в if, почему оно снаружи), надо добавить чеклаг.

Третье: граб желательно сделать циклом с проверкой на то, что что-то перемещено. Посмотри, если скрипт у тебя "тупо застревает" при том, что ингов в паке нету - то тогда все понятно. Просто граб из-за лага или сэйва мира не прошел, а дальше у тебя скрипт пытается крафтить, ты получаешь мессагу, что не из чего, но такая мессага у тебя отсутствует - вот скрипт стоит и ждет непонятно чего.

Дерзай. А "кривые ручки" лечатся практикой. У всех вначале были кривые.

Posted: 2006-09-07 09:02:09
by 31337Ghost
Ужасть, все-равно какие-то ужасы... виснет, блин.. сволочь.. даж не оставить скрипт без пресмотра.. может выложите отредакченый, а-то фто-то никак у меня мозги не домысливают до-конца чего и где править... =( а шард у нас дрв

Posted: 2006-09-08 18:18:52
by Edred
Кидай исправленный. Отлови висы на чем происходят и кидай сюда.

ЗЫ: На ДРВ не играл и не буду.