Пример скрипта.Mining RunUO

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Ugrum.
Posts: 69
Joined: 2004-04-05 11:59:21
Location: RunUO

Пример скрипта.Mining RunUO

Post by Ugrum. »

-----------------------Введение.
Скрипт написан для 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 
fr33s
Posts: 28
Joined: 2004-12-27 17:03:45
Location: Kyiv. UA.
Contact:

Post by fr33s »

на аосе я так понимаю это работать не будет..
Благодарю, Вы мне очень помогли =)
Ugrum.
Posts: 69
Joined: 2004-04-05 11:59:21
Location: RunUO

Post by Ugrum. »

скрипт тестировался на:
Ultima Online: Age of Shadows.
Сервер RunUO v1.0 RC0
Post Reply