Veterinary (Ветеринария)

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Veterinary (Ветеринария)

Post by Edred »

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

Code: Select all

#####################################################################
; Veterinary. v.1.08b (c) Edred
;
sub Veterinar()
; Ставим рядом двух чаров, у каждого по лошади. Рядом с чарами
; сундук. В сундук чистые бинты. Сериалы лошадей каждому в скрипт.
; Стравливаем лошадей (можно использовать скрипт provocat2.sc) и
; качаемся. Внимание! При низком скилле за работой скрипта надо
; следить (одним чаром, вытащив на экран статусы обоих лошадей) и
; периодически садиться на лошадь и отъезжать в сторону, слезать с нее
; и давать обоим чарам вылечить лошадей полностью. После 40-45 скилла
; нужда в этом отпадает (скилл растет быстро).
;
   VAR Sunduk = '0x4048E250'       ; Сериал сундука с бинтами и медом
   VAR Bandag = '0x0E21'          ; Тип бинтов
   VAR BlBandag = '0x0E20'         ; Тип грязных бинтов
   VAR Horse1 = '0x0040F759'      ; Сериал лошади ЭТОГО чара
   VAR fizzle = 'You apply bandages to a horse but fail'
   VAR Success = 'You apply the bandages to a horse'
   VAR mustwait = 'You must wait to use bandages again'
   VAR k
   UO.UseObject( Sunduk )
   wait(1000)
   While UO.SkillVal( 'Veterinary' ) < 1000
      If UO.Count( Bandag ) < 10 Then
         UO.FindType( Bandag, '-1', Sunduk )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', '200' )
            wait(500)
            CheckLag()
         Else
            UO.Print( 'Bandage not found! Script terminated!' )
            return
         Endif
         UO.FindType( BlBandag )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', '0', sunduk )
            wait(500)
            CheckLag()
         Endif
      Endif
      If UO.GetHP( Horse1 ) < UO.GetMaxHP( Horse1 ) Then
         DeleteJournal( fizzle )
         DeleteJournal( success )
         DeleteJournal( mustwait )
         UO.WaitTargetObject( Horse1 )
         UO.UseType( Bandag )
         k = 0
         repeat
            wait(100)
            k = k + 1
         until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
         If UO.InJournal( success ) Then
            wait(2500)
         Endif
         If UO.InJournal( mustwait ) Then
            wait(500)
         Endif
         wait(1500)
      Else
         wait(500)
      Endif
   Wend
endsub

sub Provocat2()
;
; Для провокации вам в паке необходим муз.инструмент!
;
   VAR ser1, ser2
   VAR Horse1 = '0x00C8', Horse2 = '0x00E2'
   UO.Set( 'finddistance', '2' )
   UO.FindType( Horse1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( Horse2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Horse 1 not found!' )
         return
      Endif
   Endif
   ser1 = UO.GetSerial( 'finditem' )
   UO.Print( ser1 )
   UO.Ignore( 'finditem' )
   UO.FindType( Horse1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( Horse2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Horse 2 not found!' )
         UO.IgnoreReset()
         return
      Endif
   Endif
   ser2 = UO.GetSerial( 'finditem' )
   UO.Print( ser2 )
   UO.IgnoreReset()
   UO.WaitTargetObject( ser1, ser2 )
   UO.UseSkill( 'Provocation' )
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

ВЕТЕРИНАРИЯ 2

Когда вкачаете скилл до 55-60, имеет смысл перейти на прокачку в одного чара. Я, по крайней мере, перешел и для этого наваял вот такой скриптец:

ЗАМЕЧАНИЕ: В скрипте прописаны только два типа лошадей, так что откорректируйте под те, что вам нужны.

Code: Select all

#####################################################################
; Veterinar2. v.1.03 (c) Edred
;
; Ставим две лошади напротив друг друга, кладем в сундук рядом с чаром
; чистые бинты, мед. Натравливаем при помощи провокации одну лошадь на
; другую и запускаем скрипт. Скрипт контролирует здоровье обеих лошадей
; и, если необходимо, подлечивает их с бинтов. Бинты он берет из сундука
; и туда же скидывает грязные. Скрипт с подкормкой чара и прокачкой
; спирит спик. Скрипт сам определяет сериалы лошадей и сам их провоцирует
; на атаку (если у вас не прокачан скилл Провокация, отключите этот блок -
; он отмечен в коде). Для провоцирования вы должны иметь муз. инструмент
; в паке.
;
sub veterinar2()
   VAR Sunduk = '0x4048E250'       ; Сериал сундука с бинтами и медом
   VAR Bandag = '0x0E21'          ; Тип бинтов
   VAR BlBandag = '0x0E20'         ; Тип грязных бинтов
   VAR Horse1, Horse2, k
   VAR HorTyp1 = '0x00C8', HorTyp2 = '0x00E2'
   VAR fizzle = 'You apply bandages to a horse but fail'
   VAR Success = 'You apply the bandages to a horse'
   VAR mustwait = 'You must wait to use bandages again'
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   VAR SpiritTime = UO.Timer()
   UO.UseObject( Sunduk )
   wait(1000)
   ### Блок определения сериалов лошадей
   UO.Set( 'finddistance', '2' )
   UO.FindType( HorTyp1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( HorTyp2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Horse 1 not found!' )
         return
      Endif
   Endif
   Horse1 = UO.GetSerial( 'finditem' )
   UO.Print( Horse1 )
   UO.Ignore( 'finditem' )
   UO.FindType( HorTyp1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( HorTyp2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Horse 2 not found!' )
         UO.IgnoreReset()
         return
      Endif
   Endif
   Horse2 = UO.GetSerial( 'finditem' )
   UO.Print( Horse2 )
   UO.IgnoreReset()
   ### Блок провоцирования одной лошади на другую. Без ретрейнов - у меня ГМ.
   UO.WaitTargetObject( Horse1, Horse2 )
   UO.UseSkill( 'Provocation' )
   wait(1000)
   ### Блок прокачки
   While UO.SkillVal( 'Veterinary' ) < 1000
      If UO.Count( Bandag ) < 10 Then
         UO.FindType( Bandag, '-1', Sunduk )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', '200' )
            wait(500)
            CheckLag()
         Else
            UO.Print( 'Bandage not found! Script terminated!' )
            return
         Endif
         UO.FindType( BlBandag )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', '0', sunduk )
            wait(500)
            CheckLag()
         Endif
      Endif
      EatChar( Sunduk, 2, 1, 60 )
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Endif
      If ( UO.GetHP( Horse1 ) < UO.GetMaxHP( Horse1 ) ) OR ( UO.GetHP( Horse2 ) < UO.GetMaxHP( Horse2 ) ) Then
         # Здесь я решил организовать так: чар лечит сначала ту лошадь, здоровья у которой меньше. Естественно,
         # если одна из лошадей здорова - то у второй меньше здоровья, иначе бы мы в If не вошли.
         If UO.GetHP( Horse1 ) < UO.GetHP( Horse2 ) Then
            ; лечим первую лошадь
            DeleteJournal( fizzle )
            DeleteJournal( success )
            DeleteJournal( mustwait )
            UO.Print( 'Veterinary!' )
            UO.WaitTargetObject( Horse1 )
            UO.UseType( Bandag )
            k = 0
            repeat
               wait(100)
               k = k + 1
            until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
            If UO.InJournal( success ) Then
               wait(2500)
            Endif
            If UO.InJournal( mustwait ) Then
               wait(500)
            Endif
            wait(1500)
         Endif
         If UO.GetHP( Horse1 ) > = UO.GetHP( Horse2 ) Then
            ; лечим вторую лошадь
            DeleteJournal( fizzle )
            DeleteJournal( success )
            DeleteJournal( mustwait )
            UO.Print( 'Veterinary!' )
            UO.WaitTargetObject( Horse2 )
            UO.UseType( Bandag )
            k = 0
            repeat
               wait(100)
               k = k + 1
            until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
            If UO.InJournal( success ) Then
               wait(2500)
            Endif
            If UO.InJournal( mustwait ) Then
               wait(500)
            Endif
            wait(1500)
         Endif
      Else
         wait(300)
      Endif
   Wend
endsub


Функции:

Code: Select all

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную
; TimeProcess.
;
; ver. 1.07 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
   ; сообщения при кормежке
   UO.Print( 'TEST: eat to ' + str( Nom ) + ' message and ' + str( Add ) + ' more each ' + str( TimeWait ) + ' minutes' )
   DIM Eat[8]
   Eat[0] = ''
   Eat[1] = 'You eat the food, but are still extremely hungry'
   Eat[2] = 'After eating the food, you fell much less hungry'
   Eat[3] = 'You eat the food, and begin to feel more satiated'
   Eat[4] = 'You are nearly stuffed, but manage to eat the food'
   Eat[5] = 'You fell quite full after consuming the food'
   Eat[6] = 'You are stuffed!'
   Eat[7] = 'You are simply too full to eat any more!'
   VAR Med = '0x09EC'         ; тип меда для подкормки
   VAR i, EatC, j, k, flag
   ; проверим, пора ли кормиться
   i = Val( UO.GetGlobal( 'TimeProcess' ) )
   i = ( UO.Timer() - i ) / 600
   If i < TimeWait Then
      ; рано кормиться
      UO.Print( 'Eat early! ' + str( i ) + ' from ' + str( TimeWait ) )
      return
   Endif
   If Nom > 0 AND Nom < 8 Then
      EatC = Eat[Nom]
   Else
      EatC = Eat[7]
   Endif
   UO.FindType( Med, '-1', Sunduk )
   If UO.FindCount() == 0 Then
      ; мед кончился
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
      return
   Endif
   UO.Grab( '60', 'finditem' )
   Wait( 1000 )
   CheckLag()
   For k = 1 To 7
      DeleteJournal( Eat[k] )
   Next
   flag = 0
   If Nom < 7 Then
      UO.UseType( Med )
      Wait( 1000 )
      CheckLag()
      For k = Nom + 1 To 7
         If UO.InJournal( Eat[k] ) Then
            flag = 1
         Endif
      Next
   Endif
   If flag == 0 Then
      repeat
         DeleteJournal( EatC )
         UO.UseType( Med )
         Wait( 1000 )
         CheckLag()
      until NOT UO.InJournal( EatC )
      If Add > 0 Then
         For j = 1 To Add
            UO.UseType( Med )
            Wait( 1000 )
            CheckLag()
         Next
      Endif
   Endif
   ; хватит кормиться
   ; выгрузим остатки меда обратно
   UO.Findtype( Med, '-1', 'backpack' )
   UO.MoveItem( 'finditem', 0, Sunduk )
   Wait( 1000 )
   CheckLag()
   ; Сбросим счетчик
   UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
endsub

#####################################################################
Sub CheckLag()
   DeleteJournal( 'backpack' )
   UO.Click( 'backpack' )
   repeat
      wait(100)
   until UO.InJournal( 'backpack' )
   return
end sub

#####################################################################
Sub DeleteJournal( string1 )
   VAR nom = UO.InJournal( string1 )
   If nom > 0 Then
      UO.SetJournalLine( Nom - 1, 'string replaced' )
      DeleteJournal( string1 )
   Endif
endsub

#####################################################################
; Spirit Speak v.1.00b (c) Edred
;
; Разовая прокачка спирит спика. Предназначена для вызова из других скриптов.
;
sub SpSpeak()
   VAR mod = UO.WarMode(), num
   VAR fizzle = 'You fail your attempt'
   VAR success = 'You establish a connection'
   UO.WarMode( 0 )
   DeleteJournal( success )
   repeat
      DeleteJournal( fizzle )
      UO.UseSkill( 'Spirit Speak' )
      num = 1
      repeat
         wait(100)
         num = num + 1
      until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR num > 600
   until UO.InJournal( success )
   UO.WarMode( mod )
endsub



Enjoy! :wink:
Last edited by Edred on 2005-01-30 01:22:34, edited 2 times in total.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Можете отправлять в раздел Scripts! - Ветеринарию на этих скриптах успешно вкачал до ГМа.
Post Reply