Моя борьба с failed при крафте

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Моя борьба с failed при крафте

Post by GAUHAR »

Сталкнулся с такой проблемой: после первого запуска некоторых скриптов на крафт начинаются постоянные failed, при том что стоит динамическая пауза, а перед паузой DeleteJournal. Устанавливал дополничельную паузу, но почему-то инжект упорно игнорировал эти паузы после первого запуска скрипта. Проблема решалась только перезапуском скрипта.
Не думаю что проблема в моих скриптах, так как они принципиально ничем не отличаются от того что пишут другие.
И решил я написать функцию которая устанавливала бы паузу после нескольких подряд идущих fail и вставить ее вызов сразу же после динамической паузы.
И, о чудо, моя проблема разрешилась. Может эта функция еще кому-то поможет, или подскажите мне как боротся с failed другим способом.

Code: Select all

      # Версия 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: Select all

############ 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
Post Reply