Опять же, настроено под Цитадель. Два сундука, в одном отмычки, другой бум ломать. В пак ключ от второго сундука. В первый сундук мед. В элементах массивов установить уровни скилла для разных типов отмычек. Работаем.
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
|