Взял 2 скрипта один на мининг другой на ходилку переделал под себя всё работает как часики но проблема в одном некак немогу придумать (зделать) пытался много раз нечего не выходит, дело в том что я хочу чтобы он копал не в 1 месте, а каждый раз ходил по разным местам допустим так: после того как он выкапывает он идёт ложет всё в сундук около дома и обратно возврашяеться на тоже место! А как мне сделать так чтобы после того как он выкопал одно место сходил сложыл всё в сундук и чтобы он шол копал на другое место перепробовал множество вариантов но нечего не получаеться... Жду помощи заранее спасибо!
Code: sub maning() var mx, my, mz, i, j, jor, ser, noto Uo.exec("set norbcheck 1"); для рекола uo.exec("set norbcalc 1"); тоже
uo.print('!!Выбери Лопату!! ') uo.exec('addobject Shovel') while uo.targeting() wait(100) wend
na4alo: mx = UO.GetX("self") my = UO.GetY("self") mz = UO.GetZ("self") UO.DeleteJournal() for i = mx-2 to mx+2 for j = my -2 to my+2 UO.Print("Копаем в координатах: "+str(mx-i)+" "+str(my-j)) while not UO.InJournal("no ore here") and not UO.InJournal("There is nothing here to mine for") and not UO.InJournal("You cannot mine so close to yourself") and not UO.InJournal("location") and not UO.InJournal("far away") and not UO.InJournal("in rock") UO.DeleteJournal() if uo.waiting() then uo.canceltarget() endif UO.Waittargettile("1341", str(i), str(j), str(mz)) UO.Useobject("Shovel") while not UO.InJournal("You put") and not UO.InJournal("heavy") and not UO.InJournal("You cannot mine so close to yourself") and not UO.InJournal("location") and not UO.InJournal("There is nothing here to mine for") and not UO.InJournal("but fail") and not UO.InJournal("far away") and not UO.InJournal("in rock") wait (500) if uo.injournal("heavy") or uo.dead() then sirena() Pause() endif for jor = 0 to 9 ser = uo.journalserial(jor) noto = uo.getnotoriety(ser) if noto <> 1 and noto <> 0 and not uo.injournal("elemental") then if uo.waiting() then uo.canceltarget() endif loot() wait(3000) endif next wend if uo.weight > 565 then ; Максимальный вес при котором домой с рудой goto end endif wend UO.DeleteJournal() next next goto na4alo end: if uo.waiting() then uo.canceltarget() endif
;бежыт домой uo.warmode(0) GOHOME() wait(5000) loot() wait(3000) uo.deletejournal() if uo.waiting() then uo.canceltarget() endif
;бежыт В Шахту GOSHAHTA() mx = UO.GetX("self") my = UO.GetY("self") wait(5000) if not UO.GetX("self") <> mx and not UO.GetY("self") <> my then endif goto na4alo end sub
sub loot() ; перекладка руды в сундук if uo.waiting() then uo.canceltarget() endif VAR a,Exit VAR UnloadCont='0x40003FB5' ; АЙДИ сундука для руды DIM Ore[5] Ore[0]=0x19B9 ; 4 and more ore Ore[1]=0x19B7 ; 1 ore Ore[2]=0x19BA ; 2 ore Ore[3]=0x19B8 ; 3 ore UO.SetReceivingContainer(UnloadCont) wait(500) For a=0 to 3 Exit=0 repeat UO.FindType(Ore[a]) if UO.GetQuantity('finditem')>0 then UO.Grab('0','finditem') wait(1500) Else Exit=1 endif until Exit==1 Next UO.UnSetReceivingContainer() end sub
sub sirena(); звук при появлении ПК uo.playwav("D:\alarm.wav") endsub
sub Pause() ; Пауза скрипта если выкопали Элема (продолжить сказав GO ) UO.DeleteJournal() REPEAT WAIT(3000) UO.Print("Pause") UNTIL UO.InJournal('GO') UO.Print("Play") endif end sub
sub GOHOME() ; now you need to move, for example to 1234 876 exactly ; do it var stepdelay = 1000 GoToXY(1829, 1030, 0) ; after this call your char stands directly at 1234 876 endsub sub GOSHAHTA() ; now you need to move, for example to 1234 876 exactly ; do it var stepdelay = 1000 GoToXY(1820, 1030, 0) ; after this call your char stands directly at 1234 876 endsub #(c)SerrouS Sub InitStack() UO.SetGlobal('STACK', '0') endsub Sub Push( param ) var chk = val(UO.GetGlobal('STACK')) ; количество элементов в стеке UO.SetGlobal('STACK',str(chk + 1)) UO.SetGlobal('STACK_'+str(chk), param) endsub Sub Pop () var chk = val(UO.GetGlobal('STACK')) ; количество элементов в стеке if chk then UO.SetGlobal('STACK',str(chk - 1)) return UO.GetGlobal('STACK_'+str(chk - 1)) else return '' endif endsub
SUB GoToXY(x,y,prec) #original (c) ... #modification 2.00 (c) SerrouS dim turn[8] ; индекс - ГетДир, значение поворот направо под 45 градусов turn[0] = 39 turn[1] = 34 turn[2] = 40 turn[3] = 35 turn[4] = 37 turn[5] = 36 turn[6] = 38 turn[7] = 33 dim deltax[8]; индекс - аналогично, значение - изменение координаты при проходе стенки dim deltay[8] deltax[0] = 1 deltax[1] = 1 deltax[2] = 1 deltax[3] = 0 deltax[4] = -1 deltax[5] = -1 deltax[6] = -1 deltax[7] = 0
deltay[0] = -1 deltay[1] = 0 deltay[2] = 1 deltay[3] = 1 deltay[4] = 1 deltay[5] = 0 deltay[6] = -1 deltay[7] = -1 var dx,dy
var mx,my ; current coords var lx = 0, ly = 0, ld = -1 ; last move coords var pathFind = 0 ; as logical 0 - norm, 1 - block var ind var recursInd = 0 var fout = 0
var stepdelay = 1000
InitStack() repeat mx=UO.GetX() my=UO.GetY()
; calculating for precision coming dx = mx - x If dx < 0 Then dx = 0 - dx EndIf ;get ABS diff
dy = my - y If dy < 0 Then dy = 0 - dy EndIf If dy > dx Then dx = dy EndIf If dx <= prec Then Return EndIf if mx == x and my == y then return endif lx = mx ly = my ld = UO.GetDir() ; cause once pressing can only change the direcction
if mx == x and my > y then UO.Press(33) endif if mx == x and my < y then UO.Press(35) endif if mx < x and my == y then UO.Press(34) endif if mx < x and my > y then UO.Press(39) endif if mx < x and my < y then UO.Press(40) endif if mx > x and my == y then UO.Press(36) endif if mx > x and my > y then UO.Press(38) endif if mx > x and my < y then UO.Press(37) endif UO.Print('KeyPressed') wait( stepdelay )
if lx == UO.GetX() and ly == UO.GetY() and ld == UO.GetDir() then ; now there is a stop situation UO.Print('PathFind') recursInd = 0 repeat ################################################# ind = ld UO.Print(str(ind)) fout = 0 repeat ; идем в обход пока не упремся снова или не кончится стена UO.Print('Iteration') mx = UO.GetX() my = UO.GetY() ld = UO.GetDir() UO.Press( turn[ ind ] ) wait( stepdelay ) if (UO.GetX() == mx and UO.GetY() == my and ld == UO.GetDir()) then fout = 1 ; уперлись else dx = UO.GetX() - mx dy = UO.GetY() - my UO.Print('deltas '+str(dx)+' '+str(dy)) if deltax[ ind ] == dx and deltay[ ind ] == dy then fout = 2 ; препятствие пройдено endif endif until fout UO.Print('fout '+ str(fout)) if fout == 1 then ; уходим на следующий поворот recursInd = recursInd + 1 Push( str( ind ) ) ;ld = ind else ; fout == 2 ; надо попытаться восстановить контекст из стека, или выйти из обхода UO.Print('Iter '+ str(recursInd)) pathFind = 0 if recursInd then ; восстановление pathFind = 1 recursInd = recursInd - 1 ld = val(Pop()) - 1 if ld == -1 then ld = 7 endif UO.Press( turn[ld] ) wait ( stepdelay ) ; в сиду того, что ондо нажатие меняет напрваление endif endif ################################################# until not recursInd and not pathFind UO.Print('PathFind END') endif
until 0 endsub
|