Скрипт на собирание дерьма в конюшне. Кому надо? :)

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Скрипт на собирание дерьма в конюшне. Кому надо? :)

Post by Edred »

Вот, попросили меня тут наваять такой скриптец. Наваял. Заодно сюда кидаю, может еще кому пригодится... ;)

Code: Select all

#####################################################################
; Скрипт на автособирание навоза на конюшне. Скрипт работает по маршруту,
; прописываемому в строковую переменную 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
autopilot
Posts: 57
Joined: 2004-07-25 05:16:04

Post by autopilot »

Ну вот теперь все дерьмо будут собирать ходя по одному маршруту )
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

В скрипте маршрут прописан для примера на части конюшни. Вписать нужный маршрут - не требует какого-либо знания скриптов. Там же все тривиально.
$oK0JI
Posts: 32
Joined: 2005-01-04 21:52:39

Post by $oK0JI »

А для рубки на каторге и относа в столб можеш написать плиз?
Goggy
Posts: 291
Joined: 2004-11-07 01:22:35
Location: Черкассы
Contact:

Post by Goggy »

$oK0JI wrote:А для рубки на каторге и относа в столб можеш написать плиз?


он уже есть тока мозгами надо те хоть попытаться пошевелить и он будет и у тя тоже :mrgreen:
Post Reply