Помогите со скриптом на mining и bs.

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
arch
Posts: 38
Joined: 2004-05-26 16:39:57
Location: www.myruo.ru
Contact:

Помогите со скриптом на mining и bs.

Post by arch »

Я играю на шарде, где шахта Kendal является ГЗ. В ней установлены Bank-chest, Плавилка, Наковальня и треш-бочка. Сам бог велел написать скрипт, который бы мог круглосуточно копать, плавить, ковать и сливать накованное в треш.
В целом с задачей я справился, но есть проблема - примерно через час-полтора происходит Unhandled exception и скрипт останавливается, либо вообще крашит клиент. Как можно с этим бороться?
Может, сменить версию инжекта?
Или что-то переделать в скрипте?
Заранее благодарю за помощь.

Вот код скрипта:

Code: Select all

; скрипт на гвардинг. Запускается параллельно с основным.
sub guards()
  var bandageTYPE='0x0E21' ; Тип бинтов
  var hidewithdetect=0 ; 0, если не хотите использовать детект хидден, иначе любое другое значение
  var i, j
  repeat
  if uo.injournal('атакует Вас') or uo.injournal('Elemental') or ((uo.str-1)>uo.life) then
  uo.deleteJournal()
  for i=0 to 5
    uo.waittargetself()
    uo.usetype(bandageTYPE) ; юзаем на себя бинты
    for j=1 to 2
      wait(2000)
      uo.msg('guards')
    next
    uo.warmode(0)
  next
  end if
  wait(500)
  until uo.dead()
end sub

; Главный скрипт.
sub min()
var i,j
var trashX = 2569 ; Координаты треш-бочки - Х
var trashY = 475 ; и У

var trashTYPE='0x0FAE' ; Тип треш-бочки

var bankX=2560 ; Координаты банка - Х
var bankY=490 ; и У

var forgeID="0x40023C3C" ; ID форжи, в которой будете плавить.

var ingTYPE='0x1BEF' ; Тип инготов
var hamTYPE='0x13E3' ; Тип молотка в вашем паке

var ignoreLUX=0 ; Если высставить на 1 или другое значение - игнорим сокровища

var hidewithdetect=0 ; 0, если не хотите использовать детект хидден, иначе любое другое значение

var pickaxeTYPE='0x0E86' ; Тип кирки

var bankPack = '0x4007DB19' ; ID мешка в банке. предметы будут положены именно туда.
var bankObj = '0x4010A2B5' ; ID банковского сундука

var coordSIZE=13 ; Размер массива вейпоинтов
dim coordsX[13] ; Два массива way-point`ов. Чар ходит по ним поочередно
dim coordsY[13] ; Если накопал предельный вес, идет к форже и плавит, потом кует, потом в треш.
coordsx[0]= 
coordsy[0]=
 ..... координаты way-points
coordsx[12]=
coordsy[12]=

var trashSIZE=4 ; Размер массива треш-типов
dim a_trashTYPE[4]
a_trashTYPE[0]='0x13E3' // в треш сливаются накованные молотки и оставшиеся инготы
a_trashTYPE[1]='0x1BEF'
a_trashTYPE[2]='0x1BF5'
a_trashTYPE[3]='0x1BE9'

repeat
  for i=0 to coordSIZE-1
    if ignoreLUX==0 then
      if UO.Weight>UO.Str*4-150 then
        movechar(bankX, bankY)
        unloading(bankPack,bankObj)
        plavka(forgeID)
        bs(ingTYPE,hamTYPE)
        movechar(trashX, trashY)
        for j=0 to trashSIZE-1
          trashit(a_trashTYPE[j],trashTYPE)
        next
      end if
    else
    if UO.Weight>UO.Str*4 then
      movechar(bankx, banky)
      unloading(bankPack,bankObj)
      plavka(forgeID)
      bs(ingTYPE,hamTYPE)
      movechar(trashX, trashY)
      for j=0 to trashSIZE-1
        trashit(a_trashTYPE[j],trashTYPE)
      next
    end if
  end if
  movechar(coordsx[i],coordsy[i])
  hide(hidewithdetect)
  min5x5(ignoreLUX, pickaxeTYPE)
  next
until uo.dead()
end sub

sub Reconnector() 
var ReconnectTime, RFlag 
ReconnectTime = '0' 
RFlag = 1 
Repeat 
While (UO.ObjAtLayer('Bpack') == '') 
if RFlag Then 
ReconnectTime = MakeTime() 
RFlag = 0 
endif 
Wait(30000) # WorldSave Protection 
UO.Say('') 
wait(3000) 
UO.Say('') 
wait(3000) 
UO.Say('') 
wait(3000) 
UO.LDblClick(357,164) 
UO.LClick(616,459) 
wait(3000) 
wend 
wait(3000) 
if (RFlag == 0) and (ReconnectTime <> '0') Then 
UO.Exec('terminate main') 
UO.Exec('exec main') 
UO.TextOpen() 
UO.TextPrint('Disconnected & Reconnected @ '+ReconnectTime) 
RFlag = 1 
ReconnectTime = '0' 
endif 
Until false 
end sub 

sub trashit(trtype, trashTYPE)
;сливаем в треш-бочку все предметы с типом trtype. 
;Бочка должна быть в пределах видимости
var i
var Trken
uo.findtype(trashTYPE,-1,'ground')
if uo.findcount()==0 then
uo.print("Бочки нет");
return
end if
Trken=uo.GetSerial('finditem')
uo.findtype(trtype,-1,'backpack') 
while uo.findcount()>0
uo.waittargetobject('finditem')
uo.useobject(Trken)
i=0
uo.deletejournal()
repeat
wait(200)
i=i+1
until uo.injournal('You have recieved') or i>40
uo.findtype(trtype,-1,'backpack')
Wend
end sub


sub bs(ingTYPE,hamTYPE)
; Куем из айрон-ингов молотки
var i
var ew=500
uo.waittargetself()
uo.usetype(hamTYPE) ; молоток - в руки
uo.set('injectecho','1')
uo.set('soundecho','1')
uo.set('finddistance','1')
Uo.deleteJournal()
repeat
if uo.count(ingTYPE, 0)==0 then
return
end if 
uo.findtype(ingTYPE,0)
if uo.getquantity('finditem')<6 then
return
end if
uo.useobject('finditem')
uo.waitmenu('Blacksmithing','Weapons','Weapons','Maces','Maces',"hammer") 
Uo.deleteJournal()
i=0
Repeat
wait(200)
i=i+1
Until UO.InJournal("You put the") or UO.InJournal("You have failed") or UO.InJournal("Menu choice not found")or uo.inJournal("Warning")or i>50
if UO.InJournal("Menu choice not found")or uo.inJournal("Warning") then
uo.print("Menu choice not found")
wait(1000)
return
end if
if UO.InJournal("You have failed") then
ew=ew+500
else
ew=500
end if
wait(ew)
until uo.dead()
end sub

;Скрипт на обкопку пространства вокруг себя

sub min5x5(ignoreLUX, pickaxeTYPE)
var x,y,i,skip
dim OreToSkip[7]
OreToSkip[0]="Rose Ore"
OreToSkip[1]="Gold Ore"
OreToskip[2]="Shadow Ore"
OreToSkip[3]="Crystal Ore"
OreToSkip[4]="Oldcopper Ore"
OreToSkip[5]="Silver Ore"
OreToSkip[6]="Snow Ore"

uo.exec('resend')
for x=-2 to 2 
for y=-2 to 2
repeat
if ignoreLUX==0 then
if UO.Weight > UO.Str*4-150 then
return
end if
else
if UO.Weight > UO.Str*4 then
return
end if
end if
wait(1000)
uo.exec('waittargettile tilenum '+str(x+uo.getx())+' '+str(y+uo.gety())+' 0')
uo.usetype(pickaxeTYPE)
i=0
uo.deletejournal()
repeat
i=i+1
wait(100)
until (i>=100) or uo.injournal('You put') or uo.injournal('You loosen') or uo.injournal('Здесь больше') or uo.injournal('нельзя копать') or uo.injournal('far away') or uo.injournal("can't reach") 
if uo.injournal('find') and ignoreLUX==0 then
putuplux()
end if
skip=0
if uo.injournal('You put') then
for i=0 to 6
if uo.injournal(OreToSkip[i]) then
Skip=1
end if
next
end if 
if uo.injournal("can't reach") then
uo.resend()
end if
until uo.injournal('Здесь больше') or uo.injournal('нельзя копать') or uo.injournal('far away') or uo.injournal("can't reach") or (skip==1)
next
next
end sub

; Скрипт на переплавку выкопанной руды. Не проверяет скилы.
; Т.е. если Вы выкопали метеор, он лежит у Вас в паке, но
; Вы не можете его переплавить, то он пропадет
; Скрипт написал Адил :-)
sub plavka(forgeID)
var fX = 2574
var fY = 475
var OT, OC, i
DIM OreColor[8]
OreColor[0] = '0x0000' 
OreColor[1] = '0x0944' 
OreColor[2] = '0x0770' 
OreColor[3] = '0x06A3' 
OreColor[4] = '0x0481' 
OreColor[5] = '0x0487' 
OreColor[6] = '0x0482' 
OreColor[7] = '0x0633'

DIM OreType[4]
OreType[0] = '0x19B9'
OreType[1] = '0x19B8'
OreType[2] = '0x19BA'
OreType[3] = '0x19B7'
movechar(fX,fY)
For OC = 0 to 7
For OT = 0 to 3
While Not UO.Dead() And UO.Count( OreType[OT] , OreColor[OC] ) > 0 
UO.DeleteJournal()
i = 0
wait(300)
uo.waittargetobject(forgeID)
UO.UseType( OreType[OT] , OreColor[OC] )
Repeat
wait(100)
i = i + 1
Until UO.Dead() or UO.InJournal("You put") or UO.InJournal("You fail") or UO.InJournal("*You smelt") or i > 30
wend
wait(300)
next
next
end sub

; Скрипт на собирание "сокровищ". 

sub putuplux()
dim LT[10]
LT[0]='0x1B48'
LT[1]='0x1B47'
LT[2]='0x1B46'
LT[3]='0x1B45'
LT[4]='0x1B44'
LT[5]='0x1B43'
LT[6]='0x1B42'
LT[7]='0x1B41'
LT[8]='0x1B40'
LT[9]='0x1B3F'
var bx=2559
var by=490
var i, j
uo.set('finddistance','3')
for i=0 to 9
uo.findtype(LT[i], -1, 'ground')
if uo.findcount()>0 then
uo.moveitem('finditem',0,'my')
j=0
repeat
wait(10)
j=j+1
until (j==100) or (uo.containerof('finditem')=='backpack')
uo.useobject('finditem')
wait(600)
end if
next
end sub

; Скрипт на переброску предметов с типом type и цветом color в банк.
sub movetobank(type,color,bankPack,bankObj) 
uo.useobject(bankObj)
wait(500) 
uo.findtype(type, color, 'my')
while uo.findcount()>0
uo.moveitem('finditem', 0, bankPack) 
wait(600) 
uo.findtype(type, color, 'my')
wend 
end if 
end sub

; Скрипт на перекладывание "лишних" предметов в банк.
; Я туда складывал все драгоценные камни (типа турмалинов),
; деньги и руду высших металлов.
sub unloading(bankPack,bankObj)
var i,j
dim items[10]
items[0]= '0x0F0F' 
items[1]= '0x0F15' 
items[2]= '0x0F26' 
items[3]= '0x0F13' 
items[4]= '0x0EED'
items[5]= '0x0F18'
items[6]= '0x0F16'
items[7]= '0x0F10'
items[8]= '0x0F11'

DIM OreColor[3]
OreColor[0] = '0x04C2' # bloodrock
OreColor[1] = '0x0455' # blackrock
OreColor[2] = '0x0577' # meteor

DIM OreType[4]
OreType[0] = '0x19B9'
OreType[1] = '0x19B8'
OreType[2] = '0x19BA'
OreType[3] = '0x19B7'
for i=0 to 2
for j=0 to 3
if uo.count(OreType[j], OreColor[i])>0 then
movetobank(OreType[j],OreColor[i],bankPack,bankObj)
wait(600)
endif
next
next 
for i=0 to 8
if uo.count(items[i])>0 then
movetobank(items[i], '-1',bankPack,bankObj)
wait(600)
end if
next
end sub

sub CheckLag() 
UO.DeleteJournal() 
uo.exec('resend')
UO.Click('backpack') 

repeat 
wait(500) 
until UO.InJournal('Backpack') 
end sub 

sub hide(hidewithdetect) 
; Встаем в хайд
uo.warmode(0)
while not uo.hidden()
if hidewithdetect<>0 then
uo.useskill('Detect Hidden'); перед тем как встать в хайд, детектим.
wait(4000) ; если это не нужно, стираем эти две строчки
end if
uo.useskill('Hiding')
wait(3000)
wend
end sub

; Скрипт, непосредственно двигающий чара в указанную клетку.
; нормально работает только из-за особенностей Кендаля -
; Там просто негде затрять, если way-point`ы расставлены с умом
sub movechar(xx,yy)
repeat
if yy<uo.gety() then
gon()
else 
if yy>uo.gety() then
gos()
end if
end if
if xx<uo.getx() then
gow()
else
if xx>uo.getx() then
goe()
end if
end if
until (xx==uo.getx()) and (yy==uo.gety())
end sub

; следующие 4 саба взяты из какого-то скрипта с форума yoko.
; их цель - сделать шаг на соседнюю клетку
sub GoW() 
VAR walkwait=300 
VAR x,y,dir=6 
VAR key=36 ; Home key 
x=UO.GetX() 
y=UO.GetY() 
while UO.GetDir()<>dir 
UO.Press(key) 
wait(walkwait) 
If UO.GetDir()<>dir Then 
CheckLag() 
Endif 
wend 
UO.Press(key) 

wait(walkwait) 
If x==UO.GetX() AND y==UO.GetY() Then 
CheckLag() 
Endif 

If UO.GetX()+1==x Then 
return -1 
Else 
return 1 
Endif 
end sub 


sub GoN() 
VAR walkwait=300 
VAR x,y,dir=0 
VAR key=33 ; PgUp 
x=UO.GetX() 
y=UO.GetY() 
while UO.GetDir()<>dir 
UO.Press(key) 
wait(walkwait) 
If UO.GetDir()<>dir Then 
CheckLag() 
Endif 
wend 
UO.Press(key) 

wait(walkwait) 
If x==UO.GetX() AND y==UO.GetY() Then 
CheckLag() 
Endif 

If UO.GetY()+1==y Then 
return -1 
Else 
return 1 
Endif 
end sub 


sub GoE() 
VAR walkwait=300 
VAR x,y,dir=2 
VAR key=34 ; PgDown 
x=UO.GetX() 
y=UO.GetY() 
while UO.GetDir()<>dir 
UO.Press(key) 
wait(walkwait) 
If UO.GetDir()<>dir Then 
CheckLag() 
Endif 
wend 
UO.Press(key) 

wait(walkwait) 
If x==UO.GetX() AND y==UO.GetY() Then 
CheckLag() 
Endif 

If UO.GetX()-1==x Then 
return -1 
Else 
return 1 
Endif 
end sub 

sub GoS() 
VAR walkwait=300 
VAR x,y,dir=4 
VAR key=35 ; End 
x=UO.GetX() 
y=UO.GetY() 
while UO.GetDir()<>dir 
UO.Press(key) 
wait(walkwait) 
If UO.GetDir()<>dir Then 
CheckLag() 
Endif 
wend 
UO.Press(key) 

wait(walkwait) 
If x==UO.GetX() AND y==UO.GetY() Then 
CheckLag() 
Endif 

If UO.GetY()-1==y Then 
return -1 
Else 
return 1 
Endif 
end sub 

sub MakeTime() 
VAR D, T, Ret, i 
Ret = STR(UO.Time()) 
T = "" 
For i = 0 To Len(Ret) 
T = Ret[Len(Ret)-i] + T 
If (I == 2) OR (I == 4) Then 
T = ":" + T 
EndIf 
Next 
Ret = STR(UO.Date()) 
D = "" 
For i = 0 To Len(Ret) 
D = Ret[Len(Ret)-i] + D 
If (I == 2) OR (I == 4) Then 
D = "." + D 
EndIf 
Next 
Ret = T + " @ " + D 
RETURN Ret 
end sub 

sub main()

end sub
arch
Posts: 38
Joined: 2004-05-26 16:39:57
Location: www.myruo.ru
Contact:

Post by arch »

жду. Очень терпеливо :)

Скажите хотя бы, какая версия Инжекта самая стабильная?..
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Везёт людям - в шахте полный соцпакет. :D
Кстати копает только на 2 клетки? Просто на ДРВ.РУ можно на 4 клетки копать. Так мне хватает один раз перейти на 8 клеток в любую сторону. Я не парился и через UO.PRESS() "нарисовал" путь куда перейти если всё выкопал. Правда я в случае перегруза кричу Kal Or Por, и ближе к дому - руду скинул, и в шахту. Моих скромных знаний на это хватило. А по поводу краша. У меня 2 компа на одном нормально, а на другом не очень. А в связи с ухудшением интернет-связи(ADSL), даже несбойные скрипты вылетать начали.
Инжект - 505.18 VeNd0r - меня устраивает.
Post Reply