Опять же, настроено под Цитадель. Два сундука, в одном отмычки, другой бум ломать. В пак ключ от второго сундука. В первый сундук мед. В элементах массивов установить уровни скилла для разных типов отмычек. Работаем.
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
#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную
; TimeProcess.
;
; ver. 1.07 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
; сообщения при кормежке
UO.Print( 'TEST: eat to ' + str( Nom ) + ' message and ' + str( Add ) + ' more each ' + str( TimeWait ) + ' minutes' )
DIM Eat[8]
Eat[0] = ''
Eat[1] = 'You eat the food, but are still extremely hungry'
Eat[2] = 'After eating the food, you fell much less hungry'
Eat[3] = 'You eat the food, and begin to feel more satiated'
Eat[4] = 'You are nearly stuffed, but manage to eat the food'
Eat[5] = 'You fell quite full after consuming the food'
Eat[6] = 'You are stuffed!'
Eat[7] = 'You are simply too full to eat any more!'
VAR Med = '0x09EC' ; тип меда для подкормки
VAR i, EatC, j, k, flag
; проверим, пора ли кормиться
i = Val( UO.GetGlobal( 'TimeProcess' ) )
i = ( UO.Timer() - i ) / 600
If i < TimeWait Then
; рано кормиться
UO.Print( 'Eat early! ' + str( i ) + ' from ' + str( TimeWait ) )
return
Endif
If Nom > 0 AND Nom < 8 Then
EatC = Eat[Nom]
Else
EatC = Eat[7]
Endif
UO.FindType( Med, '-1', Sunduk )
If UO.FindCount() == 0 Then
; мед кончился
UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
return
Endif
UO.Grab( '60', 'finditem' )
Wait( 1000 )
CheckLag()
For k = 1 To 7
DeleteJournal( Eat[k] )
Next
flag = 0
If Nom < 7 Then
UO.UseType( Med )
Wait( 1000 )
CheckLag()
For k = Nom + 1 To 7
If UO.InJournal( Eat[k] ) Then
flag = 1
Endif
Next
Endif
If flag == 0 Then
repeat
DeleteJournal( EatC )
UO.UseType( Med )
Wait( 1000 )
CheckLag()
until NOT UO.InJournal( EatC )
If Add > 0 Then
For j = 1 To Add
UO.UseType( Med )
Wait( 1000 )
CheckLag()
Next
Endif
Endif
; хватит кормиться
; выгрузим остатки меда обратно
UO.Findtype( Med, '-1', 'backpack' )
UO.MoveItem( 'finditem', 0, Sunduk )
Wait( 1000 )
CheckLag()
; Сбросим счетчик
UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
endsub
#####################################################################
Sub CheckLag()
DeleteJournal( 'backpack' )
UO.Click( 'backpack' )
repeat
wait(100)
until UO.InJournal( 'backpack' )
return
end sub
#####################################################################
Sub DeleteJournal( string1 )
VAR nom = UO.InJournal( string1 )
If nom > 0 Then
UO.SetJournalLine( Nom - 1, 'string replaced' )
DeleteJournal( string1 )
Endif
endsub
#####################################################################
; Spirit Speak v.1.00b (c) Edred
;
; Разовая прокачка спирит спика. Предназначена для вызова из других скриптов.
;
sub SpSpeak()
VAR mod = UO.WarMode(), num
VAR fizzle = 'You fail your attempt'
VAR success = 'You establish a connection'
UO.WarMode( 0 )
DeleteJournal( success )
repeat
DeleteJournal( fizzle )
UO.UseSkill( 'Spirit Speak' )
num = 1
repeat
wait(100)
num = num + 1
until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR num > 600
until UO.InJournal( success )
UO.WarMode( mod )
endsub