В целом с задачей я справился, но есть проблема - примерно через час-полтора происходит 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