Сталкнулся с такой проблемой: после первого запуска некоторых скриптов на крафт начинаются постоянные failed, при том что стоит динамическая пауза, а перед паузой DeleteJournal. Устанавливал дополничельную паузу, но почему-то инжект упорно игнорировал эти паузы после первого запуска скрипта. Проблема решалась только перезапуском скрипта.
Не думаю что проблема в моих скриптах, так как они принципиально ничем не отличаются от того что пишут другие.
И решил я написать функцию которая устанавливала бы паузу после нескольких подряд идущих fail и вставить ее вызов сразу же после динамической паузы.
И, о чудо, моя проблема разрешилась. Может эта функция еще кому-то поможет, или подскажите мне как боротся с failed другим способом.
Code:
# Версия YokoInjection: 505.18 VeNdOr
# Автор: GAUHAR
SUB InterruptFizzles(fraza,pause)
# ПрерватьЗафизливание('текст',число)
# fraza - сообщение которое постояно выскакивает при беспрерывно
# идущих физзлах. Пример такого сообщения:
# ИмяИгровогоПерсонажа: You fail to create the item.
# В переменной можно указывать часть сообщения или слова
# (например: 'fail' или 'You fa')
# pause - пауза в миллисекундах, необходимая для завершения действия,
# чтобы прервать физзлы.
VAR i
VAR flag = 0 # Флаг для физзлов.
VAR text = UO.Journal(0)
VAR MaxCounterFizzles = 5 # Устанавливаем максимальное количество
# подряд идущих физзлов после которых
# делается пауза (можно изменять).
VAR CounterFizzles = 0 # Счетчик физзлов.
CounterFizzles = CounterFizzles + val(UO.GetGlobal('Cycl'))
# Ищим часть сообщения в последнем сообщении.
for i = 0 to len(text)
# Почему здесь len(text), а не ( len(text) - len(fraza) - 1 ),
# потому что если UO.Journal(0) в журнале нет, то цикл FOR...NEXT
# будет от i=0 до -x и тогда произойдет зацикливание, а потом и
# вылет инжи с клиентом.
if mid(text,i,len(fraza)) == fraza then
flag = 1 # Найден физзл.
i = len(text)
endif
next
# Считаем количество идущих подряд физзлов, если физзла не было,
# то счетчик обнуляется.
if flag == 1 then
CounterFizzles = CounterFizzles + 1
UO.SetGlobal('Fizzles',CounterFizzles)
else
UO.SetGlobal('Fizzles',0)
endif
# Если счетчик физзлов достиг максимума делаем паузу.
if val(UO.GetGlobal('Fizzles')) >= MaxCounterFizzles then
UO.Print("-= Пауза " + str(pause/1000) + " cек. =-")
wait(pause)
UO.SetGlobal('Fizzles',0)
UO.Print("-= Пауза закончилась =-")
endif
endsub
Если кому захочется протестить функцию, то:
Code:
############ FIZZLE, FAIL, etc. ############
# Для теста функции InterruptFizzles бросить в бекпак персонажа
# немного инготов и инструмент тинкера.
# Будем пытаться делать бутылки. А так как крафт не будет полностью
# завершаться, то будут идти постоянные failed.
sub TEST()
while 1 == 1
if UO.WaitingMenu() then
UO.CancelMenu()
endif
UO.DeleteJournal()
UO.WaitMenu('Tinkering','Tools','Tools','empty bottle')
UO.UseType('0x1EBC')
# Небольшой wait и пропущенная динамическая пауза сделаны специально.
wait(1000)
InterruptFizzles('fail',6000)
wend
endsub