Вот, попросили меня тут наваять такой скриптец. Наваял. Заодно сюда кидаю, может еще кому пригодится...
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
|