Скриптик на руду от домика до шахты скидывание руды, и добор кирок, для работы необходимо с помошью процедурки Metka_kochek() замарчить тайлы в шахте, ею же можно замарчить и дорогу от шахты и обратно, сделал две дороги так как, при вырубке элема есть шанс что он останет где нибудь по второму макршуруту, у меня он проходил среди множества домов, и элемы отвлекались на чужих ботов
имена фалов с тайлами смотрите в теле скрипта, в заголовок не стал выносить
Code:
;***********************************************************************************
var Ruda = '0x19b9'
var Kirka = '0x0E86'
var bagpak
var Box
var box_regi
Var FileName
Var MaxWeight
Var MoveDelay=1000 # Промежуток между шагами
Var MoveNumber=1 # Количество шагов при смене дислокации
Var Ep=0.172 # Значение ширины угла хождения при определении направления.
#Если на пути встречаются сложные и широкие препятствия - увеличить.
#0.172 - сбалансированный.
MaxWeight= ((uo.STR*3.5)+39)
var Stoplocation
var nom_run
var danger = 0
Var F
var sc = 0 ; счетчик тайлов
UO.Set( 'finddistance', '2' )
sub start()
uo.exec('exec control')
uo.exec('exec main')
end sub
sub Main()
wait(1000)
uo.Targeting('self')
Box = 'Box'
uo.set('norbcalc','1')
uo.set('norbcheck','1')
uo.set('injectecho','1')
uo.useobject("Box")
while not uo.dead()
wait(500)
if uo.count(Kirka) < 1 then
GrAxe()
wait(3000)
end if
go_to_Shahta() ; Перед тем как бежать к точке реколимся в шахту
FileName = 'c:\_A\_Macr\dob\Mining_d\mn0.txt'
F=File(FileName)
F.Open()
wait(3000)
uo.sayU("Go go go!")
Rubit() ; Запускаем рубку
wend
EndSub
;--------------------------------------------- РУБИМ -----------------------------
Sub Rubit()
Var Tl,T,X,Y,Z
var Tim
var Jurn
Dim Cli[4]
Cli[0]="cliloc# 0xA867" ;You can't mine...
Cli[1]="cliloc# 0xAD00" ;there no metal
Cli[2]="cliloc# 0x6B31" ;backpack full
Cli[3]="cliloc# 0xA2DE" ;is too far away
Cli[4]="cliloc# 0xA866" ;You can't mine...
Beg:
Tl=safecall F.Readln()
Tl=Trim(Tl)
If Tl=='File read error' Then
f.close()
rec_to_home() ; Реколл домой неспеша по регам
wait(2000)
GrRuda() ; Скидываем добытое
GrAxe() ; Берем кирки
GetRegs() ; берем реги, свитки и т.д.
wait(1000)
main()
EndIf
T=GetNumb(Tl,0)
X=GetNumb(Tl,1)
Y=GetNumb(Tl,2)
Z=GetNumb(Tl,3)
UO.Print('GoTo next point ' + str(sc) + ' X= '+ str(X) + ' Y= '+str(Y))
sc = sc+1
gotoxy(X,Y,1) ; --------------- Ходим по точкам из файла c тайлами -----------
uo.useskill("Hiding") ; прячемся
wait(200)
REPEAT
uo.deletejournal()
UO.WaitTargetTile(Str(T),Str(X),Str(Y),Str(Z))
UO.usetype(Kirka)
wait(1500)
Jurn=UO.Journal(0)
UNTIL Jurn == Cli[0] or (UO.Weight > 400) or Jurn == Cli[1] or Jurn == Cli[2] or Jurn == Cli[3] or Jurn == Cli[4] or uo.count(Kirka) == 0
If (UO.Weight > 400) or uo.count(Kirka) < 1 then
UO.Print('Domoi !!!')
go_to_home() ; домой
wait(2000)
GrRuda() ; Скидываем руду
GrAxe() ; Берем топоры
GetRegs() ; берем реги, свитки и т.д.
wait(500)
UO.Print('Obratno rabotat!!!')
go_to_Shahta()
uo.say("Rubim!")
F=File(FileName)
F.Open()
Rubit() ; Запускаем рубку метталла
End If
UO.Print('Dalee !!!')
Goto Beg
End Sub
;-------------------------------------------------------------------------------------------------
Sub GetNumb(C,I) ; Процедура разборки тайлов по пробелам
var J,T,K
J=0
K=1
While K>0
J=J+1
If (Mid(C,J,1)==' ') Or (J>=Len(C)-1) Then
If I==0 Then
T=Val(Left(C,J))
Else
T=GetNumb(Right(C,Len(C)-J-1),I-1)
EndIf
K=0
EndIf
wend
UO.Print(T)
return T
endsub
;---------------------------------------------
Sub GrRuda() ; Процедура скидывания руды в указаный в начале ящик
repeat
; uo.say("BANK")
wait(1500)
uo.findtype(Ruda) #Ruda
uo.moveitem('finditem','0',Box)
wait(1000)
until not uo.count(Ruda)
end sub
;---------------------------------------------
sub GrAxe() ; Процедура взятия кирок из ящика
uo.deletejournal()
uo.useobject('Box')
wait(3000)
if uo.count(Kirka) < 2 then
uo.sayU("Berem kirki")
uo.findtype(Kirka,'-1','Box')
wait(100)
UO.grab('1','finditem')
Wait(600)
uo.findtype(Kirka,'-1','Box')
wait(100)
UO.grab('1','finditem')
Wait(600)
end if
end sub
sub Control()
var Notoriety,IsNPC, Jurn
var v = val(uo.getglobal('tek_run'))
var i
while not uo.dead()
Jurn=UO.Journal(0)
if uo.Life < 120 then
UO.Exec('terminate Main')
UO.Exec('terminate main')
UO.Set('finddistance',10)
repeat
UO.FindType('0x0e43', '-1', '1') ; Ищем сундуки
wait(100)
If UO.FindCount() < 1 Then ; если не находим то значит не смотались
uo.waittargetobject("runebookid")
wait(100)
UO.Usetype("0x1f4c")
wait(100)
go_danger() ; Убегаем от опасности
else
danger = 1 ; Ставим признак что опасность миновала
end if
wait(500)
until danger > 0
uo.sayU('Warning, atacking')
while uo.Life < 120
uo.bandageself()
wait(5000)
wend
danger = 0
GetRegs() ; добираем бинтов, регов и скролов
GrRuda() ; скинем руду
wait(500)
uo.exec('exec main') ; продожаем рубить
end if
wait(200)
wend
end sub
sub Metka_kochek() #
repeat
uo.infotile()
wait(3000)
until false
end sub
sub go_to_home()
Var Tl,T,X,Y,Z, eo = 0
FileName = 'c:\_A\_Macr\dob\Mining_d\go_house.txt'
F=File(FileName)
F.Open()
repeat
Tl=safecall F.Readln()
Tl=Trim(Tl)
If Tl=='File read error' Then
eo = 1
else
T=GetNumb(Tl,0)
X=GetNumb(Tl,1)
Y=GetNumb(Tl,2)
Z=GetNumb(Tl,3)
UO.Print('GoTo ' + str(sc) + ' X= '+ str(X) + ' Y= '+str(Y))
sc = sc+1
gotoxy(X,Y,0)
eo = 0
end if
until eo == 1
end sub
sub go_to_Shahta()
Var Tl,T,X,Y,Z, eo = 0
FileName = 'c:\_A\_Macr\dob\Mining_d\go_min.txt'
F=File(FileName)
F.Open()
repeat
Tl=safecall F.Readln()
Tl=Trim(Tl)
If Tl=='File read error' Then
eo = 1
else
T=GetNumb(Tl,0)
X=GetNumb(Tl,1)
Y=GetNumb(Tl,2)
Z=GetNumb(Tl,3)
UO.Print('GoTo ' + str(sc) + ' X= '+ str(X) + ' Y= '+str(Y))
sc = sc+1
gotoxy(X,Y,0)
eo = 0
end if
until eo == 1
end sub
sub go_danger()
end sub
sub Setup()
uo.Exec('addobject Box')
while uo.Targeting()
wait(100)
wend
uo.Exec('addobject bagpak')
while uo.Targeting()
wait(100)
wend
end sub
sub close()
var f
f.close()
end sub
;******************************************** Ходилка (не моя)*********************************************
Sub GetNumb(C,I)
var J,T,K
J=0
K=1
While K>0
J=J+1
If (Mid(C,J,1)==' ') Or (J>=Len(C)-1) Then
If I==0 Then
T=Val(Left(C,J))
Else
T=GetNumb(Right(C,Len(C)-J-1),I-1)
EndIf
K=0
EndIf
wend
UO.Print(T)
return T
endsub
Sub gotoxy(x,y,prec)
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
end if
if dx<=prec then
return
end if
if not ldc then
;uo.print(STR(dx))
end if
if dx<3 then
mk=70
else
mk=15
end if
ox=mx
oy=my
for k=1 to mk
mx=UO.GetX()
my=UO.GetY()
if mx<>ox or my<>oy then
goto sdidapl
end if
wait(10)
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
end if
if dx<=prec then
return
end if
if ld==dx then
ldc=ldc+1
if ldc>100 then
uo.print("Can not reach location!")
Stoplocation = 1
return
end if
else
ld=dx
end if
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
end if
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
end if
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
end sub