
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