Page 1 of 1

Майнинг на ВХ.

Posted: 2005-08-12 15:18:26
by flake
Играл я некоторое время на ВХ, и вот решил выложить скрипт на майнинг.

Code: Select all

#########################################################
#		World's Heart Mining			#
#			ver 1.03			#	
#					by Flake	#
#########################################################
# Описание:
#   Чар прилетает в шахту, обкапывается, затем делает 5 шагов на запад (W), 
#   и опять обкапывается. При перевесе летит к банку, и оттуда по руне домой. 
#   Дома выгружает руду, добирает реги, кушает и опять копать.
#   На базе у чара 2 сундука, Sunduk - для выгруза руды, Sunduk2 - в него 
#   кладем реги, еду и всё остальное (см. ниже).
#   Так же введена система анти-элем. Для этого вам понадобиться мощная животина,
#   лучше всего Найтмар. При выкапывании элема чар будет спускать зашринкованного
#   зверя на элема, ждать пока тот его убьет, затем он зашринкует зверя обратно и 
#   облутит труп элема. Чтобы включить эту систему, поставьте в переменной
#   AntiElem значение 1 (При 0 система отключена, при 1 - включена.).
#   Если хотите копать с антиэлемом, в Sunduk2 киньте бутылок инвиза и шринков.
#   Так же необходимо в переменных Killer и KillerB прописать типы вашего 
#   зверя - убийцы в зашринкованном и обычном видах.
#   В паке у чара должно быть: 6 рун в шахты, пару кирок, реги на рекал.
#   В банке - руна домой.
#   Руны необходимо маркать таким образом, чтобы у чара было места для 5 
#   шагов в направлении (W).
############################################################################
###########################################################################№
#                            Переменные:


VAR AntiElem = 0   ; Если 0 - систеа отключена. если 1 - включена.

VAR BankRune = '0x4048DEE9'   ; ID руны, ведущей к банку
VAR HomeRune = '0x4048DF72'   ; ID руны, которая лежит в банке и ведет к дому.
VAR Sunduk = '0x4051773C' 	  ;	ID сундука для разгрузки руды
VAR Sunduk2 = '0x404FAD09'	  ; ID сундука с регами и едой
VAR Food = '0x0C7F'   

VAR Elem = '0x000E'    		  ; тип элемента
VAR Killer = '0x0000'  		  ; тип киллера в шринке
VAR KillerB = '0x0000' 		  ; тип киллера
VAR ShrinkClr = '0x051B'      ; цвет шринка
VAR InvisClr = '0x012B'       ; цвет инвизки
VAR Bottle = '0x0F0E'  ; тип бутылки



###########################################################################
###########################################################################
sub START_MINING()
VAR Kirka = '0x0E85'   
VAR TileNum = '1339' 
VAR MaxWeight = 580                                      ; Максимальный вес минус 30-40 стоунов
VAR x, y, t, k 
VAR MaxTime = 7000    
VAR ms1 = "There is nothing here to mine for" 
VAR ms2 = "You can't use" 
VAR ms3 = "You put the" 
VAR ms4 = "loosen some rocks but fail" 
VAR ms5 = "You can't use the %s where it is" 
VAR ms6 = "Try mining in rock" 
VAR ms7 = "Try mining elsewhere." 
VAR ms8 = "no line of sight"
VAR tochka = 1
VAR flag = 0

Dim Runa[6]
 Runa[1] = 0x40519685            ; вписать ID рун в шахты
 Runa[2] = 0x4051958B
 Runa[3] = 0x40519521
 Runa[4] = 0x40519608
 Runa[5] = 0x4051D7CE
 Runa[6] = 0x4051D73E

	UO.SetGlobal( 'alarm', 'off' )
        RecallRune(Runa[tochka])
          If AntiElem == 1 Then
            ElemCheck()
          EndIf
          If UO.GetGlobal( 'alarm' ) == 'on' Then
            GoTo JumpNext
          EndIf
	CheckHide()
    
 Repeat
      
  StartMine:
  flag = flag + 1
  For y=-2 to 2 
    For x=-2 to 2
     k = 0 
      Repeat 
         UO.DeleteJournal() 
         t = UO.Timer() 
         k = k + 1 
          UO.WaitTargetTile( TileNum, STR( UO.GetX() + x ), STR( UO.GetY() + y ), 0) 
          UO.UseType( Kirka ) 
             Repeat 
               Wait(300) 
             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 ((t + MaxTime) < UO.Timer())                      
      Until ( NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR (k > 10))
   ;--- --- --- Проверка на перевес и элема --- --- 
     If AntiElem == 1 Then
       ElemCheck()
     EndIf
       If UO.Weight >= MaxWeight OR UO.GetGlobal( 'alarm') == 'on'  Then
        UO.Print( 'Перевес!' )
         UnLoad()
	 RecallRune(Runa[tochka])
	   If AntiElem == 1 Then
             ElemCheck()
           EndIf
           If UO.GetGlobal( 'alarm' ) == 'on' Then
             GoTo JumpNext
           EndIf
         CheckHide()
         flag = 0				
         tochka = tochka + 1		
           If tochka == 6 Then		
              tochka = 1			
           EndIf				
         Goto StartMine			
       EndIf				
    ;--- --- --- --- --- --- --- --- --- ---
    Next 
  Next 
  
  If flag < 2 Then
    Walk()
    GoTo StartMine
  EndIf

  JumpNext:
    flag = 0
    tochka = tochka + 1
      If tochka == 6 Then
        tochka = 1
      EndIf
    RecallRune(Runa[tochka])
      If AntiElem == 1 Then
        ElemCheck()
      EndIf
      If UO.GetGlobal( 'alarm' ) == 'on' Then
        GoTo JumpNext
      EndIf
    CheckHide()

 Until UO.Dead()
endsub


;  --- Модуль разгрузки и добора регов.  
Sub UnLoad()
VAR a, b

Dim Ore[4]
Ore[1]= 0x19B9 ; 4 and more ore 
Ore[2]= 0x19B7 ; 1 ore 
Ore[3]= 0x19BA ; 2 ore 
Ore[4]= 0x19B8 ; 3 ore 

Dim RecallReg[3]
RecallReg[1] = 0x0F7A 
RecallReg[2] = 0x0F7B 
RecallReg[3] = 0x0F86

  ; --- Прыгаем к банку
   RecallRune(BankRune)
   UO.MSG( 'Bank' )
   Wait(100)

  ; --- Прыгаем домой
    RecallRune(HomeRune)

  ; --- Разгрузка руды
   For a = 1 to 4
     UO.FindType( Ore[a] )
       While UO.FindCount()
         UO.MoveItem( 'finditem', '-1', Sunduk )
         Wait(200)
         CheckLag()
         UO.FindType( Ore[a] ) 
       Wend
   Next

  ; --- Добор регов, еды и бутылок
  For b = 1 to 3
    UO.FindType( RecallReg[b] )
      If UO.GetQuantity( 'finditem' ) < 20 Then
        UO.FindType( RecallReg[b], '-1', Sunduk2 )
          If UO.GetQuantity( 'finditem' ) > 20 Then
	    UO.Grab( '20', 'finditem' ) 
            Wait(200)
            CheckLag()
          Else
            UO.Print( 'Regs not found, script terminated' )
            UO.Exec( 'terminate all' )
          EndIf
        
      EndIf
  Next
    UO.FindType( Food )
      If UO.GetQuantity( 'finditem' ) < 10 Then
        UO.FindType( Food, '-1', Sunduk2 )
        UO.Grab( '10', 'finditem' ) 
        Wait(200)
        CheckLag()
      EndIf
    UO.DeleteJournal()  
    UO.FindType( Food )
      If UO.FindCount() Then
        Repeat  
          UO.UseType( Food )
          Wait(200)
          CheckLag()
        Until UO.InJournal( 'simply too full' )
      EndIf
    
  If AntiElem == 1 Then
    UO.FindType( Bottle, ShrinkClr, 'my' )
      If UO.GetQuantity( 'finditem' ) < 6 Then
        UO.FindType( Bottle, ShrinkClr, Sunduk2 )
	  If UO.FindCount() > 6 Then
	    UO.Grab( '6', 'finditem' )
	  Else
	    UO.Print( 'Bottles not found, script terminated' )
            UO.Exec( 'terminate all' )
	  EndIf
      EndIf

    UO.FindType( Bottle, InvisClr, 'my' )
      If UO.GetQuantity( 'finditem' ) < 6 Then
        UO.FindType( Bottle, InvisClr, Sunduk2 )
	  If UO.FindCount() > 6 Then
	    UO.Grab( '6', 'finditem' )
	  Else
	    UO.Print( 'Bottles not found, script terminated' )
            UO.Exec( 'terminate all' )
	  EndIf
      EndIf
  EndIf
endsub


; --- Процедура рекала по руне
Sub RecallRune(RuneId)  
VAR MyX, MyY, t, i 
  If UO.Mana < UO.Int Then
    UO.WarMode(0)
      Repeat
        UO.UseSkill( 'Meditation' )
        Wait(1000)        
      Until UO.Mana == UO.Int
   EndIf
	i = 1
      Cast:
        MyX = UO.GetX()
        MyY = UO.GetY()
	t = 0	
        UO.Cast( 'Recall', RuneId )
        UO.DeleteJournal()
	  If UO.GetGlobal( 'alarm' ) == 'on' AND i ==1 Then
	    Wait(150)
	    UO.UseType( Bottle, InvisClr )
	    i = 0
          EndIf
          Repeat
	      t = 1 + 1
              If UO.InJournal( 'izzle' ) OR (t > 40) Then
                GoTo Cast
	      Else
		Wait(500)
              EndIf
          Until MyX <> UO.GetX() AND MyY <> UO.GetY()
endsub   

; --- Функция Анти-Элемент.
Sub ElemCheck()
UO.Set( 'finddistance', '5' )
UO.FindType( Elem, '-1', 'ground' )
  If UO.FindCount() == 1 Then
    UO.Print( 'One Element found! Killing system activated!' )
    UO.UseType( 'Killer' )
    UO.WaitTargetObject( 'finditem'  )
    UO.MSG( 'all kill' )
      UO.FindType( Elem, '-1', 'ground' )
        While UO.FindCount()
	      Wait(1000)
 	      UO.FindType( Elem, '-1', 'ground' )
  	    Wend
      UO.FindType( KillerB, '-1', 'ground' )
      UO.WaitTargetObject( 'finditem' )
      UO.UseType( Bottle, ShrinkClr )
      Wait(200)
      UO.FindType( Killer, '-1', 'ground' )
      UO.Grab( '1', 'finditem' )
      Wait(200)
      UO.SetGlobal( 'alarm', 'off' )
      LootElem()
  Else
    If UO.FindCount() > 1 Then
      UO.SetGlobal( 'alarm', 'on' )
    Else
      UO.SetGlobal( 'alarm', 'off' )
    EndIf
  EndIf
endsub

; ---  Функция Лута Элема
Sub LootElem()
VAR Cleaver = '0x0000'
VAR Kirka = '0x0E85'
VAR a
 Dim Ore[4]
  Ore[1]= 0x19B9 ; 4 and more ore 
  Ore[2]= 0x19B7 ; 1 ore 
  Ore[3]= 0x19BA ; 2 ore 
  Ore[4]= 0x19B8 ; 3 ore 

  If UO.GetDistance( 'lastcorpse' ) < 3 Then
    UO.WaitTargetObject( 'lastcorpse' )
    UO.UseType( Cleaver )
    Wait(300)
    UO.UseObject( 'lastcorpse' )
      For a = 1 to 4
        UO.FindType( Ore[a], '-1', 'lastcorpse' )
          While UO.FindCount()
	    UO.Grab( '1', 'finditem' )
            Wait(200)
	    CheckLag()
	    UO.FindType( Ore[a], '-1', 'lastcorpse' )
 	  Wend
      Next
	UO.FindType( '0x0EED', '-1', 'lastcorpse' )   ; деньги
	  If UO.FindCount() Then
	    UO.Grab( '1', 'finditem' )
            Wait(200)
	  EndIf
    UO.UseType( Kirka )
    Wait(200)
  Else
    UO.Print( 'The corpse is too far!' )
  EndIf
endsub

; --- Процедура проверки и ухода в хайд.
Sub CheckHide()
VAR fail = "You can't seem to hide here."
  If UO.Hidden() Then
    UO.Print( 'Hidden!' )
  Else
    UO.Print( 'Now Hiding...' )
    StartHide:
      UO.WarMode(0)
      UO.UseSkill( 'Hiding' )
      DeleteJournal("You can't seem to hide here.")
        Repeat
          If UO.InJournal( fail ) Then
            GoTo StartHide
          Else
            Wait(100)
          EndIf
        Until UO.Hidden()
    UO.Print( 'Hidden!' )
  EndIf
end sub

Sub Walk() 
  UO.Press(36)
  UO.Press(36)
  UO.Press(36)
  UO.Press(36)
  UO.Press(36)
  Wait(1500)
  CheckHide()
endsub

Sub CheckLag() 
   DeleteJournal( 'backpack' ) 
   UO.Click('backpack') 
   Repeat 
      Wait(100) 
   Until UO.InJournal('backpack') 
end sub
  
Sub DeleteJournal(msg)
   var nom = UO.InJournal(msg) 
   If nom>0 Then 
      UO.SetJournalLine(Nom - 1," -- replaced -- ")  
      DeleteJournal(msg) 
   EndIf 
endsub