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