Yoko

All sides of Injection
It is currently 2024-03-29 00:50:51

All times are UTC+02:00




Post new topic  Reply to topic  [ 203 posts ]  Go to page 1 2 3 4 511 Next
Author Message
PostPosted: 2006-03-10 18:20:47 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Хм, начну скидывать ВСЕ свои скрипты :shock:

autoload.sc (чуть-чуть покоцал, выкинул мелочевку)

Code:
#                                                                   #
#   AutoLoad.sc, ver 507.050 (c) Edred                              #
#                                                                   #
#####################################################################

#####################################################################
; ScrollSort v.1.00 (c) Edred
;
; Запоминает все спеллбуки в первом контейнере и потом по очереди драгает
; все скроллы, которые находит в этом же контейнере на все спеллбуки. Если
; спелл не подгружается в спеллбуку - пробует подгрузить в следующую
; спеллбуку и т.д. Если спелл есть уже во всех спеллбуках - скидывает его
; во второй контейнер.
:
sub ScrollSort()
   VAR Spellbk = '0x0EFA', i, j, temptyp, tempob, tempnam
;   DIM Scrolls[64]
;      Scrolls[0]  = ''      ; 1: Clumsy
;      Scrolls[1]  = ''      ; 1: Create Food
;      Scrolls[2]  = ''      ; 1: Feeblemind
;      Scrolls[3]  = '0x1F31'      ; 1: Heal
;      Scrolls[4]  = '0x1F32'      ; 1: Magic Arrow
;      Scrolls[5]  = '0x1F33'      ; 1: Night Sight
;      Scrolls[6]  = ''      ; 1: Reactive Armor
;      Scrolls[7]  = '0x1F34'      ; 1: Weaken
;      Scrolls[8]  = ''      ; 2: Agility
;      Scrolls[9]  = ''      ; 2: Cunning
;      Scrolls[10] = '0x1F37'      ; 2: Cure
;      Scrolls[11] = '0x1F38'      ; 2: Harm
;      Scrolls[12] = '0x1F39'      ; 2: Magic Trap
;      Scrolls[13] = '0x1F3A'      ; 2: Magic Untrap
;      Scrolls[14] = ''      ; 2: Protection
;      Scrolls[15] = ''      ; 2: Strength
;      Scrolls[16] = '0x1F3D'      ; 3: Bless
;      Scrolls[17] = '0x1F3E'      ; 3: Fireball
;      Scrolls[18] = '0x1F3F'      ; 3: Magic Lock
;      Scrolls[19] = '0x1F40'      ; 3: Poison
;      Scrolls[20] = '0x1F41'      ; 3: Telekinesis
;      Scrolls[21] = ''      ; 3: Teleport
;      Scrolls[22] = ''      ; 3: Unlock
;      Scrolls[23] = '0x1F44'      ; 3: Wall of Stone
;      Scrolls[24] = ''      ; 4: Arch Cure
;      Scrolls[25] = ''      ; 4: Arch Protection
;      Scrolls[26] = ''      ; 4: Curse
;      Scrolls[27] = '0x1F48'      ; 4: Fire Field
;      Scrolls[28] = ''      ; 4: Greater Heal
;      Scrolls[29] = ''      ; 4: Lightning
;      Scrolls[30] = ''      ; 4: Mana Drain
;      Scrolls[31] = '0x1F4B'      ; 4: Recall
;      Scrolls[32] = ''      ; 5: Blade Spirit
;      Scrolls[33] = ''      ; 5: Dispel Field
;      Scrolls[34] = '0x1F4F'      ; 5: Incognito
;      Scrolls[35] = ''      ; 5: Magic Reflection
;      Scrolls[36] = ''      ; 5: Mind Blast
;      Scrolls[37] = '0x1F52'      ; 5: Paralyze
;      Scrolls[38] = ''      ; 5: Poison Field
;      Scrolls[39] = '0x1F54'      ; 5: Summon Creature
;      Scrolls[40] = '0x1F55'      ; 6: Dispel
;      Scrolls[41] = ''      ; 6: Energy Bolt
;      Scrolls[42] = '0x1F57'      ; 6: Explosion
;      Scrolls[43] = '0x1F58'      ; 6: Invisibility
;      Scrolls[44] = '0x1F59'      ; 6: Mark
;      Scrolls[45] = '0x1F5A'      ; 6: Mass Curse
;      Scrolls[46] = ''      ; 6: Paralyze Field
;      Scrolls[47] = '0x1F5C'      ; 6: Reveal
;      Scrolls[48] = ''      ; 7: Chain Lightning
;      Scrolls[49] = ''      ; 7: Energy Field
;      Scrolls[50] = '0x1F5F'      ; 7: Flame Strike
;      Scrolls[51] = '0x1F60'      ; 7: Gate Travel
;      Scrolls[52] = '0x1F61'      ; 7: Mana Vampire
;      Scrolls[53] = ''      ; 7: Mass Dispel
;      Scrolls[54] = ''      ; 7: Meteor Swarm
;      Scrolls[55] = ''      ; 7: Polymorph
;      Scrolls[56] = '0x1F65'      ; 8: Earthquake
;      Scrolls[57] = ''      ; 8: Energy Vortex
;      Scrolls[58] = ''      ; 8: Resurrection
;      Scrolls[59] = ''      ; 8: Air Elemental
;      Scrolls[60] = ''      ; 8: Summon Daemon
;      Scrolls[61] = ''      ; 8: Earth Elemental
;      Scrolls[62] = '0x1F6B'      ; 8: Fire Elemental
;      Scrolls[63] = '0x1F6C'      ; 8: Water Elemental
   VAR msg1 = "Can't add this to the spellbook", flag
   DIM Spells[10]
   For i = 0 To 9
      Spells[i] = ''
   Next
   VAR TmpTyp
   UO.Print( 'Select container with scroll for sort' )
   UO.Exec('addobject TmpObj1')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select container for trash scrolls' )
   UO.Exec('addobject TmpObj2')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.IgnoreReset()
   UO.TextOpen()
   UO.TextClear()
   j = 0
   repeat
      UO.FindType( Spellbk, '-1', 'TmpObj1' )
      If UO.FindCount() Then
         Spells[j] = UO.GetSerial( 'finditem' )
         UO.TextPrint( 'Slot number ' + str(j) + ' = ' + Spells[j] )
         UO.Ignore( 'finditem' )
         j = j + 1
      Endif
   until UO.FindCount() == 0 OR j > 9
   j = j - 1
   repeat
      UO.FindType( '-1', '-1', 'TmpObj1' )
      If UO.FindCount() > 0 Then
         If UO.GetGraphic( 'finditem' ) == Spellbk Then
            UO.Ignore( 'finditem' )
         Else
            temptyp = UO.GetGraphic( 'finditem' )
            UO.MoveItem( 'finditem', '1' )
            wait(1000)
            CheckLag()
            UO.FindType( temptyp )
            If UO.FindCount() == 0 Then
               UO.Print( 'Gluki glukami pogonayayut!' )
            Endif
            tempob = UO.GetSerial( 'finditem' )
            UO.Click( 'finditem' )
            wait(500)
            CheckLag()
            tempnam = UO.GetName( 'finditem' )
            flag = 0
            For i = 0 To j
               DeleteJournal( msg1 )
               UO.MoveItem( tempob, '0', Spells[i] )
               wait(2000)
               CheckLag()
               If UO.InJournal( msg1 ) == 0 Then
                  flag = 1
                  UO.TextPrint( tempnam + ' (' + temptyp + ') moved to slot number ' + str(i) )
                  i = j
               Endif
            Next
            If flag == 0 Then
               UO.MoveItem( tempob, '0', 'TmpObj2' )
               UO.TextPrint( tempnam + ' (' + temptyp + ') moved to container 2' )
            Endif
         Endif
      Else
         return
      Endif
   until UO.FindCount() == 0
endsub

#####################################################################
; NeedGo v.1.02 (c) Edred
;
; Запрашивает координаты и отправляет по ним чара (пешком)
;
sub NeedGo()
   VAR s, x, y
   s = UO.asmInputString("Введите через пробел координаты:","")
   If s == '' Then
      UO.Print( 'Invalid coordinates!' )
      return
   Endif
   s = s + ' end '
   x = GetWord( s, 1 )
   y = GetWord( s, 2 )
   GoToTile( val(x), val(y), 1, False )
endsub

#####################################################################
; BegMoney v.1.00 (c) Edred
;
; Скрипт на выпрашивание денег. Слазит с лошади, просит денег у
; ближайшего вендора, садится обратно на лошадь. В случае если
; деньги в паке превысили 699 гп - сообщает, что пора их выгрузить
; в банк. При поиске вендора проверяется глобальная переменная
; LastVendor - если серийник такой же - ищется другой вендор.
;
sub BegMoney()
   VAR VendTyp1 = '0x0191'
   VAR VendTyp2 = '0x0190'
   VAR HorSer = '0x00257883'
   VAR VendSer, k, HSer, flag
   VAR Dengi = '0x0EED'
   VAR dal = 'Here, you can have this'
   VAR poslal = "I'm sorry,"
   VAR daleko = 'is too far away!'
   VAR chasto = 'You must wait to use that skill again.'
   UO.Set( 'finddistance', '5' )
   #### Блок нахождения 1 или 2 вендоров
   UO.Ignore( 'self' )
   UO.FindType( VendTyp1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( VendTyp2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Vendor not found!' )
         UO.IgnoreReset()
         return
      Endif
   Endif
   VendSer = UO.GetSerial( 'finditem' )
   If UO.GetGlobal( 'LastVendor' ) == VendSer Then
      UO.Ignore( 'finditem' )
      UO.FindType( VendTyp1, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.FindType( VendTyp2, '-1', '1' )
         If UO.FindCount() == 0 Then
            UO.Print( 'Vendor not found!' )
            UO.IgnoreReset()
            return
         Endif
      Endif
      VendSer = UO.GetSerial( 'finditem' )
   Endif
   UO.SetGlobal( 'LastVendor', VendSer )
   # Найден
   HSer = UO.ObjAtLayer( 'Horse' )
   If  HSer <> '' Then
      UO.UseObject( 'self' )
   Endif
   flag = 0
   If UO.Count( Dengi ) > 699 Then
      UO.Findtype( Dengi )
      If UO.FindCount() > 0 Then
         UO.Drophere( 'finditem' )
;         wait(500)
         CheckLag()
         flag = 1
      Endif
   Endif
   repeat
      DeleteJournal( dal )
      DeleteJournal( poslal )
      DeleteJournal( daleko )
      DeleteJournal( chasto )
      UO.WaitTargetObject( VendSer )
      UO.UseSkill( 'Begging' )
      k = 0
      repeat
         wait(100)
         k = k + 1
      until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR UO.InJournal( chasto ) OR k > 50
      If UO.InJournal( chasto ) Then
         wait(2000)
      Endif
   until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR k > 50
   If flag == 1 Then
      UO.Findtype( Dengi, '-1', '1' )
      while UO.FindCount() > 0
         UO.Grab( '0', 'finditem' )
         wait(00)
         CheckLag()
         UO.Findtype( Dengi, '-1', '1' )
      Wend
   Endif
   If  HSer <> '' Then
      UO.UseObject( HorSer )
   Endif   
   UO.Print( 'My gold is ' + str( UO.Count( Dengi ) ) )
   UO.IgnoreReset()
endsub

#####################################################################
sub AutoMove()
; Автоматическое перекладывание предметов одного типа и цвета из одного
; контейнера в другой. Поддержка двух режимов - драга на стопку и драга
; на контейнер.
; v.1.04b (c) Edred
   VAR MyPause = 600
   VAR Type1, Color1, s, n, SerStopka, SumCol = 0
   UO.Print( 'Select sending container' )
   UO.Exec('addobject TmpCont1')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select targeting container' )
   UO.Exec('addobject TmpCont2')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select type for move' )
   UO.Exec('addobject TmpObj1')
   While UO.Targeting()
      Wait(100)
   Wend
   Type1 = UO.GetGraphic( 'TmpObj1' )
   Color1 = UO.GetColor( 'TmpObj1' )
   While UO.Targeting()
      Wait(100)
   Wend
   s = ''
   s = UO.asmInputString("Задайте размер порции:","500")
   If s == '' Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   VAR ToDo = UO.asmInputList("Выберите способ:","'Драг в стопку';'Драг на контейнер'")
   SerStopka = UO.GetSerial( 'TmpCont2' )
   n = val( s )
   If n < 0 OR n > 20000 Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   repeat
      If ToDo == 1 Then
         UO.FindType( Type1, Color1, 'TmpCont2' )
         If UO.FindCount() > 0 Then
            SerStopka = UO.GetSerial( 'finditem' )
         Else
            SerStopka = UO.GetSerial( 'TmpCont2' )
         Endif
      Endif
      UO.FindType( Type1, Color1, 'TmpCont1' )
      If UO.FindCount() > 0 Then
         If UO.GetQuantity( 'finditem' ) < n Then
            SumCol = SumCol + UO.GetQuantity( 'finditem' )
         Else
            SumCol = SumCol + n
         Endif
         UO.MoveItem( 'finditem', str(n), SerStopka )
         Wait( MyPause )
         CheckLag()
         UO.Print( 'I moved ' + str(SumCol) + ' items' )
      Else
         UO.Print( 'Automove finished' )
         Return
      Endif
   until False
endsub

#####################################################################
sub AutoMove2()
; Автоматическое перекладывание некучкующихся предметов одного типа и цвета
; из одного контейнера в другой. Осуществляется драг на контейнер.
; v.1.05b (c) Edred
;
   VAR MyPause = 600
   VAR Type1, Color1, s, n, SerStopka, SumCol = 0, Howmany='200'
   UO.Print( 'Select sending container' )
   UO.Exec('addobject TmpCont1')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select targeting container' )
   UO.Exec('addobject TmpCont2')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select type for move' )
   UO.Exec('addobject TmpObj1')
   While UO.Targeting()
      Wait(100)
   Wend
   Type1 = UO.GetGraphic( 'TmpObj1' )
   Color1 = UO.GetColor( 'TmpObj1' )
   While UO.Targeting()
      Wait(100)
   Wend
   Howmany = UO.asmInputString("Сколько всего переложить?",Howmany)
   If Howmany == '' Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   repeat
      UO.FindType( Type1, Color1, 'TmpCont1' )
      If UO.FindCount() > 0 Then
         UO.MoveItem( 'finditem', '0', 'TmpCont2' )
         Wait( MyPause )
         CheckLag()
         SumCol = SumCol + 1
         If SumCol == val(Howmany) Then
            UO.Print( 'Script finished' )
            return
         Endif
      Else
         UO.Print( 'Script finished' )
         return
      Endif
   until False
endsub

#####################################################################
; Флипанье сандстоуновых стен. Автоматический анлок и лок в конце.
; Три варианта задания типа: через переменную, запрос на этот тип и
: прицел на образец (оставлен этот, остальные закомментарены).
; v.1.03b (c) Edred
sub FlipWall()
   DIM typwalls[66]
   typwalls[1] = '0x0158'
   typwalls[2] = '0x0159'
   typwalls[3] = '0x015A'
   typwalls[4] = '0x015B'
   typwalls[5] = '0x015C'
   typwalls[6] = '0x015D'
   typwalls[7] = '0x015E'
   typwalls[8] = '0x015F'
   typwalls[9] = '0x0160'
   typwalls[10] = '0x0161'
   typwalls[11] = '0x0162'
   typwalls[12] = '0x0163'
   typwalls[13] = '0x0164'
   typwalls[14] = '0x0165'
   typwalls[15] = '0x0166'
   typwalls[16] = '0x0167'
   typwalls[17] = '0x0168'
   typwalls[18] = '0x0169'
   typwalls[19] = '0x0160'
   typwalls[20] = '0x016A'
   typwalls[21] = '0x016B'
   typwalls[22] = '0x016C'
   typwalls[23] = '0x016D'
   typwalls[24] = '0x016E'
   typwalls[25] = '0x016F'
   typwalls[26] = '0x0170'
   typwalls[27] = '0x0171'
   typwalls[28] = '0x0172'
   typwalls[29] = '0x0173'
   typwalls[30] = '0x0174'
   typwalls[31] = '0x0175'
   typwalls[32] = '0x0176'
   typwalls[33] = '0x0177'
   typwalls[34] = '0x0178'
   typwalls[35] = '0x0179'
   typwalls[36] = '0x017A'
   typwalls[37] = '0x017B'
   typwalls[38] = '0x017C'
   typwalls[39] = '0x017D'
   typwalls[40] = '0x017E'
   typwalls[41] = '0x017F'
   typwalls[42] = '0x0180'
   typwalls[43] = '0x0181'
   typwalls[44] = '0x0182'
   typwalls[45] = '0x0183'
   typwalls[46] = '0x0184'
   typwalls[47] = '0x0185'
   typwalls[48] = '0x0186'
   typwalls[49] = '0x0187'
   typwalls[50] = '0x0188'
   typwalls[51] = '0x0189'
   typwalls[52] = '0x018A'
   typwalls[53] = '0x018B'
   typwalls[54] = '0x018C'
   typwalls[55] = '0x018D'
   typwalls[56] = '0x018E'
   typwalls[57] = '0x018F'
   typwalls[58] = '0x0190'
   typwalls[59] = '0x0191'
   typwalls[60] = '0x0192'
   typwalls[61] = '0x0193'
   typwalls[62] = '0x0194'
   typwalls[63] = '0x0195'
   typwalls[64] = '0x0196'
   typwalls[65] = '0x01CA'
   VAR i, k, s, j, n
   ##############################################################
   ; Три варианта указания типа стены для верчения (переменная n)
   ; Уберите комментарий с нужной
   ##############################################################
   # I вариант. Явное указание:
;   n = 3
   ##############################################################
   # II вариант. Запрос на ввод номера нужного типа:
;   s = UO.asmInputString("Задайте номер нужного типа:","1")
;   If s == '' Then
;      UO.Print( 'Invalid number of type wall!' )
;      return
;   Endif
;   n = val( s )
;   If n < 1 OR n > 65 Then
;      UO.Print( 'Invalid number of type wall!' )
;      return
;   Endif
   ##############################################################
   # III вариант. Прицел для выбора образца:
   UO.Print( 'Please, click to type of wall' )
   UO.Exec('addobject WTypFlip')
   While UO.Targeting()
      Wait(100)
   Wend
   j = UO.GetGraphic( 'WTypFlip' )
   For k = 1 To 65
      If j == typwalls[k] Then
         n = k
      Endif
   Next
   ##############################################################
   UO.Print( 'Please, click to walls for flip' )
   UO.Exec('addobject WFlip')
   While UO.Targeting()
      Wait(100)
   Wend
   If UO.GetGraphic( 'WFlip' ) <> typwalls[n] Then
      UO.WaitTargetObject( 'WFlip' )
      UO.Msg( 'i wish to unlock this' )
      wait(1000)
      repeat
         UO.WaitTargetObject( 'WFlip' )
         UO.Msg( 'i wish to flip this' )
         wait(1000)
      until UO.GetGraphic( 'WFlip' ) == typwalls[n]
      UO.WaitTargetObject( 'WFlip' )
      UO.Msg( 'i wish to lock this down' )
      wait(1000)
   Endif
endsub

#####################################################################
; Скрипт для подсчета всех объектов в любом
; контейнере. Запращивает прицел на
; контейнер. Потом считает объекты в контейнере и выдает на
; экран результат.
; v.1.00b (c) Edred, based on unknown script
sub CountResource()
   VAR ContSer, last
   UO.Print( "Click target to container" )
   UO.Info( "self" )
   last = UO.GetSerial( "lasttarget" )
   UO.CancelTarget()
   UO.Info()
   while last == UO.GetSerial( "lasttarget" ) AND UO.Targeting()
      wait(100)
   wend
   ContSer = UO.GetSerial( "lasttarget" )
   UO.FindType( -1, -1, ContSer )
   UO.Print( 'I find ' + str( UO.FindCount() ) + ' items' )
endsub

#####################################################################
; FishingAround. v.2.07b (c) Edred
;
; Рыбачим вокруг чара
;
sub FishingAround()
   VAR Ms0 = "You can't see"         ; не можем ловит здесь
   VAR Ms1 = "You can't fish under the ship"   ; не можем ловить здесь
   VAR Ms2 = "You are too far away"      ; далеко
   VAR Ms3 = "There are no fish here"      ; кончилось тут
   VAR Ms4 = "You fish a while, but fail to catch anything"   ; физл
   VAR Ms5 = "You pull out"         ; поймал что-то
   VAR Ms6 = "Try fishing in water."      ; не можем ловить здесь
   VAR k, t, v, x, y
   VAR MaxTime = 800
   For y = -4 To 4
      For x = -4 To 4
         k = 0
         repeat
            If UO.Dead() Then
               return
            Endif
            DeleteJournal(ms0)
            DeleteJournal(ms1)
            DeleteJournal(ms2)
            DeleteJournal(ms3)
            DeleteJournal(ms4)
            DeleteJournal(ms5)
            DeleteJournal(ms6)
            t = UO.Timer()
            If UO.Waiting() Then
               UO.CancelTarget()
            Endif
            UO.WaitTargetTile( '0', STR( UO.GetX() + x ), STR( UO.GetY() + y ), '251')
            UO.UseObject( UO.GetSerial( UO.ObjAtLayer( 'Lhand' ) ) )
            repeat
               wait(100)
            until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR ((t + MaxTime) < UO.Timer())
            k = k + 1
            If UO.InJournal(ms5) Then
               k = 0
            Endif
            If UO.Dead() Then
               return
            Endif
            If UO.InJournal( ms5 ) Then
               GetResultFish()
            Endif
         until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR (k > 6)
         If UO.Dead() Then
            return
         Endif
      Next
   Next
endsub

Sub GetResultFish()
   ; ------- улов -------
   DIM Fish[18]
   Fish[0]  = '0x170B'   ; сапоги
   Fish[1]  = '0x170F'   ; тапки
   Fish[2]  = '0x170D'   ; сандалии
   Fish[3]  = '0x1711'   ; сапоги
   Fish[4]  = '0x09CC'   ; тип рыбы 1
   Fish[5]  = '0x09CD'   ; тип рыбы 2
   Fish[6]  = '0x09CE'   ; тип рыбы 3
   Fish[7]  = '0x09CF'   ; тип рыбы 4
   Fish[8]  = '0x0FC4'   ; ракушка, тип 1
   Fish[9]  = '0x0FC5'   ; ракушка, тип 2
   Fish[10] = '0x0FC6'   ; ракушка, тип 3
   Fish[11] = '0x0FC7'   ; ракушка, тип 4
   Fish[12] = '0x0FC8'   ; ракушка, тип 5
   Fish[13] = '0x0FC9'   ; ракушка, тип 6
   Fish[14] = '0x0FCA'   ; ракушка, тип 7
   Fish[15] = '0x0FCB'   ; ракушка, тип 8
   Fish[16] = '0x0FCC'   ; ракушка, тип 9
   Fish[17] = '0x14ED'   ; карта
   VAR Razmer = 17      ; размер массива - 1
   VAR Scissor = '0x0F9E'   ; тип ножниц
   VAR Bandag = '0x0E21'      ; Тип бинтов
   VAR i
   ; Ищем что у нас валяется под ногами, если надо перерабатываем
   ; и складируем в трюм. Потом введем всякие мешочки разные и ящички.
   For i = 0 To Razmer
      UO.FindType( Fish[i], '-1', 'ground' )
      If UO.FindCount() > 0 Then
         If i < 4 Then
            ; обувь
            UO.WaitTargetObject( 'finditem' )
            UO.UseType( Scissor )
            Wait( 3000 )
            UO.FindType( Bandag )
         Endif
         UO.Grab( '0', 'finditem' )
         Wait( 2000 )
         If i > 7 AND i < 17 Then
            ; ракушка
            UO.UseObject( 'finditem' )
            wait(1000)
         Endif
      Endif
   Next
endsub

#####################################################################
; Remember armor & weapon, disarm, healing from bandages, arm
sub Bandag()
   UO.SetArm('CWeapon')
   UO.Exec('bandageself')
   wait(300)
   UO.Arm('CWeapon')
endsub

#####################################################################
;  Arrow() - cast magic arrow on laststatus
sub Arrow()
   VAR ManaNeed=4
   UO.Set('lasttarget','laststatus')
   if UO.Mana>=ManaNeed then
      UO.Cast('Magic Arrow','laststatus')
   else
      UO.Print("Low mana!!!")
   endif
end sub

#####################################################################
; Poison() - cast poison on laststatus if target-char not
;            poisoned and your char have enought mana
sub Poison()
   VAR ManaNeed=9
   VAR ScrollManaNeed=4
   UO.Set('lasttarget','laststatus')
   If NOT UO.Poisoned('lasttarget') Then
      UO.FindType('0x1F40',-1,'my')
      If UO.GetQuantity('finditem')>0 Then
         If UO.Mana>=ScrollManaNeed Then
            UO.WaitTargetObject('lasttarget')
            UO.UseObject('finditem')
            UO.Print("Scroll")
         Else
            UO.Print("Low mana!!! Scroll!")
         Endif
      Else
         If UO.Mana>=ManaNeed Then
            UO.Cast('Poison','laststatus')
         Else
            UO.Print("Low mana!!!")
         Endif
      Endif
   Else
      UO.Print("Character already poisoned!")
   Endif
end sub

#####################################################################
;  Flame() - cast Flame Strike to last status from scroll,
;            if she found or from spellbook
sub Flame()
   UO.Set('lasttarget','laststatus')
   UO.FindType('0x1F5F',-1,'my')
   If UO.GetQuantity('finditem')>0 then
      if UO.Mana>=22 then
         UO.WaitTargetObject('lasttarget')
         UO.UseObject('finditem')
         UO.Print("Scroll")
      else
         UO.Print("Low mana!!! Scroll!")
      endif
   else
      if UO.Mana>=45 then
         UO.Cast('Flame Strike','laststatus')
         UO.Print("Spell")
      else
         UO.Print("Low mana!!! Spell!")
      endif
   endif
end sub

#####################################################################
;  Light() - cast Lighting to last status from scroll,
;            if she found or from spellbook
sub Light()
   UO.Set('lasttarget','laststatus')
   UO.FindType('0x1F4A',-1,'my')
   If UO.GetQuantity('finditem')>0 then
      if UO.Mana>=10 then
         UO.WaitTargetObject('lasttarget')
         UO.UseObject('finditem')
         UO.Print("Scroll")
      else
         UO.Print("Low mana!!! Scroll!")
      endif
   else
      if UO.Mana>=20 then
         UO.Cast('Lightning','laststatus')
         UO.Print("Spell")
      else
         UO.Print("Low mana!!! Spell!")
      endif
   endif
end sub

#####################################################################
sub NechegoDelat()
   SpSpeak()
   VAR SpiritTime = UO.Timer()
   repeat
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Else
         wait(500)
      Endif
   until UO.Dead()
endsub

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

#####################################################################
; BUYREGS
; Скупка регов по байлисту
; v.1.01b (с) Edred
sub buyregs()
   VAR i
   DIM vendors[29]
   vendors[0] = 'Kaspar'
   vendors[1] = 'Austin'
   vendors[2] = 'Reese'
   vendors[3] = 'Alessa'
   vendors[4] = 'Akina'
   vendors[5] = 'Aileen'
   vendors[6] = 'Alula'
   vendors[7] = 'Kevin'
   vendors[8] = 'Ainhoa'
   vendors[9] = 'Aderes'
   vendors[10] = 'Cassidy'
   vendors[11] = 'Gideon'
   vendors[12] = 'Canton'
   vendors[13] = 'Alaqua'
   vendors[14] = 'Doyle'
   vendors[15] = 'Ali'
   vendors[16] = 'Alake'
   vendors[17] = 'Jabir'
   vendors[18] = 'Beau'
   vendors[19] = 'Morris'
   vendors[20] = 'Aleka'
   vendors[21] = 'Akili'
   vendors[22] = 'Tremain'
   vendors[23] = 'Terence'
   vendors[24] = 'Brock'
   vendors[25] = 'Alumit'
   vendors[26] = 'Redmond'
   vendors[27] = 'Adoncia'
   vendors[28] = 'Rudyard'
   ;
   UO.UseSkill( 'Meditation' )
   wait(100)
   UO.DeleteJournal()
   For i = 0 To 28
      UO.Buy( 'magic', vendors[i] )
      wait(1000)
      If UO.InJournal( 'I thank thee for thy' ) Then
         UO.SayU( 'bye' )
         return
      Endif
   Next
endsub

#####################################################################
; TestArmor. v.1.06b (c) Edred
;
; Выводит в текстовое окно информацию о армореклассе и износе всего,
; что надето на чара и взято им в руки
;
sub TestArmor()
   DIM Lay[8]
   Lay[0] = 'Lhand'
   Lay[1] = 'Rhand'
   Lay[2] = 'Arms'
   Lay[3] = 'Legs'
   Lay[4] = 'Gloves'
   Lay[5] = 'Hat'
   Lay[6] = 'Torso'
   Lay[7] = 'Neck'
   VAR i, ob, nam, l, k
   UO.TextOpen()
   UO.TextClear()
   for i = 0 to 7
      DeleteJournal( 'Quality' )
      ob = UO.ObjAtLayer( Lay[i] )
      If ob <> '' Then
         UO.Click( ob )
         wait(1000)
         nam = UO.GetName( ob )
         UO.TextPrint( nam )
         UO.WaitTargetObject( ob )
         UO.UseSkill( 'Arms Lore' )
         k = 0
         repeat
            wait(300)
            k = k + 1
         until UO.InJournal( 'Quality' ) OR k > 30
         l = UO.InJournal( 'Quality' )
         nam = UO.Journal( l - 1 )
         UO.TextPrint( nam )
      Endif
   next
endsub

#####################################################################
; AutoHeal. v.1.10b (c) Edred
;
; Автоматический подхил чара (здоровье минус 30). Автоматическое питие
; греатхил поушена при здоровье меньше 60. Автоматическое запоминание
; оружия и щита при запуске и взятие их в руки после подхилла.
;
sub AutoHeal()
   VAR GreatHeal = '0x0F0C'
   VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
   VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
   If MyFork == '0x0000' Then
      MyFork = ''
   Endif
   If MyShield == '0x0000' Then
      MyShield = ''
   Endif
   repeat
      If UO.Life < (UO.Str - 30) Then
         RestoreChar( 0 )
         GetWeapon( MyFork, MyShield )
      Endif
      If UO.Life < 60 Then
         UO.UseType( GreatHeal )
      Endif
      wait(2000)
   until UO.Dead()
endsub

; Процедура взятия в руки указанного оружия и щита. Если чар не может
; взять в руки оружие - автоматический диспел на себя.
;
Sub GetWeapon( Fork, Shield )
   VAR msg1 = 'Not strong enough to equip'
   DeleteJournal( msg1 )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If Fork == '' AND Shield == '' Then
      return
   Endif
   If Fork == '' Then
      ; только щит
      If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
         ; все есть
         return
      Else
         GetOneWeaponOnly( 'Lhand', Shield )
         return
      Endif
   Endif
   If Shield == '' Then
      ; только оружие
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; все есть
         return
      Else
         GetOneWeaponOnly( 'Rhand', Fork )
         return
      Endif
   Endif
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         GetOneWeaponOnly( 'Rhand', Fork )
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         GetOneWeaponOnly( 'Lhand', Shield )
      Else
         ; в руках нет ни оружия, ни щита
         GetOneWeaponOnly( 'Rhand', Fork )
         GetOneWeaponOnly( 'Lhand', Shield )
      Endif
   Endif
endsub

Sub GetOneWeaponOnly( lay, typ )
   VAR msg1 = 'Not strong enough to equip'
   UO.Equipt( lay, typ )
   repeat
      wait(50)
   until UO.GetGraphic( UO.ObjAtLayer( lay ) ) == typ OR UO.InJournal( msg1 )
   If UO.InJournal( msg1 ) Then
      UO.WaitTargetSelf()
      UO.Cast( 'Dispel' )
      wait(4000)
      GetOneWeaponOnly( lay, typ )
      CheckLag()
   Endif
endsub

; Процедура лечения чара с бинтов. Два варианта - разовый подхил или подхил
; до полного восстановления здоровья.
;
Sub RestoreChar( a )
   VAR bandag = '0x0E21'
   If a == 0 Then
      If UO.Count( Bandag ) > 0 Then
         UO.Bandageself()
         wait( 300 )
      Endif
      return
   Endif
   If a == 1 Then
      If UO.Count( Bandag ) > 0 Then
         While UO.Life < 150
            UO.Bandageself()
            wait( 2000 )
         Wend
      Endif
      return
   Endif
endsub

#####################################################################
; AutoLoot. v.1.11b (c) Edred
;
; Автоматический лут трупа. Три варианта скрипта - первый на последний
; труп, второй вызывает прицел для указания трупа. Лутится только то,
; что указано в массиве. Третий вариант - лутим с земли около чара.
;
sub AutoLoot()
   VAR Cleaver = '0x0EC2'   ; кливер (тип)
   ; Считываем оружие и щит из рук
   VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
   VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
   If MyFork == '0x0000' Then
      MyFork = ''
   Endif
   If MyShield == '0x0000' Then
      MyShield = ''
   Endif
   ;
   VAR CorpseSer = UO.GetSerial( 'lastcorpse' )
   CheckLag()
   UO.WaitTargetObject( CorpseSer )
   UO.UseType( Cleaver )
   wait(1000)
   CheckLag()
   GetWeapon( MyFork, MyShield )
   UO.UseObject( CorpseSer )
   wait(500)
   CheckLag()
   CorpseLoot( CorpseSer )
endsub
;
sub AutoLoot2()
   VAR Cleaver = '0x0EC2'   ; кливер (тип)
   ; Считываем оружие и щит из рук
   VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
   VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
   If MyFork == '0x0000' Then
      MyFork = ''
   Endif
   If MyShield == '0x0000' Then
      MyShield = ''
   Endif
   ;
   If UO.Targeting() Then
      UO.CancelTarget()
   Endif
   UO.Print( 'Please, choice of corpse:' )
   UO.AddObject( 'CorpseForLoot' )
   While UO.Targeting()
      wait(100)
   Wend
   VAR CorpseSer = UO.GetSerial( 'CorpseForLoot' )
   CheckLag()
   UO.WaitTargetObject( CorpseSer )
   UO.UseType( Cleaver )
   wait(1000)
   CheckLag()
   GetWeapon( MyFork, MyShield )
   UO.UseObject( CorpseSer )
   wait(500)
   CheckLag()
   CorpseLoot( CorpseSer )
endsub
;
; Автоматически лутим с земли около чара. Одежду сразу режем на бинты.
;
sub AutoLootGround()
   VAR Cleaver = '0x0EC2'   ; кливер (тип)
   VAR Scissor = '0x0F9E'   ; Ножницы
   VAR fastloot = 'FastLoot detected.'
   DIM Nado[27]
   Nado[0]  = '0x170B'   ; boots
   Nado[1]  = '0x1718'   ;
   Nado[2]  = '0x1516'   ; a skirt
   Nado[3]  = '0x1F03'   ; a robe
   Nado[4]  = '0x1F01'   ; a plain dress
   Nado[5]  = '0x1EFD'   ; a fancy shirt
   Nado[6]  = '0x1541'   ; a body sash
   Nado[7]  = '0x170B'   ; boots
   Nado[8]  = '0x170D'   ; sandals
   Nado[9]  = '0x1717'   ; a straw hat
   Nado[10] = '0x1539'   ; long pants   
   Nado[11] = '0x152E'   ; short pants
   Nado[12] = '0x1515'   ; a cloak
   Nado[13] = '0x1FA1'   ; tunic
   Nado[14] = '0x0EED'   ; gold coin
   Nado[15] = '0x0F3F'   ; arrows
   Nado[16] = '0x0F7A'   ; pearls, black pearls
   Nado[17] = '0x0F7B'   ; bood moss
   Nado[18] = '0x0F7D'   ; vials of blood
   Nado[19] = '0x0F84'   ; garlic
   Nado[20] = '0x0F85'   ; ginseng
   Nado[21] = '0x0F86'   ; mandrake root
   Nado[22] = '0x0F88'   ; night shade
   Nado[23] = '0x0F8C'   ; sulphorous ash
   Nado[24] = '0x0F8D'   ; spiders silk
   Nado[25] = '0x14ED'   ; a treasure map
   Nado[26] = '0x0E75'   ; backpack
   VAR i
   UO.Exec( 'set finddistance 3' )
   For i = 0 To 25
      UO.FindType( Nado[i], '-1', '1' )
      While UO.FindCount() > 0
         DeleteJournal( fastloot )
         If i < 14 Then
            UO.WaitTargetObject( 'finditem' )
            UO.UseType( Scissor )
            GetPause(500)
            CheckLag()
         Else
            If i == 23 Then
               If UO.GetQuantity( 'finditem' ) == 1 Then
                  UO.Ignore( 'finditem' )
               Else
                  UO.MoveItem( 'finditem' )
                  GetPause(350)
                  CheckLag()
               Endif
            Else
               UO.MoveItem( 'finditem' )
               GetPause(350)
               CheckLag()
            Endif
         Endif
         UO.FindType( Nado[i], '-1', '1' )
      Wend
   Next
   UO.Print( 'The loot was finished' )
endsub
;
; Лут указанного трупа
;
Sub CorpseLoot( Cont )
   ; лутим из Cont
   DIM Nado[40]
   ; реги
   Nado[0]  = '0x0F7A'   ; pearls, black pearls
   Nado[1]  = '0x0F7B'   ; bood moss
   Nado[2]  = '0x0F84'   ; garlic
   Nado[3]  = '0x0F85'   ; ginseng
   Nado[4]  = '0x0F86'   ; mandrake root
   Nado[5]  = '0x0F88'   ; night shade
   Nado[6]  = '0x0F8C'   ; sulphorous ash
   Nado[7]  = '0x0F8D'   ; spiders silk
   ; то что надо резать ножницами
   Nado[8] = '0x1078'   ; leather
   ; основной лут
   Nado[9]  = '0x0F78'   ; batwings   
   Nado[10] = '0x0F7E'   ; bones
   Nado[11] = '0x0F7D'   ; vials of blood
   Nado[12] = '0x0F80'   ; daemons bones
   Nado[13] = '0x0F81'   ; fertile dirt
   Nado[14] = '0x0F82'   ; dragons blood
   Nado[15] = '0x0F87'   ; eyes of newt
   Nado[16] = '0x0F8E'   ; serpents scales
   Nado[17] = '0x0F90'   ; dead woods
   Nado[18] = '0x0F91'   ; wyrms hearts
   Nado[19] = '0x0F8F'   ; volcanic ash
   Nado[20] = '0x0E34'   ; blank scrolls
   ; золото и руда
   Nado[21] = '0x0EED'   ; gold coin
   Nado[22] = '0x0F23'   ; cintrines
   Nado[23] = '0x19B7'   ; magic ore
   ; прочий лут
   Nado[24] = '0x0E24'   ; water bottles
   Nado[25] = '0x0F0E'   ; empty bottles
   Nado[26] = '0x0F0B'   ; total refresh
   Nado[27] = '0x0F09'   ; total mana refresh
   Nado[28] = '0x0F06'   ; shrink
   Nado[29] = '0x0F0C'   ; greater heal
   Nado[30] = '0x0F09'   ; invisibility
   Nado[31] = '0x0E21'   ; bandages
   Nado[32] = '0x0E20'   ; bloody bandages - бинты
   Nado[33] = '0x0F3F'   ; arrows
   Nado[34] = '0x1BD1'   ; feathers
   Nado[35] = '0x14ED'   ; a treasure map
   Nado[36] = '0x1078'   ; pile of hides
   Nado[37] = '0x0FAB'   ; duing tub
   Nado[38] = '0x1BFB'   ; bolts
   Nado[39] = '0x1089'   ; necklace

   VAR otherpack = '0x0E75'   ; backpack
   VAR i, typ, serpack
   VAR Scissor = '0x0F9E'   ; Ножницы
   VAR fastloot = 'FastLoot detected.'
   For i = 0 To 39
      UO.FindType( Nado[i], -1, Cont )
      While UO.FindCount() > 0
         DeleteJournal( fastloot )
         If i == 8 Then
            If UO.GetColor( 'finditem' ) == '0x0000' Then
               UO.WaitTargetObject( 'finditem' )
               UO.UseType( Scissor )
               GetPause(500)
               CheckLag()
            Else
               UO.MoveItem( 'finditem' )
               GetPause(500)
               CheckLag()
            Endif
         Else
            UO.MoveItem( 'finditem' )
            GetPause(500)
            CheckLag()
         Endif
         UO.FindType( Nado[i], -1, Cont )
      Wend
   Next
   UO.FindType( otherpack, -1, Cont )
   while UO.FindCount() > 0
      serpack = UO.GetSerial( 'finditem' )
      UO.Ignore( 'finditem' )
      UO.UseObject( serpack )
      wait(500)
      CheckLag()
      CorpseLoot( serpack )
      wait(500)
      UO.FindType( otherpack, -1, Cont )
   wend
   UO.Print( 'The loot was finished' )
endsub
;
; Пауза в переданных миллисекундах, с проверкой на сообщение о
; детекте фастлута. Не забудьте удалить эту фразу из журнала перед
; тем действием, после которого стоит эта пауза!
Sub GetPause( ms )
   VAR t = 0
   VAR msg = 'FastLoot detected.'
   repeat
      wait(50)
      t = t + 50
   until t >= ms OR UO.InJournal( msg )
   If UO.InJournal( msg ) Then
      wait(200)
   Endif
endsub

#####################################################################
;
; EmptyPack. Разгрузка пака от результатов зоннерства.
;
; v. 1.12b (c) Edred
;
sub EmptyPack()
;   VAR Sunduk = '0x40361048'            ; сундук с барахлом
   VAR Cont = '0x4043310C'               ; куда сгружать все
   VAR Regbag = '0x405F74B3'            ; мешок для регов и поушенов
   VAR Box1 = UO.GetGlobal( 'BoxRegs' )   ; regs
   VAR Box2 = UO.GetGlobal( 'BoxBand' )   ; bandages, blood bandages, bottles
   VAR Box3 = UO.GetGlobal( 'BoxPick' )   ; pickaxes, hatchets, cleavers, scissors
   VAR Box4 = UO.GetGlobal( 'BoxArms' )   ; weapons, armors, robes
   VAR i, mx = 23
   VAR pak = '0x0E75', pakser
   DIM DropType[24], DropColor[24]
   ; serpents scales
   DropType[0]   = '0x0F8E'
   DropColor[0]  = '0x0000'
   ; volcanic ash
   DropType[1]   = '0x0F8F'
   DropColor[1]  = '0x0000'
   ; bones
   DropType[2]   = '0x0F7E'
   DropColor[2]  = '0x0000'
   ; eyes of newt
   DropType[3]   = '0x0F87'
   DropColor[3]  = '0x0000'
   ; cintrines
   DropType[4]   = '0x0F23'
   DropColor[4]  = '0x0427'
   ; batwings
   DropType[5]   = '0x0F78'
   DropColor[5]  = '0x0000'
   ; vials of blood
   DropType[6]   = '0x0F7D'
   DropColor[6]  = '0x0000'
   ; feathers
   DropType[7]   = '0x1BD1'
   DropColor[7]  = '0x0000'
   ; dragons blood
   DropType[8]   = '0x0F82'
   DropColor[8]  = '0x0000'
   ; water bottles
   DropType[9]   = '0x0E24'
   DropColor[9]  = '0x0482'
   ; fertile dirt
   DropType[10]  = '0x0F81'
   DropColor[10] = '0x0000'
   ; pearls
   DropType[11]  = '0x0F7A'
   DropColor[11] = '0x05B2'
   ; dead woods
   DropType[12]  = '0x0F90'
   DropColor[12] = '0x06FB'
   ; cut up leather
   DropType[13]  = '0x1067'
   DropColor[13] = '0x0000'
   ; daemons bones
   DropType[14]  = '0x0F80'
   DropColor[14] = '0x0000'
   ; wyrms hearts
   DropType[15]  = '0x0F91'
   DropColor[15] = '0x0000'
   ; gold coin
   DropType[16]  = '0x0EED'
   DropColor[16] = '0x0000'
   ; bloody bandages
   DropType[17]  = '0x0E20'
   DropColor[17] = '0x0000'
   ; a Treasure Map
   DropType[18]  = '0x14ED'
   DropColor[18] = '0x0000'
   ; empty bottles
   DropType[19]  = '0x0F0E'
   DropColor[19] = '0x0000'
   ; pile of white hides
   DropType[20]  = '0x1078'
   DropColor[20] = '0x0481'
   ; pile of black hides
   DropType[21]  = '0x1078'
   DropColor[21] = '0x083A'
   ; pile of red hides
   DropType[22]  = '0x1078'
   DropColor[22] = '0x0424'
   ; pile of green hides
   DropType[23]  = '0x1078'
   DropColor[23] = '0x0426'
   ;
   DIM Regs[8]
   Regs[0] = '0x0F7A'   ; black pearls
   Regs[1] = '0x0F7B'   ; bood moss
   Regs[2] = '0x0F84'   ; garlic
   Regs[3] = '0x0F85'   ; ginseng
   Regs[4] = '0x0F86'   ; mandrake root
   Regs[5] = '0x0F88'   ; night shade
   Regs[6] = '0x0F8C'   ; sulphorous ash
   Regs[7] = '0x0F8D'   ; spiders silk
   VAR bandag = '0x0E21'               ; бинты
   UO.Exec( 'terminate AutoZonner' )
   wait(500)
   UO.Exec( 'terminate AutoHeal' )
   wait(500)
   If UO.Targeting() Then
      UO.CancelTarget()
   Endif
;   UO.UseObject( Sunduk )
;   wait(500)
;   CheckLag()
   UO.UseObject( Cont )
   wait(500)
   CheckLag()
; ------- вставляем предварительную очистку всех паков в бэкпаке   
; v.1.10
   UO.FindType( pak )
   While UO.FindCount() > 0
      pakser = UO.GetSerial( 'finditem' )
      UO.UseObject( pakser )
      wait(1000)
      CheckLag()
      UO.FindType( -1, -1, pakser )
      While UO.FindCount() > 0
         UO.MoveItem( 'finditem' )
         wait(500)
         CheckLag()
         UO.FindType( -1, -1, pakser )
      Wend
      UO.Ignore( pakser )
      UO.FindType( pak )
   Wend
; ------- конец вставки очистки паков
   for   i = 0 to mx
;      UO.Print( 'TEST. i = ' + str(i) )
      UO.FindType( DropType[i], DropColor[i] )
      While UO.FindCount() > 0
         UO.MoveItem( 'finditem' , 0, Cont )
         wait(500)
         CheckLag()
         UO.FindType( DropType[i], DropColor[i] )
      Wend
   next
   ; проверим бинты
   UO.FindType( bandag )
   While UO.FindCount() > 0
      If UO.GetColor( 'finditem' ) <> '0x0000' Then
         UO.MoveItem( 'finditem' , 0, Cont )
         wait(500)
         CheckLag()
      Else
         UO.Ignore( 'finditem' )
      Endif
      UO.FindType( bandag )
   Wend
   UO.IgnoreReset()
   ; переложим реги в спецмешок
   for   i = 0 to 7
      UO.FindType( Regs[i] )
      While UO.FindCount() > 0
         UO.MoveItem( 'finditem' , 0, Regbag )
         wait(500)
         CheckLag()
         UO.FindType( Regs[i] )
      Wend
   next
   ; тест оружия
   TestArmor()
endsub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
   While not UO.Hidden()
      UO.UseSkill('Hiding')
      Wait(4000)
   Wend
endsub

#####################################################################
Sub GetDagger( Dagger )
   If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) <> Dagger Then
      UO.FindType( Dagger )
      If UO.FindCount() == 0 Then
         return 0
      Endif
      UO.Equipt( 'Rhand', Dagger )
      wait(1000)
   Endif
   return 1
endsub

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную
; TimeProcess.
;
; ver. 1.05 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
   ; сообщения при кормежке
   UO.Print( 'TEST: eat to ' + str( Nom ) + ' message and ' + str( Add ) + ' more each ' + str( TimeWait ) + ' minutes' )
   VAR Eat1 = 'You eat the food, but are still extremely hungry'
   VAR Eat2 = 'After eating the food, you fell much less hungry'
   VAR Eat3 = 'You eat the food, and begin to feel more satiated'
   VAR Eat4 = 'You are nearly stuffed, but manage to eat the food'
   VAR Eat5 = 'You fell quite full after consuming the food'
   VAR Eat6 = 'You are stuffed!'
   VAR Eat7 = 'You are simply too full to eat any more!'
   VAR Med = '0x09EC'         ; тип меда для подкормки
   VAR i, Eat, j
   ; проверим, пора ли кормиться
   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 == 1 Then
      Eat = Eat1
   Endif
   If Nom == 2 Then
      Eat = Eat2
   Endif
   If Nom == 3 Then
      Eat = Eat3
   Endif
   If Nom == 4 Then
      Eat = Eat4
   Endif
   If Nom == 5 Then
      Eat = Eat5
   Endif
   If Nom == 6 Then
      Eat = Eat6
   Endif
   If Nom == 7 Then
      Eat = Eat7
   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 )
   repeat
      DeleteJournal( Eat )
      UO.UseType( Med )
      Wait( 1000 )
   until NOT UO.InJournal( Eat )
   If Add > 0 Then
      For j = 1 To Add
         UO.UseType( Med )
         Wait( 1000 )
      Next
   Endif
   ; хватит кормиться
   ; выгрузим остатки меда обратно
   UO.Findtype( Med, '-1', 'backpack' )
   UO.MoveItem( 'finditem', 0, Sunduk )
   Wait( 1000 )
   ; Сбросим счетчик
   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

#####################################################################
Sub Recalling( Runbk, NRune )
   ; Runbk - сериал или ссылка на объект рунбуки
   ; NRune - десятичный номер (текстом) руны для реколла
   VAR myx = UO.GetX()
   VAR myy = UO.GetY()
   VAR OldMana = UO.Mana
   VAR i = 0
   DeleteJournal( 'fizzles' )
   UO.Exec("recall " + Runbk + " " + NRune)
   repeat
      CheckLag()
      wait(1000)
      i = i + 1
   until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
   wait(500)
   If myx == UO.GetX() AND myy == UO.GetY() Then
      UO.WarMode( 'flip' )
      wait(100)
      UO.WarMode( 'flip' )
      Recalling( Runbk, NRune )
   Endif
endsub

Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
   VAR tmpst, i, dlin, kol = 0, start = 0
   dlin = len( st )
   For i=0 To dlin - 1
      If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
         kol = kol + 1
         If kol == nom Then
            ; это первый пробел после нужного нам слова
            tmpst = mid( st, start, i - start )
            return tmpst
         Else
            While mid( st, i, 1 ) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 Then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   return tmpst
endsub

#================================================#
#  ПРОЦЕДУРЫ ХОЖДЕНИЯ                            #
#================================================#
; Autor - Sergious, Edited - Edred.
;
; Процедура GoToTile( X, Y, D, T )
; X,Y: координаты точки назначения
; D: точность подхода (необходимое расстояние)
; T: строгость подхода (точно ли должно быть то расстояние... True/False)
;
; Установите в своем скрипте следующие глобальные переменные:
; -----------------------------------------------------------
; MovDelay  - Пауза между шагами. Обычное значение - '1000'
; MovNumber - Количество шагов при смене дислокации
; KoefEp    - Значение ширины угла хождения при определении направления.
;             Если на пути встречаются сложные и широкие препятствия -
;             увеличить. '0.172' - сбалансированный.
#===================================================================#
; ============== GOTOTILE ===
;
Sub GoToTile( OX, OY, N, S )
   VAR myx, myy, MD, J
   VAR Lx1, Ly1
   VAR Lx2, Ly2
   VAR Sx, Sy
   VAR T
   VAR Des = N
   VAR MoveDelay = 100
   J = 1
   MD = MoveDelay * 1.5
   myx = uo.getx()
   myy = uo.gety()
   MoveOnce( GetDir( uo.getx(), uo.gety(), ox, oy), MD, False)
   Sx = 0
   Sy = 0
   Lx1 = uo.getx() / 2
   Ly1 = uo.gety() / 2
   Lx2 = Lx1 / 2
   Ly2 = Ly1 / 2
   T = UO.Timer()
   If (GetDistance(ox, oy) <> N) OR ( (NOT S) AND GetDistance(ox, oy) > N ) Then
      UO.Exec('exec PermResend')
   EndIf
   While ( (GetDistance(ox, oy) <> N) OR ((NOT S) and GetDistance(ox, oy) > N) ) and ( OX >= 0 ) and ( OY >= 0 )
      If ( (UO.Timer() - T) * 15 > MoveDelay ) Then
         T = UO.Timer()
         Lx2 = Lx1
         Ly2 = Ly1
         Lx1 = myx
         Ly1 = myy
         myx = uo.getx()
         myy = uo.gety()
      endIf
      MD=MoveDelay
      If ((OX-uo.getx())*(OX-uo.getx())+(OY-uo.gety())*(OY-uo.gety())>0) Then
         MD = MD * 3 / GetDistance( ox, oy )
      EndIf
      wait(MD)
      If GetDistance( OX, OY ) > Des Then
         MoveOnce(GetDir(uo.GetX(),uo.GetY(),ox,oy),MD,False)
      Else
         If S Then
            If GetDistance(OX,OY)<Des Then
               If GetDistance(OX,OY)<>0 Then
                  MoveOnce(GetDir(ox,oy,uo.GetX(),uo.GetY()),MD,False)
               Else
                  MoveOnce(GetDir(uo.GetX(),uo.GetY(),Lx2,Ly2),MD,False)
               EndIf
            EndIf
         EndIf
      EndIf
      If GetDistance(OX,OY)<>Des Then
         If (Lx2==uo.getx()) and (Ly2==uo.gety()) Then
            If (Sx<>uo.getx()) or (Sy<>uo.gety()) Then
               J=1
            EndIf
            J=J+1
            UO.Resend()
            Sx = uo.getx()
            Sy = uo.gety()
            Stun(ox,oy,J)
         EndIf
      EndIf
   Wend
   UO.Exec( 'terminate PermResend' )
endsub
;
; ============ MOVEONCE ===
; Процедура MoveOnce - хождение в определённую сторону
; Направления:
; Система направлений по клавишам Нумпада
; 8 = 1 | 2 = -1
; 9 = 2 | 1 = -2
; 6 = 3 | 4 = -3
; 3 = 4 | 7 = -4
;
; Такая система позволяет с лёгкостью получать направление, обратное
; данному...
;
Sub MoveOnce( Dir, Del, Rev )
   VAR Num
   Var MoveNumber = 1
   If Rev Then
      Num = MoveNumber + 1
   Else
      Num = MoveNumber
   EndIf
   If ( Num > 0 ) and ( Dir <> 0 ) Then
      If Dir == 1 Then
         UO.Press( 38, Num, Del )
      EndIf
      If Dir == 2 Then
         UO.Press( 33, Num, Del )
      EndIf
      If Dir == 3 Then
         UO.Press( 39, Num, Del )
      EndIf
      If Dir == 4 Then
         UO.Press( 34, Num, Del )
      EndIf
      If Dir == -1 Then
         UO.Press( 40, Num-1, Del )
      EndIf
      If Dir == -2 Then
         UO.Press( 35, Num, Del )
      EndIf
      If Dir == -3 Then
         UO.Press( 37, Num, Del )
      EndIf
      If Dir == -4 Then
         UO.Press( 36, Num, Del )
      EndIf
      If Rev Then
         If Dir <> -1 Then
            UO.Press( 40, 1, Del )
         EndIf
      EndIf
   EndIf
endsub
;
; ============== GETDIR ===
; Функция GetDir возвращает направление, по которому надо идти
; к координате
;
Sub GetDir( myx, myy, ox, oy )
   VAR I, J
   J = 0
   VAR X = ox - myx
   VAR Y = oy - myy
   I = GetQDir( Abs(X), Abs(Y) )
   If X >= 0 Then
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -1
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 3
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      EndIf
   Else
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -3
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 1
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; =============== GETQDIR ===
;
;
Sub GetQDir( x, y )
   VAR Ep = 0.172
   VAR J = 0
   If X == 0 Then
      J = 1
   Else
      If ( Y / X ) < Ep Then
         J = 3
      Else
         If ( X / Y ) < Ep Then
            J = 1
         Else
            J = 2
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; ============== GETDISTANCE ===
; Функция GetDistance возвращает расстояние до координат
; (как UO.GetDistance - до объекта)
;
; Почему так - потому что учим математику :)
;
Sub GetDistance( X, Y )
   VAR A, B, C
   A = abs( X - UO.GetX() )
   B = abs( Y - UO.GetY() )
   If A > B Then
      C = A
   Else
      C = B
   EndIf
   Return C
endsub
;
; ============= PERP ===
; Функция Perp возвращает направление, перпендикулярное введённому
;
Sub Perp( Dir )
   VAR D = Dir
   If Dir == 1 Then
      D = 3
   EndIf
   If Dir == 2 Then
      D = 4
   EndIf
   If Dir == 3 Then
      D = -1
   EndIf
   If Dir == 4 Then
      D = -2
   EndIf
   If Dir == -1 Then
      D = -3
   EndIf
   If Dir == -2 Then
      D = -4
   EndIf
   If Dir == -3 Then
      D = 1
   EndIf
   If Dir == -4 Then
      D = 2
   EndIf
   RETURN D
endsub
;
; =============== STUN ===
; Обход препятствий
;
Sub Stun( X, Y, N )
   VAR I
   VAR myx
   VAR myy
   VAR MoveDelay = 100
   myx = uo.getx()
   myy = uo.gety()
   For I=1 to N
      MoveOnce(perp(GetDir(myx,myy,x,y)),MoveDelay,False)
   Next
   Wait(MoveDelay)
   UO.Resend()
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-perp(GetDir(myx,myy,x,y)),MoveDelay,False)
      Next
      Wait(MoveDelay)
      UO.Resend()
   EndIf
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-GetDir(myx,myy,x,y),MoveDelay,False)
      Next
      Wait(MoveDelay)
      Stun(x,y,N)
   EndIf   
endsub
;
; ============= ABS ===
; Убирает знак минуса в отрицательных числах
;
Sub abs( a )
   VAR b
   If a < 0 Then
      b = -a
   Else
      b = a
   endif
   return b
endsub
;
; ============== PERMRESEND ===
;
Sub PermResend()
   Var Mn = 9
   VAR MoveDelay = 100
   Repeat
      UO.Resend()
      Wait( MoveDelay * Mn )
   Until ( 1 > 2 )
endsub


Top
   
 Post subject:
PostPosted: 2006-03-10 18:22:47 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
SkillUp.sc

Code:
#===================================================================#
# SkillUp, v.502.23                                                 #
# Скрипты для прокачки скиллов                                      #
#===================================================================#
#                                                                   #
# 1. Прокачка крафтов                                               #
# -------------------                                               #
#  1. Bowcraft. Крафтим шафты                                       #
#  2. Bowcraft. Крафтим стрелы                                      #
#  3. Poison                                                        #
#  4. Mining. Плавим руду                                           #
#  5. Tailoring                                                     #
#  6. Tailoring2                                                    #
#  7. Tinker                                                        #
#  8. TinkerWood                                                    #
#  9. Carpentry                                                     #
# 10. CarpentryD                                                    #
# 11. Cartograph                                                    #
# 12. Inscript. Крафтим скроллы стрелок                             #
# 13. Inscript. Крафтим скроллы реколлов                            #
# 14. Veterinary (для двух чаров)                                   #
# 15. Veterinary (для одного чара)                                  #
#                                                                   #
# 2. Прокачка других скиллов                                        #
# --------------------------                                        #
#  1. Magery                                                        #
#  2. Music                                                         #
#  3. Provocation                                                   #
#  4. Enticment                                                     #
#  5. Forensic                                                      #
#  6. Hiding                                                        #
#  7. Hiding & Stealth                                              #
#  8. MaceFighting (на кукле)                                       #
#  9. Fencing (на кукле)                                            #
# 10. Swordsmanship (на кукле)                                      #
# 11. Anatomy, Animal lore, Evalution Int                           #
# 12. Camping                                                       #
# 13. Cooking                                                       #
# 14. Spirit Speak                                                  #
# 15. Herding                                                       #
# 16. Lockpicking                                                   #
# 17. Begging                                                       #
# 18. Snooping                                                      #
# 19. Stealing                                                      #
#                                                                   #
# 3. Процедуры                                                      #
# ------------                                                      #
#                                                                   #
#===================================================================#

#===================================================================#
#
# I. Прокачка Крафтов
#
#####################################################################
; Bowcraft. v.1.03b (c) Edred
;
; Чар берет из сундука логи, крафтит из них шафты
; и складывает эти шафты в этот же сундук.
; Если логи закончились - выход.
; Если даггер (или что вы там используете) сломался -
; скрипт найдет аналогичный по типу в бэкпаке и возьмет
; в руки.
;
; 1.03b: Проверка, если Kolvo = 1, то берем три и кладем обратно два
;        лога.
;
sub bowcraft()
   VAR Sunduk = '0x405210C8'       ; Сериал сундука
   VAR Logi = '0x1BDD'          ; Тип логов
   VAR Shafts = '0x1BD4'          ; Тип шафтов
   VAR Kolvo = 10               ; Брать логов для одного крафта
   VAR k = 0, j, dagger
   dagger = UO.ObjAtLayer( 'Rhand' )
   UO.SetGlobal( 'instrtype', UO.GetGraphic( dagger ) )
   While TRUE
      UO.FindType( Logi, -1, Sunduk )   ; Ищем логи в сундуке
      If UO.FindCount() == 0 Then
         UO.Print("Logs not found, script terminated")
         return
      else
         j = UO.GetQuantity( 'finditem' )
         If j > Kolvo Then
            UO.Print( 'I can use ' + str( j ) + ' logs' )
         else
            UO.Print( "I can't use " + str( j ) + " logs" )
            return
         Endif
      Endif
      If Kolvo == 1 Then
         ; v. 1.03
         UO.Grab( '3', 'finditem' )
         wait(500)
         UO.FindType( Logi )
         UO.MoveItem( 'finditem', '2', Sunduk )
         wait(500)
      Else
         UO.Grab( Str( Kolvo ), 'finditem' )
         wait(500)
      Endif
      ; А это - динамическая пауза на мув
      while UO.Count( Logi ) < Kolvo
         wait(100)
      wend
      ; проверка на то, что в руках по-прежнему даггер
      If CheckInstr() == 0 Then
         UO.Print("You don't have daggers!" )
         return
      Endif
      UO.DeleteJournal()
      UO.CancelMenu()
      UO.WaitMenu ('What do you want to carve', 'shaft' )
      UO.WaitTargetType( Logi )
      UO.UseObject( dagger )
      k = 0
      while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
         k = k + 1
         wait(300)
      wend
      If UO.Count( Shafts ) > 0 then
         UO.FindType( Shafts, -1, -1 )
         UO.MoveItem( 'finditem', 0, Sunduk )
         wait(500)
         while UO.Count( Shafts ) > 0
            wait(100)
         wend
         UO.Print( 'Shafts moved' )
      Endif
   Wend
end sub

#####################################################################
; Bowcraft2. v.1.04b (c) Edred
;
; Чар берет из сундука шафты и перья, крафтит из них стрелы и
; складывает эти стрелы в этот же сундук.
; Если шафты или перья закончились - выход.
;
sub bowcraft2()
   VAR Sunduk = '0x405210C8'       ; Сериал сундука
   VAR Shafts = '0x1BD4'          ; Тип шафтов
   VAR Feather = '0x1BD1'         ; Тип перьев
   VAR Arrows = '0x0F3F'         ; Тип стрел
   VAR Kolvo = 1               ; Брать шафтов для одного крафта
   VAR k = 0, j
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   UO.CancelMenu()
   UO.AutoMenu ('Select arrow type', 'arrow' )
   While TRUE
      EatChar( Sunduk, 2, 1, 120 )
      If UO.Count( Shafts ) == 0 Then
         UO.FindType( Shafts, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print("Shafts not found, script terminated")
            return
         Endif
         UO.Grab( Str( Kolvo ), 'finditem' )
         wait(500)
         while UO.Count( Shafts ) < Kolvo
            wait(100)
         wend
         CheckLag()
      Endif
      If UO.Count( Feather ) == 0 Then      
         UO.FindType( Feather, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print("Feather not found, script terminated")
            return
         Endif
         UO.Grab( Str( Kolvo ), 'finditem' )
         wait(500)
         while UO.Count( Feather ) < Kolvo
            wait(100)
         wend
         CheckLag()
      Endif
      UO.DeleteJournal()
      UO.UseType( Shafts )
      k = 0
      while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
         k = k + 1
         wait(300)
      wend
      If UO.Count( Arrows ) > 0 then
         UO.FindType( Arrows, -1, -1 )
         UO.MoveItem( 'finditem', 0, Sunduk )
         wait(500)
         while UO.Count( Arrows ) > 0
            wait(100)
         wend
         UO.Print( 'Arrows moved' )
      Endif
   Wend
end sub

#####################################################################
sub poison()
; v. 1.02 (c) Edred
; Положите рядом с чаром на пол побольше меду и lesser poison,
; поставьте рядом сундук, занесите его сериал в переменную
; Sunduk (туда будут сбрасываться пустые бутылки и отравленный мед)
; Если что-то не берет - значит положили далеко от чара,
; поправьте цифру в команде set finddistance
;
   VAR Sunduk = '0x404331B7'
   VAR Med = '0x09EC'
   VAR LesPois = '0x0F0A'
   VAR EmpBot = '0x0F0E'
   VAR MedSer, k
   UO.Exec('set finddistance 2')
   While TRUE
      UO.FindType( Med, -1, 1 )
      If UO.FindCount() == 0 Then
         UO.Print("Jars not found, script terminated")
         return
      Endif
      UO.Grab( '1', 'finditem' )
      wait( 2000 )
      UO.FindType( LesPois, -1, 1 )
      If UO.FindCount() == 0 Then
         UO.Print("Bottle of Poison not found, script terminated")
         return
      Endif
      UO.Grab( '1', 'finditem' )
      wait( 2000 )
      UO.DeleteJournal()
      UO.WaitTargetType( Med )
      UO.UseObject( 'finditem' )
      k = 0
      while NOT UO.InJournal('You apply lesser poison') AND NOT UO.InJournal('You fail to apply lesser poison') AND ( k < 30 )
         k = k + 1
         wait(500)
      wend
      UO.Print( 'meda v pake ' + str( UO.Count( Med ) ) )
      if UO.Count( Med ) > 0 then
         UO.FindType( Med, -1, 'backpack' )
         UO.MoveItem( 'finditem', 0, Sunduk )
         wait( 2000 )
         UO.Print( 'Jar dropped' )
      end if
      if UO.Count( EmpBot ) > 0 then
         UO.FindType( EmpBot, -1, 'backpack' )
         UO.MoveItem( 'finditem', 0, Sunduk )
         wait( 2000 )
         UO.Print( 'Empty bottle dropped' )
      end if
   Wend
end sub

#####################################################################
; Training of Mining, ver 2.00b, (c) Edred
; 2.00b - добавляем сундук, откуда берется руда по 100 шт. и кидается
;         под ногм. Дальше как было. Заодно все правлю и переписываю
;         более правильно :)
sub Smelt()
   VAR Sunduk = '0x40437910'         ; Сериал сундука с рудой
   VAR Ruda1 = '0x19B9'            ; Тип руды
   VAR Ruda2 = '0x19B8'            ; Тип руды - 3 шт.
   VAR Ruda3 = '0x19BA'            ; Тип руды - 2 шт.
   VAR Ruda4 = '0x19B7'            ; Тип руды - 1 шт.
   VAR Ing1 = '0x1BEF'               ; Тип ингов металлов
   VAR Ing2 = '0x1BF2'               ; Тип ингов строймата
   VAR MaxVes = 200               ; Максимальный вес пака
   While UO.SkillVal( 'Mining' ) < 1000
      repeat   
         UO.Findtype( Ruda1, '-1', '1' )      ; Ищем руду на земле
         If UO.Findcount() == 0 Then
            UO.Findtype( Ruda2, '-1', '1' )
            If UO.Findcount() == 0 Then
               UO.Findtype( Ruda3, '-1', '1' )
               If UO.Findcount() == 0 Then
                  UO.Findtype( Ruda4, '-1', '1' )
                  If UO.Findcount() == 0 Then
                     If GetOre( Sunduk, Ruda1 ) == 0 Then
                        UO.Print( "No more ore for smelt..." )
                        Return
                     Endif
                  Endif
               Endif
            Endif
         Endif
      until UO.FindCount() > 0
      UO.Grab( '1', 'finditem' )
      Wait(500)
      CheckLag()
      UO.UseType( Ruda4 )            ; переплавляем
      Wait(500)
      CheckLag()
      If UO.Weight > MaxVes Then
         ; Максимальный вес пака превышен - разгружаемся
         UO.Findtype( Ing1 )
         If UO.Findcount() > 0 Then
            UO.MoveItem( 'finditem', '0', Sunduk )
            Wait(500)
            CheckLag()
         Endif
         UO.Findtype( Ing2 )
         If UO.Findcount() > 0 Then
            UO.MoveItem( 'finditem', '0', Sunduk )
            Wait(500)
            CheckLag()
         Endif
      Endif
   Wend
endsub

Sub GetOre( cont, typ )
   ; Взять из сундука 100 руды и бросить под ноги.
   ; Если руды нет - возвращаем 0, если есть 1
   UO.FindType( typ, '-1', cont )
   If UO.FindCount() == 0 Then
      return 0
   Else
      UO.Grab( '100', 'finditem' )
      wait(500)
      CheckLag()
      UO.FindType( typ )
      If UO.FindCount() == 0 Then
         UO.Print( 'Idiot! Your script is fuck!' )
      Else
         UO.Drophere( 'finditem' )
         wait(500)
         CheckLag()
      Endif
   Endif
   return 1
endsub

#####################################################################
; Tailoring. v.1.04b (c) Edred
;
; Два сундука: в одном много кожи и воска, а также лежит много пустых мешков.
; В другой чар будет класть мешки и наполнять их картами (по 200 штук в
; каждый).
;
; (1.04b) - переделываю. Все берется из одного сундука, и мат, и мешки.
; Переходим заодно на AutoMenu, вводим чеклаг и всякие доп проверки.
;
sub tailoring()
   VAR Sunduk1 = '0x4043310C'       ; Сериал сундука с пустыми мешками
   VAR Sunduk2 = '0x40403350'       ; Сериал пустого сундука
   VAR Meshok = '0x0E76'          ; Тип мешка
   VAR Shkur = '0x1067'          ; Тип шкур
   VAR Vosk = '0x1423'          ; Тип воска
   VAR Kit = '0x0F9D'          ; Тип инструмента тейлора
   VAR Map = '0x14EB'          ; Тип карты
   VAR Kolvo = 200          ; Брать шкур и воска
   VAR MeshSer, j, ShkurSer, k, i
   VAR Med = '0x09EC'         ; Тип меда
   VAR success = 'You put'
   VAR fizzle = 'fail'
   UO.CancelMenu()
   UO.AutoMenu( "Leather", "Blank's" )
   UO.AutoMenu("Blank's", "blank map" )
   While TRUE
      # Перекладываем один мешок в сундук 2
      UO.FindType( Meshok, '-1', Sunduk1 )    ; Ищем мешок в сундуке 1
      MeshSer = UO.GetSerial( 'finditem' )
      UO.MoveItem( MeshSer, '0', Sunduk2 )
      wait(500)
      CheckLag()
      i = 0
      repeat
         If UO.Count( Shkur ) < 10 Then
            If GetResource( Shkur, 200 - UO.Count( Shkur ), Sunduk1 ) == 0 Then
               return
            Endif
         Endif
         If UO.Count( Vosk ) < 10 Then
            If GetResource( Vosk, 200 - UO.Count( Vosk ), Sunduk1 ) == 0 Then
               return
            Endif
         Endif
         UO.Print('Ostalos ' + Str( UO.Count( Shkur ) ) + ' shkur' )
         DeleteJournal( success )
         DeleteJournal( fizzle )
         UO.FindType( Shkur )
         UO.WaitTargetObject( 'finditem' )
         UO.UseType( Kit )
         k = 0
         repeat
            k = k + 1
            wait(500)
         until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR ( k > 30 )
         If UO.Count( Map ) > 0 Then
            i = i + 1
            UO.FindType( Map )
            UO.MoveItem( 'finditem', '0', MeshSer )
            wait(500)
            CheckLag()
            UO.Print( str(i) + ' maps moved' )
         Endif
      Until i > 199
   Wend
endsub

#####################################################################
; Tailor2. v.1.05b (c) Edred
;
sub tailoring2()
   VAR Sunduk = "0x4043310C"
   VAR Kozha = "0x1067"
   VAR Vosk = "0x1423"
   VAR Kit = "0x0F9D"
   VAR Scrol = "0x0E34"
   VAR k
   UO.CancelMenu()
   wait(500)
   UO.AutoMenu( "Leather", "Blank's" )
   UO.AutoMenu( "Blank's", "blank scroll" )
   While TRUE
      If UO.Count( Kozha ) == 0 Then
         UO.FindType( Kozha, '-1', Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print("Leathers not found, script terminated")
            return
         Endif
         UO.Grab( '1', 'finditem' )
         wait(500)
         while UO.Count( Kozha ) == 0
            wait(100)
         wend
      Endif
      If UO.Count( Vosk ) == 0 Then
         UO.FindType( Vosk, '-1', Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print("Beeswaxs not found, script terminated")
            return
         Endif
         UO.Grab( '1', 'finditem' )
         wait(500)
         while UO.Count( Vosk ) == 0
            wait(100)
         wend
      Endif
      UO.DeleteJournal()
      UO.WaitTargetType( Kozha )
      UO.UseType( Kit )
      k = 0
      while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
         k = k + 1
         wait(300)
      wend
      if UO.Count( Scrol ) > 0 then
         UO.FindType( Scrol )
         UO.MoveItem( 'finditem', '0', Sunduk )
         wait( 500 )
         while UO.Count( Scrol ) > 0
            wait(100)
         wend
      endif
   Wend
   UO.CancelMenu()
end sub

#####################################################################
; Tinker. v.1.03b (c) Edred
;
; Чар берет из сундука инготы, крафтит из них бутылки
; и складывает эти бутылки в этот же сундук.
; Если инги закончились - выход.
;
sub tinker()
   VAR Sunduk = '0x4052561D'       ; Сериал сундука
   VAR Ingi = '0x1BEF'          ; Тип ингов
   VAR Instrum = '0x1EBC'          ; Тип инструмента тинкера
   VAR Bottle = '0x0F0E'          ; Тип бутылки
   VAR Kolvo = 200             ; Брать ингов
   VAR k = 0
   UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
                        ; Начало отсчета скрипта
   While TRUE
      EatChar( Sunduk, 2, 2, 60 )
      UO.FindType( Ingi, -1, Sunduk )   ; Ищем инги в сундуке
      If UO.FindCount() == 0 Then
         UO.Print("Iron Ingots not found, script terminated")
         return
      Endif
      UO.Grab( Str( Kolvo ), 'finditem' )
      wait( 2000 )
      While UO.Count( Ingi ) > 0
         ; Пока в паке есть инги
;         UO.CancelMenu()
         UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
         UO.DeleteJournal()
         UO.WaitMenu ('Tinkering', 'Tools', 'Tools', 'empty bottle' )
         UO.UseType( Instrum )
         k = 0
         while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
            k = k + 1
            wait(500)
         wend
         if UO.Count( Bottle ) > 0 then
            UO.FindType( Bottle, -1, -1 )
            UO.MoveItem( 'finditem', 0, Sunduk )
            wait( 1000 )
            UO.Print( 'Bottle moved' )
         end if
      Wend
   Wend
end sub

#####################################################################
; TinkerWood. v.1.02b (c) Edred
;
; Чар берет с пола логи, крафтит из них игровые доски
; и скидывает их в трэш.
; Если логи на полу закончились - выход.
;
sub tinkerwood()
   VAR MyTrash = '0x4042F38E'       ; Сериал мусорки
   VAR Logi = '0x1BDD'          ; Тип логов (logs type)
   VAR Instrum = '0x1EBC'          ; Тип инструмента тинкера
   VAR Chess = '0x0E1C'          ; Тип игровой доски
   VAR Kolvo = 300             ; Брать логов (Count of logs for a one grab)
   VAR j, k
   While TRUE
      UO.FindType( Logi, -1, 1 )       ; Ищем логи на полу
      UO.Grab( Str( Kolvo ), 'finditem' )    ; Кладем логи в пак
      wait( 1000 )
      If UO.FindCount() == 0 Then
         UO.Print("Logs not found, script terminated")
         return
      Endif
      While UO.Count( Logi ) > 4
         ; Пока в паке есть логи
         UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
         UO.DeleteJournal()
         UO.CancelMenu()
         UO.WaitMenu ('Tinkering', 'Tavern Types', 'Tavern Types', 'backgammon board' )
         UO.UseType( Instrum )
         k = 0
         while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
            k = k + 1
            wait(500)
         wend
         ; Wait( 14000 )
         ; Скрафтили доску
         ; Сразу переложим ее в трэш
         while UO.Count( Chess ) > 0
            UO.FindType( Chess )
            UO.MoveItem( 'finditem', 0, MyTrash )
            wait( 1000 )
            UO.Print( 'Backgammon board trashed' )
         wend
      Wend
   Wend
end sub

#####################################################################
; TinkerLockPick. v.1.00b (c) Edred
;
; Чар берет из сундука инготы, крафтит из них отмычки
; и складывает эти отмычки в этот же сундук.
; Если инги закончились - выход.
;
sub tinker()
   VAR Sunduk = '0x4052561D'       ; Сериал сундука
   VAR Ingi = '0x1BEF'          ; Тип ингов
   VAR Instrum = '0x1EBC'          ; Тип инструмента тинкера
   VAR LPick = '0x14FB'          ; Тип отмычки
   VAR Kolvo = 200             ; Брать ингов
   VAR k = 0
   UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
                        ; Начало отсчета скрипта
   While TRUE
      EatChar( Sunduk, 2, 2, 60 )
      UO.FindType( Ingi, -1, Sunduk )   ; Ищем инги в сундуке
      If UO.FindCount() == 0 Then
         UO.Print("Iron Ingots not found, script terminated")
         return
      Endif
      UO.Grab( Str( Kolvo ), 'finditem' )
      wait( 2000 )
      While UO.Count( Ingi ) > 0
         ; Пока в паке есть инги
;         UO.CancelMenu()
         UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
         UO.DeleteJournal()
         UO.WaitMenu ('Tinkering', 'Keys', 'Keys and Lockpicks', 'Iron lockpick' )
         UO.UseType( Instrum )
         k = 0
         while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
            k = k + 1
            wait(500)
         wend
         if UO.Count( LPick ) > 0 then
            UO.FindType( LPick, -1, -1 )
            UO.MoveItem( 'finditem', 0, Sunduk )
            wait( 1000 )
            UO.Print( 'Lockpicks moved' )
         end if
      Wend
   Wend
end sub

#####################################################################
; Carpentry. v.1.13b (c) Edred
;
; Чар берет из сундука 1 пустой мешок, кладет этот мешок в сундук 2,
; берет с пола логи, крафтит из них удочки и складывает эти удочки
; в этот мешок в сундуке 2. Если логи на полу или пустые мешки
; кончились - выход
;
sub carpentry()
   VAR Sunduk1 = '0x4017439B'       ; Сериал сундука с пустыми мешками
   VAR Sunduk2 = '0x4000F46C'       ; Сериал пустого сундука
   VAR Meshok = '0x0E76'          ; Тип мешка
   VAR Logi = '0x1BDD'          ; Тип логов
   VAR Rubanok = '0x1031'          ; Тип инструмента карпентера
   VAR Udochka = '0xDBF'          ; Тип удочки
   VAR Kolvo = 460          ; Брать логов (2 лога = 1 удочка)
   VAR MeshSer, j, k
   While TRUE
      UO.FindType( Logi, -1, 1 )       ; Ищем логи на полу
      UO.Grab( Str( Kolvo ), 'finditem' )    ; Кладем логи в пак
      wait( 2000 )
      If UO.FindCount() == 0 Then
         UO.Print("Logs not found, script terminated")
         return
      Endif
      UO.FindType( Meshok, -1, Sunduk1 )       ; Ищем мешок в сундуке 1
      MeshSer = UO.GetSerial( 'finditem' )
      UO.Grab( '1', 'finditem' )          ; Кладем его в бэкпак
      wait( 2000 )
      UO.MoveItem( MeshSer, 0, Sunduk2 )
      wait( 2000 )
      While UO.Count( Logi ) > 0
         ; Пока в паке есть логи
         UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
         UO.DeleteJournal()
         UO.CancelMenu()
         UO.WaitMenu ('Carpentry', 'Fishing Poles', 'Fishing Poles', 'fishing pole' )
         UO.UseType( Rubanok )
         k = 0
         while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
            k = k + 1
            wait(500)
         wend
         ; Wait( 14000 )
         ; Скрафтили удочку
         ; Сразу переложим ее в мешок
         if UO.Count( Udochka ) > 0 then
            UO.FindType( Udochka, -1, 'backpack' )
            UO.MoveItem( 'finditem', 0, MeshSer )
            wait( 2000 )
            UO.Print( 'Udochka perelozhena' )
         end if
      Wend
   Wend
end sub

#####################################################################
; Carpentry. v.1.14D (c) Edred
;
; Чар берет берет с пола логи, крафтит из них удочки и скидывает удочки
; в трэш. Если логи на полу кончились - выход.
; (Get logs from ground and craft fishing pole. Move fishing pole trash)
;
; v. 1.13D Special Edition (for Democratic)
; v. 1.14D Special Edition (for Chyzzzz): берем логи из сундука. Заодно
;          немного причесываю скрипт и переходим на Automenu.
;
sub carpentryD()
   VAR MyTrash = '0x4017439B'       ; Сериал мусорки (ID of trash)
   VAR Sunduk = '0x4017439B'      ; Сериал сундука с логами
   VAR Logi = '0x1BDD'          ; Тип логов (logs type)
   VAR Rubanok = '0x1031'          ; Тип инструмента (carpentry tools type)
   VAR Udochka = '0xDBF'          ; Тип удочки (fishing pole type)
   VAR Kolvo = 200          ; Брать логов (Count of logs for a one grab)
   VAR j, k, sum = 0
   UO.CancelMenu()
   UO.AutoMenu ('Carpentry', 'Fishing Poles' )
   UO.AutoMenu ('Fishing Poles', 'fishing pole' )
   UO.UseObject( Sunduk )
   wait(1000)
   CheckLag()
   While UO.SkillVal( 'Carpentry' ) < 1000
      UO.FindType( Logi, '-1', Sunduk )   ; Ищем логи в сундуке
      UO.Grab( Str( Kolvo ), 'finditem' )    ; Кладем логи в пак
      wait( 1000 )
      If UO.FindCount() == 0 Then
         UO.Print("Logs not found, script terminated")
         return
      Endif
      While UO.Count( Logi ) > 0
         ; Пока в паке есть логи
         UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
         UO.DeleteJournal()
         UO.UseType( Rubanok )
         k = 0
         repeat
            k = k + 1
            wait(500)
         until UO.InJournal('You put') OR UO.InJournal('fail') OR ( k > 30 )
         If UO.InJournal('You put') Then
            sum = sum + 1
            UO.Print( 'Crafted ' + str(sum) + ' fishing poles' )
         Endif
         while UO.Count( Udochka ) > 0
            UO.FindType( Udochka )
            UO.MoveItem( 'finditem', '0', MyTrash )
            wait( 500 )
            CheckLag()
         Wend
      Wend
   Wend
endsub

#####################################################################
; Cartography. v.1.02b (c) Edred
;
; Ищем в сундуке 1 мешок с картами, берем по очереди из него карты,
; качаем на них картографию (с повторами в случае физлов), потом скидываем
; карты в трэш. Если мешки кончились - выход.
;
; 1.02 - добавил кормежку и прокачку спирит спика. Убрал заодно "ересь".
;        По-хорошему, скрипт надо переписать, структура рыхлая, но лень
;
sub cartograph()
   VAR Sunduk1 = '0x40403350'       ; Сериал сундука с мешками с картами
   VAR Trash = '0x403D6BCA'      ; Сериал мусорного ведра
   VAR Meshok = '0x0E76'          ; Тип мешка
   VAR Map = '0x14EB'             ; Тип карты
   VAR Fizzle = 'Thy trembling hand results'
   VAR Success = 'You put the map in your pack'
   VAR MeshSer, j, k, MapSer, flag
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   VAR SpiritTime = UO.Timer()
   UO.CancelMenu()
   UO.IgnoreReset()
   UO.AutoMenu( 'What sort of map', 'Sea Chart' )
   UO.FindType( Meshok, '-1', Sunduk1 )
   While UO.FindCount() > 0
      EatChar( Sunduk1, 2, 1, 120 )
      MeshSer = UO.GetSerial( 'finditem' )
      UO.UseObject( MeshSer )
      wait(500)
      CheckLag()
      UO.FindType( Map, '-1', MeshSer )
      While UO.FindCount() > 0
         MapSer = UO.GetSerial( 'finditem' )
         UO.Grab( '1', 'finditem' )
         repeat
            wait(100)
         until UO.Count( Map ) == 1
         flag = 0
         While flag == 0
            DeleteJournal( Fizzle )
            DeleteJournal( Success )
            UO.UseObject( MapSer )
            k = 0
            repeat
               k = k + 1
               wait(100)
            until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR k > 1200
            If UO.InJournal( Success ) OR k > 1200 Then
               flag = 1
            Endif
         Wend
         UO.FindType( Map )
         While UO.FindCount() > 0            
            UO.MoveItem( 'finditem', '0', Trash )
            wait(1000)
            CheckLag()
            UO.FindType( Map )
         Wend
         If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
            ; Прошло 5 минут с момента последней прокачки Spirit Speak
            SpSpeak()
            SpiritTime = UO.Timer()
         Endif
         UO.FindType( Map, '-1', MeshSer )
      Wend
      UO.Ignore( MeshSer )
      UO.FindType( Meshok, '-1', Sunduk1 )
   Wend
   UO.IgnoreReset()
   UO.CancelMenu()
endsub

#####################################################################
; Inscription. v.1.04b (c) Edred
;
; Берем из сундука blank scroll, nightshade, black pearl,
; крафтим из них скролл Magic Arrow (с повторами в случае физлов),
; потом скидываем готовый скролл в тот же сундук.
; Если что-либо кончилось - выход.

sub inscript1()
   VAR Sunduk = '0x404CFAA3'       ; Сериал сундука с бланкскроллами и регами
   VAR Blank = '0x0E34'          ; Тип бланк скролла
   VAR Arrow = '0x1F5F'         ; Тип скроллов Flame Strike
   VAR Reg1 = '0x0F8C'            ; SA
   VAR Reg2 = '0x0F8D'            ; SS
   VAR Fizzle = 'You fail to inscribe the scroll'
   VAR Success = 'You put the'
   VAR k
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   VAR SpiritTime = UO.Timer()
   UO.CancelMenu()
   UO.AutoMenu( 'Spell Circles', 'Seventh Circle' )
   UO.AutoMenu( 'Spell Circle 7', 'Flamestrike' )
   UO.UseObject( Sunduk )
   wait(1000)
   While UO.SkillVal( 'Inscription' ) < 1000
      ; берем бланк скроллы
      EatChar( Sunduk, 2, 1, 120 )
      If UO.Count( Blank ) == 0 Then
         UO.FindType( Blank, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Blank Scroll not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Blank ) > 0
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Blank ) == 100
            CheckLag()
         Endif
      Endif
      ; берем найтшэд
      If UO.Count( Reg1 ) == 0 Then
         UO.FindType( Reg1, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Nightshade not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg1 ) > 0
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg1 ) == 100
            CheckLag()
         Endif
      Endif
      ; берем блэкперл
      If UO.Count( Reg2 ) == 0 Then
         UO.FindType( Reg2, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Black Pearls not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg2 ) > 0
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg2 ) == 100
            CheckLag()
         Endif
      Endif
      repeat
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Blank )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
         If UO.Mana < 50 Then
            repeat
               UO.UseSkill( 'Meditation' )
               wait(2000)
            until UO.Mana == UO.Int
         Endif
         If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
            ; Прошло 5 минут с момента последней прокачки Spirit Speak
            SpSpeak()
            SpiritTime = UO.Timer()
         Endif
      Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
      While UO.Count( Arrow ) > 0
         UO.FindType( Arrow )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', 0, Sunduk )
            wait(1000)
            CheckLag()
         Endif
      Wend
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; Inscription2. v.1.05b (c) Edred
;
; Берем из сундука blank scroll, blood pearl, black moss, mandrake root
; крафтим из них скролл Recall (с повторами в случае физлов),
; потом скидываем готовый скролл в тот же сундук.
; Если что-либо кончилось - выход.

sub inscript2()
   VAR Sunduk = '0x40140DD1'       ; Сериал сундука с бланкскроллами и регами
   VAR Blank = '0x0E34'          ; Тип бланк скролла
   VAR Arrow = '0x1F4C'         ; Тип скроллов Recall
   VAR Reg1 = '0x0F86'            ; mandrake root
   VAR Reg2 = '0x0F7A'            ; black pearl
   VAR Reg3 = '0x0F7B'            ; blood moss
   VAR Fizzle = 'You fail to inscribe the scroll'
   VAR Success = 'You put the'
   VAR k
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   VAR SpiritTime = UO.Timer()
   UO.CancelMenu()
   UO.AutoMenu( 'Spell Circles', 'Fourth Circle' )
   UO.AutoMenu( 'Spell Circle 4', 'Recall' )
   UO.UseObject( Sunduk )
   wait(1000)
   While UO.SkillVal( 'Inscription' ) < 1000
      ; берем бланк скроллы
      EatChar( Sunduk, 2, 1, 120 )
UO.Print( 'test2' )
      If UO.Count( Blank ) == 0 Then
         UO.FindType( Blank, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Blank Scroll not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Blank ) > 0
            wait(100)
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Blank ) == 100
            wait(100)
            CheckLag()
         Endif
      Endif
      ; берем mandrake root
      If UO.Count( Reg1 ) == 0 Then
         UO.FindType( Reg1, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Mandrake Root not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg1 ) > 0
            wait(100)
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg1 ) == 100
            wait(100)
            CheckLag()
         Endif
      Endif
      ; берем black pearl
      If UO.Count( Reg2 ) == 0 Then
         UO.FindType( Reg2, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Black Pearls not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg2 ) > 0
            wait(100)
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg2 ) == 100
            wait(100)
            CheckLag()
         Endif
      Endif
      ; берем blood moss
      If UO.Count( Reg3 ) == 0 Then
         UO.FindType( Reg3, -1, Sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'Blood Moss not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) < 100 Then
            UO.Grab( '0', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg3 ) > 0
            CheckLag()
         Else
            UO.Grab( '100', 'finditem' )
            repeat
               wait(100)
            until UO.Count( Reg3 ) == 100
            CheckLag()
         Endif
      Endif
      repeat
;         If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
;            ; Прошло 5 минут с момента последней прокачки Spirit Speak
;            SpSpeak()
;            SpiritTime = UO.Timer()
;         Endif
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Blank )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal(Fizzle) OR UO.InJournal(Success) OR UO.Count(Blank)==0 OR UO.Count(Reg1)==0 OR UO.Count(Reg2)==0 OR UO.Count(Reg3)==0 OR k > 600
         If UO.Mana < 10 Then
            repeat
               UO.UseSkill( 'Meditation' )
               wait(2000)
            until UO.Mana == UO.Int
         Endif
      Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR UO.Count( Reg3 ) == 0
UO.Print( 'test1' )
      While UO.Count( Arrow ) > 0
         UO.FindType( Arrow )
         If UO.FindCount() > 0 Then
            UO.MoveItem( 'finditem', 0, Sunduk )
            wait(1000)
            CheckLag()
         Endif
      Wend
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; Veterinar. v.1.08 (c) Edred
;
; Ставим рядом двух чаров, у каждого по лошади. Рядом с чарами
; сундук. В сундук чистые бинты. Сериалы лошадей каждому в скрипт.
; Стравливаем лошадей (можно использовать скрипт provocat2.sc) и
; качаемся. Внимание! При низком скилле за работой скрипта надо
; следить (одним чаром, вытащив на экран статусы обоих лошадей) и
; периодически садиться на лошадь и отъезжать в сторону, слезать с нее
; и давать обоим чарам вылечить лошадей полностью. После 40-45 скилла
; нужда в этом отпадает (скилл растет быстро).
;
sub Veterinar()
   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.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)
      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

#####################################################################
; 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 = '0x00E4'
   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', '3' )
   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)
         Else
            wait(500)
         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)
         Else
            wait(500)
         Endif
      Else
         wait(300)
      Endif
   Wend
endsub
   
#===================================================================#
#
# I. Прокачка других скиллов
#
#####################################################################
sub Magery()
   ; ver. 2.01 (c) Edred
   ;
   ; Вводим сундук (пак) с найтшэдом, вводим подкормку чара.
   ;
   VAR sunduk = '0x40531245'
   VAR targ = '0x4041C420'
   VAR mir = 'You are at peace'
   VAR NS = '0x0F88'
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   UO.UseObject( sunduk )
   wait(1000)
   CheckLag()
   While UO.SkillVal( 'Magery' ) < 1000
      If UO.Count( NS ) == 0 Then
         UO.Findtype( NS, '-1', sunduk )
         If UO.FindCount() == 0 Then
            UO.Print( 'NightShade not found, script terminated' )
            return
         Endif
         UO.MoveItem( 'finditem', '100' )
         wait(500)
         CheckLag()
      Endif
      If UO.Mana < 20 Then
         DeleteJournal( mir )
         repeat
            UO.UseSkill( 'Meditation' )
            wait(2000)
         until UO.InJournal( mir )
         EatChar( sunduk, 2, 1, 60 )
      Endif
      UO.WaitTargetObject( targ )
      UO.Cast( 'Poison' )
      wait(3000)
   Wend
endsub

#####################################################################
sub music()
   VAR Gitara = '0x0EB4'   ; тип балалайки
   repeat
      UO.UseType( Gitara )
      wait(2000)
   until UO.Dead()
endsub

#####################################################################
sub provocat()
; Provocation
   VAR Horse1 = '0x004033E5'   ; лошадь 1
   VAR Horse2 = '0x0040349F'   ; лошадь 2
   repeat
      UO.WaitTargetObject( Horse1, Horse2 )
      UO.UseSkill( 'Provocation' )
      wait(2000)
   until UO.Dead()
endsub

#####################################################################
sub entic()
; Enticement
   VAR Horse1 = '0x004033E5'   ; лошадь 1
   repeat
      UO.WaitTargetObject( Horse1 )
      UO.UseSkill( 'Enticement' )
      wait(1000)
   until UO.Dead()
endsub

#####################################################################
; Forensic. v.1.00b (c) Edred
;
sub forensic()
   UO.WarMode( 0 )
   repeat
      UO.DeleteJournal()
      UO.WaitTargetObject( 'lastcorpse' )
      UO.UseSkill( 'Forensic' )
      repeat
         wait(100)
      until UO.InJournal( "This is the corpse" ) OR UO.InJournal( "This is Body" ) OR UO.InJournal( "You can tell nothing" ) OR UO.InJournal( "You can't see the target" )
   until UO.InJournal( "You can't see the target" )
   UO.WarMode( 1 )
endsub

#####################################################################
sub Hidonly()
   while UO.SkillVal( 'Hiding' ) < 1000
      UO.UseSkill('Hiding')
      Wait(4000)
   wend
endsub

#####################################################################
sub HidStealth()
;   while UO.SkillVal( 'Hiding' ) < 1000 AND UO.SkillVal( 'Stealth' ) < 1000
   while UO.DEX < 100
      while (UO.GetX() <> 1852)
         GoHide()
         UO.Press( 36 )
         wait(1000)
      wend
      while (UO.GetX() <> 1864)
         GoHide()
         UO.Press( 34 )
         wait(1000)
      wend
   wend
endsub

#####################################################################
sub macef()
   VAR Kukla = '0x40429852', flag = 1
   VAR maul = '0x143A'
   while UO.SkillVal( 'Mace Fighting' ) < 600
      flag = GetDagger( maul )
      If flag == 0 Then
         UO.Print( 'Maul not found!' )
         return
      Endif
      UO.UseObject( Kukla )
      wait(4000)
      If UO.Life < 100 Then
         UO.SayU( 'Guards!' )
      Endif
   wend
endsub

#####################################################################
sub fencing()
   VAR Kukla = '0x40429852', flag = 1
   VAR Dagger = '0x0F51'
   while UO.SkillVal( 'Fencing' ) < 600
      flag = GetDagger( Dagger )
      If flag == 0 Then
         UO.Print( 'Dagger not found!' )
         return
      Endif
      UO.UseObject( Kukla )
      wait(4000)
      If UO.Life < 50 Then
         UO.SayU( 'Guards!' )
      Endif
   wend
endsub

#####################################################################
sub swordsman()
   VAR Kukla = '0x40429852', flag = 1
   VAR sword = '0x13FE'
   while UO.SkillVal( 'Swordsmanship' ) < 600 OR UO.Str < 150
      flag = GetDagger( sword )
      If flag == 0 Then
         UO.Print( 'Katana not found!' )
         return
      Endif
      UO.UseObject( Kukla )
      wait(4000)
      If UO.Life < 50 Then
         UO.SayU( 'Guards!' )
      Endif
   wend
endsub

#####################################################################
sub Intell()
   VAR Anima = '0x005F631D'
   VAR ms1 = "a horse looks superhumanly strong"
   VAR ms2 = "think of anything"
   VAR ms3 = "it is loyal"
   VAR ms4 = "a horse looks dumb as a rock"
   VAR ms5 = "You cannot seem to judge"
   VAR k
   while UO.SkillVal( 'Evaluating Intelligence' ) < 1000
      DeleteJournal( ms1 )
      DeleteJournal( ms2 )
      UO.WaitTargetObject( Anima )
      UO.UseSkill( 'Anatomy' )
      CheckLag()
      k = 0
      repeat
         wait(100)
         k = k + 1
      until UO.InJournal( ms1 ) OR UO.InJournal( ms2 ) OR k > 30
      DeleteJournal( ms3 )
      DeleteJournal( ms2 )
      UO.WaitTargetObject( Anima )
      UO.UseSkill( 'Animal Lore' )
      CheckLag()      
      k = 0
      repeat
         wait(100)
         k = k + 1
      until UO.InJournal( ms3 ) OR UO.InJournal( ms2 ) OR k > 30
      DeleteJournal( ms4 )
      DeleteJournal( ms5 )
      DeleteJournal( ms2 )
      UO.WaitTargetObject( Anima )
      UO.UseSkill( 'Evaluating Intelligence' )
      CheckLag()
      k = 0
      repeat
         wait(100)
         k = k + 1
      until UO.InJournal( ms4 ) OR UO.InJournal( ms5 ) OR UO.InJournal( ms2 ) OR k > 30
   wend
endsub

#===================================================================#
# CAMPING                                                           #
#===================================================================#
#   v.1.04b (с) Edred                                               #
#===================================================================#
; Берем в пак 200 хвороста и реги, реколлимся по руне туда где можно
; жечь костры, врубаем медитацию, отделяем по 1 шт. хвороста, кладем их
; вокруг чара с трех сторон, дважды щелкаем по этим кучкам хвороста
; для их разжигания (с повторами в случае физлов). Отходим назад
; (направление на правый нижний угол - клавиша "3" на нумпаде).
; Повторям последнюю операцию пока чар не придет в точку FinalX.
; Реколлимся на базу, добираем из ящика хворост и реги. И по кругу.
;
; Разметьте руну где-нибудь в непосещаемом городе, прогуляйтесь шагов
; на 30-50 по диагонали по направлению цифры 3 на нумпаде, занесите
; координату X этой точки в FinalX (для надежности и защиты от лагов
; будет лучше если в этой точке чар упрется в стенку). На базе рядом
; с реколлкой поставьте сундук и в него положите много хвороста (можно
; одной "неподьъемной" кучкой и побольше регов для реколла.
; Занесите руну в этот город в ту же рунбуку, где и руна на базу.
;
sub camping()
   DIM Regs[3]
   Regs[0] = '0x0F7A'         ; Black Pearl
   Regs[1] = '0x0F7B'         ; Bood Moss
   Regs[2] = '0x0F86'         ; Mandrake Root
   VAR Hvorost = '0x0DE1'
   VAR flag, myx, myy, myz, fin, i
   VAR FinalX = 1350
   VAR Sunduk = '0x40591B82'
   VAR RuneToBase = '20'
   VAR RuneToFire = '30'
   ;
   ; Стартуем стоя в начале пути.
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   UO.Exec( 'set finddistance 3' )
   While UO.SkillVal( 'Camping' ) < 1000
      fin = 0
      UO.UseSkill( 'Meditation' )
      UO.FindType ( Hvorost )
      While ( UO.FindCount() > 0 ) AND ( fin == 0 )
         myx = UO.GetX()
         myy = UO.GetY()
         myz = UO.GetZ()
         UO.MoveItem('finditem', '1', 'ground', str(myx-1), str(myy), str(myz))
         wait(1000)
         CheckLag()
         UO.FindType ( Hvorost )
         UO.MoveItem('finditem', '1', 'ground', str(myx), str(myy+1), str(myz))
         wait(1000)
         CheckLag()
         UO.FindType ( Hvorost )
         UO.MoveItem('finditem', '1', 'ground', str(myx), str(myy-1), str(myz))
         wait(1000)
         CheckLag()
         UO.Findtype( Hvorost, -1, 1 )
         While UO.FindCount() > 0 AND NOT UO.InJournal( "You can't ignite several" )
            repeat
               flag = 1
               DeleteJournal( "You fail to ignite" )
               DeleteJournal( "You can't ignite several" )
               DeleteJournal( "You must wait" )
               UO.UseFromGround( Hvorost )
               wait(1000)
               CheckLag()
               If UO.InJournal( "You must wait" ) OR UO.InJournal( "You fail to ignite" ) Then
                  flag = 0
                  wait(1000)
               Endif
               If UO.InJournal( "You can't ignite several" ) Then
                  UO.FindType( Hvorost, -1, 1 )
                  While UO.FindCount() > 0
                     If UO.GetQuantity( 'finditem' ) > 1 Then
                        UO.Grab( str( UO.GetQuantity( 'finditem' ) - 1 ), 'finditem' )
                        wait(1000)
                        CheckLag()
                     Endif
                     UO.Ignore( 'finditem' )
                     UO.FindType( Hvorost, -1, 1 )
                  Wend
                  UO.IgnoreReset()
               Endif
            until flag
            UO.Findtype( Hvorost, -1, 1 )
         Wend
         While ( UO.GetX() < myx + 1 ) AND ( fin == 0 )
            UO.Press( 34 )
            wait(300)
            CheckLag()
            If UO.GetX() == FinalX Then
               fin = 1
            Endif
         Wend
         UO.FindType ( Hvorost )
      Wend
      ; достигли конца маршрута или кончился хворост
      Recalling( 'CommonRunbook', RuneToBase )
      UO.UseObject( Sunduk )
      wait(1000)
      CheckLag()
      for i = 0 To 2
         If UO.Count( Regs[i] ) < 6 Then
            ; этого рега меньше 6
            UO.FindType( Regs[i], '-1', Sunduk )
            UO.Grab( str( 6 - UO.Count( Regs[i] ) ), 'finditem' )
            Wait( 1000 )
            CheckLag()
         Endif
      next
      If UO.Count( Hvorost ) < 200 Then
         ; хвороста меньше 200
         UO.FindType( Hvorost, '-1', Sunduk )
         UO.Grab( str( 200 - UO.Count( Hvorost ) ), 'finditem' )
         Wait( 1000 )
         CheckLag()
      Endif
      EatChar( Sunduk, 2, 1, 60 )
      Recalling( 'CommonRunbook', RuneToFire )
   Wend
endsub

#===================================================================#
# COOKING                                                           #
#===================================================================#
#   v.1.05b (с) Edred                                               #
#===================================================================#
;
; Встаем рядом среколлкой на базе, рядом с чаром в АМЗ ставим сундук или
; ящик. В него раскладываем много кучек хвороста не больше чем по 500
; в кучке (иначе чар не сможет взять 1 шт.) и кладем несколько стопок стейков
; (можно по 10к в стопке). Можно туда же добавить меда - уберите комментарий
; с EatChar() и добавьте эту функцию.
; Берем из сундука 1 шт хвороста, кладем в координаты TX, TY и зажигаем ее.
; Потом берем 1 шт. стейков из этого же сундука и жарим
; на костре или углях. При этом перед жаркой проверяем, есть ли в
; вокруг чара огонь или угли. если есть жарим, иначе опять жгем костер.
; Готовый стейк скидывается в этот же сундук.
;
; Перед разжиганием костра проверяем, прошло ли 5 минут с момента последней
; попытки прокачать Spirit Speak, если прошло - качаем.
;
sub cooking()
   VAR Sunduk = '0x40591B82'
   VAR Hvorost = '0x0DE1'
   VAR Koster = '0x0DE3'
   VAR Ugli = '0x0DE9'
   VAR Fish = '0x097A'
   VAR FishGot = '0x097B'
   VAR TX = 1873
   VAR TY = 387
   VAR i, flag
   VAR SpiritTime = UO.Timer()
   UO.CancelTarget()
   UO.Exec( 'set finddistance 3' )
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   UO.UseObject( Sunduk )
   While UO.SkillVal( 'Cooking' ) < 1000
;      EatChar( Sunduk, 2, 1, 120 )
# ----------------------------------
# блок запуска прокачки Spirit Speak
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Endif
# ----------------------------------
      wait(1000)
      UO.FindType( Hvorost, -1, Sunduk )
      If UO.FindCount() == 0 Then
         UO.Print( 'No kindling found. Script terminated' )
         return
      Endif
      UO.MoveItem( 'finditem', '1', 'ground', str(TX), str(TY), str(UO.GetZ()) )
      wait(1000)
      CheckLag()
      UO.Findtype( Hvorost, -1, 1 )
;      wait(1000)
      If UO.FindCount() > 0 Then
         repeat
            UO.UseFromGround( Hvorost )
            wait(1000)
            UO.FindType( Koster, -1, 1 )
         until UO.FindCount() > 0
         ; костер горит
         flag = 1
         repeat
            ; взять из сундука 1 стейк
            If UO.Count( Fish ) == 0 Then
               UO.FindType( Fish, -1, Sunduk )
               If UO.FindCount() == 0 Then
                  UO.Print( 'No fish steaks found. Script terminated' )
                  return
               Endif
               UO.Grab( '1', 'finditem' )
;               repeat
;                  wait(100)
;               until UO.Count( Fish ) > 0
               wait(1000)
               CheckLag()
            Endif
            ; теперь проверим не погас ли костер, не исчезли ли угли
            UO.FindType( Koster, -1, 1 )
            If UO.FindCount() <> 0 Then
               ; еще горит костер - жарим на нем стейк
               If UseSteake( Fish, UO.GetSerial('finditem') ) Then
                  flag = 0
               Endif
               ; стейк готов
            Else
               UO.FindType( Ugli, -1, 1 )
               If UO.FindCount() <> 0 Then
                  ; есть еще угли!
                  if UseSteake( Fish, UO.GetSerial('finditem') ) then
                     flag = 0
                  endif
               Else
                  flag = 0
               Endif
            Endif
            If UO.Count( FishGot ) > 0 Then
               UO.FindType( FishGot )
               UO.MoveItem( 'finditem', -1, Sunduk )
;               repeat
;                  wait(100)
;               until UO.Count( FishGot ) == 0
               wait(1000)
               CheckLag()
            Endif
         until flag == 0
      Endif
   Wend
endsub

Sub UseSteake( fish, koster )
   VAR msg1 = 'You burn the food'            ; физл
   VAR msg2 = 'You put the fish steak'         ; успех
   VAR msg22 = 'You put the fish steaks'      ; успех
   VAR msg3 = 'You must wait'               ; ждать
   VAR msg4 = "You can't see the target"
   repeat
      DeleteJournal (msg1 )
      DeleteJournal (msg2 )
      DeleteJournal (msg22 )
      DeleteJournal (msg3 )
      DeleteJournal (msg4 )
      UO.WaitTargetObject( 'finditem' )
      UO.UseType( Fish )
      repeat
         wait(500)
      until UO.InJournal(msg1) OR UO.InJournal(msg2) OR UO.InJournal(msg22) OR UO.InJournal(msg3) OR UO.InJournal(msg4)
      if UO.InJournal(msg4) then
         return 1
      endif
      if UO.InJournal(msg3) then
         wait(500)
      endif
   until UO.InJournal(msg2) OR UO.InJournal(msg22)
   return 0
endsub

sub NechegoDelat()
   SpSpeak()
   VAR SpiritTime = UO.Timer()
   repeat
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Else
         wait(500)
      Endif
   until UO.Dead()
endsub

#####################################################################
; Herding v.1.02b (c) Edred
;
; Для прокачки потребуются две лошади (ламы или другие животные)
; и два щита (или какие-то другие объекты). Кладем щиты на пол в доме
; в паре шагов от чара (не стопкой, в соседние тайлы) и ставим обеих
; лошадей рядом с чаром. Чару в руку посох (одного посоха хватит на всю
; прокачку). Вносим серийники лошадей и щитов в соответствующие переменные.
; Поехали. Блоки, отвечающие за подкормку чара и прокачку
; Spirit Speak закомментарены.
;
sub Herding()
   VAR Horse = '0x0040D2A1'
   VAR Horse2 = '0x005AF4B1'   
   VAR Targ = '0x404215E8'
   VAR Targ2 = '0x404214EF'
   VAR Sunduk = '0x404E5494'
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   VAR success = "The animal goes where it is instructed"
   VAR fizzle = "You don't seem"
   VAR SpiritTime = UO.Timer()
   UO.UseObject( Sunduk )
   wait(1000)
   CheckLag()
   While UO.SkillVal( 'Herding' ) < 1000
      EatChar( Sunduk, 2, 1, 120 )
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Endif
      DeleteJournal( success )
      DeleteJournal( fizzle )
      UO.WaitTargetObject( Horse, Targ )
      UO.UseObject( UO.ObjAtLayer( 'Lhand' ) )
      repeat
         wait(100)
      until UO.InJournal( fizzle ) OR UO.InJournal( success )
      If UO.InJournal( success ) Then
         ; вторая животина
         DeleteJournal( success )
         UO.WaitTargetObject( Horse2, Targ2 )
         UO.UseObject( UO.ObjAtLayer( 'Lhand' ) )
         repeat
            wait(100)
         until UO.InJournal( fizzle ) OR UO.InJournal( success )
      Endif
   Wend
endsub


Top
   
 Post subject:
PostPosted: 2006-03-10 18:25:50 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
окончание файла SkillUp.sc (в один пост не влезло)

Code:
#####################################################################
; Lockpicking v.1.01b (c) Edred
;
sub Lockpicking()
   VAR SundukFrom = '0x404CF9CF'
   VAR SundukTarg = '0x401EA0CA'
   VAR KeyTarg = '0x401EA0C9'
   VAR LockType = '0x14FB'
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   DIM LockColor[3], SkUp[3]
   LockColor[0] = '0x0000'      ; айрон
   LockColor[1] = '0x060A'      ; дулл купер
   LockColor[2] = '0x0488'      ; бронза
   LockColor[3] = '0x08A5'      ; золото
   SkUp[0] = 299            ; уровень скилла выше которого качать железными отмычками
   SkUp[1] = 499            ; уровень скилла выше которого качать медными отмычками   
   SkUp[2] = 499            ; уровень скилла выше которого качать бронзовыми отмычками
   SkUp[3] = 599            ; уровень скилла выше которого качать золотыми отмычками   
   VAR fizzle = "You can't open this."
   VAR success = "You open this."
   VAR locked = "You close this chest."
   VAR TimeLimit = 3000
   VAR trycount = 0, succount = 0
   VAR i, j, needcolor, k, end
   VAR SpiritTime = UO.Timer()
   UO.UseObject( SundukFrom )
   wait(1000)
   CheckLag()
   while UO.SkillVal( 'Lockpicking' ) < 1000
      If UO.Count( LockType ) == 0 Then
         EatChar( SundukFrom, 6, 2, 120 )
         j = 0
         For i = 0 To 3
            If SkUp[i] < UO.SkillVal( 'Lockpicking' ) Then
               j = i
            Endif
         Next
         needcolor = LockColor[j]
         UO.FindType( LockType, needcolor, SundukFrom )
         If UO.FindCount() == 0 Then
            UO.Print( 'Lockpicks not found. Script terminated' )
            return
         Endif
         If UO.GetQuantity( 'finditem' ) > 100 Then
            UO.Grab( '100', 'finditem' )
         Else
            UO.Grab( 'finditem' )
         Endif
         wait(1000)
         CheckLag()
      Endif
      While UO.Count( LockType ) > 0
         If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
            ; Прошло 5 минут с момента последней прокачки Spirit Speak
            SpSpeak()
            SpiritTime = UO.Timer()
         Endif
         trycount = trycount + 1
         UO.Print( 'You have ' + str( UO.Count( LockType ) ) + ' lockpicks.' )
         UO.Print( 'You have ' + str( succount ) + ' success attempt' )
         UO.Print( 'You get ' + str( trycount ) + ' attempt'  )
         DeleteJournal( fizzle )
         DeleteJournal( success )
         UO.WaitTargetObject( SundukTarg )
         UO.UseType( LockType )
         k = 0
         repeat
            wait(100)
            k = k + 1
         until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR k > TimeLimit
         If UO.InJournal( success ) Then
            DeleteJournal( locked )
            succount = succount + 1
            UO.WaitTargetObject( SundukTarg )
            UO.UseObject( KeyTarg )
            repeat
               wait(100)
            until UO.InJournal( locked )
         Endif
      Wend
   Wend
endsub

#####################################################################
; Begging v.1.07 (c) Edred
;
; Встаем около какого-нибудь вендора (лучше двух) и запускаем скрипт.
; Чар найдет вендора (или обоих), определит их сериалы, будет у них
; попрошайничать (чередуя после успеха) и в случае успеха скидывать
; деньги обратно на вендора (на Цитадели попрошайничать надо голым
; с пустым паком и банком). Заодно качается спиритспик.
;
sub Begging()
   VAR VendTyp1 = '0x0191'
   VAR VendTyp2 = '0x0190'
   VAR VendSer, VendSer1 = '', VendSer2 = '', k
   VAR Dengi = '0x0EED'
   VAR dal = 'Here, you can have this'
   VAR poslal = "I'm sorry,"
   VAR daleko = 'is too far away!'
   VAR chasto = 'You must wait to use that skill again.'
   VAR SpiritTime = UO.Timer()
   UO.Set( 'finddistance', '3' )
   #### Блок нахождения 1 или 2 вендоров
   UO.Ignore( 'self' )
   UO.FindType( VendTyp1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( VendTyp2, '-1', '1' )
      If UO.FindCount() == 0 Then
         UO.Print( 'Vendor not found!' )
         return
      Endif
   Endif
   VendSer1 = UO.GetSerial( 'finditem' )
   UO.Print( 'Vendor1 = ' + VendSer1 )
   UO.Ignore( 'finditem' )
   UO.FindType( VendTyp1, '-1', '1' )
   If UO.FindCount() == 0 Then
      UO.FindType( VendTyp2, '-1', '1' )
      If UO.FindCount() <> 0 Then   
         VendSer2 = UO.GetSerial( 'finditem' )
         UO.Print( 'Vendor2 = ' + VendSer2 )
      Endif
   Else
      VendSer2 = UO.GetSerial( 'finditem' )
      UO.Print( 'Vendor2 = ' + VendSer2 )
   Endif
   ### Все!
   UO.IgnoreReset()
   VendSer = VendSer1
   While UO.SkillVal( 'Begging' ) < 1100
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Endif
      If UO.GetHP() < UO.GetMaxHP() Then
         UO.Msg( 'GUARDS' )
      Endif
      DeleteJournal( dal )
      DeleteJournal( poslal )
      DeleteJournal( daleko )
      DeleteJournal( chasto )
      UO.WaitTargetObject( VendSer )
      UO.UseSkill( 'Begging' )
      k = 0
      repeat
         wait(100)
         k = k + 1
      until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR UO.InJournal( chasto ) OR k > 50
      If UO.InJournal( chasto ) Then
         wait(1000)
      Else
         wait(2500)
      Endif
      If UO.Count( dengi ) > 0 Then
         UO.FindType( dengi )
         While UO.FindCount() > 0
            UO.MoveItem( 'finditem', '0', VendSer )
            wait(1000)
            CheckLag()
            UO.FindType( dengi )
         Wend
      Endif
      If UO.InJournal( dal ) Then
         # Блок смены вендора
         If VendSer2 <> '' Then
            If VendSer == VendSer1 Then
               VendSer = VendSer2
            Else
               VendSer = VendSer1
            Endif
         Endif
      Endif
      If UO.GetHP() < UO.GetMaxHP() Then
         UO.Msg( 'GUARDS' )
      Endif
   Wend
endsub

sub Snooping()
   ; Прокачка снупинга.
   VAR bpack = '0x404CFB26'
   repeat
      UO.UseObject( bpack )
      wait(2500)
   until UO.SkillVal( 'Snooping' ) > 999
endsub

sub Stealing()
   ; Прокачка стилинга. Временный тестовый скрипт.
   VAR bint = '0x0E21'
   VAR bpack = '0x404CFB26'
   repeat
      UO.FindType( bint, '-1', bpack )
      UO.UseSkill( 'Stealing', 'finditem' )
      wait(4000)
   until UO.Dead()
endsub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
   While not UO.Hidden()
      UO.UseSkill('Hiding')
      Wait(4000)
   Wend
endsub

#####################################################################
Sub GetDagger( Dagger )
   If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) <> Dagger Then
      UO.FindType( Dagger )
      If UO.FindCount() == 0 Then
         return 0
      Endif
      UO.Equipt( 'Rhand', Dagger )
      wait(1000)
   Endif
   return 1
endsub

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную
; 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

#####################################################################
Sub Recalling( Runbk, NRune )
   ; Runbk - сериал или ссылка на объект рунбуки
   ; NRune - десятичный номер (текстом) руны для реколла
   VAR myx = UO.GetX()
   VAR myy = UO.GetY()
   VAR OldMana = UO.Mana
   VAR i = 0
   DeleteJournal( 'fizzles' )
   UO.Exec("recall " + Runbk + " " + NRune)
   repeat
      CheckLag()
      wait(1000)
      i = i + 1
   until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
   wait(500)
   If myx == UO.GetX() AND myy == UO.GetY() Then
      UO.WarMode( 'flip' )
      wait(100)
      UO.WarMode( 'flip' )
      Recalling( Runbk, NRune )
   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

#####################################################################
Sub GetResource( typ, kolvo, cont )
   ; Берем из указанного контейнера указанное количество ресурса по типу
   ; Возвращаем 0 если ресурс не найден и 1 если все ок.
   UO.FindType( typ, '-1', cont )      ; Ищем ресурс в контейнере
   If UO.FindCount() == 0 Then
      UO.Print("Resource not found, script terminated")
      return 0
   Endif
   UO.Grab( Str( Kolvo ), 'finditem' ) ; Кладем ресурсы в пак
   Wait(500)
   CheckLag()
   return 1
endsub


Top
   
 Post subject:
PostPosted: 2006-03-10 18:27:50 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
SimpleCraft.sc

Code:
#                                                                   #
#   SimpleCraft.sc, ver 505.110 (c) Edred                           #
#                                                                   #
#####################################################################
#  1. CraftLockPick                                                 #
#  2. MadeMarkScroll                                                #
#  3. MadeRecallScroll                                              #
#  4. MadeFSScroll                                                  #
#  5. AutoCraftPotion                                               #
#  6. CraftFishFat                                                  #
#  7. CraftRecallRune                                               #
#  8. Craft10Cleaver                                                #
#  9. CraftBlankDeed                                                #
# 10. CookFish                                                      #
# 11. TailorBlankScroll                                             #
#                                                                   #
#####################################################################
;
#####################################################################
; CraftLockpick. v.1.01b (c) Edred
;
sub CraftLockpick()
   VAR Sunduk = '0x404CFAA3'
   VAR Ingi = '0x1BEF'
   VAR Instrum = '0x1EBC'
   VAR LPicks = '0x14FB'
   VAR Kolvo = 200, SumKolvo = 0, MoveKolvo = 0
   VAR k = 0
   UO.TextOpen()
   UO.TextClear()
   UO.CancelMenu()
   UO.FindType( Lpicks, '-1', Sunduk )
   If UO.FindCount() > 0 Then
      SumKolvo = UO.GetQuantity( 'finditem' )
      UO.TextPrint( 'I have ' + str(SumKolvo) + ' lockpicks' )
   Endif
   UO.AutoMenu('Keys and Lockpicks', 'Golden lockpick')
   While TRUE
      UO.FindType( Ingi, '-1', Sunduk )
      If UO.FindCount() == 0 Then
         UO.Print("Ingots not found, script terminated")
         UO.CancelMenu()
         return
      Endif
      UO.Grab( Str( Kolvo ), 'finditem' )
      wait( 1000 )
      CheckLag()
      While UO.Count( Ingi ) > 0
         UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
         UO.DeleteJournal()
         UO.UseType( Instrum )
         k = 0
         while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
            k = k + 1
            wait(500)
         wend
      Wend
      If UO.Count( LPicks ) > 0 then
         UO.FindType( LPicks, '-1', '-1' )
         MoveKolvo = UO.GetQuantity( 'finditem' )
         SumKolvo = SumKolvo + MoveKolvo
         UO.MoveItem( 'finditem', '0', Sunduk )
         wait( 1000 )
         CheckLag()
         UO.Print( 'Lockpicks dropped' )
         UO.TextPrint( 'Added ' + str(MoveKolvo) + ' lockpicks. Sum is ' + str(SumKolvo) )
      Endif
   Wend
end sub

#####################################################################
; MadeMarkScroll. v.1.00b (c) Edred
;
; Крафтим столько марк скроллов, сколько позволяют ингридиенты в паке.

sub MadeMarkScroll()
   VAR Blank = '0x0E34'          ; Тип бланк скролла
   VAR Mark = '0x1F59'            ; Тип скроллов Mark
   VAR Reg1 = '0x0F86'            ; mandrake root
   VAR Reg2 = '0x0F7A'            ; black pearl
   VAR Reg3 = '0x0F7B'            ; blood moss
   VAR Fizzle = 'You fail to inscribe the scroll'
   VAR Success = 'You put the'
   VAR k
   UO.CancelMenu()
   UO.AutoMenu( 'Spell Circles', 'Sixth Circle' )
   UO.AutoMenu( 'Spell Circle 6', 'Mark' )
   While TRUE
      If UO.Count( Blank ) == 0 Then
         UO.Print( 'Blank Scroll not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg1 ) == 0 Then
         UO.Print( 'Mandrake Root not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg2 ) == 0 Then
         UO.Print( 'Black Pearls not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg3 ) == 0 Then
         UO.Print( 'Blood Moss not found. Script terminated' )
         return
      Endif
      repeat
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Blank )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
         If UO.Mana < 20 Then
            repeat
               UO.UseSkill( 'Meditation' )
               wait(2000)
            until UO.Mana == UO.Int
         Endif
      Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; MadeRecallScroll. v.1.00b (c) Edred
;
; Крафтим столько рекалл скроллов, сколько позволяют ингридиенты в паке.
sub MadeRecallScroll()
   VAR Blank = '0x0E34'          ; Тип бланк скролла
   VAR Reg1 = '0x0F86'            ; mandrake root
   VAR Reg2 = '0x0F7A'            ; black pearl
   VAR Reg3 = '0x0F7B'            ; blood moss
   VAR Fizzle = 'You fail to inscribe the scroll'
   VAR Success = 'You put the'
   VAR k
   UO.CancelMenu()
   UO.AutoMenu( 'Spell Circles', 'Fourth Circle' )
   UO.AutoMenu( 'Spell Circle 4', 'Recall' )
   While TRUE
      If UO.Count( Blank ) == 0 Then
         UO.Print( 'Blank Scroll not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg1 ) == 0 Then
         UO.Print( 'Mandrake Root not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg2 ) == 0 Then
         UO.Print( 'Black Pearls not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg3 ) == 0 Then
         UO.Print( 'Blood Moss not found. Script terminated' )
         return
      Endif
      repeat
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Blank )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
         If UO.Mana < 20 Then
            repeat
               UO.UseSkill( 'Meditation' )
               wait(2000)
            until UO.Mana == UO.Int
         Endif
      Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; MadeFSScroll. v.1.00b (c) Edred
;
; Крафтим столько flame strikes, сколько позволяют ингридиенты в паке.

sub MadeFSScroll()
   VAR Blank = '0x0E34'          ; Тип бланк скролла
   VAR Mark = '0x1F5F'            ; Тип скроллов FS
   VAR Reg1 = '0x0F8D'            ; spider silk
   VAR Reg2 = '0x0F8C'            ; sulphorous ash
   VAR Fizzle = 'You fail to inscribe the scroll'
   VAR Success = 'You put the'
   VAR k
   UO.CancelMenu()
   UO.AutoMenu( 'Spell Circles', 'Seventh Circle' )
   UO.AutoMenu( 'Spell Circle 7', 'Flamestrike' )
   While TRUE
      If UO.Count( Blank ) == 0 Then
         UO.Print( 'Blank Scroll not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg1 ) == 0 Then
         UO.Print( 'Spider Silk not found. Script terminated' )
         return
      Endif
      If UO.Count( Reg2 ) == 0 Then
         UO.Print( 'Sulphorous Ash not found. Script terminated' )
         return
      Endif
      repeat
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Blank )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
         If UO.Mana < 45 Then
            repeat
               UO.UseSkill( 'Meditation' )
               wait(2000)
            until UO.Mana == UO.Int
         Endif
      Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; Крафтим разные поушены пока хватает ингридиентов или бутылок в паке.
; Выбор поушена осуществляется через меню.
; v.1.01b (c) Edred
sub AutoCraftPotion()
   DIM treagents[13], nampotion[13], nreagents[13], countregs[13]
   nampotion[1]  = 'greater agility'
   nreagents[1]  = 'blood moss'
   treagents[1]  = '0x0F7B'
   countregs[1]  = 3
   nampotion[2]  = 'greater cure'
   nreagents[2]  = 'garlic'
   treagents[2]  = '0x0F84'
   countregs[2]  = 6
   nampotion[3]  = 'greater explosion'
   nreagents[3]  = 'sulphorous ash'
   treagents[3]  = '0x0F8C'
   countregs[3]  = 10
   nampotion[4]  = 'greater heal'
   nreagents[4]  = 'ginseng'
   treagents[4]  = '0x0F85'
   countregs[4]  = 7
   nampotion[5]  = 'greater poison'
   nreagents[5]  = 'nightshade'
   treagents[5]  = '0x0F88'
   countregs[5]  = 8
   nampotion[6]  = 'greater strength'
   nreagents[6]  = 'mandrake root'
   treagents[6]  = '0x0F86'
   countregs[6]  = 5
   nampotion[7]  = 'total refresh'
   nreagents[7]  = 'black pearl'
   treagents[7]  = '0x0F7A'
   countregs[7]  = 5
   nampotion[8]  = 'shrink'
   nreagents[8]  = 'batwing'
   treagents[8]  = '0x0F78'
   countregs[8]  = 4
   nampotion[9]  = 'invisibility'
   nreagents[9]  = 'wyrm heart'
   treagents[9]  = '0x0F91'
   countregs[9]  = 18
   nampotion[10] = 'deadly poison'
   nreagents[10] = 'nightshade'
   treagents[10] = '0x0F88'
   countregs[10] = 16
   nampotion[11] = 'lava bomb'
   nreagents[11] = 'volcanic ash'
   treagents[11] = '0x0F8F'
   countregs[11] = 10
   nampotion[12] = 'total mana refresh'
   nreagents[12] = 'eye of newt'
   treagents[12] = '0x0F87'
   countregs[12] = 6
   VAR bottles = '0x0F0E'
   VAR i, menu1, j, SumPot = 0
   UO.CancelMenu()
   menu1 = ''
   For j = 1 To 11
      menu1 = menu1 + "'" + nampotion[j] + "'" + ";"
   Next
   menu1 = menu1 + "'" + nampotion[12] + "'"
   i = UO.asmInputCombo( "Выберите вид поушена:", menu1 )
   UO.Print( str(i) )
   If i == 0 Then
      UO.Print( 'Script terminated' )
      return
   Endif
   UO.Exec( "automenu 'What potion do you want' " + "'" + nampotion[i] +"'" )
   while UO.Count( bottles, '0x0000' ) > 0 AND UO.Count( treagents[i] ) >= countregs[i]
      UO.DeleteJournal()
      UO.UseType( treagents[i] )
      repeat
         wait(200)
      until UO.InJournal( "You put" ) OR UO.InJournal( "You toss the failed" )
      If UO.InJournal( "You put" ) Then
         SumPot = SumPot + 1
         UO.Print( 'I tossed ' + str( SumPot ) + ' potions' )
      Endif
   wend
   UO.Print( 'Script finished' )
   UO.CancelMenu()
endsub

#####################################################################
; CraftFishFat. Крафтим Fish Fat.
; v.1.00b (c) Edred
sub CraftFishFat()
   VAR Garlic = '0x0F84'          ; Тип гарлика
   VAR Steak = '0x097B'         ; Тип жареных стейков
   VAR Bottle = '0x0F0E'         ; Тип пустых бутылок
   VAR Fizzle = 'You toss the failed'
   VAR Success = 'You put'
   VAR k
   UO.CancelMenu()
   UO.AutoMenu( 'What potion do you want', 'The fish fat' )
   While TRUE
      If UO.Count( Garlic ) < 1 Then
         UO.Print( '1 Garlic not found. Script terminated' )
         return
      Endif
      If UO.Count( Steak ) < 100 Then
         UO.Print( '100 Steak not found. Script terminated' )
         return
      Endif
      If UO.Count( Bottle ) < 1 Then
         UO.Print( '1 Empty Bottle not found. Script terminated' )
         return
      Endif
      repeat
         DeleteJournal( Fizzle )
         DeleteJournal( Success )
         UO.UseType( Garlic )
         k = 0
         repeat
            k = k + 1
            wait(100)
         until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Garlic ) < 1 OR UO.Count( Steak ) < 100 OR UO.Count( Bottle ) < 1 OR k > 600
      Until UO.Count( Garlic ) < 1 OR UO.Count( Steak ) < 100 OR UO.Count( Bottle ) < 1
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; CraftRecallRune. Крафтим Fish Fat.
; v.1.00b (c) Edred
sub CraftRecallRune()
   VAR BPearl = '0x0F7A'          ; Тип black pearl
   VAR FishFat = '0x182B'         ; Тип жареных стейков
   VAR Bottle = '0x0F0E'         ; Тип пустых бутылок
   VAR Stone = '0x1BF2'         ; тип стоун бриков
   VAR Beeswax = '0x1423'         ; тип воска
   VAR RecallScroll = '0x1F4C'      ; тип рекалл скролла
   VAR MarkScroll = '0x1F59'      ; тип марк скролла
   VAR Fizzle = 'You toss the failed'
   VAR Success = 'You put'
   VAR k
   UO.CancelMenu()
   UO.AutoMenu( 'What potion do you want', 'recall rune' )
   While UO.Count(BPearl)>0 AND UO.Count(FishFat)>0 AND UO.Count(Bottle)>0 AND UO.Count(Stone)>9 AND UO.Count(Beeswax)>9 AND UO.Count(RecallScroll)>0 AND UO.Count(MarkScroll)>0
      DeleteJournal( Fizzle )
      DeleteJournal( Success )
      UO.UseType( BPearl )
      k = 0
      repeat
         k = k + 1
         wait(100)
      until UO.InJournal(Fizzle) OR UO.InJournal(Success) OR k>600 OR UO.Count(BPearl)==0 OR UO.Count(FishFat)==0 OR UO.Count(Bottle)==0 OR UO.Count(Stone)<10 OR UO.Count(Beeswax)<10 OR UO.Count(RecallScroll)==0 OR UO.Count(MarkScroll)==0
   Wend
   UO.CancelMenu()
endsub

#####################################################################
; Craft10Cleaver. v.1.00b (c) Edred
;
; В руки молоток и 100 айрона в пак (или больше). Будут сделаны 10 кливеров.
;
sub Craft10Cleaver()
   VAR Iron = '0x1BEF'
   UO.CancelMenu()
   UO.IgnoreReset()
   UO.AutoMenu( 'Blacksmithing', 'Iron Tools' )
   UO.AutoMenu( 'Other Iron Weapon', 'cleaver' )
   VAR k, i
   i = 0
   repeat
      UO.DeleteJournal()
      UO.UseType( Iron )
      k = 0
      while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 150 )
         k = k + 1
         wait(100)
      wend
      If UO.InJournal('You put') Then
         i = i + 1
      Endif
   until i == 10
   UO.IgnoreReset()
   UO.CancelMenu()
endsub

#####################################################################
; CraftBlankDeed. v.1.00b (c) Edred
;
sub CraftBlankDeed()
   VAR Shkur = '0x1067'          ; Тип шкур
   VAR Vosk = '0x1423'          ; Тип воска
   VAR Kit = '0x0F9D'          ; Тип инструмента тейлора
   VAR j, ShkurSer, k, i
   VAR success = 'You put'
   VAR fizzle = 'fail'
   UO.CancelMenu()
   UO.AutoMenu( "Leather", "Blank's" )
   UO.AutoMenu("Blank's", "blank deed" )
   While UO.Count( Shkur ) > 9 AND UO.Count( Vosk ) > 9
      DeleteJournal( success )
      DeleteJournal( fizzle )
      UO.FindType( Shkur )
      UO.WaitTargetObject( 'finditem' )
      UO.UseType( Kit )
      k = 0
      repeat
         k = k + 1
         wait(500)
      until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR ( k > 30 )
   Wend
endsub

#####################################################################
; CookFish. v.1.05b (c) Edred
;
; Скрипт для жарки рыбных стейков из пака. Хворост также лежит в паке.
;
; Берем из пака 1 шт хвороста, кладем в координаты TX, TY и зажигаем ее.
; Потом берем 1 шт. сырых стейков из пака и жарим
; на костре или углях. При этом перед жаркой проверяем, есть ли в
; вокруг чара огонь или угли. если есть жарим, иначе опять жгем костер.
; Готовый стейк остается в паке.
;
sub CookFish()
   VAR Hvorost = '0x0DE1'
   VAR Koster = '0x0DE3'
   VAR Ugli = '0x0DE9'
   VAR Fish = '0x097A'
   VAR FishGot = '0x097B'
   VAR SpiritTime = UO.Timer()
   VAR TX = 2042
   VAR TY = 378
   VAR i, flag
   UO.CancelTarget()
   UO.Exec( 'set finddistance 3' )
      UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
   While UO.Count( Fish ) > 0
# ----------------------------------
# блок запуска прокачки Spirit Speak
      If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
         ; Прошло 5 минут с момента последней прокачки Spirit Speak
         SpSpeak()
         SpiritTime = UO.Timer()
      Endif
# ----------------------------------
      UO.FindType( Hvorost )
      If UO.FindCount() == 0 Then
         UO.Print( 'No kindling found. Script terminated' )
         return
      Endif
      UO.MoveItem( 'finditem', '1', 'ground', str(TX), str(TY), str(UO.GetZ()) )
      wait(1000)
      CheckLag()
      UO.Findtype( Hvorost, '-1', '1' )
      If UO.FindCount() > 0 Then
         repeat
            UO.UseFromGround( Hvorost )
            wait(1000)
            UO.FindType( Koster, '-1', '1' )
         until UO.FindCount() > 0
         ; костер горит
         UO.UseSkill( 'Hiding' )
         wait(2000)
         flag = 1
         repeat
            ; теперь проверим не погас ли костер, не исчезли ли угли
            UO.FindType( Koster, '-1', '1' )
            If UO.FindCount() <> 0 Then
               ; еще горит костер - жарим на нем стейк
               If UseSteake( Fish, UO.GetSerial('finditem') ) Then
                  flag = 0
               Endif
               ; стейк готов
            Else
               UO.FindType( Ugli, '-1', '1' )
               If UO.FindCount() <> 0 Then
                  ; есть еще угли!
                  if UseSteake( Fish, UO.GetSerial('finditem') ) then
                     flag = 0
                  endif
               Else
                  flag = 0
               Endif
            Endif
         until flag == 0
      Endif
   Wend
endsub
;
Sub UseSteake( fish, koster )
   VAR msg1 = 'You burn the food'            ; физл
   VAR msg2 = 'You put the fish steak'         ; успех
   VAR msg22 = 'You put the fish steaks'      ; успех
   VAR msg3 = 'You must wait'               ; ждать
   VAR msg4 = "You can't see the target"
   repeat
      DeleteJournal (msg1 )
      DeleteJournal (msg2 )
      DeleteJournal (msg22 )
      DeleteJournal (msg3 )
      DeleteJournal (msg4 )
      UO.WaitTargetObject( 'finditem' )
      UO.UseType( Fish )
      repeat
         wait(500)
      until UO.InJournal(msg1) OR UO.InJournal(msg2) OR UO.InJournal(msg22) OR UO.InJournal(msg3) OR UO.InJournal(msg4)
      if UO.InJournal(msg4) then
         return 1
      endif
      if UO.InJournal(msg3) then
         wait(500)
      endif
   until UO.InJournal(msg2) OR UO.InJournal(msg22)
   return 0
endsub

#####################################################################
; TailorBlankScroll. v.1.00b (c) Edred
;
sub TailorBlankScroll()
   VAR Kozha = "0x1067"
   VAR Vosk = "0x1423"
   VAR Kit = "0x0F9D"
   VAR Scrol = "0x0E34"
   VAR k
   UO.CancelMenu()
   wait(500)
   UO.AutoMenu( "Leather", "Blank's" )
   UO.AutoMenu( "Blank's", "blank scroll" )
   While TRUE
      If UO.Count( Kozha ) == 0 Then
         UO.Print("Leathers not found, script terminated")
         return
      Endif
      If UO.Count( Vosk ) == 0 Then
         UO.Print("Beeswaxs not found, script terminated")
         return
      Endif
      UO.DeleteJournal()
      UO.WaitTargetType( Kozha )
      UO.UseType( Kit )
      k = 0
      while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
         k = k + 1
         wait(300)
      wend
   Wend
   UO.CancelMenu()
end sub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
   While not UO.Hidden()
      UO.UseSkill('Hiding')
      Wait(4000)
   Wend
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


Top
   
 Post subject:
PostPosted: 2006-03-10 18:29:52 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Фигня какая-то под рукой оказалась...

Code:
#===================================================================#
# SELLLOGS                                                          #
# Продажа логов вендорусту                                          #
#===================================================================#
#   v.1.02b (с) Edred                                               #
#===================================================================#
;
; Берем в пак 2000 логов и тут же, на базе, запускаем скрипт. Реги тоже
; на момент старта должны быть в паке. ГМ Медиты приветствуется :)
;
sub SellLogs()
   VAR vend = '0x00276549', vendname = 'Aiko', Logs = '0x1BDD'
   VAR Gold = '0x0EED', i, sunduk = '0x400FAF5F'
   DIM reg[2]
   reg[0] = '0x0F7B'               ; blood moss
   reg[1] = '0x0F86'               ; mandrake root
   reg[2] = '0x0F7A'               ; black pearl
   UO.Set( 'maxsell', '999' )
   UO.Set( 'distance', '3' )
   repeat
      Recalling( 'MyRunbook', '48' )
      wait(1000)
;      UO.UseSkill( 'Meditation' )
      ; проверка расстояния до вендора
      while UO.Count( Logs )
         repeat
            wait(300)
         until UO.GetDistance( vend ) < 2      
         UO.WaitTargetObject( vend )
         UO.Sell( 'logi', vendname )
         wait(1000)
         UO.SayU( '.sell' )
         wait(1000)
      wend
      Recalling( 'MyRunbook', '42' )
      wait(1000)
      UO.FindType( Gold )
      While UO.FindCount()
         UO.MoveItem( 'finditem', 0, sunduk )
         wait(1000)
         CheckLag()
         UO.FindType( Gold )
      Wend
      UO.FindType( Logs, '0x0000', sunduk )
      If UO.FindCount() Then
         UO.Grab( '2000', 'finditem' )
         wait(1000)
         CheckLag()
      Else
         return
      Endif
      If UO.Mana < 40 Then
         repeat
            UO.UseSkill( 'Meditation' )
            wait(2000)
         until UO.Mana > 90
      Endif
      for i = 0 to 2
         If UO.Count( reg[i] ) < 3 Then
            UO.FindType( reg[i], -1, sunduk )
            If UO.FindCount() == 0 Then
               return
            Endif
            If UO.GetQuantity( 'finditem' ) > 10 Then
               UO.Grab( '10', 'finditem' )
            Else
               UO.Grab( '0', 'finditem' )
            Endif
            wait(1000)
            CheckLag()
         Endif
      next
   until UO.Count(Logs) == 0
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

#####################################################################
Sub Recalling( Runbk, NRune )
   ; Runbk - сериал или ссылка на объект рунбуки
   ; NRune - десятичный номер (текстом) руны для реколла
   VAR myx = UO.GetX()
   VAR myy = UO.GetY()
   VAR OldMana = UO.Mana
   VAR i = 0
   DeleteJournal( 'fizzles' )
   UO.Exec("recall " + Runbk + " " + NRune)
   repeat
      CheckLag()
      wait(1000)
      i = i + 1
   until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
   wait(500)
   If myx == UO.GetX() AND myy == UO.GetY() Then
      UO.WarMode( 'flip' )
      wait(100)
      UO.WarMode( 'flip' )
      Recalling( Runbk, NRune )
   Endif
endsub

Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
   VAR tmpst
   VAR i, dlin, kol, start
   dlin = len( st )
   kol = 0
   start = 0
   For i=0 To dlin - 1
      If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
         kol = kol + 1
         If kol == nom Then
            ; это первый пробел после нужного нам слова
            tmpst = mid( st, start, i - start )
            return tmpst
         Else
            While mid( st, i, 1 ) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 Then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   return tmpst
endsub


Top
   
 Post subject:
PostPosted: 2006-03-10 18:34:22 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Вот тут уже кое-что интересное, правда, не доведенное до ума. Но работает...

readme.txt

Code:
Скрипт crafters.sc

Скрипт работает по двум файлам - базы данных и командного.

база данных - crafters.db
командный - crafters.go

База данных содержит описание всевозможных крафтов, в том числе
сложных, описанных на встроенном в скрипт языке.

Командный файл содержит список того, что необходимо скрафтить
после запуска скрипта с указанием количеств.

Оба файла текстовые.

Командный файл представляет из себя список условных названий
крафтов с указанием количеств:
...
fulloldcopper 5
fullrose 3
fullsilver 6
cleaver 10
...
то есть - скрафтить 5 полных арморов из олд купера и сложить их
в соответствующие мешки, 3 фулл армора из розы, 6 фулл арморов из силвера
и 10 кливеров.

Весь крафт будет сложен в спецконтейнер (сундук).

Скрипт сам возьмет необходимый инструмент и материалы из соотвествующих
контейнеров в сундуке с ресурсами и инструментами на базе. Сериалы
контейнеров прописаны в массиве в скрипте (в дальнейшем будут сделаны
в виде текстового файла).

Поддерживаются следующие скиллы: tailor, blacksmithing, carpentry, alchemy,
tinker.


crafters.go

Code:
;  Командный файл для АвтоКрафтера. Уберите комментарий с того
;  предмета(ов) / набора(ов), которые вы хотите скрафтить и измените
;  количество с 1 на то, которое вам необходимо.
;
; Охвачены скиллы - бс, тейлор, тинкер
;
;============================ Наборы арморов с щитами (BS)
; fulloldcopper 1
; fulldullcopper
; fullcopperarmor
; fullbronzearmor
; fullrosearmor 5
; fullgoldenarmor
; fullsilverarmor
; fullagapitearmor 4
; fullbloodrockarmor
;============================ Наборы арморов без щитов (BS)
; fullveritearmor
;============================ Щиты (BS)
; silverkite 10
; veriteheater
; valoriteheater
;============================ Валоритовое оружие (BS)
; valoritedagger
; valoritekryss
; valoritewarfork
; valoritepitchfork
; valoritewarmace
; valoritewarhammer
; valoritevikingsword
; valoritehalberd
;============================ Инструменты (BS, tinker)
; irondagger 30
; smithhammer
; cleaver
; scissors
; sewingkit
; tinkertools
; pickaxe 10
; mortar
; jointingplane
;============================ Бланки (Tailor)
; blankscroll
blankdeed 20
;============================ Отмычки (tinker)
; veriterlockpick
; valoritelockpick
;============================ Топоры (tinker)
; hatchet
; ancienthatchet
; sturdyhatchet
; steelhatchet
;============================ Сундуки с ключами (tinker)
; ironchest
; dullcopperchest
; bronzechest
; goldenchest
; agapitechest
; veritechest
; valoritechest
;============================ House Parts (карпентер)
; housepart 10
; woodenhousepart 10
; plasterhousepart 3
; sandstonehousepart 3
; stonehousepart 4
; marblehousepart 6
;============================ Houses (карпентер)
; smallstoneplasterhouse 3
; smallstonehouse 1
; smallbrickhouse 1
; smallwoodhouse
; smallwoodplasterhouse 3
; smallwoodroofhouse 1
;
;============================ Walls (карпентер)
; sandstonewall 50
;


Продолжение в след посте


Top
   
 Post subject:
PostPosted: 2006-03-10 18:36:14 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
продолжение скрипта Crafters...

crafters.db

Code:
; крафтим pickaxe
@pickaxe
#SKILL tinker
RESOURCE 0x1BEF color 0x0000 count 4 container ingots FOCUS
RESOURCE 0x1BDD color 0x0000 count 1 container logs
MENU "Tinkering", "Tools"
MENU "Tools", "pickaxe"
RESULT 0x0E85 color 0x0000 count 1
; крафтим iron dagger
@irondagger
#SKILL bs
RESOURCE 0x1BEF color 0x0000 count 3 container ingots FOCUS
MENU "Iron Fencing Weapons", "Iron Dagger"
RESULT 0x0F51 color 0x0000 count 1
; крафтим silver kite
@silverkite
#SKILL bs
RESOURCE 0x1BF5 color 0x0000 count 16 container ingots FOCUS
MENU "Blacksmithing", "Colored Armor"
MENU "Silver Armor", "Silver Shields"
MENU "Silver Shields", "Silver Kite Shield"
RESULT 0x1B74 color 0x05B2 count 1
; ===================================================================
; =================================================== СТЕНЫ И КАЛИТКИ
;
; ------------------------ Stone wall
;
@stonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Dark stone wall
;
@darkstonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Sandstone wall
;
@sandstonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x0031 count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Plaster wall
;
@plasterwall
#SKILL carpent
RESOURCE 0x1BF2 color 0x0032 count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Stone Gates
;
@stonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x08FD count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ------------------------ Dark Stone Gates
;
@darkstonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x08FD count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ------------------------ Sandstone Gates
;
@sandstonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x0031 count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ===================================================================
; ============================================================ ТЕЙЛОР
;
; ------------------------ Blank Deed
;
@blankdeed
#SKILL tailor
RESOURCE 0x1067 color 0 count 10 container leather FOCUS
RESOURCE 0x1423 color 0 count 10 container leather
MENU "Leather", "Blank's"
MENU "Blank's", "blank deed"
RESULT 0x14EF color 0x0000 count 1
;
; ===================================================================
; ============================================================== ДОМА
;
; ------------------------ House Part
;
@housepart
#SKILL carpent
RESOURCE 0x1BEF color 0x0000 count 1000 container ingots FOCUS
MENU "Parts", "(2)"
; "House Part (1000 t_ingots)"
RESULT 0x14EF color 0x08FD count 1
;
; ------------------------ Wooden House Part
;
@woodenhousepart
#SKILL carpent
RESOURCE 0x1BDD color 0x0000 count 1000 container logs FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Wooden House Part"
RESULT 0x14EF color 0x0091 count 1
;
; ------------------------ Plaster House Part
;
@plasterhousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x0032 count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Plaster House Part"
RESULT 0x14EF color 0x0032 count 1
;
; ------------------------ Sandstone House Part
;
@sandstonehousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x0031 count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Sandstone House Part"
RESULT 0x14EF color 0x0030 count 1
;
; ------------------------ Stone House Part
;
@stonehousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Stone House Part"
RESULT 0x14EF color 0x08FD count 1
;
; ------------------------ Deed to a small stone and plaster house
;
@smallstoneplasterhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small stone and plaster"
RESULT 0x2830 color 0x0000 count 1
;
; ------------------------ Deed to a small stone house
;
@smallstonehouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small stone house"
RESULT 0x2830 color 0x0000 count 1
;
; ------------------------ Deed to a small brick house
;
@smallbrickhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small brick house"
RESULT 0x2830 color 0x0000 count 1
;
; ------------------------ Deed to a small wood house
;
@smallwoodhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood house"
RESULT 0x2830 color 0x0000 count 1
;
; ------------------------ Deed to a small wood and plaster house
;
@smallwoodplasterhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood and plaster"
RESULT 0x2830 color 0x0000 count 1
;
; ------------------------ Deed to a small wood thatched roof house
;
@smallwoodroofhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood thatched"
RESULT 0x2830 color 0x0000 count 1
;
; ===================================================================
; ============================================================ АРМОРЫ
;
; ------------------------ Full Old Copper Armor
;
@fulloldcopper
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Old Copper armor"
RESULT 0x0E76 color 0x0590 count 1
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 25 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(1)"
RESULT 0x1415 color 0x0590 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 10 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(1)"
RESULT 0x1413 color 0x0590 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 12 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(2)"
RESULT 0x1414 color 0x0590 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 15 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(3)"
RESULT 0x1412 color 0x0590 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 20 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(4)"
RESULT 0x1411 color 0x0590 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 18 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(4)"
RESULT 0x1410 color 0x0590 count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 18 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Shields"
MENU "Old Copper Shields", "(5)"
RESULT 0x1B76 color 0x0590 count 1
NEXTINSTOP
;
; ------------------------ Full Agapite Armor
;
@fullagapitearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Agapite armor"
RESULT 0x0E76 color 0x0682 count 1
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 25 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(1)"
RESULT 0x1415 color 0x0682 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 10 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(1)"
RESULT 0x1413 color 0x0682 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 12 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(2)"
RESULT 0x1414 color 0x0682 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 15 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(3)"
RESULT 0x1412 color 0x0682 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 20 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(4)"
RESULT 0x1411 color 0x0682 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 18 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(4)"
RESULT 0x1410 color 0x0682 count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 18 container ingots FOCUS
MENU "Agapite Armor", "Agapite Shields"
MENU "Agapite Shields", "(5)"
RESULT 0x1B76 color 0x0682 count 1
NEXTINSTOP
;
;
; ------------------------ Full Verite Armor without Shield
;
@fullveritearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Verite armor"
RESULT 0x0E76 color 0x07D1 count 1
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 25 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(1)"
RESULT 0x1415 color 0x07D1 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 10 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(1)"
RESULT 0x1413 color 0x07D1 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 12 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(2)"
RESULT 0x1414 color 0x07D1 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 15 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(3)"
RESULT 0x1412 color 0x07D1 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 20 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(4)"
RESULT 0x1411 color 0x07D1 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 18 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(4)"
RESULT 0x1410 color 0x07D1 count 1
;
; ------------------------ Full Rose Armor
;
@fullrosearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Rose armor"
RESULT 0x0E76 color 0x048C count 1
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 25 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(1)"
RESULT 0x1415 color 0x048C count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 10 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(1)"
RESULT 0x1413 color 0x048C count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 12 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(2)"
RESULT 0x1414 color 0x048C count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 15 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(3)"
RESULT 0x1412 color 0x048C count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 20 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(4)"
RESULT 0x1411 color 0x048C count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 18 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(4)"
RESULT 0x1410 color 0x048C count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 18 container ingots FOCUS
MENU "Rose Armor", "Rose Shields"
MENU "Rose Shields", "(5)"
RESULT 0x1B76 color 0x048C count 1
NEXTINSTOP
;
@endoffile


Top
   
 Post subject:
PostPosted: 2006-03-10 18:38:11 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
продолжение скрипта Crafters...

structure_db.txt

Code:
; Строка, начинающаяся с точки с запятой явлеется комментарием и при анализе
; файла игнорируется.
;
; ВНИМАНИЕ! Регистр ключевых слов важен! Соблюдайте его по описанию!
;
@fulldullcopper
; условное имя крафта. Строка должна начинаться с @ и не содержать более
; одного слова. Это слово - условное название предмета крафта (или набора)
; Все строки после этой до следующей строки с @ или до конца файла считаются
; описанием последовательности крафта этого предмета.
#SKILL tailor
; условное название скилла, используемого при крафте. Возможные варианты:
; tailor, bs, carpent, alchemy, tinker
; возможность комбинировать скиллы для крафта предметов пока не предусмотрена
; (будет сделано в последующих версиях). Пока с команды #SKILL начинается
; блок крафта одного предмета. Если речь идет о крафте набора предметов -
; команда #SKILL открывает блок крафта одного предмета из набора.
RESOURCE 0x1067 color 0 count 2 container leather
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
; эта строка (или несколько таких строк должна идти непосредственно после
; строки с условным названием скилла. В каждой такой строке описан один
; вид ресурса, необходимого для крафта данного предмета. Структура этой
; строки жесткая: сначала идет ключевое слово RESOURCE, за ним через пробел
; type данного ресурса, потом через пробел ключевое слово color, через пробел
; параметр color (цвет) данного ресурса (если цвет не важен - 0), через
; пробел ключевое слово count, через пробел количество ресурса, необходимое
; для крафта одного экземпляра данного предмета, через пробел ключевое слово
; container, через пробел условное название контейнера, в котором содержится
; данный ресурс. Кроме того, в одной из строк с ресурсами должно быть в конце
; слово FOCUS. Это указание что прицел при крафте направляется на этот
; ресурс (или этот ресурс "используется" при крафте)
; Больше в данной строке никаких символов быть не должно.
; Возможные контейнеры: 'tools', 'colortools', 'blankdeeds', 'leather',
; 'ingots', 'bricks', 'logs', 'elements', 'regs', 'bottles'
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Old Copper armor"
MENU "aaaaa", "bbbbbbb"
; Строки MENU (вторая и третья - если два или три уровня
; меню крафта), указывают на выбор пунктов в меню крафта данного предмета.
; Выбор пишется в двойных кавычках или просто цифрой без кавычек.
; Сначала в строке идет название шапки меню, потом через запятую выбор
; в данном меню. Если пункты выбора в меню имеют одинаковые названия -
; пользуйтесь порядковыми номерами, записанными в скобках. ВНИМАНИЕ! При
; крафте предмета в пак берется только указанное выше количество ресурса,
; при переписывании пунктов меню делайте также, так как в зависимости от
; количества ресурсов в паке меню крафта видоизменяется.
; Эти строки (MENU) должны идти непосредственно (без учета
; комментариев) после строк, начинающихся с ключевых слов RESOURCE.
RESULT 0x0E76 color 0x0590 count 1
; Следующей строкой должна быть строка, начинающаяся с ключевого слова
; RESULT. Эта строка описывает результат крафта предмета (то есть сам
; предмет). Структура строки жесткая, ключевые слова - по аналогии с
; с строкой RESOURCE.
;
; При крафте наборов могут дополнительно использоваться две команды:
;
NEXTINBEGIN
; Следует непосредственно за строкой RESULT, в которой описан какой-либо
; контейнер (ящик, пак, мешок). Данная команда переназначает приемный
; контейнер для последующего крафта данного набора в этот контейнер.
; Если данной команды в базе данных нет - предмет сразу после крафта
; будет переложен в сундук для готовой продукции. Если данная команда
; встретилась - все предметы из данного набора, описания крафта которых
; следуют далее будут после крафта складываться в данный контейнер.
NEXTINSTOP
; Данная команда заканчивает действие предыдущей. Сразу после нее
; контейнер, в который складывался крафт, будет переложен в сундук
; для готовой продукции. Строка может идти только сразу после строки
; Result
;
; Пока больше возможных команд нет.


Top
   
 Post subject:
PostPosted: 2006-03-10 18:40:55 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
А вот и сам скрипт Crafters...

Crafters.sc

Code:
#===================================================================#
# CRAFTERS. Craft from list.                                        #
#===================================================================#
#   v.1.04b (c) Edred                                               #
#===================================================================#
;
; Крафтим все что можно в заказанных количествах (включая наборы),
; складываем скрафченное в спецконтейнер. Список крафта содержится
; в файле crafters.go, база данных по крафту - в файле crafters.db.
; Чар на скрипте сам берет необходимые ресурсы и инструменты из
; сундуков и ящиков и мешков в этих сундуках.
; Структура склада ресурсов и инструмента прописана через массив
; и в дальнейшем будет вынесена в файл.
; В структуре крафта предусмотрена возможность крафта контейнеров,
; в которые складываются остальные части крафта данного набора.
; База данных и список крафта - текстовые файлы. Список крафта
; представляет из себя перечень условных названий предметов (наборов)
; крафта и необходимых к крафту количеств:
; ...
; fulloldcopper 5
; fullrose 3
; fullsilver 6
; cleaver 10
; ...
; Файл базы данных представляет из себя описание крафта каждого
; возможного предмета или набора, структуированное по условным
; названиям крафтов. Описание крафта производится на специальном
; языке. Возможные команды этого языка (строки, начинающиеся
; с точки с запятой считаются комментариями и игнорируются) приведены
; в файле structure.db
;
; v.1.00b - пока без наборов. Простой крафт. Пишем и тестим.
;           пока только 1 скилл - бс.
;           Эта версия очень тупая - при физле сбрасывает меню и
;           снова его грузит - сделать в дальнейшем при физле только
;           добор ресурсов если будет заметна потеря времени.
; v.1.01b - сделан сброс скрафченного в приемный контейнер. Пока только
;           в сундук, но сразу сделано через глобалку, чтобы легко
;           было переназначать.
; v.1.02b - делаем тейлор. Зодно делаем возможность брать 1 шт. ресурса из
;           неподъемной кучки.
; v.1.03b - добавляем наборы. То есть команды NEXTINBEGIN и NEXTINSTOP
; v.1.04b - добавляем скиллы tinker, carpentry, alchemy
;
; TO DO:    1. Морф перед крафтом, еда, подхилл чара (через команду в базе)
;           2. Отмена морфа (через команду в базе)
;           3. Возможность взять несколько некучкующихся штук ресурса
;           4. Контроль за кол-вом предметов в паке, возможность работы
;              с мешками с некучкующимися ресурсами (например сено)
;           5. Взятие из банка артефакта и использование его при крафте
;              в случае тейлора - надевание на себя)
;           6. Выкладывание инструментов обратно
;           7. Возможность крафта вне АМЗ (то есть процедурой добор регов,
;              реколл в реколл-зону, крафт и возврат обратно пешком
;              по узловым точкам. При этом крафтить сразу все необходимое
;              количество!
;           8. скиллы инскрипт, боукрафт
;           9. Перекладывание скрафченных предметов в контейнеры ресурсов
;              (сложный крафт)
;
sub Crafters()
   UO.SetGlobal( 'otladka', '0' )
   VAR mypath = "C:\Games\Injection\scripts\Crafters\"
   VAR DBFile = 'crafters.db'
   VAR GOFile = 'crafters.go'
   VAR Go1, What, HowMuch, HowInt, i, rez = 1
   ; Читаем файл что надо крафтить
   DBFile = mypath + DBFile
   GOFile = mypath + GOFile
   VAR f = File( GOFile )
   UO.SetGlobal( 'ContForResult', '' )
   UO.SetGlobal( 'LastResult', '' )
   UO.TextOpen()
   UO.TextClear()
   If NOT F.Open() Then
      UO.Print( 'File carfters.go not found!' )
   Endif
   tm(1)
   Repeat
      tm(2)
      Go1 = Safecall F.ReadLn()
      If F.Eof() OR fatal error Then
         F.Close()
         return
      Endif
      tm(3)
      While left( Go1, 1 ) == ';'
         ; комментарий
         Go1 = Safecall F.ReadLn()
         If F.Eof() OR fatal error Then
            F.Close()
            return
         Endif
      Wend
      tm(4)
      What = GetWord( Go1, 1 )
      If What == '' Then
         F.Close()
         Return
      Endif
      HowMuch = GetWord( Go1, 2 )
      If HowMuch == '' Then
         HowInt = 1
      Else
         HowInt = val( HowMuch )
      Endif
      tm(5)
      For i = 1 To HowInt
         tm(6)
         rez = CraftItem( What, DBFile )
         tm(7)
         If rez == 0 Then
            F.Close()
            return
         Endif
      Next
      tm(8)
   until F.Eof() OR fatal error
   tm(9)
   F.Close()
   return
endsub
;
Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
   VAR tmpst
   VAR i, dlin, kol, start
   dlin = len( st )
   kol = 0
   start = 0
   For i=0 To dlin - 1
      If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
         kol = kol + 1
         If kol == nom Then
            ; это первый пробел после нужного нам слова
            tmpst = mid( st, start, i - start )
            return tmpst
         Else
            While mid( st, i, 1 ) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 Then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   return tmpst
endsub
;
Sub FindSymb( symb, st ) 
; найти первое вхождение символа в строке. Не найдено - вернем 0
   VAR dlin = len( st ) - 1
   VAR i
   For i = 0 To dlin
      If st[i] == symb Then
         return i + 1
      endif
   Next
   i = 0
   return i
endsub
;
Sub GetQuote( st, num )
; Вырезает и возвращает num-подстроку строки st, ограниченную с обоих
; сторон кавычками без самих кавычек. Возвращаем пустую строку если ошибка
   VAR s = 0, i = 0, rt = ''
   VAR quot = '"'
   s = FindSymb( quot, st )
   If s > 0 Then
      i = i + 1
      st = right( st, len(st) - s )
      s = FindSymb( quot, st )
      If s == 0 Then
         return ''
      Endif
      If i == num   Then
         ; нашли начало нужной строки
         st = left( st, s - 1 )
         return st
      Else
         st = right( st, len(st) - s )
         rt = GetQuote( st, num - 1 )
         If rt == '' Then
            return ''
         Else
            return rt
         Endif
      Endif
   Endif
   return ''
endsub

Sub CraftItem( nam, DBFile )
; Скрафтить итем или набор, описанный в nam
; возвращаем 1 если успех, 0 - если кранты
;
; Ошибки: 001 - вместо строки SKILL идет конец файла
;         002 - отсутствие в нужном разделе базы данных строки SKILL
;         003 - вместо строки RESOURCE идет конец файла
;         004 - отсутствие в нужном разделе базы данных строки RESOURCE
;         005 - сразу после строки RESOURCE идет конец файла
;         006 - более 10 ресурсных строк
;         007 - отсутствие в нужном разделе базы данных строки MENU
;         008 - сразу после строки MENU идет конец файла
;         009 - более 3 строк меню
;         010 - отсутствие в нужном разделе базы данных строки RESULT
;     011-013 - ошибки распознавания строки ресурсов
;     014-017 - ошибки проверки параметров ресурсов
;     018-021 - ошибки взятия ресурсов
;         022 - неправильное название контейнера с ресурсом
;         023 - ошибка чтения названия скилла в массиве инструментов
;         024 - ошибка считывания фокуса
;         025 - отсутствие ресурса в паке при крафте (ошибка фокуса)
;         026 - ошибка чтения параметров меню из базы
;
    VAR str1, str2, flag = 0, str5, tmpstr, tmpstr2, vendcont
   VAR skill, result, packbegin, packend, i, cyclflag
   VAR F2 = File( DBFile )
   DIM res[11]            ; массив для записи ресурсных строк
   DIM menuhi[7]            ; массив для уровней меню (3 уровня)
   If NOT F2.Open() Then
      UO.Print( 'File carfters.db not found!' )
   Endif
   ; откроем на экране и назначим переменную для приемного контейнера
   ; (по умолчанию - vendcont)
   vendcont = OpenContainer( 'vendor' )
   If vendcont == '0' Then
      UO.Print( 'Containers for result of crafts not found!' )
      return 0
   Endif
   tm(10)
   Repeat
      str1 = Safecall F2.ReadLn()
      If left( str1, 1 ) == '@' Then
         str1 = right( str1, len( str1 ) - 1 )
         str1 = GetWord( str1, 1 )
         If str1 == nam Then
            tm(11)
            ; Нашли нужную нам секцию
            flag = 1
            str1 = Safecall F2.ReadLn()
            repeat
               ;
               ; SKILL
               ; --------------------------------------
               ; строка записывается в переменную skill
               ;
               If F2.Eof() OR fatal error Then
                  UO.Print( 'Error of reading database. N 001' )
                  F2.Close()
                  return 0
               Endif
               # ----- Проверка на комментарий
               While left( str1, 1 ) == ';'
                  ; комментарий
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 001' )
                     F2.Close()
                     return 0
                  Endif
               Wend
               # -----
               str2 = GetWord( str1, 1 )
               If str2 <> '#SKILL' Then
                  UO.Print( 'Error of reading database. N 002' )
                  F2.Close()
                  return 0
               Endif
               skill = GetWord( str1, 2 )
               tm(12)
               ;
               ; RESOURCE
               ; --------------------------------------
               ; строки записывается в массив res начиная с 1 до 10,
               ; ненужные строки и нулевая - пустые.
               ;
               cyclflag = 0
               ClearMassiv( res, 10 )         ; очистим массив
               i = 1
               str1 = Safecall F2.ReadLn()
               If F2.Eof() OR fatal error Then
                  UO.Print( 'Error of reading database. N 003' )
                  F2.Close()
                  return 0
               Endif
               # ----- Проверка на комментарий
               While left( str1, 1 ) == ';'
                  ; комментарий
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 003' )
                     F2.Close()
                     return 0
                  Endif
               Wend
               # -----
               str2 = GetWord( str1, 1 )
               If str2 <> 'RESOURCE' Then
                  UO.Print( 'Error of reading database. N 004' )
                  F2.Close()
                  return 0
               Endif
               tm(13)
               repeat
                  ; цикл чтения ресурсов
                  res[i] = str1
                  i = i + 1
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 005' )
                     F2.Close()
                     return 0
                  Endif
                  # ----- Проверка на комментарий
                  While left( str1, 1 ) == ';'
                     ; комментарий
                     str1 = Safecall F2.ReadLn()
                     If F2.Eof() OR fatal error Then
                        UO.Print( 'Error of reading database. N 005' )
                        F2.Close()
                        return 0
                     Endif
                  Wend
                  # -----
                  str2 = GetWord( str1, 1 )
                  If str2 <> 'RESOURCE' Then
                     ; строки ресурсов кончились
                     cyclflag = 1
                  Else
                     If i > 10 Then
                        ; ресурсных строк больше 10
                        UO.Print( 'Error of reading database. N 006' )
                        F2.Close()
                        return 0
                     Endif
                  Endif
               until cyclflag
               tm(14)
               ;
               ; MENU
               ; --------------------------------------
               ; выбор записывается в массив menuhi
               ;
               cyclflag = 0
               ClearMassiv( menuhi, 6 )         ; очистим массив
               i = 1
               # ----- Проверка на комментарий
               While left( str1, 1 ) == ';'
                  ; комментарий
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 005' )
                     F2.Close()
                     return 0
                  Endif
               Wend
               # -----
               tm(15)
               str2 = GetWord( str1, 1 )
               If str2 <> 'MENU' Then
                  UO.Print( 'Error of reading database. N 007' )
                  F2.Close()
                  return 0
               Endif
               repeat
                  ; цикл чтения меню
                  tmpstr = right( str1, len(str1) - 5 )
                  menuhi[i] = GetQuote( tmpstr, 1 )
                  i = i + 1
                  menuhi[i] = GetQuote( tmpstr, 2 )
                  i = i + 1
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 008' )
                     F2.Close()
                     return 0
                  Endif
                  # ----- Проверка на комментарий
                  While left( str1, 1 ) == ';'
                     ; комментарий
                     str1 = Safecall F2.ReadLn()
                     If F2.Eof() OR fatal error Then
                        UO.Print( 'Error of reading database. N 008' )
                        F2.Close()
                        return 0
                     Endif
                  Wend
                  # -----
                  str2 = GetWord( str1, 1 )
                  If str2 <> 'MENU' Then
                     ; строки ресурсов кончились
                     cyclflag = 1
                  Else
                     If i > 7 Then
                        ; строк меню больше 3
                        UO.Print( 'Error of reading database. N 009' )
                        F2.Close()
                        return 0
                     Endif
                  Endif
               until cyclflag
               tm(16)
               ;
               ; RESULT
               ; --------------------------------------
               ; строка записывается в переменную result
               ;
               # ----- Проверка на комментарий
               While left( str1, 1 ) == ';'
                  ; комментарий
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     UO.Print( 'Error of reading database. N 008' )
                     F2.Close()
                     return 0
                  Endif
               Wend
               # -----
               str2 = GetWord( str1, 1 )
               If str2 <> 'RESULT' Then
                  UO.Print( 'Error of reading database. N 010' )
                  F2.Close()
                  return 0
               Endif
               result = GetWord( str1, 2 ) + ' ' + GetWord( str1, 4 ) + ' ' + GetWord( str1, 6 ) + ' '
               tm(17)
               ;
               ;============================================
               ; Крафтим конкретную описанную вещь
               ;
               If NOT CraftOfIt( skill, result, res, menuhi ) Then
                  tm(18)
                  F2.Close()
                  return 0
               Endif
               ;
               ;============================================
               ;
               str1 = Safecall F2.ReadLn()
               # ----- Проверка на комментарий
               While left( str1, 1 ) == ';'
                  ; комментарий
                  str1 = Safecall F2.ReadLn()
                  If F2.Eof() OR fatal error Then
                     F2.Close()
                     return 999
                  Endif
               Wend
               # -----
               str2 = GetWord( str1, 1 )
               If str2 == 'NEXTINBEGIN' OR str2 == 'NEXTINSTOP' Then
                  tm(990)
                  ;
                  ; NEXTINBEGIN или NEXTINSTOP
                  ;
                  If str2 == 'NEXTINBEGIN' Then
                     tm(991)
                     If UO.GetGlobal( 'LastResult' ) <> '' Then
                        ; если глобалка пустая - переназначать не на что
                        UO.SetGlobal( 'ContForResult', UO.GetGlobal( 'LastResult' ) )
                     Endif
                  Else
                     tm(992)
                     vendcont = OpenContainer( 'vendor' )
                  Endif
                  ;
                  str1 = Safecall F2.ReadLn()
                  # ----- Проверка на комментарий
                  While left( str1, 1 ) == ';'
                     ; комментарий
                     str1 = Safecall F2.ReadLn()
                     If F2.Eof() OR fatal error Then
                        F2.Close()
                        return 999
                     Endif
                  Wend                  
               Endif
               If left( str1, 1 ) == '@' Then
                  flag = 0
               Endif
                until flag == 0
            F2.Close()
            return 1
         Endif
      Endif
   until F2.Eof() OR fatal error
   UO.Print( 'Your keyword not found in database!' )
   F2.Close()
   return 0
endsub
;
Sub ClearMassiv( res, mx )
   VAR i
   For i = 0 To mx
      res[i] = ''
   Next
endsub
;
Sub CraftOfIt( skill, result, res, menuhi )
; В этих двух переменных и 2 массивах все что нам нужно для крафта одной
; конкретной вещи. Это эта фунция и делает. С взятием ресурсов, инструментов
; и учетом физлов.
;
   VAR maxres = 10
   VAR maxmenuhi = 6
   VAR i, success, focus, j = 0, tmpres
   ;
   tm(20)
   success = 0
   ; проверим массив меню
   for i = 1 To maxmenuhi
      If menuhi[i] == '' Then
         tm(21)
         j = i
         i = maxmenuhi
      Endif
   Next
   tm(22)
   If j <> 0 Then
      If j == 5 Then
         ; 2 уровня меню
         maxmenuhi = 4
         tm(23)
      Else
         If j == 3 Then
            ; 1 уровень меню
            maxmenuhi = 2
            tm(24)
         Else
            UO.Print( 'Error of reading database. N 026' )
            tm(25)
            return 0
         Endif
      Endif
   Endif
   ; здесь надо бы вставить проверочку переменной result, она должна
   ; быть вида '0x1414 0x0590 1', где первое число - тип, второе - цвет,
   ; третье - кол-во
   ;
   ; СДЕЛАТЬ В СЛЕД ВЕРСИИ!!!!!
   ;
   tm(26)
   repeat
      For i = 1 To maxres
         tm(27)
         if res[i] <> '' then
            tm(28)
            tmpres = res[i]
            If NOT GetResource( tmpres ) Then      ; взять в пак ресурс
               Return 0
            Endif
         Endif
      Next
      tm(29)
      If GetInstrument( skill ) == 0 Then
         return  0
      Endif
      tm(30)
      focus = ReadFocus( res, maxres )         ; на что прицел
      tm(31)
       If skill == 'tailor' Then
         success = MakeTailor( menuhi, maxmenuhi, focus, result )
         tm(32)
      Endif
      tm(33)
       If skill == 'bs' Then
         success = MakeBS( menuhi, maxmenuhi, focus, result )
         tm(34)
      Endif
       If skill == 'carpent' Then
         success = MakeCarpent( menuhi, maxmenuhi, focus, result )
      Endif
       If skill == 'alchemy' Then
         success = MakeAlchemy( menuhi, maxmenuhi, focus, result )
      Endif
       If skill == 'tinker' Then
         success = MakeTinker( menuhi, maxmenuhi, focus, result )
      Endif
      If Success == 999 Then
         return 0
      Endif
   until success <> 0
   ; Перекладываем эту вещь (result) из пака в приемный контейнер   
   ;
   ; ПОКА СЧИТАЕМ КОЛ-ВО КАК 1
   ;
   UO.FindType( GetWord(result, 1), GetWord(result, 2) )
   If UO.FindCount() == 0 Then
      ; эх, что-то не то в датском королевстве... Ведь успешно скрафтили, а вещи нету!
      UO.Print( 'Error of script! Unknown type of result!' )
      return 0
   Else
      ; На всяк случай запомним серийник последнего скрафченного предмета...
      ; запомним в глобальной переменной. Потому что вдруг он будет объявлен приемным
      ; контейнером в дальнейшем...
      UO.SetGlobal( 'LastResult', UO.GetSerial( 'finditem' ) )
      UO.MoveItem( 'finditem', 0, UO.GetGlobal( 'ContForResult' ) )
      wait(1000)
      CheckLag()
   Endif
   return 1
endsub
;
Sub GetResource( str1 )
;
; Берем ресурсы по строке (точнее проверяем и добираем)
; Возвращаем 1, если взяли, 0, если ошибка
;
; RESOURCE 0x1067 color 0 count 2 container leather
; RESOURCE 0x1067 color 0 count 2 container leather FOCUS
   VAR typ, col, cnt, cont, tmp, tmplen, cntval, tmplen2
   typ = GetWord( str1, 2 )
   tmp = GetWord( str1, 3 )
   tm(100)
   If tmp <> 'color' Then
      UO.Print( 'Error of reading database. N 011' )
      return 0
   Endif
   col = GetWord( str1, 4 )
   tmp = GetWord( str1, 5 )
   tm(101)
   If tmp <> 'count' Then
      UO.Print( 'Error of reading database. N 012' )
      return 0
   Endif
   cnt = GetWord( str1, 6 )
   tmp = GetWord( str1, 7 )
   If tmp <> 'container' Then
      UO.Print( 'Error of reading database. N 013' )
      return 0
   Endif
   cont = GetWord( str1, 8 )
   tm(102)
   ; проверим "правильность" переменных
   tmplen = len( typ )
   If tmplen < 6 OR tmplen > 6 Then
      UO.Print( 'Error of reading database. N 014' )
      return 0
   Endif
   tm(103)
   tmplen = len( cnt )
   If tmplen < 1 OR tmplen > 4 Then
      UO.Print( 'Error of reading database. N 015' )
      return 0
   Endif
   tm(104)
   tmplen = len( cont )
   If tmplen == 0 OR cont == 'FOCUS' Then
       UO.Print( 'Error of reading database. N 016' )
      return 0
   Endif
   tm(105)
   cntval = val( cnt )
   If cntval == 0 Then
       UO.Print( 'Error of reading database. N 017' )
      return 0
   Endif
   tm(106)
   ; Работаем
   If col <> '0' Then
      tm(1071)
      tmplen2 = UO.Count( typ, col )
      If tmplen2 < cntval Then
         tm(1072)
         tmplen = cntval - tmplen2
         cont = OpenContainer( cont )
         If cont == '0' Then
            return 0
         Endif
         UO.FindType( typ, col, cont )
         If UO.FindCount() == 0 Then
             UO.Print( 'Error of reading database. N 018' )
            return 0
         Else
            If UO.GetQuantity( 'finditem' ) < tmplen Then
                UO.Print( 'Error of reading database. N 019' )
               return 0
            Endif
         Endif
         ; ================================
         ; Здесь надо вставить защиту от попыток перетащить 1 шт. из очень
         ; тяжелой кучки!!!
         ;
         If tmplen > 1 Then
            UO.Grab( str(tmplen), 'finditem' )
         Else
            UO.Grab( '3', 'finditem' )
            repeat
               wait(100)
            until UO.Count( typ, col ) == tmplen2 + 3
            CheckLag()
            UO.FindType( typ, col )
            UO.MoveItem( 'finditem', '2', cont )
            repeat
               wait(100)
            until UO.Count( typ, col ) == cntval
         Endif
      Endif
   Else
      tm(1072)
      tmplen2 = UO.Count( typ )
      If  tmplen2 < cntval Then
         tmplen = cntval - tmplen2
         cont = OpenContainer( cont )
         UO.FindType( typ, -1, cont )
         If UO.FindCount() == 0 Then
             UO.Print( 'Error of reading database. N 020' )
            return 0
         Else
            If UO.GetQuantity( 'finditem' ) < tmplen Then
                UO.Print( 'Error of reading database. N 021' )
               return 0
            Endif
         Endif
         ; ================================
         ; Здесь надо вставить защиту от попыток перетащить 1 шт. из очень
         ; тяжелой кучки!!!
         ;
         If tmplen > 1 Then
            UO.Grab( str(tmplen), 'finditem' )
         Else
            UO.Grab( '3', 'finditem' )
            repeat
               wait(100)
            until UO.Count( typ ) == tmplen2 + 3
            CheckLag()
            UO.FindType( typ )
            UO.MoveItem( 'finditem', '2', cont )
            repeat
               wait(100)
            until UO.Count( typ ) == cntval
         Endif
      Endif
   Endif
   return 1
endsub
;
Sub OpenContainer( cont )
;
; Получаем условное название контейнера, открываем его на экране,
; возвращаем его сериал
;
; Структура простая: есть сундук commonbox, в котором куча всяких
; ящичков, боксов, паков, мешков с ресурсами и один из них с инструментом
;
   VAR commonbox = '0x40069CB2'   ; Сундук с ящиками и паками с ресурсами
   DIM boxes[11]
   boxes[0]  = 'tools 0x404300A0 '
   boxes[1]  = 'colortools 0x40246639 '
   boxes[2]  = 'blankdeeds 0x4042FB6D '
   boxes[3]  = 'leather 0x404325E6 '
   boxes[4]  = 'ingots 0x404327A2 '
   boxes[5]  = 'bricks 0x401A1AB7 '
   boxes[6]  = 'logs 0x402CE89F '
   boxes[7]  = 'elements 0x4042F09C '
   boxes[8]  = 'regs 0x40430813 '
   boxes[9]  = 'bottles 0x403C91EF '
   boxes[10] = 'vendor 0x4008EE64 '
   VAR box = '', i, tmp

   For i = 0 To 10
      tmp = GetWord( boxes[i], 1 )
      If tmp == cont Then
         box = GetWord( boxes[i], 2 )
      Endif
   Next
   If box == '' Then
      UO.Print( 'Error of reading database. N 022: ' + cont )
      return '0'
   Endif
   UO.UseObject( commonbox )
   wait(1000)
   CheckLag()
   UO.UseObject( box )
   wait(1000)
   CheckLag()
   If cont == 'vendor' Then
      UO.SetGlobal( 'ContForResult', box )
   Endif
   return box
endsub
;
Sub GetInstrument( skill )
;
; Берем нужный инструмент. Пока сделан только один вариант инструмента
; для каждого скилла. Также не сделан цветной инструмент
;
   DIM instr[5]
   instr[0] = 'tailor 0x0F9D '
   instr[1] = 'bs 0x13E3 '
   instr[2] = 'carpent 0x1030 '
   instr[3] = 'alchemy 0x0E9B '
   instr[4] = 'tinker 0x1EBC '
   VAR sunduk = OpenContainer( 'tools' )
   VAR i, typ = '', tmp

   For i = 0 To 4
      tmp = GetWord( instr[i], 1 )
      If tmp == skill Then
         typ = GetWord( instr[i], 2 )
      Endif
   Next
   If typ == '' Then
      UO.Print( 'Error of reading database. N 023: ' + skill )
      return 0
   Endif
   If UO.Count( typ ) > 0 Then
      ; в паке или руках есть такой инструмент
      return 1
   Else
      UO.FindType( typ, -1, sunduk )
      If UO.FindCount() == 0 Then
         UO.Print( 'I cannot find the instrument... type = ' + typ )
         return 0
      Endif
      UO.Grab( '0', 'finditem' )
      wait(1000)
      CheckLag()
   Endif
   return 1
endsub
;
Sub ReadFocus( res, razmer )
;
; Считываем из массива ресурсов на каком типе ресурсов фокус
;
; RESOURCE 0x1067 color 0 count 2 container leather
; RESOURCE 0x1067 color 0 count 2 container leather FOCUS
   VAR i, tmpword = '', tmpfocus = ''

   For i = 1 To razmer
      If res[i] <> '' Then
         tmpword = GetWord( res[i], 9 )
         If tmpword == 'FOCUS' Then
            tmpfocus = GetWord( res[i], 2 ) + ' ' + GetWord( res[i], 4 ) + ' '
         Endif
      Endif
   Next
   If tmpfocus == '' Then
      UO.Print( 'Error of reading database. N 024' )
      return 0
   Endif
   ;
   ; Вернем ресурс на котором фокус. Это описание вида:
   ; '0x1067 0x0000 ', где первое число - тип, второе - цвет
   ;
   return tmpfocus
endsub
;
Sub CheckInstrum( lay, typ )
;
; Убедимся что на указанном слое есть такой тип, если нет - найдем в паке
; (точно есть) и возьмем на указанный слой
;
   If UO.GetGraphic( UO.ObjAtLayer( lay ) ) <> typ Then
      UO.UnEquip( lay )
      wait(1000)
      CheckLag()
      UO.Equipt( lay, typ )
      repeat
         wait(100)
      until UO.GetGraphic( UO.ObjAtLayer( lay ) ) == typ
   Endif
endsub
;
Sub MakeBS( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент
; там же. Если успешно - возвращаем 1, если физл - 0
;
   VAR success = 'You put'
   VAR fizzle = 'You have failed'
   VAR instrum = '0x13E3'
   VAR i, k, tmpmenu
   ; при БС берем в руки инструмент, потом дважды щелкаем (используем)
   ; металл (фокус)
   CheckInstrum( 'Rhand', instrum )
   DeleteJournal( success )
   DeleteJournal( fizzle )
   UO.CancelMenu()
   If razmer == 2 Then
      UO.WaitMenu( menuhi[1], menuhi[2] )
   Else
      If razmer == 4 Then
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
      Else
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
      Endif
   Endif

   If GetWord( focus, 2 ) == '0' Then
      UO.FindType( GetWord( focus, 1 ) )
   Else
      UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
   Endif
   If UO.FindCount() == 0 Then
      UO.CancelMenu()
      UO.Print( 'Error of crafting. N 025' )
      return 999
   Endif
   UO.UseObject( 'finditem' )
   k = 1
   repeat
      wait(100)
      k = k + 1
   until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;   UO.CancelMenu()
   If UO.InJournal( success ) Then
      return 1
   Endif
   return 0
endsub
;
Sub MakeTailor( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент
; там же. Если успешно - возвращаем 1, если физл - 0
;
   VAR success = 'You put'
   VAR fizzle = 'fail'
   VAR instrum = '0x0F9D'
   VAR i, k, tmpmenu
   ; при тейлоре дважды щелкаем (используем) инструмент в паке и
   ; на кожу (фокус)
   DeleteJournal( success )
   DeleteJournal( fizzle )
   UO.CancelMenu()
   If razmer == 2 Then
      UO.WaitMenu( menuhi[1], menuhi[2] )
   Else
      If razmer == 4 Then
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
      Else
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
      Endif
   Endif
   If GetWord( focus, 2 ) == '0' Then
      UO.FindType( GetWord( focus, 1 ) )
   Else
      UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
   Endif
   If UO.FindCount() == 0 Then
      UO.CancelMenu()
      UO.Print( 'Error of crafting. N 025' )
      return 999
   Endif
   UO.WaitTargetObject( 'finditem' )
   UO.UseType( instrum )
   k = 1
   repeat
      wait(100)
      k = k + 1
   until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;   UO.CancelMenu()
   If UO.InJournal( success ) Then
      return 1
   Endif
   return 0
endsub
;
Sub MakeCarpent( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент
; там же. Если успешно - возвращаем 1, если физл - 0
;
   VAR success = 'You put'
   VAR fizzle = 'fail'
   VAR instrum = '0x1030'
   VAR i, k, tmpmenu
   ; при карпентри дважды щелкаем (используем) инструмент в паке
   DeleteJournal( success )
   DeleteJournal( fizzle )
   UO.CancelMenu()
   If razmer == 2 Then
      UO.WaitMenu( menuhi[1], menuhi[2] )
   Else
      If razmer == 4 Then
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
      Else
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
      Endif
   Endif
   UO.UseType( instrum )
   k = 1
   repeat
      wait(100)
      k = k + 1
   until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;   UO.CancelMenu()
   If UO.InJournal( success ) Then
      return 1
   Endif
   return 0
endsub
;
Sub MakeAlchemy( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент
; там же. Если успешно - возвращаем 1, если физл - 0
;
   VAR success = 'You put'
   VAR fizzle = 'fail'
   VAR i, k, tmpmenu
   ; при алхимии дважды щелкаем (используем) ресурс фокуса
   DeleteJournal( success )
   DeleteJournal( fizzle )
   UO.CancelMenu()
   If razmer == 2 Then
      UO.WaitMenu( menuhi[1], menuhi[2] )
   Else
      If razmer == 4 Then
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
      Else
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
      Endif
   Endif
   If GetWord( focus, 2 ) == '0' Then
      UO.FindType( GetWord( focus, 1 ) )
   Else
      UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
   Endif
   If UO.FindCount() == 0 Then
      UO.CancelMenu()
      UO.Print( 'Error of crafting. N 025' )
      return 999
   Endif
   UO.UseObject( 'finditem' )
   k = 1
   repeat
      wait(100)
      k = k + 1
   until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;   UO.CancelMenu()
   If UO.InJournal( success ) Then
      return 1
   Endif
   return 0
endsub
;
Sub MakeTinker( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент
; там же. Если успешно - возвращаем 1, если физл - 0
;
   VAR success = 'You put'
   VAR fizzle = 'fail'
   VAR instrum = '0x1EBC'
   VAR i, k, tmpmenu
   ; при тинкере дважды щелкаем (используем) инструмент в паке
   DeleteJournal( success )
   DeleteJournal( fizzle )
   UO.CancelMenu()
   If razmer == 2 Then
      UO.WaitMenu( menuhi[1], menuhi[2] )
   Else
      If razmer == 4 Then
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
      Else
         UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
      Endif
   Endif
   UO.UseType( instrum )
   k = 1
   repeat
      wait(100)
      k = k + 1
   until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;   UO.CancelMenu()
   If UO.InJournal( success ) Then
      return 1
   Endif
   return 0
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

#####################################################################
Sub tm( nom1 )
   If UO.GetGlobal( 'otladka' ) == '1' Then
      UO.TextPrint( 'TEST. Step number ' + str( nom1 ) )
   Endif
endsub


Top
   
 Post subject:
PostPosted: 2006-03-10 18:43:42 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
ЗЫ: В последнем скрипте планировалось, как помнится, перевести список на менюшку в дельфи, саму менюшку сделал, но не подключил к скрипту...

Продолжение следует, еще много скриптов, но не счас, устал малость... :oops:


Top
   
 Post subject:
PostPosted: 2006-03-10 20:27:03 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
AutoJail.sc

Code:
#####################################################################
; Скрипт на автособирание навоза на конюшне. Скрипт работает по маршруту,
; прописываемому в строковую переменную JailPatch.
; В этой строке перечисляются через пробел координаты точек, в которые
; чар должен приходить, а также ставятся команды OPEN, GET, END, WAIT.
; Команда OPEN открывает ближайшую к чару дверь, команда GET ищет в радиусе
; двух клеток от чара навоз и "берет" его. При этом проверяется, может
; ли чар взять его. Если нет - поиск повторяется. Если навоз отсутствует -
; чар ждет его появления. Команда END ставится в конце маршрута, это сигнал
; скрипту переходить к началу маршрута. Команда WAIT означает что надо подождать
; 60 сек. прежде чем продолжать (не заставляйте чара долго ждать респауна
; внутри отсека, если дверь закроется - чар не выйдет из отсека и скрипт
; собъется. Помните, это лишь самая первая и простая версия этого скрипта).
; Поэтому в конце маршрута перед командой END задайте несколькими командами
; WAIT приблизительную необходимую паузу на респаун навоза. Я не задаю точных
; величин, так как скрипт предусматривает ваш собственный маршрут, который
; необязательно должен включать в себя все отсеки (если вы в джайле не один,
; вы можете разделить ее между собой). Также рекомендую заносить в маршрут
; "узловые точки", например, точку выхода из крайних отсеков.
;
; Ходилка в скрипте используется простейшая, без обхода препятствий. Так что
; если чар упирается - добавляйте в маршрут промежуточную точку.
; На самом деле - скрипт простейший, собран из кирпичиков, все они
; есть на форуме. Не понимаю, чего народ парится...
;
; ВНИМАНИЕ! В скрипте нет проверок "на дурака" от неправильного написания
; маршрута. Все последствия - на вашей совести.
;
; В качестве примера в скрипте прописан маршрут по верхнему левому ряду конюшни.
;
; v.1.00b (c) Edred
;
sub AutoJail()
   VAR JailPatch = '1293 1767 OPEN 1291 1767 GET 1293 1770 OPEN 1291 1770 GET 1293 1773 OPEN 1291 1773 GET 1293 1776 OPEN 1291 1776 GET 1293 1779 OPEN 1291 1779 GET 1293 1782 OPEN 1291 1782 GET 1295 1782 WAIT WAIT END'
   VAR navoz = '0x0F3C'
   VAR woodgate = '0x0843'
   VAR str1, str2, i = 1, sum = 0
   VAR NeedGuano = 20000
   UO.Set( 'distance', '3' )
   UO.Set( 'finddistance', '3' )
   JailPatch = JailPatch + ' '
   repeat
      str1 = GetWord( JailPatch, i )
      If str1 <> '' Then
         If str1 == 'OPEN' Then
            ; откроем ближайшую дверь
            OpenGate( woodgate )
         Else
            If str1 == 'GET' Then
               ; берем навоз
               GetGuano( navoz )
               sum = sum + 1
               If sum > NeedGuano Then
                  UO.Print( 'I made it!!! Congratulations!' )
                  return
               Endif
            Else
               If str1 == 'END' Then
                  i = 0
               Else
                  If str1 == 'WAIT' Then
                     wait(60000)
                  Else
                     ; str1 - координата
                     i = i + 1
                     str2 = GetWord( JailPatch, i )
                     GoToXY( val(str1), val(str2), 0 )
                  Endif
               Endif
            Endif
         Endif
      Else
         i = 0
      Endif
      i = i + 1
   until sum > NeedGuano
endsub

Sub OpenGate( typ1 )
   VAR nemogu = "You can't reach that."
   repeat
      UO.Findtype( typ1, '-1', '1' )
      DeleteJournal( nemogu )
      UO.UseObject( 'finditem' )
      wait(500)
      CheckLag()
      If UO.InJournal( nemogu ) Then
         UO.Ignore( 'finditem' )
      Else
         return
      Endif
   until False
endsub

Sub GetGuano( typ1 )
   VAR nemogu = "You can't reach that."
   repeat
      UO.FindType( typ1, '-1', '1' )
      If UO.FindCount() > 0 Then
         DeleteJournal( nemogu )
         UO.UseObject( 'finditem' )
         wait(500)
         CheckLag()
         If UO.InJournal( nemogu ) Then
            UO.Ignore( 'finditem' )
         Else
            UO.IgnoreReset()
            return
         Endif
      Else
         wait( 1000 )
      Endif
   until False
endsub

Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
   VAR tmpst
   VAR i, dlin, kol, start
   dlin = len( st )
   kol = 0
   start = 0
   For i=0 To dlin - 1
      If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
         kol = kol + 1
         If kol == nom Then
            ; это первый пробел после нужного нам слова
            tmpst = mid( st, start, i - start )
            return tmpst
         Else
            While mid( st, i, 1 ) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 Then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   return tmpst
endsub

; Удаляем указанную фразу из журнала
;
Sub DeleteJournal( string1 )
   VAR nom = UO.InJournal( string1 )
   If nom > 0 Then
      UO.SetJournalLine( Nom - 1, ' ' )
      DeleteJournal( string1 )
   Endif
endsub
;
; Проверка на лаги
; Идея - Savage
Sub CheckLag()
   DeleteJournal( 'backpack' )
   UO.Click( 'backpack' )
   repeat
      wait(100)
   until UO.InJournal( 'backpack' )
   return
end sub

SUB GoToXY(x,y,prec)
; Хождение по мировым координатам с точностью prec и скоростью, зависящей от wt
; (c) Yoko, AGRS
  UO.TextPrint('GoToXY '+STR(x)+', '+STR(y))
   Var ld=0,ldc=0
   Var dx,dy
   Var mx,my
   Var ox,oy,mk,k
start:
   mx=UO.GetX()
   my=UO.GetY()
   dx=mx-x
   If dx<0 Then
      dx=0-dx
   EndIf
   dy=my-y
   If dy<0 Then
      dy=0-dy
   EndIf
   If dy>dx Then
      dx=dy
   EndIf
   If dx<=prec Then
      Return
   EndIf
   If dx<3 Then
      mk=70
   Else
      mk=15
   EndIf
   ox=mx
   oy=my
   For k=1 To mk
      mx=UO.GetX()
      my=UO.GetY()
      If mx<>ox Or my<>oy Then
         GoTo sdidapl
      EndIf
   Next
sdidapl:
   mx=UO.GetX()
   my=UO.GetY()
   dx=mx-x
   If dx<0 Then
      dx=0-dx
   EndIf
   dy=my-y
   If dy<0 Then
      dy=0-dy
   EndIf
   If dy>dx Then
      dx=dy
   EndIf
   If dx<=prec Then
      Return
   EndIf
   If ld==dx Then
      ldc=ldc+1
      If ldc>100 Then
         UO.Print("Can not reach location!")
         Return
      EndIf
   Else
      ld=dx
   EndIf
   If mx==x Then
      If my==y Then
         Return
      EndIf
      If my>y Then
         UO.Press(33)
         GoTo start
      EndIf
      UO.Press(35)
      GoTo start
   EndIf
   If mx<x Then
      If my>y Then
         UO.Press(39)
         GoTo start
      EndIf
      If my==y Then
         UO.Press(34)
         GoTo start
      EndIf
      UO.Press(40)
      GoTo start
   EndIf
   If my<y Then
      UO.Press(37)
      GoTo start
   EndIf
   If my==y Then
      UO.Press(36)
      GoTo start
   EndIf
   UO.Press(38)
   GoTo start
endsub


Top
   
 Post subject:
PostPosted: 2006-03-11 06:30:01 
Offline

Joined: 2005-04-19 18:00:29
Posts: 2259
Location: Московская область
своя рубашка конечно всегда ближе к телу,- но однако есть и интересные скрипты %)) ближе к пвп -)


Top
   
 Post subject:
PostPosted: 2006-03-11 11:16:21 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Простейшие добывающие:

Code:
#####################################################################
; LumberAround. v.3.25b (c) Edred
;
; Рубим вокруг чара. Используется ASM-модуль для инжекта для поиска деревьев.
;
sub LamberAround()
   VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY
   VAR MaxTime = 600                        ; измеряется в 1/10 сек.
   VAR ms1 = "There are no logs here to chop"      ; нет логов
   VAR ms2 = "You can't use"                  ; не можем
   VAR ms3 = "in your pack."                  ; вырубили логи
   VAR ms4 = "You fail to produce"               ; физл
   VAR ms5 = "You are too far away"            ; стоим далеко
   VAR ms6 = "It appears immune to your blow"      ; не проходит удар
   VAR ms7 = "You can't see that"               ; не можем увидеть
   VAR ms8 = "is destroyed*"                  ; топор развалился
   VAR ms9 = "Try to kill my spirit at first!"      ; вырубили духа дерева
   UO.asmTLStaticOpen('Resource_Static.dat')   ; Загрузим таблицу типов статики
   VAR i, strpoint
   VAR MaxVes = 580
   cx = UO.GetX()
   cy = UO.GetY()
   for tmpx = -3 to 3
      for tmpy = -3 to 3
         k = 0
         pointX = cx + tmpx
         pointY = cy + tmpy
         strpoint = str(pointX) + ' ' + str(pointY)
         repeat
            DeleteJournal( ms1 )
            DeleteJournal( ms2 )
            DeleteJournal( ms3 )
            DeleteJournal( ms4 )
            DeleteJournal( ms5 )
            DeleteJournal( ms6 )
            DeleteJournal( ms7 )
            DeleteJournal( ms8 )
            DeleteJournal( ms9 )
            t = UO.Timer() + MaxTime
            k = k + 1
            wait(300)
            CanMine = UO.asmWaitTargetStaticTile( 'tree', PointX, PointY, 0 )
            If CanMine Then
               UO.UseObject(UO.ObjAtLayer('Lhand'))
               repeat
                  wait(100)
               until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
            Endif
            If UO.Weight > MaxVes Then
               ; Вес превышен!
               return
            Endif
            If UO.InJournal( ms8 ) Then
               ; топор накрылся!
               return
            Endif
            If UO.InJournal( ms9 ) Then
               ; дух дерева!
               return
            Endif
         until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
         Endif
      next
   next
endsub

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


Code:
#####################################################################
; MiningAround. v.2.01b (c) Edred
;
; Копаем вокруг чара. Используется ASM-модуль для инжекта для поиска
; выкапыемых тайлов или краев скал.
;
; MiningAround2 - вскапываем вокруг чара без АСМа
;
;
sub MiningAround()
; MiningAround() - вскапываем вокруг чара
;
   VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY, flag
   VAR MaxTime = 600                     ; измеряется в 1/10 сек.
   VAR ms1 = "There is no ore here to mine"
   VAR ms2 = "Это не копается."
   VAR ms3 = "in your pack."
   VAR ms4 = "You fail to find any useable ore"
   VAR ms5 = "Далеко. Не дотянуться."
   VAR ms6 = "Try mining in rock"
;   VAR ms7 = "You can't see that"
   VAR ms7 = "Хм... Не вижу.. Где копать то?."
   VAR ms8 = "is destroyed*"               ; кирка развалилась совсем
   VAR ms9 = "ore at your feet."            ; предположительно - элементаль
   UO.asmTLMapOpen('Resource_Map.dat')         ; Загрузим таблицу типов карты
   UO.asmTLStaticOpen('Resource_Static.dat')   ; Загрузим таблицу типов статики
   VAR i, strpoint
   VAR MaxVes = 600
   cx = UO.GetX()
   cy = UO.GetY()
   for tmpx = -2 to 2
      for tmpy = -2 to 2
         k = 0
         pointX = cx + tmpx
         pointY = cy + tmpy
         repeat
            DeleteJournal( ms1 )
            DeleteJournal( ms2 )
            DeleteJournal( ms3 )
            DeleteJournal( ms4 )
            DeleteJournal( ms5 )
            DeleteJournal( ms6 )
            DeleteJournal( ms7 )
            DeleteJournal( ms8 )
            DeleteJournal( ms9 )
            t = UO.Timer() + MaxTime
            k = k + 1
            flag = 1
            wait(300)
            If UO.Waiting() Then
               UO.CancelTarget()
            Endif
            CanMine = UO.asmWaitTargetMapTile( 'rock', pointX, PointY, 0 )
            wait(50)
            If CanMine Then
               UO.UseObject(UO.ObjAtLayer('Lhand'))
            Else
               If UO.Waiting() Then
                  UO.CancelTarget()
               Endif
               CanMine = UO.asmWaitTargetStaticTile( 'rock', PointX, PointY, 0 )
               wait(50)
               If CanMine Then
                  UO.UseObject(UO.ObjAtLayer('Lhand'))
               Else
                  flag = 0
               Endif
            EndIf
            If flag == 1 Then
               repeat
                  wait(100)
               until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
            Endif
            If UO.InJournal( ms9 ) Then
               ; вывалился элементаль...
               return
            Endif
            If UO.Weight > MaxVes Then
               ; Вес превышен!
               return
            Endif
            If UO.InJournal( ms8 ) Then
               ; кирка накрылась!
               return
            Endif
         until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
      next
   next
   If UO.Waiting() Then
      UO.CancelTarget()
   Endif
endsub

sub MiningAround2()
; MiningAround2() - вскапываем вокруг чара без АСМа
;
   VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY, flag
   VAR MaxTime = 600                     ; измеряется в 1/10 сек.
   VAR ms1 = "There is no ore here to mine"
   VAR ms2 = "Это не копается."
   VAR ms3 = "in your pack."
   VAR ms4 = "You fail to find any useable ore"
   VAR ms5 = "Далеко. Не дотянуться."
   VAR ms6 = "Try mining in rock"
;   VAR ms7 = "You can't see that"
   VAR ms7 = "Хм... Не вижу.. Где копать то?."
   VAR ms8 = "is destroyed*"               ; кирка развалилась совсем
   VAR ms9 = "ore at your feet."            ; предположительно - элементаль
   VAR i, strpoint
   VAR MaxVes = 600
   cx = UO.GetX()
   cy = UO.GetY()
   for tmpx = -2 to 2
      for tmpy = -2 to 2
         k = 0
         pointX = cx + tmpx
         pointY = cy + tmpy
         repeat
            DeleteJournal( ms1 )
            DeleteJournal( ms2 )
            DeleteJournal( ms3 )
            DeleteJournal( ms4 )
            DeleteJournal( ms5 )
            DeleteJournal( ms6 )
            DeleteJournal( ms7 )
            DeleteJournal( ms8 )
            DeleteJournal( ms9 )
            t = UO.Timer() + MaxTime
            k = k + 1
            flag = 1
            wait(300)
            If UO.Waiting() Then
               UO.CancelTarget()
            Endif
            UO.WaitTargetTile( 'all', str(pointX), str(PointY), '0' )
            UO.UseObject(UO.ObjAtLayer('Lhand'))
            repeat
               wait(100)
            until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
            Endif
            If UO.InJournal( ms9 ) Then
               ; вывалился элементаль...
               return
            Endif
            If UO.Weight > MaxVes Then
               ; Вес превышен!
               return
            Endif
            If UO.InJournal( ms8 ) Then
               ; кирка накрылась!
               return
            Endif
         until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
      next
   next
endsub
;
Sub DeleteJournal( string1 )
   VAR nom = UO.InJournal( string1 )
   If nom > 0 Then
      UO.SetJournalLine( Nom - 1, ' ' )
      DeleteJournal( string1 )
   Endif
endsub
;
Sub CheckLag()
   DeleteJournal( 'backpack' )
   UO.Click( 'backpack' )
   repeat
      wait(50)
   until UO.InJournal( 'backpack' )
   return
endsub


Code:
#####################################################################
; FishingAround. v.2.07b (c) Edred
;
; Рыбачим вокруг чара
;
sub FishingAround()
   VAR Ms0 = "You can't see"         ; не можем ловит здесь
   VAR Ms1 = "You can't fish under the ship"   ; не можем ловить здесь
   VAR Ms2 = "You are too far away"      ; далеко
   VAR Ms3 = "There are no fish here"      ; кончилось тут
   VAR Ms4 = "You fish a while, but fail to catch anything"   ; физл
   VAR Ms5 = "You pull out"         ; поймал что-то
   VAR Ms6 = "Try fishing in water."      ; не можем ловить здесь
   VAR k, t, v, x, y
   VAR MaxTime = 800
   For y = -4 To 4
      For x = -4 To 4
         k = 0
         repeat
            If UO.Dead() Then
               return
            Endif
            DeleteJournal(ms0)
            DeleteJournal(ms1)
            DeleteJournal(ms2)
            DeleteJournal(ms3)
            DeleteJournal(ms4)
            DeleteJournal(ms5)
            DeleteJournal(ms6)
            t = UO.Timer()
            If UO.Waiting() Then
               UO.CancelTarget()
            Endif
            UO.WaitTargetTile( '0', STR( UO.GetX() + x ), STR( UO.GetY() + y ), '251')
            UO.UseObject( UO.GetSerial( UO.ObjAtLayer( 'Lhand' ) ) )
            repeat
               wait(100)
            until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR ((t + MaxTime) < UO.Timer())
            k = k + 1
            If UO.InJournal(ms5) Then
               k = 0
            Endif
            If UO.Dead() Then
               return
            Endif
            If UO.InJournal( ms5 ) Then
               GetResultFish()
            Endif
         until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR (k > 6)
         If UO.Dead() Then
            return
         Endif
      Next
   Next
endsub

Sub GetResultFish()
   ; ------- улов -------
   DIM Fish[18]
   Fish[0]  = '0x170B'   ; сапоги
   Fish[1]  = '0x170F'   ; тапки
   Fish[2]  = '0x170D'   ; сандалии
   Fish[3]  = '0x1711'   ; сапоги
   Fish[4]  = '0x09CC'   ; тип рыбы 1
   Fish[5]  = '0x09CD'   ; тип рыбы 2
   Fish[6]  = '0x09CE'   ; тип рыбы 3
   Fish[7]  = '0x09CF'   ; тип рыбы 4
   Fish[8]  = '0x0FC4'   ; ракушка, тип 1
   Fish[9]  = '0x0FC5'   ; ракушка, тип 2
   Fish[10] = '0x0FC6'   ; ракушка, тип 3
   Fish[11] = '0x0FC7'   ; ракушка, тип 4
   Fish[12] = '0x0FC8'   ; ракушка, тип 5
   Fish[13] = '0x0FC9'   ; ракушка, тип 6
   Fish[14] = '0x0FCA'   ; ракушка, тип 7
   Fish[15] = '0x0FCB'   ; ракушка, тип 8
   Fish[16] = '0x0FCC'   ; ракушка, тип 9
   Fish[17] = '0x14ED'   ; карта
   VAR Razmer = 17      ; размер массива - 1
   VAR Scissor = '0x0F9E'   ; тип ножниц
   VAR Bandag = '0x0E21'      ; Тип бинтов
   VAR i
   ; Ищем что у нас валяется под ногами, если надо перерабатываем
   ; и складируем в трюм. Потом введем всякие мешочки разные и ящички.
   For i = 0 To Razmer
      UO.FindType( Fish[i], '-1', 'ground' )
      If UO.FindCount() > 0 Then
         If i < 4 Then
            ; обувь
            UO.WaitTargetObject( 'finditem' )
            UO.UseType( Scissor )
            Wait( 3000 )
            UO.FindType( Bandag )
         Endif
         UO.Grab( '0', 'finditem' )
         Wait( 2000 )
         If i > 7 AND i < 17 Then
            ; ракушка
            UO.UseObject( 'finditem' )
            wait(1000)
         Endif
      Endif
   Next
endsub

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


Top
   
 Post subject:
PostPosted: 2006-03-11 13:14:52 
Offline

Joined: 2006-02-03 06:53:36
Posts: 64
спасибо, много интересных решений


Top
   
 Post subject:
PostPosted: 2006-03-11 16:19:44 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Если бы ты писал не скрипты, а операционку, что-нибудь вроде вин3.1 написать мог бы -)


Top
   
 Post subject:
PostPosted: 2006-03-11 17:32:15 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Destruction wrote:
Если бы ты писал не скрипты, а операционку, что-нибудь вроде вин3.1 написать мог бы -)


Погоди, ты еще главного моего творчества не видел... Мининг и ламбер в одном флаконе. Но увидишь. Счас хостинг найду куда архивы положить и кину сюда все (там меню на дельфи, надо куда-то екзешник положить).


Top
   
 Post subject:
PostPosted: 2006-03-11 19:34:15 
Offline

Joined: 2005-07-27 08:48:54
Posts: 7
Location: Лучший вид на этот город - если сесть в бомбардировщик...
Вот это да! :shock: :)

Сорри - не удержался!


Top
   
 Post subject:
PostPosted: 2006-03-13 09:09:53 
Offline
User avatar

Joined: 2005-01-13 07:20:54
Posts: 528
ВНИМАНИЕ ССЫЛКИ НА ФАЙЛЫ ПО ЭТОМУ ТОПИКУ !

UPDATE 1.07.06
http://vlad.nagorniy.ru/files/

конкретно по минингу тут
http://vlad.nagorniy.ru/files/edred/Mine&Lumb/

9-745-475


Last edited by admir on 2006-07-01 05:52:31, edited 3 times in total.

Top
   
 Post subject:
PostPosted: 2006-03-13 17:11:45 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Благодаря Адмиру нужные файлики теперь лежат в оне, посему начну постить свой мининг и ламбер. Думаю, постов в десять помещусь :shock:

файл readme

Code:
Как установить скрипт:

1. Установить инжект и настроить его (версия 312.19, выложена на сайте
Цитадели).

2. Установить ASM версии не ниже 503.01 (для этого необходимо переименовать
файл script.dll в папке инжекта на файл scriptengine.dll и после этого
скопировать все файлы из папки ASM в папку инжекта). Более подробная
информация - на сайте АГРСа (автор ASM-модуля для инжекта).
http://agrs.info/asm

3. Скопировать в папку с инжектом файлы mine&lumb.ini, setup4ML.exe,
resource_map.dat, resource_static.dat

4. Скопировать в какую-нибудь подпапку или папку с инжектом скрипт
mine&lumb.sc (местонахождение скрипта непринципиально)

5. Запустить игру с инжектом, зайти на закладку script, загрузить файл
скрипта, запустить процедуру main.


ПЕРЕД ЗАПУСКОМ СКРИПТА НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ВНИМАТЕЛЬНО ИЗУЧИТЬ
ФАЙЛ mine&lumb.hst (ЭТО ТЕКСТОВЫЙ ФАЙЛ).


файл mine&lamb.hst

Code:
#===================================================================#
# MINING & LUMBERJACKING.                                           #
#===================================================================#
#   v.1.00 - 3.30b (с) Edred, 2004-2005                             #
#===================================================================#

Многофункциональный скрипт на мининг и ламбер с возможностью выбирать
режим  работы через меню и заданием настроек в ини-файле (то есть нет
необходимости редактировать скрипт!)

Поддерживаются 6 режимов работы:

          1. Режим копки по краям скал
          2. Режим копки по полу шахт
          3. Режим рубки леса
          4. Режим разметки маршрутов
          5. ВИП-шахта
          6. ВИП-лес

Все добывающие режимы работают по маршрутам. Разметка маршрута осуще-
ствляется  так:  выбираете  режим 4, задаете номер машрута (из меню),
скрипт  дополнительно  спросит о том режиме скрипта, в котором данный
маршрут будет задействован. После этого на экран будет выведено окош-
ко с кнопкой подтверждения окончания разметки маршрута. Переключитесь
обратно на игру и проведите чара по планируемому маршруту. Скрипт бу-
дет  автоматически записывать этот маршрут. В конечной точке маршрута
переключитесь на окно с кнопкой и нажмите Enter.  Помните - начальной
точкой маршрута всегда является месторасположения чара в момент нача-
ла разметки.  Обратите  внимание: скрипт будет сам находить деревья в
случае  ламбера и скалу в случае копки вокруг скал. Также автоматиче-
ски определяются тайлы, пригодные для копки по полу шахты.

В первых трех режимах скрипта задействованы по 8 маршрутов, в послед-
них  двух (ВИП)  -  по  2  маршрута.  После окончания последнего мар-
шрута чар автоматически перейдет на первый.  Стартовый номер маршрута
задается  из  стартового меню. В первых трех режимах работы чар между
маршрутами реколлится на базу для разгрузки (при этом сделана возмож-
ность  подходить  к  месту разгрузки на базе из реколлки),  в ВИП-ре-
жимах  -  чар  без  реколлов  подходит к месту разгрузки (прилоченный
сундук). В первых трех режимах начальные точки всех маршрутов необхо-
димо  отмарчить  рунами,  которые поместить в соответствующие рунбуки
(см. mine&lumb.ini, комментарии).

В стартовом меню вы можете задать:

   1. Использовать ли во время добычи хайд.
   2. Пить ли инвизы при тревоге (тревога от ПК).
   3. Использовать процедуру хождения с обходом препятствий (в данной
      версии  скрипта  она  используется независимо от вашего выбора)
   4. Использовать  разгрузку  в  банк.  Логика этого режима (нового,
      введен с версии 3.30)  такова: если это обычная копка/рубка, то
      включение  этого флага означает, что чар по руне на базу рекол-
      лится  на самом деле к банку (или вывеске дома) и разгружается.
      Если это ВИП-режимы,  где реколлы не задействованы, то осущест-
      вляется подход к банку/вывеске.
   5. Вести  подробный  лог.  В  этом случае в файл лога сбрасываются
      данные о каждом шаге чара,  о каждом ударе киркой и его резуль-
      тате.  Также  после  разрушения  инструмента в лог записывается
      сводная таблица добытого с его помощью и счетчики обнуляются.

Нажатие  кнопки  Save  в стартовом меню приводит к продолжению работы
скрипта, нажатие Cancel прерывает скрипт. При нажатии Save меню запи-
сывает  ваш  выбор  в соответствующие параметры файла mine&lumb.ini и
передает управление обратно скрипту (при запуске скрипта тот запуска-
ет меню и встает в ожидание вашего выбора).

Во время работы первых трех режимов скрипта осуществляется отслежива-
ние  появления других чаров, эти чары сортируются на ПК и АПК по цве-
ту, для каждого типа существуют обособленные параметры (см. ини-файл)
расстояний, на которые те могут приблизиться. Если другой чар прибли-
жается ближе указанного расстояния - ваш чар выпьет инвиз (если вклю-
чено)  и  среколлится на базу для разгрузки, после чего отправится на
следующий  маршрут.  Существует список исключений, то есть чаров, чье
появление скриптом будет игнорироваться (В данной  версии  исключения
указываются  в  теле  скрипта в функции ControlPK, в дальнейшем будут
вынесены в ини-файл).  Также в дальнейшем планируется добавить убега-
ние от ПК во время ожидания реколла (в случае отказа от инвизов).

Также  во время работы первых трех режимов скрипта осуществляется от-
слеживание появления елементалей, медведей, духов деревьев (последнее
пока не сделано).  В случае их появления, чар сбрасывает инструмент в
пак,  берет в руки оружие и щит и сражается с врагом.  После убийства
он вскрывает труп и лутит его. После этого вновь берет в руки инстру-
мент  и продолжает добычу ресурсов. Во время сражения чар автоматиче-
ски отхиливается с бинтов, пьет греат хилл поушен (в случае если здо-
ровья меньше 60).  Процедура отслеживания ПК работает и во время сра-
жения!

При разгрузке на базе чар сбрасывает в указанные (файл mine&lumb.ini)
сундуки и контейнеры в них добытое, лишние реги (оставляет себе толь-
ко  по  6 шт.  регов  для реколлов), при необходимости добирает реги,
аналогично  с  бинтами, кровавыми бинтами, поушенами, кливерами, нож-
ницами.  Также поверяется на целостность инструмент и при необходимо-
сти (разрушение) берется новый.

Во время работы по маршруту осуществляется контроль веса чара. В слу-
чае  перевеса  (макс. величина задается в файле mine&lumb.ini) добыча
прерывается и чар отправляется на разгрузку.

В  ВИП-режимах: контроль за ПК не осуществляется, также в данной вер-
сии  осуществляется  контроль  только за выкопанными или вырубленными
елементалями  и духами леса (через перевес). При разгрузке  структура 
контейнеров  другая (один сундук). Контроль инструмента при этом осу-
ществляется.

В  ВИП режимах  осуществляется  контроль  за состоянием сытости чара,
при  этом  производится  подкормка  чара медом, который должен быть в
паке чара. Добор меда и контроль сытости чара в других режимах в дан-
ной версии не подключен.

Также пока не подключено: авторес чара в случае смерти, реколлы через
заряды рунбуки (после автореса), реконнектор.

В подробный лог пишется: при запуске скрипта пишется записать в лог 3
пустые строки, после этого пишется информация о старте скрипта ио со-
стоянии  инструмента.  Потом записывается номер маршрута и в процессе
работы по маршруту записываются  координаты куда идет чар, координаты
точек добычи, результат каждого удара. При вылезании елема или рипера
скидываем информацию о нем. В процессе боя с  элемом/рипером/медведем
скидываем  информацию  о  выпитых  греат хиллах. В случае килла элема
скидываем информацию об этом, и о луте с этого элема/рипера. При убе-
гании от ПК или зверя скидываем информацию об этом а также сериал ча-
ра,  от  которого убегаем. А также о выпитых инвизах. В случае смерти
чара скидываем информацию об этом и сериал объекта, который нас убил.
При  разгрузке  скидываем информацию обо всех разгруженных ресурсах с
количеством. Количество суммируем с ранее добытым. Суммарную информа-
цию  показываем  в логе в квадратных скобках и записываем в ини-файл.
Пишем обо всех добранных ресурсах. Пишем о состоянии инструмента. Пи-
шем номер следующего массива.

В случае разрушения инструмента информация об этом сбрасывается в лог
и  сбрасывается информация о количестве добытого с этим инструментом.

Во  время работы по маршруту все точки копки/рубки заносятся в массив
usep. Этот массив организован по типу стека и имеет длину в 1000 ком-
плектов  координат  (в дальнейшем уменьшить). При приближении к концу
массива (заполнение) вызывается спец функция,  сдвигающая массив вниз
на 100 ячеек.  Каждая  новая точка копки/рубки сначала проверяется по
массиву, если есть - пропускается.  В конце маршрута или в случае его
прерывания массив usep очищается.



 History:

  v.1.00b - Делаем только копку по одному массиву
  v.1.01b - Добавил скрипт на разметку массива
  v.1.02b - Добавил альтернативную ходилку, потом поймем какая лучше
  v.1.03b - С копкой по массиву разобрались, вводим срочно контроль
            элемов. Пока с остановом скрипта на копку.
  v.1.04b - C отслеживаниеи и лутом элемов похоже разобрались
  v.1.05b - Вводим 5 массивов копки, реколлы между ними и на базу, разгрузку
  v.1.06b - мелкие правки вар-режима, разгрузки, хайда.
  v.1.07b - еще куча мелких отладочных правок. Теперь все более-менее работает.
  v.1.08b - массивов уже 7. Боремся за респаун руды ;)
  v.1.09b - добавляем контроль за приходом ПК
  v.1.10b - что-то глючит у нас с хайдиванием, правим до упора
  v.1.11b - увеличиваем кол-во массивов до 10. Теперь должно хватить.
  v.1.12b - Переписан скрипт на разметку массива. Теперь он сам создает
            файл с массивом, траханье с логами игры исключено.
  v.2.00b - Пересобираем весь скрипт, вводим глобальные переменные контроля,
            причесываем всю структуру скрипта.
  v.2.01b - Ввел ведение лога (пока только начало скрипта, переход к массиву,
            к разгрузке, сколько какой руды выгружено). Лог ведется в файл.
  v.2.02b - временно лог ведется в текстовое окно. Ввел полное обновление
            регов и бинтов, чтобы не копилось регов лута с элемов, теперь
            при доборе регов и прочего на экране открываются все необходимые
            контейнеры.
  v.2.03b - ввел питие инвизок (от ПК) и грит хилов (от кристалл элемов).
  v.2.04b - добор кирки и реакция на ее разрушение.
  v.2.05b - пробуем новую версию скрипта на реколл. Теперь проверка успешности
            идет через проверку звуков.
  v.2.06b - приводим в порядок даты и время в логе, определяем тип элема,
            вводим еще дополнительные сообщения.
  v.2.07b - реколл через проверку звука отключаем, переписываем реколл
            с учетом траты маны и смену координат
  v.2.08b - вводим систему проверок лагов при реколле и разгрузке.
  v.2.09b - вводим проверку глюка на считывание строки 'end of file' в
            массиве как строки координат.
  v.2.10b - Оптимизируем паузы, доп мессаги по телу скрипта.
  v.2.11b - вводим глобальные счетчики для подсчета суммы всех выкопанных
            и доставленных на базу руд. Итог по счетчикам помещаем в лог
            после разгрузки.
  v.2.12b - оказывается текстовое окно с логом имеет ограничение по размеру,
            правим вывод лога, заодно правим форматирование дат...
  v.2.13b - срочно добавляем проверку и добор на базе кливеров... блин, как
            жалко мне этого необлутенного кристалл-элема...
  v.2.14b - разбираемся. Почему-то иногда чар не хочет вскрывать элема,
            выдает ругательство "You can't reach this"... Правим... Посмотрим,
            получилось ли... Сделал через подход к трупу ходилкой.
  v.2.15b - Получилось. Делаем это стандартным способом вскрытия элемов.
  v.2.16b - вновь пробуем сделать запись лога в файл.
  v.2.17b - Делаем два раздельных лога - один так и ведется в текстовом
            окне, это удобно для контроля чара во время работы скрипта, второй
            пишется в файл один раз за круг, подводя итоги копки, килла
            элемов и убегания от ПК за круг (10 массивов копки).
  v.2.18b - Пытаемся поправить подвисы (редкие) при подходе к элему,
            вводим возможность задать стартовый массив копки.
  v.2.19b - Правим глюки предыдущей правки. Не туда запрос на номер массива
            вставил. Заодно введу-ка проверку что номер массива в допустимых
            пределах, а то ведь найдутся любопытные, которые введут...
  v.2.20b - переписываем часть, отвечающую за лут элема, отменяем попытку
            подойти к элему (глюков много), контролируем - если элем не
            лутится - в лог скидывается вся инфа что возможно о чаре и
            трупе элема...
  v.2.21b - вводим усовершенствование системы контроля ПК - проверяем цвет
            найденного чара, если красный - драпаем сразу, если не красный,
            контролируем в цикле расстояние до него, если меньше минимального
            (задается переменной) - тоже драпаем.
  v.2.22b - Еще раз разбираемся с лутом элемов. Почему-то не лутит. Не лутит
            почти всегда. Выделяем вскрытие и лут элемов в отдельный модуль
            и бьемся над разгадкой... Похоже, ларчик просто открывался...
            Тестим.
  v.2.23b - Наконец руки дошли сделать нормальное обновление регов при
            разгрузке. Заодно проверим смену кирок.
  v.2.24b - Вроде все работает стабильно, так что чистим структуру и
            готовимся в переходу на версию 3.00 (в скрипт будет интегрирован
            скрипт на ламберджекинг).
  v.2.25b - реагируем на сообщение в журнале 'bear is attacking you*'.
            Берем в руки оружие и выходим из хайда. Затем ждем мессаги о
            трупе и продолжаем копку.
  v.2.26b - и опять, в который раз, правим лут элемов... :)
  v.2.27b - Правка контроля дистанции до ПК. Правка именования элемов в
            выводе в лог.
  v.2.28b - Ввожу диалоги ASM. Ввожу изменение паузы при хотьбе в зависимости
            от места. Пока пауза до 300 уменьшается только на разгрузке.
  v.2.29b - Новая разметка массива. Почти полный автомат. Но это разметка
            массива для новой версии мининга, которую буду вводить в ближ
            время. При этом изменяется формат файла массивов и придется
            их перемарчивать.
  v.2.30b - Вводим начальные запросы на тип мининга. Пока доступен только
            вариант мининга по краям скал и разметки массива.
  v.2.31b - вновь делаем 8 массивов. Еще 8 идут в данжи и пещеры. Итого
            полная рунбука.
  v.2.32b - Вводим список исключений чаров. Вводим флаг пить или не пить инвиз.
  v.2.33b - делаем новую процедуру копки с использованием ASM (новые массивы)
  v.2.34b - в разметке массивов вводим контроль уже занесенных тайлов
  v.2.35b - Мелкие улучшения процедуры разметки массивов, больше запросов,
            удобнее работать.
  v.3.00a - Сделан второй режим работы чара: копка в пещерах.
  v.3.00b - На фиг массивы, делаем маршруты движения. Теперь разметка
            превращается в автоматическое запоминание маршрута передвижения
            вдоль скалы или по лесу. Сам перебор тайлов осуществляется в самих
            процедурах копки/рубки. Маршруты хранятся одной строкой
            и пишутся в один файл, mining.ini. При этом можно сменить процедуру
            движения на более простую и быструю, потому что обход препятствий
            не требуется.
  v.3.00c - Перелопачиваем весь скрипт на предмет соответсвия названий процедур.
            Вводим ламбер. Отделяем хистори в отдельный файл. Перегруппировы-
            ваем функции и процедуры. Переименовываем часть из них.
            Переименовываем сам скрипт (старое название minewalls)
  v.3.00d - Присобачиваем ламбер. Переделываем разгрузку чтобы не брать лишнего
            при ламбере.
  v.3.01  - Первый релиз. Ловите момент!
  v.3.01b - 3.01e - куча мелкой правки и мелких усовершенствований.
  v.3.10b - Неосуществленная версия, наработки перешли в следующую:
            Все режимы работают. Но не работала проверка на то, что тайл уже
            копался/рубился. Поправил. Но поправлю еще - надо уменьшать массив
            и делать его наподобие стека, что чар всегда помнил последние 5-10
            шагов. Заодно избавляемся от "наследия" прошлого - теперь массивов
            копки всего 8, остальные 8 - ламбер. Соответственно сливаем в один
            режимы копки по скалам и по стенам данжей. Режим же контроля элемов
            при мининге включаем, ориентируясь на кирку. Если обычная - нет,
            если цветная - контролируем. Также контролируем выкопанную руду
            в процессе копки по мессаге. Если выкопана старшая руда (задается
            спецпеременной) - используем инвизы при удирании от ПК. Также
            инвизы используются если копаем старшей цветной киркой или в арме.
            Ламберджекинг аналогично. Перекомпоновываем разгрузку для поддержки
       новых режимов. Проверка кирок и топоров включает их цветность.
       Искореняем режим копки по полу - это все равно будет реализовано
       отдельным скриптом с вариантом копки в ГЗ-пещере. Вводим проверку
       версии инжекта и хождение в зависимости от нее либо через нажатие
       клавиш, либо через Addstep/Adddir.
  v.3.20b - Перерабатываем скрипт версии 3.01е с добавлением наработанного
            в версии 3.10b и с добавлением кучи нового. Теперь стандартным
       комплектом софта для скрипта является инжект версии 312.19 и ASM
       501.06. Далее будем придерживаться этой же линии - фиксированная
       версия инжекта и последняя версия АСМа. По крайней мере до тех пор
       пока Йоко не избавится от неустойчивости последних версий инжекта.
       Также добавляем сразу менюшку в дельфи, копку по полу, два тестовых
       режима, подробный лог, стелс-режим. Уточнение: требуется ASM не ниже
       503.01PE (корректная работа с ini-файлами).
  v.3.21b - Счетчики логов и руды вынесены в ини-файл, туда же они скидываются
            при разгрузке. При запуске скрипта они оттуда считываются, в случае
       отсутствия принимаются за 0.
  v.3.22b - Выносим в ини-файл все остальные настройки. Оттуда они будут
            считываться при старте скрипта, туда при необходимости будут
       сохраняться. Активно комментируем настройки в ини-файле.
  v.3.23b - Поправляю ситуацию с разрушением кирки в тестовом мининге. Если все
            ок, аналогично пропишу и ламбер.
  v.3.23c - Мелкая поправка. При открытии контейнеров на разгрузке не стоял вызов
            CheckLag(), в результате при лагах чар мог взять мешок разгрузки в пак
       и скрипт зацикливался. Заодно отключил открытие мешка при разгрузке
       в тестовых режимах, это просто лишнее.
  v.3.24a - Килл элемов в тестовом мининге. Пока только килл и сброс инфы в лог,
            никакого лута и занесения в счетчики. Новый способ обнаружения выкопа
       элемов. Потом задействую в остальных режимах. Килл через плитку.
       Сериал плитки - пока процедуре.
  v.3.24b - Мелкие поправки действий по разрушению кирки в тестовом мининге:
            руда скидывалась в сундук, а не мешок; скрипт не останавливался.
       Хмм... Первую ошибку поправил, вторая не поддалась. Еще бум думать.
  v.3.25b - Прописываем все необходимые изменения в ламбере. Вносим цвета старших
            логов, типы духов деревьев и прописываем защиту от них. Делаем (только
       в тестовом режиме) сброс (с занесением в счетчики) 500 обычных логов
       в случае перевеса (чтобы маршрут не прерывался раньше времени).
  v.3.25s - Спецверсия, где тестовые режимы переделаны на разгрузку в банк.
  v.3.30b - Изменения в меню: тестовые режимы переименовываются в ВИП-режимы.
            "Использовать Addstep" (не использовалось) переименовано в
       "Разгружаться в банк". Этот флаг переключает процедуру разгрузки на
       разгрузку в банк. В случае ВИП-режимов реколлы не производятся, а
       осуществляется подход к банку или вывеске дома и разгрузка в банк.
       Разгрузка в банк: открывается пак по сериалу (инифайл), в нем
       находится кучка соответствующей руды или логов и разгрузка
       соответствующего мата производится в нее (чтобы не было проблем с
            перегрузом банка). В инифайл вводится флаг разгрузки в банк: либо
       здание, либо вывеска. В инифайл вводятся координаты точки куда
       подходить на разгрузку. Дополнительно вводятся маршруты подхода
       (раздельные для мининга и ламбера) и маршруты перемещения после
       разгрузки. ВНИМАНИЕ: в этой версии изменилась структура ини-файла!
       Либо используйте новый, либо внимательно проверьте старый!!!
       Отключил структуру боксов в сундуке для добора.
       Изменил названия руды и цвета на современные (послевайповые).
       Вместо флага "Использовать обход препятствий" в меню введен флаг
       "Контролировать сытость чара"



Идея на следующую версию: вводим дополнительный автоматический этап: первая копка/рубка после
разметки массива. Для этого в ини-файле заводим разделы для каждого маршрута. В начале этих разделов
помещаем флаг:
SetUpThisPatch=0
если 0 - массив размечен, копка не производилась. При разметке массива автоматически
устанавливаем этот флаг в 0 какое бы значение у него не было. При запуске копки/рубки проверяем этот
флаг для данного маршрута. Если флаг 0 - запускаем очистку этого раздела от всех строк по точкам
маршрута. Далее помещаем в раздел переменную количества точек копки:
RazmerThisPatch=0
Потом будут идти строки, каждая на одну точку копки:
PointPatch-001=1111 2222 3333 4444 5555 6666 7777 8888
Счетчик в переменной трехзначный. То есть маршрут ограничен 999 точками - вполне достаточно.
Первые два числа - координаты чара в этой точке маршрута. Последующие пары - точки в которых можно
что-то добыть.
После прохождения всего маршрута помещаем длину маршрута в RazmerThisPatch и ставим флаг
SetUpThisPatch в 1. Тогда при следующих прохождениях этого маршрута он не будет заново просчитываться.
Соответственно, при следующих запусках не будет необходимости в использовании массива точек копки/рубки,
проверки лишних точек - сам процесс значительно ускорится.


Top
   
 Post subject:
PostPosted: 2006-03-13 17:14:19 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
файл mine&lumb.ini

Code:
[Setup]
; Эти установки автоматически перезаписываются из главного меню
; при старте скрипта
UseExeInterface=1
ModeOfScript=4
NumberPatch=8
CheckHide=0
CheckInviz=0
CheckChatFood=0
CheckLog=0
CheckBankDis=0

[Patches]
; маршруты. Записываются функцией разметки маршрутов. Маршрут -
; перечисление координат точек через пробел.
walls1=2273 406 2273 407 2273 408 2273 409 2273 410 2273 411 2273 412 2273 413 2273 414 2273 415 2273 416 2273 417 2273 418 2273 419 2273 420 2272 421 2272 422 2271 423 2271 424 2271 425 2271 426 2271 427 2271 428 2270 429 2269 430 2268 431 2267 432 2266 433 2265 434 2264 435 2264 436 2263 437 2262 438 2262 439 2261 440 2261 441 2261 442 2261 443 2261 444 2261 445 2261 446 2261 447 2261 448 2260 449 2259 450 2258 451 2257 452 2256 453
walls2=2072 370 2072 369 2073 368 2074 367 2075 366 2075 365 2076 364 2077 364 2077 363 2077 362 2078 361 2079 360 2079 359 2080 359 2081 359 2082 358 2083 357 2083 356 2083 355 2083 354 2084 353 2085 353 2086 353 2087 353 2088 352 2089 352 2089 351 2089 350 2090 349 2091 348 2091 347 2091 346 2092 346 2093 346 2094 346 2094 345 2094 344 2095 343 2096 343 2097 343 2098 342 2099 341 2100 341 2101 341 2102 340 2103 339 2103 338 2104 338 2105 338 2106 338 2107 338 2108 337 2109 337 2110 337 2111 336 2111 337 2112 337 2113 337 2114 336 2115 335 2116 334 2117 333 2118 333 2119 333 2119 332 2120 331 2121 331 2122 331 2122 330 2123 329 2124 328 2125 327
walls3=1794 771 1794 772 1794 773 1795 773 1795 774 1795 775 1796 775 1796 776 1796 777 1797 777 1797 778 1797 779 1797 780 1798 780 1798 781 1798 782 1798 783 1798 784 1798 785 1799 786 1800 787 1799 787 1799 788 1799 789 1800 790 1800 791 1799 792 1800 792 1801 793 1800 794 1801 794 1802 794 1802 795 1802 796 1803 796 1803 797 1803 798 1803 799 1803 800 1803 801 1803 802 1803 803 1803 804 1804 804 1804 805 1804 806 1805 807 1805 808 1806 809 1806 810 1807 811 1808 811 1809 811 1810 811 1811 810 1812 810 1813 810 1814 810 1814 809 1815 809 1816 809 1817 809 1818 809 1819 809 1820 809 1821 808 1822 808
walls4=2072 1222 2073 1222 2074 1222 2075 1222 2075 1223 2076 1223 2077 1223 2077 1224 2078 1225 2079 1225 2079 1226 2080 1226 2081 1226 2082 1226 2083 1226 2084 1226 2085 1226 2086 1226 2086 1225 2086 1224 2087 1224 2088 1224 2089 1224 2090 1224 2091 1224 2091 1225 2093 1226 2094 1226 2095 1226 2096 1226 2097 1226 2098 1226 2099 1226 2099 1227 2100 1227 2101 1227 2102 1227 2103 1227 2104 1227 2104 1228 2105 1228 2106 1228 2107 1228 2108 1228 2109 1228 2110 1228 2111 1228 2112 1229 2113 1229 2114 1230 2115 1231 2115 1232 2116 1233
walls5=2049 125 2051 125 2052 125 2053 126 2054 127 2055 127 2056 128 2057 128 2057 129 2057 130 2057 131 2057 132 2058 133 2059 134 2059 135 2059 136 2059 137 2059 138 2058 139 2058 140 2058 141 2058 142 2059 143 2060 144 2060 145 2059 146 2059 147 2059 148 2060 148 2061 149 2062 149 2063 150 2063 151 2064 151 2065 152 2065 153 2065 154 2065 155 2065 156 2065 157 2065 158 2065 159 2065 160 2065 161 2065 162 2065 163 2065 164 2064 165 2064 166 2064 167 2064 168 2063 169 2063 172 2063 173 2063 174 2063 175 2064 175 2065 176 2065 177 2065 178 2065 179 2065 180 2066 180 2066 181 2066 182 2067 182 2068 183 2068 184 2068 185 2069 185 2069 186 2070 187 2070 188 2070 189 2071 190 2071 191 2071 192
walls6=2255 414 2255 415 2255 416 2254 416 2254 417 2254 418 2254 419 2254 420 2254 421 2254 422 2254 423 2253 423 2253 424 2253 425 2252 425 2252 426 2252 427 2251 427 2251 428 2251 429 2251 430 2251 431 2251 432 2250 432 2250 433 2250 434 2250 435 2249 435 2249 436 2249 437 2249 438 2249 439 2248 439 2248 440 2247 440 2246 440 2246 441 2246 442 2246 443 2246 444 2246 445 2245 445 2244 445 2244 446 2244 447 2243 447 2243 448 2242 449 2241 450 2240 450 2240 451 2239 451 2239 452 2238 452 2237 453 2236 454 2235 455 2234 455 2233 455 2232 456 2231 456 2231 457 2231 458 2230 459 2229 459 2229 460 2228 461 2227 462 2226 462 2226 463 2226 464 2225 464 2225 465 2225 466 2224 466 2224 467 2224 468 2224 469 2224 470 2223 470 2223 471 2222 471 2222 472 2221 472 2221 473 2221 474 2220 474 2219 474 2219 475 2218 476 2217 476 2216 476 2216 477 2215 477 2215 478 2214 478 2214 479
walls7=2116 269 2116 270 2116 271 2116 272 2117 272 2117 273 2117 274 2117 275 2118 276 2118 277 2118 278 2118 279 2118 280 2118 281 2118 282 2118 286 2118 287 2118 288 2118 289 2118 290 2118 291 2118 292 2117 293 2117 294 2116 295 2116 296 2117 296 2117 297 2118 298 2119 299 2119 300 2119 301 2119 302 2120 302 2121 302 2121 303 2121 304 2122 304 2123 305 2124 306 2125 307 2126 308 2126 309 2125 310 2124 311 2124 312 2124 313 2124 314 2125 314 2125 315 2125 316 2124 317 2125 318 2126 319 2126 320 2126 321 2126 322 2126 323 2126 324
walls8=1945 73 1946 74 1947 75 1947 76 1948 77 1949 78 1949 79 1949 80 1949 81 1949 82 1949 83 1949 84 1949 85 1950 86 1950 87 1951 88 1951 89 1951 90 1951 91 1951 92 1951 93 1951 94 1951 95 1951 96 1951 97 1952 98 1953 99 1954 100 1955 101 1955 102 1955 103 1956 103 1957 103 1958 104 1959 105 1959 106 1960 106 1961 106 1962 105 1963 105 1963 106 1964 106 1965 106 1966 106 1967 107 1968 107 1969 107 1970 108 1971 109 1972 110 1973 110 1974 110
floor1=
floor2=
floor3=
floor4=
floor5=
floor6=
floor7=
floor8=
trees1=
trees2=
trees3=
trees4=
trees5=
trees6=
trees7=
trees8=
vipmi1=2472 55 2471 56 2470 57 2469 58 2468 58 2467 58 2466 57 2465 56 2464 56 2463 56 2462 56 2461 57 2460 58 2459 59 2459 58 2459 57 2459 56 2459 55 2458 55 2457 55 2456 55 2455 55 2454 55 2453 55 2453 54 2453 53 2453 52 2454 51 2455 50 2455 49 2455 48 2456 48 2457 48 2458 48 2459 48 2460 48 2461 49 2462 50 2462 51 2462 52 2462 53 2463 53 2464 53 2465 53 2466 53 2467 54 2468 55 2469 55 2470 55 2471 55 2472 55
vipmi2=2472 55 2473 55 2474 55 2475 55 2476 55 2477 54 2478 53 2479 52 2480 51 2481 51 2482 51 2483 51 2484 51 2485 51 2486 50 2487 49 2487 48 2487 47 2486 46 2485 45 2484 45 2483 45 2482 45 2482 44 2482 43 2481 43 2480 43 2479 43 2479 45 2479 46 2479 47 2479 48 2478 49 2477 50 2476 51 2475 52 2474 53 2472 55
vipla1=2908 577 2909 576 2910 575 2911 574 2912 573 2911 572 2910 572 2909 571 2908 570 2907 570 2906 570 2905 570 2904 569 2903 568 2902 567 2901 566 2901 563 2901 562 2902 561 2903 560 2904 559 2905 558 2905 557 2905 556 2906 555 2906 554 2906 553 2906 552 2906 551 2906 550 2906 549 2906 548 2907 548 2907 547 2907 546 2908 545 2909 544 2909 543 2910 542 2909 541 2909 540 2908 539 2907 538 2906 537 2905 536 2904 535 2904 534 2904 533 2903 533 2903 532 2902 531 2901 530 2900 530 2899 530 2898 530 2897 530 2896 530 2895 530 2894 530 2893 530 2892 530 2891 530 2890 530 2889 531 2888 530 2887 529 2886 528 2885 527 2884 526 2883 525 2882 524 2881 523 2881 522 2881 521 2881 520 2880 520 2879 520 2878 520 2878 519 2878 518 2878 514 2878 513 2878 512 2877 512 2876 512 2875 512 2874 513 2873 514 2872 515 2871 516 2870 515 2869 514 2869 513 2869 512 2869 511 2869 510 2869 509 2869 508 2868 508 2867 508 2866 508 2866 509 2866 510 2865 511 2864 511 2863 511 2862 511 2862 512 2862 513 2862 514 2862 515 2862 516 2862 517 2862 518 2862 519 2862 520 2862 521 2862 522 2862 523 2863 523 2864 523 2865 523 2866 523 2866 524 2866 525 2866 526 2865 527 2864 528 2864 529 2864 530 2863 531 2862 532 2861 533 2860 534 2860 535 2860 536 2860 537 2860 538 2859 539 2858 540 2857 541 2856 542 2857 543 2858 544 2859 543 2860 543 2861 542 2862 541 2862 542 2862 543 2863 544 2864 545 2865 546 2865 547 2865 548 2865 549 2865 551
; 2865 555 2865 556 2865 557 2865 558 2866 558 2867 558 2868 558 2869 558 2870 559 2871 560 2872 561 2873 562 2872 563 2872 564 2872 565 2872 566 2872 567 2872 568 2872 569 2872 570 2872 571 2872 572 2872 573 2872 574
vipla2=2916 593 2917 592 2918 591 2920 591 2920 590 2921 590 2922 590 2923 590 2924 589 2925 588 2925 587 2925 586 2925 585 2925 584 2926 583 2927 582 2928 581 2929 580 2930 580 2931 580 2932 580 2933 580 2934 581 2935 582 2936 583 2937 583 2938 583 2939 583 2940 584 2941 585 2942 586 2943 586 2944 586 2945 585 2945 584 2945 583 2945 582 2945 581 2944 580 2943 579 2942 578 2942 577 2942 576 2942 575 2941 574 2941 573 2941 572 2941 571 2941 570 2941 569 2941 568 2940 567 2939 566 2938 565 2938 564 2938 563 2938 562 2938 561 2938 560 2939 559 2940 558 2941 557 2941 556 2942 555 2943 554 2944 553 2945 552 2946 552 2947 552 2948 552 2949 552 2950 551 2951 550 2951 549 2950 548 2949 547 2949 546 2949 545 2948 544 2947 544 2947 543 2946 542 2945 541 2945 540 2945 539 2945 538 2945 537 2945 536 2945 535 2945 534 2946 533 2946 532 2947 531 2948 530 2951 530 2952 530 2952 529 2952 528 2952 527 2951 526 2950 525 2949 524 2949 523 2949 522 2949 521 2949 520 2948 519 2947 518 2946 519 2945 520 2944 520 2943 521 2942 522 2941 523 2940 524 2939 525 2938 526 2937 527 2936 528 2935 529 2935 530 2935 531 2935 532 2935 533 2935 534 2935 535 2935 536 2934 537 2933 538 2932 537 2931 536 2930 535 2929 534 2928 534 2927 534 2926 534 2925 533 2924 532 2923 533 2922 534 2921 534 2920 535 2920 536 2920 537 2920 538 2921 539 2922 540 2922 541 2923 541 2924 542 2923 543 2923 544 2922 545 2921 546 2920 547 2920 548 2920 549 2920 550 2919 551 2918 551 2917 552 2917 553 2917 554 2917 555 2917 556 2916 556 2915 556 2914 556 2913 556 2912 556 2911 556 2910 556 2910 557 2909 558 2908 558 2907 558 2906 559 2905 560 2906 561 2906 562 2908 563 2908 562 2909 562 2910 562 2911 563 2912 564 2912 565 2912 566 2912 567 2913 568 2914 569 2914 570 2914 571
; 2913 572 2911 574 2910 575 2909 576 2908 577

[LogCount]
; Счетчики логов. Автоматически обнуляются при разрушении инструмента
; (итоговые значения попадают в лог).
TreeLogs=0
AncientLogs=0
SturdyLogs=0
SteelLogs=0
NeitralLogs=0
ChaosLogs=0
OrderLogs=0
TitanicLogs=0
ElvinLogs=0

[OreCount]
; Счетчики руды. Автоматически обнуляются при разрушении инструмента
; (итоговые значения попадают в лог).
Iron=0
Damned=0
Kreonit=0
Copper=0
Bronze=0
Walean=0
Golden=0
Silver=0
Oceanite=0
BloodRock=0
Sacred=0
Brilliant=0
Order=0
Chaos=0
Neutral=0
Stardust=0
Citadel=0
Plaster=0
Sandstone=0
Stone=0
Marble=0

[Runbooks]
; на закладке Objects необходимо создать объекты с такими именами
; одна рунбука - 8 рун для мининга по скалам + 8 рун для мининга по полу
; вторая рунбука - 8 рун для ламбера по лесу + 8 рун резерва (пока не задействованы)
;
; Имя рунбуки для реколла на базу
RunbookBase=CommonRunbook
; Имена рунбук для реколла на маршруты
RunbookTile=MineRunbook
RunbookTile2=LambRunbook
; Номер руны для реколла на базу через реги
BaseRune=20
; Номер руны для реколла на базу через заряд рунбуки
; ПОКА НЕ ИСПОЛЬЗУЕТСЯ!
BaseRuneScroll=19
; Номер кнопки пополнения зарядов рунбуки
; ПОКА НЕ ИСПОЛЬЗУЕТСЯ!
RechargeNumber=0

[MiningWalls]
; Номера рун в рунбуке для реколлов на маршруты
; копка по краям скал
Wall1Rune=36
Wall2Rune=38
Wall3Rune=40
Wall4Rune=42
Wall5Rune=44
Wall6Rune=46
Wall7Rune=48
Wall8Rune=50

[MiningFloor]
; Номера рун в рунбуке для реколлов на маршруты
; копка по полу пещеры
Wall1Rune=36
Wall2Rune=38
Wall3Rune=40
Wall4Rune=42
Wall5Rune=44
Wall6Rune=46
Wall7Rune=48
Wall8Rune=50

[LamberForest]
; Номера рун в рунбуке для реколлов на маршруты
; ламбер в лесу
Wall1Rune=20
Wall2Rune=22
Wall3Rune=24
Wall4Rune=26
Wall5Rune=28
Wall6Rune=30
Wall7Rune=32
Wall8Rune=34

[DischargeSer]
; Сериалы контейнеров для разгрузки и добора необходимого
; при первых трех режимах работы
;
; Координаты точки из которой будем разгружаться.
; Если включен режим разгрузки в банк - это координаты
; вывески дома
Sund_Tile_X=2472
Sund_Tile_Y=55
; Сериал сундука, куда складывать руду или логи
; если включен режим разгрузки в банк - это сериал банкбокса
Sund1_Ser=0x403CAA91
; Сериал сундука, откуда добирать реги и прочее
; если включен режим разгрузки в банк - игнорируется
Sund2_Ser=0x40361048
; ящики в этом сундуке:
; regs
BoxRegs=0x40520E8C
; bandages, blood bandages, bottles
BoxBand=0x40520ED6
; pickaxes, hatchets, cleavers, scissors
BoxPick=0x40520F33
; weapons, armors, robes
BoxArms=0x40520F7C

[DischargeVIP]
; Переменные этого раздела задействованы в случае
; ВИП-режимов
;
; Флаг куда разгружаться: 0 - банк по команде 'bank'
; 1 - банк с вывески дома
; Режимы работают только в случае включения соотв.
; флага в меню, иначе флаг игнорируется
PlaceOfBank=1
HomeTablSerial=0x4033E959
; Сериалы и координаты контейнеров для разгрузки и добора
; необходимого при мининге.
; Если PlaceOfBank == 0 - место вызова банка и сериал его,
; 1 - место откуда кликаем по вывеске и сериал банка.
MinContSerial=0x4041B46B
MinContX=2472
MinContY=55
; Необходимость использования маршрута для подхода к сундуку/банку
MinNeedInPatch=0
; Путь подхода к банку в мининге
MinPatchToBank=
;
; Аналогично - для ламбера
;
LambContSerial=0x405B9440
LambContX=2895
LambContY=670
;
LambNeedInPatch=1
LambPatchToBank=2906 610 2906 659

[OtherConfig]
; уровень злобности для деления чаров на ПК и АПК
MinNotoriety=4
; минимальное расстояние, на которое позволяем приблизиться АПК
MinEnemyDist=5
; минимальное расстояние, на которое позволяем приблизиться ПК
MinEnemyDist2=7
; максимальное расстояние, на котором враг ищется
MaxEnemyDist=10
; максимальный поднимаемый чаром вес -50 стоунов
MaxWightOfChar=580
; тип элементаля руды
OreElemental=0x000E
; тип духа дерева
TreeSpirit=0x003A

;=================================================================
; НИЖЕ СЛЕДУЮТ РАЗДЕЛЫ  С АВТОМАТИЧЕСКИМ ЗАПОЛНЕНИЕМ И ИЗМЕНЕНИЕМ
; НЕ ИЗМЕНЯЙТЕ В НИХ НИЧЕГО! ЭТО МОЖЕТ ПРИВЕСТИ К НЕПРЕДСКАЗУЕМЫМ
; ПОСЛЕДСТВИЯМ!!!                        [начиная с версии 3.40b]
;=================================================================
;
; Cтруктура следующих разделов: это вычисленные (на автомате)
; точки маршрутов.
; SetUpThisPatch - если 0 - маршрут еще не обсчитан
; RazmerThisPatch - количество точек копки в обсчитанном маршруте
; PointPatch-001 - таких строк будет ровно столько сколько в пре-
; дыдущем счетчике. Первая пара чисел - координаты чара, последующие -
; уникальные координаты копки/рубки, в которых можно производить добычу

[walls1]
SetUpThisPatch=0
RazmerThisPatch=0

[walls2]
SetUpThisPatch=0
RazmerThisPatch=0

[walls3]
SetUpThisPatch=0
RazmerThisPatch=0

[walls4]
SetUpThisPatch=0
RazmerThisPatch=0

[walls5]
SetUpThisPatch=0
RazmerThisPatch=0

[walls6]
SetUpThisPatch=0
RazmerThisPatch=0

[walls7]
SetUpThisPatch=0
RazmerThisPatch=0

[walls8]
SetUpThisPatch=0
RazmerThisPatch=0

[floor1]
SetUpThisPatch=0
RazmerThisPatch=0

[floor2]
SetUpThisPatch=0
RazmerThisPatch=0

[floor3]
SetUpThisPatch=0
RazmerThisPatch=0

[floor4]
SetUpThisPatch=0
RazmerThisPatch=0

[floor5]
SetUpThisPatch=0
RazmerThisPatch=0

[floor6]
SetUpThisPatch=0
RazmerThisPatch=0

[floor7]
SetUpThisPatch=0
RazmerThisPatch=0

[floor8]
SetUpThisPatch=0
RazmerThisPatch=0

[trees1]
SetUpThisPatch=0
RazmerThisPatch=0

[trees2]
SetUpThisPatch=0
RazmerThisPatch=0

[trees3]
SetUpThisPatch=0
RazmerThisPatch=0

[trees4]
SetUpThisPatch=0
RazmerThisPatch=0

[trees5]
SetUpThisPatch=0
RazmerThisPatch=0

[trees6]
SetUpThisPatch=0
RazmerThisPatch=0

[trees7]
SetUpThisPatch=0
RazmerThisPatch=0

[trees8]
SetUpThisPatch=0
RazmerThisPatch=0

[vipmi1]
SetUpThisPatch=0
RazmerThisPatch=0

[vipmi2]
SetUpThisPatch=0
RazmerThisPatch=0

[vipla1]
SetUpThisPatch=0
RazmerThisPatch=0

[vipla2]
SetUpThisPatch=0
RazmerThisPatch=0


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 203 posts ]  Go to page 1 2 3 4 511 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 22 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited