Code: var step_timeout = 800 ; таймаут на шаг VAR MaxVes = 50 VAR havka = '0x09F2' ; жаренная рыба VAR Container = '0x4008E70D' ;Сундук (банк) руда, рыба, инструменты VAR Stat='0x4001CCDE' VAR Pickaxe = '0x0E85' ; тип кирки var i, oldX, oldY, LastTimer
sub mining()
var continue = "You loosen some rocks but fail to find any useable ore.|in your pack.|Success in work!" ; сообщения о продолжении капания этого тайла var break = "Try mining in rock.|That is too far away.|There is no ore here to mine.|You can't see the target|Unexpected button input|You broke the pickaxe.|You have incorrectly entered a code. Repeat attempt" ; сообщения о прекращении капания этого тайла var i = 0, f = file ( "D:\mining3.txt" ) ; файлик с координатами f.open() var cnt = f.readNumber() DIM type[ val( str( cnt ) ) ] DIM tile_t[ val( str( cnt ) ) ] DIM tile_x[ val( str( cnt ) ) ] DIM tile_y[ val( str( cnt ) ) ] DIM tile_z[ val( str( cnt ) ) ] while not f.eof() type[ i ] = f.readNumber() tile_t[ i ] = f.readNumber() tile_x[ i ] = f.readNumber() tile_y[ i ] = f.readNumber() tile_z[ i ] = f.readNumber() i = i + 1 wend f.close() for i = 0 to cnt -1 if type[i] == 2 || type[i] == 1 then desWalker( tile_x[i], tile_y[i] ) endif if type[i] == 2 || type[i] == 0 then repeat deljournal( break + "|" + continue ) uo.waittargettile( str( tile_t[ i ] ), str( tile_x[ i ] ), str( tile_y[ i ] ), str( tile_z[ i ] ) ) uo.usetype( Pickaxe ) repeat wait( 100 ) until uo.injournal( break + "|" + continue ) || UO.Weight > MaxVes || UO.Dead() until uo.injournal( break ) || UO.Weight > MaxVes || UO.Dead() If UO.Weight > MaxVes Then UO.Print('Перегруз!') wait(500) BackMine() wait(500) endif endif next endsub
Sub desWalker( x, y ) var dir, key, mx, my, timer if x== uo.getX() && y == uo.getY() then return false endif repeat mx = uo.getX() my = uo.getY() key = getWalkDir( x-mx, y-my, 0, 0 ) dir = getWalkDir( x-mx, y-my, 1, 0 ) if Not uo.getDir() == dir then uo.press( key, 2 ) else uo.press( key ) endif timer = 0 while uo.getX() == mx && uo.getY() == my && step_timeout / 100 > timer wait( 100 ) timer = timer + 1 wend until uo.getX() == x && y == uo.getY() endsub Sub getWalkDir(x, y, type, walk) DIM keys[8] if type == 0 then if walk == 0 then keys[0] = 35; End keys[1] = 40; Down keys[2] = 34; Page Down keys[3] = 39; Right keys[4] = 33; Page Up keys[5] = 38; Up keys[6] = 36; Home keys[7] = 37; Left else keys[0] = 33; Page Up keys[1] = 38; Up keys[2] = 36; Home keys[3] = 37; Left keys[4] = 35; End keys[5] = 40; Down keys[6] = 34; Page Down keys[7] = 39; Right endif else if walk == 0 then keys[0] = 4; End keys[1] = 3; Down keys[2] = 2; Page Down keys[3] = 1; Right keys[4] = 0; Page Up keys[5] = 7; Up keys[6] = 6; Home keys[7] = 5; Left else keys[0] = 0; Page Up keys[1] = 7; Up keys[2] = 6; Home keys[3] = 5; Left keys[4] = 4; End keys[5] = 3; Down keys[6] = 2; Page Down keys[7] = 1; Right endif endif if x==0 && y > 0 then return keys[0] endif if x==0 && y < 0 then return keys[4] endif if x > 0 && y == 0 then return keys[2] endif if x < 0 && y == 0 then return keys[6] endif if x > 0 && y > 0 then return keys[1] endif if x > 0 && y < 0 then return keys[3] endif if x < 0 && y > 0 then return keys[7] endif if x < 0 && y < 0 then return keys[5] endif endsub
Sub deljournal(msg) while uo.injournal(msg) uo.setjournalline(uo.injournal(msg)-1,"") wend endsub
Sub OneClick() dim reindex[8] reindex[0] = 11 reindex[1] = 12 reindex[2] = 13 reindex[3] = 10 reindex[4] = 16 reindex[5] = 14 reindex[6] = 17 reindex[7] = 15 var GumpID = 0 var ButtonID = 0 var ButtonText var i = 18 if uo.LastGump('text', 4) <> "0" then i = 19 end if GumpID = val(Mid(uo.LastGump('command', i), 16, 4)) ButtonID = reindex[GumpID-2225] ButtonText = uo.LastGump('command', ButtonID) uo.LClick(Val(Mid(ButtonText, 7, 3)), Val(Mid(ButtonText, 11, 3))) wait(300) end sub
sub AntiMacro() while not uo.Dead() if not uo.LastGump('replyed') then if uo.LastGump('text', 0) == 'Antimacros System' then OneClick() end if endif wait(500) wend end sub
Sub BackMine() i=UO.Getserial('self') oldX=UO.GetX(i) oldY=UO.GetY(i) walker(2568,475,0) wait(500) skid() wait(500) walker(oldX,oldY,0) endsub
sub skid() uo.useobject(Stat) wait(300) PUT(0x1BDD, Container ) PUT(0x19B9, Container ) PUT(0x19B7, Container ) PUT(0x19BA, Container ) PUT(0x19B8, Container ) eat() GrAxe() end sub
Sub eat() GET(havka, Container, 1, 5) REPEAT UO.DeleteJournal() LastTimer=UO.Timer() UO.findtype(havka,-1,'backpack') If UO.FindCount() > 0 Then UO.Useobject('finditem') wait(200) Else UO.Print( 'кончилась рыба' ) return 0 end if Until UO.InJournal("stuffed!|think|found|You would not like to eat more|You feel quite full after consuming the food.") OR UO.Timer()>LastTimer+200 PUT(havka, Container) end sub
sub GrAxe() uo.deletejournal() uo.useobject('Stat') wait(2000) uo.useobject('0x400B442D') wait(2000) if uo.count(Pickaxe) < 6 then uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) uo.findtype(Pickaxe,'-1','Container') wait(100) UO.grab('1','finditem') Wait(600) end if end sub
Sub PUT(item, cont) while UO.Count( item ) > 0 UO.FindType( item, -1, -1 ) UO.MoveItem( 'finditem', 0, cont ) wait(300) wend end sub
Sub GET(item, cont, min, max) If UO.Count( item ) < min Then UO.FindType( item, '-1', cont ) if UO.FindCount() > 0 Then uo.moveitem('finditem', max, 'backpack') wait(300) else return endif Endif end sub
########################################## ХОДИЛКА 3 ########################## #var Prec=3 # Как близко следует подойти к цели (Precision) #var MaxTraceDistance=15 # Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень #большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву. #var Speed=2 # Длина шага. Сколько шагов делать за раз. Выше 3 ставить смысла нет. Тоесть тупое умножение шагов. Для ламбера #идеально 3, для майнинга - 1. #var StepTimeOut=400 # Если уперлись в неопознанный обьект, сколько мсек ждать сдвига с места. Если по простому - таймаут #шага. Если поставить сильно маленькие, ходилка начнет трассировать пустые места. #UO.SetGlobal("Logging","1") # - показывать отладочные сообщения. #UO.SetGlobal("BlindWalk","0") # - не использовать проверку тайлов, а использовать ходьбу наощупь. Для майнинга ОБЯЗАТЕЛЬНО #ВКЛЮЧИТЬ. #В функции IsPass, содержиться список проходимых тайлов.
#Walker(X,Y,Prec) - идем к цели с координатами X,Y. Возвращает 1 в случае успешного достижения цели, и 0 - при невозможном обходе (путь не найден) #Tracer(StartDir,Direction) - трассировка 1 шага. Возвращает направление по которому получилось сдвинуться с места. StartDir #- направление последнего движения, Direction (-1 или +1) направление обхода. -1 - по часовой стрелке, +1 против часовой #стрелки. Направления скрипт использует личного формата: #1 - влево вниз #2 - вниз #3 - вправо вниз #4 - вправо #5 - вправо вверх #6 - вверх #7 - влево вверх #8 - влево #Tracer(StartDir,Direction) - идеально подходит для рыбалки вдоль берега так как она будет обходить берег бесконечно (1 #запуск функции = 1 шаг обхода). ##################################################### # WW W WW AA LL Kk KK EE EE RRR # # WW W WW AA A LL Kk K EEE R R # # WW W WW AA A LL KKK EEEEE R R # # WW WW WW AAAA LL KKK EEE RRR # # WWW WWW AA A LLLL KK Kk EE EE R RR # #################################################### var MaxTraceDistance=10 var TraceLoopIncrease=5 #Увеличение MaxTraceDistance при исчерпании количества ходов var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет). var Speed=1 var StepTimeOut=300 #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга. # Для ходьбы - 500+Ping # Для бега/ходьбы на лошади - 300+Ping # Бег на лошади - 150 + Ping
var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС. var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
Sub ttt() walker(1165,1661,1) end sub
Sub Walker(GoX,GoY,Prec) UO.SetGlobal("Logging","0") UO.SetGlobal("BlindWalk","1") var LastDir var MoveRes var TracerCnt UO.SetGlobal("GlobalGoX",str(GoX)) UO.SetGlobal("GlobalGoY",str(GoY)) while not IsEnd(GoX,GoY,Prec) TracerCnt = MaxTraceDistance repeat LogInfo('Just walking') LastDir=GoUntilHit(GoX,GoY,Prec) if IsEnd(GoX,GoY,Prec) then return 1 end if LogInfo('Tracing') MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt) if TracerCnt > LimitTrace then return 0 endif TracerCnt = TracerCnt + TraceLoopIncrease until MoveRes == 1 wend return 1 end sub
Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace) var LineX=UO.GetX() var LineY=UO.GetY() var CurDir=StartDir var Direction=CountDirection(GoX,GoY,CurDir,Prec) var StartX,StartY var MovesDone=0 repeat StartX=UO.GetX() StartY=UO.GetY() CurDir=Tracer(CurDir,Direction,Prec) if (CurDir==GetDir(GoX,GoY,Prec)) then return 1 endif if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then return 1 end if MovesDone=MovesDone+1 CurDir=AddToDir(CurDir,-Direction,Prec) until MovesDone>MaxTrace return 0 end sub
Sub CountDirection(GoX,GoY,StartDir,Prec) var GoDir=GetDir(GoX,GoY,Prec) var MyX=UO.GetX() var MyY=UO.GetY() if GoDir<StartDir then return -1 end if if GoDir>StartDir then return 1 end if if Abs(MyX-GoX)>Abs(MyY-GoY) then if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then return -1 else return 1 end if else if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then return -1 else return 1 end if end if end sub
Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec) var x3,y3,x4,y4 x3=StartX y3=StartY x4=StartX+(XFromDir(Dir)-StartX)*Speed y4=StartY+(YFromDir(Dir)-StartY)*Speed return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec) end sub
Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec) if x1==x3 and y1==y3 then return false end if var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1) var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1) if z1*z2>0 then return false else LogInfo('Vector info:') LogInfo('x1= '+str(x1)) LogInfo('y1= '+str(y1)) LogInfo('x2= '+str(x2)) LogInfo('y2= '+str(y2)) LogInfo('x3= '+str(x3)) LogInfo('y3= '+str(y3)) LogInfo('x4= '+str(x4)) LogInfo('y4= '+str(y4)) return true end if end sub
Sub IsDiap(X,X0,X1,Prec) if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then return true end if return false end sub
Sub GoUntilHit(GoX,GoY,Prec) var LastDir LastDir=GetDir(GoX,GoY,Prec) var CouldMove repeat LastDir=GetDir(GoX,GoY,Prec) if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then CouldMove=TryDir(LastDir,Prec) end if until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove return LastDir end sub
Sub IsEnd(GoX,GoY,Prec) if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then LogInfo('END FOUND') return true else return false end if end sub
Sub GetDir(GoX,GoY,Prec) var MyX=UO.GetX() var MyY=UO.GetY() var DiffX=Abs(UO.GetX()-GoX) var DiffY=Abs(UO.GetY()-GoY) var GoDir=0 if (DiffX/(DiffY+0.1))>=2 then if (MyX>GoX) then GoDir=7 else GoDir=3 end if else if (DiffY/(DiffX+0.1))>=2 then if (MyY>GoY) then GoDir=5 else GoDir=1 end if else if (MyX>GoX) and (MyY>GoY) then GoDir=6 else if (MyX>GoX) and (MyY<GoY) then GoDir=8 else if (MyX<GoX) and (MyY>GoY) then GoDir=4 else if (MyX<GoX) and (MyY<GoY) then GoDir=2 end if end if end if end if end if end if return GoDir end sub
Sub Tracer(StartDir,Direction,Prec) var CurDir=StartDir var Result repeat Result=TryDir(CurDir,Prec) if not Result then CurDir=AddToDir(CurDir,Direction,Prec) end if until Result return Result end sub
Sub AddToDir(Dir,Cnt,Prec) var NewDir=Dir NewDir=NewDir+Cnt while NewDir>8 NewDir=NewDir-8 wend while NewDir<1 NewDir=NewDir+8 wend return NewDir end sub
Sub TryDir(Dir,Prec) var BegX=UO.GetX() # Ia?aeuiia O var BegY=UO.GetY() # Ia?aeuiia Y var Counter=0 var GoX=BegX var GoY=BegY GoX=XFromDir(Dir) GoY=YFromDir(Dir) if not IsPass(GoX,GoY) then LogInfo(str(GoX)+':'+str(GoY)+' is not passable') return false end if return TurnAndGoDir(Dir,Prec) end sub
Sub XFromDir(Dir) if Dir==2 OR Dir==3 Or Dir==4 then return (UO.GetX()+1) end if if Dir==6 OR Dir==7 Or Dir==8 then return (UO.GetX()-1) end if return (UO.GetX()) end sub
Sub YFromDir(Dir) if Dir==8 OR Dir==1 Or Dir==2 then return (UO.GetY()+1) end if if Dir==4 OR Dir==5 Or Dir==6 then return (UO.GetY()-1) end if return (UO.GetY()) end sub
Sub TurnAndGoDir(Dir,Prec) var StartDir=GetDirToDir(UO.GetDir(),Prec) var StartX=UO.GetX() var StartY=UO.GetY() var EndDir var Counter=0 var TestCounter=CheckCnt #Direction Test repeat Counter = 0 LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter)) PressDir(Dir) repeat EndDir=GetDirToDir(UO.GetDir(),Prec) wait(DynamicPause) Counter=Counter+1 until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause TestCounter = TestCounter - 1 LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter)) until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause if Counter>=StepTimeOut/DynamicPause then LogInfo('Direction timeout reached') return 0 end if #End direction Test if StartY<>UO.GetY() or StartX<>UO.GetX() then return Dir end if #Start Primary test TestCounter=CheckCnt repeat GoDir(Dir,Prec) Counter=0 repeat wait(DynamicPause) Counter=Counter+1 until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause TestCounter = TestCounter - 1 until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause #End primary test if Counter>=StepTimeOut/DynamicPause then LogInfo('Step timeout reached') return 0 else return Dir end if end sub
Sub GetDirToDir(GotDir,Prec) var ChangedDir=-GotDir ChangedDir=AddToDir(ChangedDir,5,Prec) return ChangedDir end sub
Sub DirToInj(Dir) dim Dirs[9] Dirs[1]=1 Dirs[2]=2 Dirs[3]=3 Dirs[4]=6 Dirs[5]=9 Dirs[6]=8 Dirs[7]=7 Dirs[8]=4 return (Dirs[Dir]) end sub
Sub PressDir(Dir) dim Dirs[9] Dirs[1]=35 Dirs[2]=40 Dirs[3]=34 Dirs[4]=39 Dirs[5]=33 Dirs[6]=38 Dirs[7]=36 Dirs[8]=37 UO.Press(Dirs[Dir],1) end sub
Sub GoDir(Dir,Prec) dim Dirs[9] Dirs[1]=35 Dirs[2]=40 Dirs[3]=34 Dirs[4]=39 Dirs[5]=33 Dirs[6]=38 Dirs[7]=36 Dirs[8]=37 var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX"))) var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY"))) var GoDistance if (DistanceX-Prec)<Speed then GoDistance=DistanceX-Prec else if (DistanceY-Prec)<Speed then GoDistance=DistanceY-Prec else GoDistance=Speed endif endif UO.Press(Dirs[Dir],GoDistance) end sub
Sub IsPass(X,Y) if UO.GetGlobal("BlindWalk") then return true endif dim Types[60] Types[1]=3 Types[2]=25 Types[3]=51 Types[4]=63 Types[5]=113 Types[6]=140 Types[7]=172 Types[8]=219 Types[9]=232 Types[10]=235 Types[11]=239 Types[12]=243 Types[13]=248 Types[14]=251 Types[15]=264 Types[16]=267 Types[17]=282 Types[18]=289 Types[19]=321 Types[20]=379 Types[21]=420 Types[22]=440 Types[23]=476 Types[24]=499 Types[25]=513 Types[26]=542 Types[27]=578 Types[28]=586 Types[29]=622 Types[30]=700 Types[31]=804 Types[32]=1740 Types[33]=1758 Types[34]=1770 Types[35]=1779 Types[36]=1779 Types[37]=1881 Types[38]=1886 Types[39]=1801 Types[40]=1805 Types[41]=1813 Types[42]=1820 Types[43]=1831 Types[44]=1833 Types[45]=1843 Types[46]=1850 Types[47]=1873 Types[48]=1876 Types[49]=1885 Types[50]=1888 Types[51]=1946 Types[52]=1969 Types[53]=2500 Types[54]=2539 for var i=1 TO 53 STEP 2 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then return true end if next return false end sub
Sub LogInfo(Line) if not UO.GetGlobal("Logging")=="0" then UO.TextOpen() UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line); end if end sub
Sub Abs(X) if X>0 then return X else return (-X) end if end sub ########################################## КОНЕЦ ХОДИЛКИ 3 ##########################
вобщем скрипт "я его слепила из того что было"
не ходить по кругу =( доходит до конца и останавливаеться
|