мой черновик для обкопа небольшой шахты когда домик стоит рядом и не надо реколиться.
Code: var bag = '0x4018A728' ; сундук куда скидывать руду и откуда брать инструменты var instr = 'тип кирки или лопаты' var ore1 = '0x19B7' var ore2 = '0x19BA' var ore3 = '0x19B8' var ore4 = '0x19B9' var Lasttimer sub main() repeat walker(1874, 267, 0) UO.UseObject(bag) wait(1000) putore() ; скидываем руду getinstr() ; добираем инструменты walker(1874, 267, 0) ; координаты до шахты walker(1874, 271, 0) walker(1887, 271, 0) walker(1897, 271, 0) walker(1904, 271, 0) Mine() walker(1912, 273, 0) Mine() walker(1916, 281, 0) Mine() walker(1921, 276, 0) Mine() walker(1921, 269, 0) Mine() walker(1924, 264, 0) Mine() walker(1917, 271, 0) walker(1901, 271, 0) walker(1887, 271, 0) walker(1874, 271, 0) walker(1874, 267, 0) ; координата у домика until UO.Dead() end sub Sub getinstr() get(instr, bag, 3, 1) get(instr, bag, 3, 1) get(instr, bag, 3, 1) endsub Sub putore() put(ore1,bag) put(ore2,bag) put(ore3,bag) put(ore4,bag) end sub ################ Рудокоп ################# Sub Mine() VAR Shovel1 = '0x0F39' VAR Shovel2 = '0x0F3A' VAR Pickaxe1 = '0x0E85' VAR Pickaxe2 = '0x0E86' VAR MaxRange = 2 VAR X, Y, Z, Tiles VAR mX, mY, mZ VAR MaxVes = 610 mX = UO.GetX('self') mY = UO.GetY('self') mZ = UO.GetZ('self') for Y = MaxRange - ( MaxRange * 2 ) to MaxRange for X = MaxRange - ( MaxRange * 2 ) to MaxRange Tiles = MiningTiles(mX+X, mY+Y) if Tiles then UO.DeleteJournal() repeat ############################ #ПЕРЕГРУЗ!!!# ############################ If UO.Weight > MaxVes Then UO.Print('Перегруз!') return endif ############################ UO.Set('quiet','1') UO.DeleteJournal() UO.Warmode(0) UO.WaitTargetTile(Tiles, mX+X, mY+Y, mZ) UO.FindType(Shovel1,-1,'my') if UO.FindCount() then UO.UseType(Shovel1) else UO.FindType(Shovel2,-1,'my') if UO.FindCount() then UO.UseType(Shovel2) else UO.FindType(Pickaxe1,-1,'my') if UO.FindCount() then UO.UseType(Pickaxe1) else UO.FindType(Pickaxe2,-1,'my') if UO.FindCount() then UO.UseType(Pickaxe2) else UO.Set('quiet','0') UO.Print("ERROR: Нечем копать!!!") return endif endif endif endif LastTimer=UO.Timer() repeat wait(100) until UO.InJournal("%|destroyed|useable|выкопали|0xAD00|0xA867|0xA2DE|0xAD03|0x5DE0|0x5DE1|0x5DE2|0x5DE3|0x5DE4|0x5DE5|0x5DE6|0x5DE7|Вы положили|put the|is nothing here to mine|Wthere do you|Вам не удалось|У вас нет|have no line|ничего|Тут ничего|Попробуйте|Try mining elsewhere") || UO.Timer()>LastTimer+100 || UO.Weight > MaxVes || UO.Dead() until UO.InJournal("%|destroyed|0xAD00|0xA867|0xA2DE|Тут ничего|is nothing here to mine|нет руды|У вас нет|have no line|Попробуйте|Try mining elsewhere") || UO.Timer()>LastTimer+500 || UO.Weight > MaxVes || UO.Dead() ############################ #ПЕРЕГРУЗ!!!# ############################ If UO.Weight > MaxVes Then UO.Print('Перегруз!') return endif ############################ endif next next UO.Set('quiet','0') UO.Print("Все") UO.Sound(100) return 0 end sub Sub MiningTiles(X,Y) var i if UO.PrivateGetTile(X, Y, -1, 616, 618) then for i=616 to 618 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 1339, 1363) then for i=1339 to 1363 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 2272, 2282) then for i=2272 to 2282 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 4963, 4973) then for i=4963 to 4973 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 6001, 6012) then for i=6001 to 6012 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 13121, 13369) then for i=13121 to 13369 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 13446, 13455) then for i=13446 to 13455 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 13484, 13492) then for i=13484 to 13492 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if if UO.PrivateGetTile(X, Y, -1, 13625, 13628) then for i=13625 to 13628 if UO.PrivateGetTile(X, Y, -1, i, i) then return i end if next end if return 0; No Mining Tiles end sub Sub GET(item, cont, min, max) If UO.Count( item ) < min Then # UO.Print("Кончилось сырье в рукзаке") UO.FindType( item, '-1', cont ) if UO.FindCount() > 0 Then # UO.Print('Сырья в сундуке: ' + Str( UO.FindCount( item ) ) ) uo.moveitem('finditem', max, 'backpack') checklag() else # UO.Print( 'Полностью кончилось сырье' ) UO.CancelMenu() return endif Endif end sub Sub PUT(item, cont) while UO.Count( item ) > 0 UO.FindType( item, -1, -1 ) UO.MoveItem( 'finditem', 0, cont ) checklag() wend end sub Sub DeleteJournal(msg) While UO.InJournal(msg) UO.SetJournalLine(UO.InJournal(msg) - 1,'') wend endsub Sub MyTerminate() UO.Set('quiet','1') UO.CancelMenu() UO.IgnoreReset() UO.Set('quiet','0') UO.Exec('terminate all') end sub Sub checklag() DeleteJournal("ackpack") UO.Click("backpack") repeat wait(100) until UO.InJournal("ackpack") 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 ########################## sub Reconnector() var ReconnectTime, RFlag ReconnectTime = '0' RFlag = 1 Repeat While (UO.ObjAtLayer('Bpack') == '') If RFlag Then ReconnectTime = MakeTime() RFlag = 0 endif Wait(20000) # 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.TextOpen() uo.TextPrint('Disconnected & Reconnected @ '+ReconnectTime) RFlag = 1 ReconnectTime = '0' End If Until false 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 TerminateAll() uo.Exec('Terminate All') End Sub
Просто сейчас немного некогда разбирать твой скрипт. Попробуй сравнить с тем что я дал. Если проблема останется что позже либо я либо ктонибудь еще займется твоим скриптом.
|