Скрипт написан для RunUO в сентябре 2003г.Ходилка в скрипте использована от Йоко(Спасибо!)
Реколы использует паладинские(Sacred Journey).Соответственно скил чивалри(Chivalry) должен
быть достаточен для этого и в книге(Book of Chivalry) должны быть деньги(Tithing points)
Чар начинает работу у своего дома,где берет из сундука кирки,потом реколится в шахту
и начинает копать в первой точке согласно файлу пути.Если все выкопал-идет в точку 2 ит.д.
Если превышен вес реколится к дому,плавит руду,инги складывает в сундук.Если кирок меньше 2
берет кирки.При создании файла пути следует располагать точки по прямой
(без препятствий между ними).Скрипт закончит работу если чар умрет:) или если закончатся кирки
в сундуке.
------------------------Настройка скрипта
-Требуется ввести значения 3 переменных
-Создать файл точек в которых будет копать чар
Но все не так уж и страшно:)
1.В бекпек чару кладем Runebuk. Набираем в УО ,info далее таргетом на Runebuk
получаем в текстовом окне нечто вида:
Code: Select all
ID=0x4001435E Type=0x22C5 CWBWJMD Name=
Quantity: 1 Colour: 0x084B Layer: 0 Has: 1
X=66 Y=66 Z=0 C=0x400A2007 F=0x00
Нам нужен ID. Это значение вставляем в скрипт в переменную MyRunebuk
Code: Select all
var MyRunebuk='0x4001435E'
2,3.Рядом с домом(платформой) марчим руну.Таким образом чтобы с этого места чар
мог достать Forge и сундук в который будет выкладывать инги.Эту руну кладем
первой(!!!!! это важно) в Runebuk.
С помощью ,info узнаем ID Forge и сундука.Соответственно изменяем значения
Code: Select all
Var Forg='0x4000898C'
Var Box='0x40013750'
Приступаем к созданию файла пути.
Зайдите в шахту в которой собираетесь копать.Станете вы на входе в шахту или
посередине ее особого значения не имеет.

кладем второй(!!!!! это важно) в Runebuk.Набираем в УО ,infotile далее таргетом на
пол шахты, делаем по прямой 4-5 шагов -снова ,infotile таргет на пол шахты и т. д.
Так насобирали допустим 6 точек.Открываем текстовое окно Инжекта.Там видим например:
Code: Select all
1343 1198 1417 -95
1340 1183 1425 -95
1351 1179 1424 -95
1340 1173 1414 -95
1340 1171 1427 -95
В блокноте создаем файл например с именем Mine1.txt далее копируем туда наши точки,
удаляем пустые строки и сохраняем файл Mine1.txt

Code: Select all
1343 1198 1417 -95
1340 1183 1425 -95
1351 1179 1424 -95
1340 1173 1414 -95
1340 1171 1427 -95
Внимание!Для коректного опознания Инжектом конца файла нужно чтобы курсор находился
в первой позиции последней строки.(хм чтобы стрелками на клавиатуре его можно
было туда опусить... может быть так понятнее?:))
Первая строка скрипта-путь к этому файлу.
Code: Select all
Var FileName='E:\GAMES\Injection\Mine1.txt'
Измените на свой.
Вот собственно и все!Совсем не сложно!Правда?:)
---------------------Возможные проблемы
-Чар реколится к сундуку,берет кирки,реколится в шахту и появляется ошибка Инжекта
Unhandled exeception in parser
Возможные причины- неправильно указан путь к файлу точек копания.Либо неправильное
имя самого файла.Проверьте не имеет ли файл имя например Mine1.txt.txt

Удачи!!!
Code: Select all
;***********************************************************************************
Var FileName='E:\GAMES\Injection\Mine1.txt'
Var ore = '0x19B9'
Var MaxWeight
Var Pickaxe= '0x0E86'
Var MoveDelay=1000 # Промежуток между шагами
Var MoveNumber=1 # Количество шагов при смене дислокации
Var Ep=0.172 # Значение ширины угла хождения при определении направления.
#Если на пути встречаются сложные и широкие препятствия - увеличить.
#0.172 - сбалансированный.
var XN = 1117
var YN = 1462
var Stoplocation
Var RecToForg = '7'
Var RecToMine = '13'
Var Forg='0x4000898C'
Var Box='0x40013750'
var MyRunebuk='0x4001435E'
MaxWeight= ((uo.STR*3.5)+39)
if MaxWeight >= 410 then
MaxWeight=410
endif
;---------------------------------------
Sub Main()
uo.set('norbcalc','1')
uo.set('norbcheck','1')
uo.set('injectecho','1')
if uo.count(Pickaxe) < 1 then
Recaling(RecToForg)
GrAxe()
end if
Mine()
EndSub
;---------------------------------------
Sub Mine()
Var Tl,T,X,Y,Z
Var F
var Tim
var Jurn
Dim Сli[9]
Сli[0]="cliloc# 0xA867" ;You can't mine...
Сli[1]="cliloc# 0xAD03" ;You loosen
Сli[2]="cliloc# 0xAD00" ;there no metal
Сli[3]="cliloc# 0x6B31" ;backpack full
Сli[4]="cliloc# 0xEE46" ;worn out tool!
Сli[5]="cliloc# 0x5DE1" ;dull cuper
Сli[6]="cliloc# 0x5DE6" ;agapit
Сli[7]="cliloc# 0xA2DE" ;is too far away
Сli[8]="cliloc# 0xACF9" ;where do you wish to dig
Сli[9]="cliloc# 0xA866" ;You can't mine...
;----------------------------
Begin:
Recaling(RecToMine)
Stoplocation = 0
F=File(FileName)
F.Open()
Beg:
Tl=safecall F.Readln()
Tl=Trim(Tl)
If Tl=='File read error' Then
GoTo Ext
EndIf
T=GetNumb(Tl,0)
X=GetNumb(Tl,1)
Y=GetNumb(Tl,2)
Z=GetNumb(Tl,3)
UO.Print('GoTo hext point')
gotoxy(X,Y,1)
if Stoplocation == 1 then
Recaling(RecToForg)
SmOre()
GrOre()
GrAxe()
GoTo Ext
EndIf
REPEAT
uo.deletejournal()
UO.WaitTargetTile(Str(T),Str(X),Str(Y),Str(Z))
UO.usetype(Pickaxe)
wait(200)
Tim = UO.Timer()
REPEAT
wait(150)
Jurn=UO.Journal(0)
UNTIL ((UO.Timer()-Tim) > 40 or (not UO.Weight < MaxWeight) or Jurn[10] == "5" or Jurn == Сli[1] or Jurn == Сli[2] or Jurn == Сli[3] or Jurn == Сli[4] or Jurn == Сli[0] or Jurn == Сli[9] or UO.GetHP()==0)
UNTIL Jurn == Сli[3] or (not UO.Weight < MaxWeight) or Jurn == Сli[2] or uo.count(Pickaxe)==0 or Jurn == Сli[7] or Jurn == Сli[0] or Jurn == Сli[9]
If Jurn == Сli[2] or Jurn == Сli[0] or Jurn == Сli[7] or Jurn == Сli[9] then
UO.Print('there no metal !!!')
GoTo Beg
EndIf
If Jurn == Сli[3] or (not UO.Weight < MaxWeight) or uo.count(Pickaxe)==0 then
UO.Print('backpack full!!!')
Recaling(RecToForg)
SmOre()
GrOre()
GrAxe()
EndIf
Ext:
F.Close()
UO.Print('S T O P!!!')
GoTo Begin
EndSub
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 SmOre()
var Сli="cliloc# 0xA2DE" ;is too far away
uo.deletejournal()
repeat
uo.findtype(ore)
uo.waittargetobject(Forg)
uo.useobject("finditem")
wait(900)
If uo.InJournal(Сli) > 0 then
Recaling(RecToForg)
EndIf
until not uo.count(ore)
end sub
;---------------------------------------------
sub GrOre()
repeat
uo.findtype('0x1BF2') #ingots
uo.moveitem('finditem','0',Box)
wait(700)
until not uo.count('0x1BF2')
end sub
;---------------------------------------------
sub GrAxe()
var Mes='Contains'
var Tim
uo.deletejournal()
if uo.count(Pickaxe) < 2 then
uo.useobject(Box)
Tim = UO.Timer()
repeat
Wait(100)
until uo.InJournal(Mes) or (UO.Timer()-Tim) > 30
Wait(200)
uo.findtype(Pickaxe,'-1',Box)
Wait(200)
if uo.findCount()>2 then
repeat
uo.findtype(Pickaxe,'-1',Box)
UO.grab('1','finditem')
Wait(1200)
until uo.count(Pickaxe)==2
else
UO.print("--NET KIROK!!!!----")
UO.Exec('terminate all')
end if
end if
end sub
;**************************************************************************
Sub Recaling(Num)
var myx, myy,Tim
var Cli="cliloc# 0xA8B6"
var Cli2="cliloc# 0xAA57"
var recOk = false
if uo.Waiting() then
uo.canceltarget()
wait(200)
end if
wait(800)
myx=uo.getx()
myy=uo.gety()
uo.deletejournal()
REPEAT
uo.recall(MyRunebuk,Num)
Tim = UO.Timer()
repeat
wait(100)
until (UO.Timer()-Tim) > 50 or myx<>uo.getx() or myy<>uo.gety() or uo.InJournal(Cli)
If myx<>uo.getx() or myy<>uo.gety() or uo.InJournal(Cli) Then
recOk = True
else
if uo.InJournal(Cli2) then
uo.findtype(ore)
uo.moveitem('finditem','1','ground')
wait(500)
end if
EndIf
UNTIL recOk
End Sub
;---------------------------------
sub gotoxy(x,y,prec)
var ld=0,ldc=0
var dx,dy
var mx,my
var ox,oy,mk,k
#uo.print(">")
#uo.track("1",str(x),str(y))
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.Print("UR")
UO.Press(33)
goto start
endif
#UO.Print("DL")
UO.Press(35)
goto start
end if
if mx<x then
if my>y then
#UO.Print("R")
UO.Press(39)
goto start
endif
if my==y then
#UO.Print("DR")
UO.Press(34)
goto start
endif
#UO.Print("D")
UO.Press(40)
goto start
end if
if my<y then
#UO.Print("L")
UO.Press(37)
goto start
endif
if my==y then
#UO.Print("LU")
UO.Press(36)
goto start
endif
#UO.Print("U")
UO.Press(38)
goto start
end sub