Lumberjacking |
Lumberjacking |
Сообщений: 139 Рег. 26.09.2011 |
11 ноября 2017 07:58
Сообщение #1
|
Поделитесь пожалуйста скриптом на ламбер, что бы ходил сам и если дерево увидит, рубил. был у меня такой раньше, всё потеряно.. |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
11 ноября 2017 08:05
Сообщение #2
|
Кажется нашел что искал в этой ветке, через поиск, спасибо ;) |
|
|
|
Сообщений: 48 Рег. 5.11.2017 |
11 ноября 2017 09:08
Сообщение #3
|
Выложи! |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
11 ноября 2017 10:52
Сообщение #4
|
Слишком длинный, не пропускает для встаавки. Вот ссылка на тему - http://bestuo.ru./index.php?do=forum&showtopic=10300 Исправляешь скрипт из первого сообщения, правками из второго, ищешь ссылку в теме на скрипт ходилку - добавляеш его к основному скрипту, жмешь на кнопку запуска скрипта и поехали.. |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
12 ноября 2017 04:31
Сообщение #5
|
Sub searchTree() var i, x, y, t, stp, max_search = 24; ìàêñèìàëüíàÿ äèñòàíöèÿ äëÿ ãåíåðàöèè êîîðäèíàò. var cx = uo.getX() var cy = uo.getY() for i = 1 to max_search for x =-i to i stp = 1 if not i == abs( x ) then stp = abs( i ) * 2 endif for y = -i to i step stp if NOT uo.getGlobal( 't:' + str( x + cx ) + "," + str( y + cy ) ) == "empty" then t = IsTreeTile( x + cx, y + cy ) if not t == false then uo.setGlobal( "tree_x", str( x + cx ) ) uo.setGlobal( "tree_y", str( y + cy ) ) uo.setGlobal( "tree_t", str( t ) ) return false else uo.setGlobal( 't:' + str( x + cx ) + "," + str( y + cy ), 'empty' ) endif endif next next next uo.print( "Çäåñü ïîëåçíàÿ äðåâåñèíà êîí÷èëàñü.|Ñëèøêîì äàëåêî." ) uo.exec( "terminate autoLumber" ) return false endsub sub autoLumber() searchTree() doMineTree() ttt() endsub Sub doMineTree() var x, y, t var end = "appears immune|nothing here|reach this|You can|far away|no line|here to chop|elsewhere|?????????!" var try = "You put|fail|You hack|You decide|You must|is attacking" repeat x = val( uo.getGlobal( "tree_x" ) ) y = val( uo.getGlobal( "tree_y" ) ) t = val( uo.getGlobal( "tree_t" ) ) uo.setGlobal( 't:' + str( x ) + "," + str( y ), "empty" ) Walker( x, y, 1 ) uo.exec( "exec searchTree" ) repeat if uo.waiting() then uo.canceltarget() endif deljournal( try + "|" + end ) uo.waittargettile( str( t ), str( x ), str( y ), str( uo.getZ() ) ) uo.usetype( 0x0F43 ) repeat wait( 100 ) until uo.injournal( try + "|" + end ) until uo.injournal( end ) while uo.getGlobal( "tree_x" ) == str( x ) && uo.getGlobal( "tree_y" ) == str( y ) wait( 100 ) wend until false endsub Sub deljournal( msg ) while uo.injournal( msg ) uo.setjournalline( uo.injournal( msg ) -1, '' ) wend endsub Sub IsTreeTile( x, y ) var i, tree_count = 20 DIM tree[ val( str( tree_count ) ) ] tree[0] = 3274 tree[1] = 3275 tree[2] = 3276 tree[3] = 3277 tree[4] = 3280 tree[5] = 3283 tree[6] = 3286 tree[7] = 3289 tree[8] = 3291 tree[9] = 3292 tree[10] = 3294 tree[11] = 3295 tree[12] = 3296 tree[13] = 3299 tree[14] = 3302 tree[15] = 3394 tree[16] = 3395 tree[17] = 3417 tree[18] = 3440 tree[19] = 3461 for i = 0 to tree_count -1 if uo.privategettile( x, y, -1, tree[i], tree[i] ) then return tree[i] endif next return false endsub |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
12 ноября 2017 04:31
Сообщение #6
|
########################################## ??????? 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=15#??????? ????? ? ??? ??????? ?? ????????? ????? ?????? ?????????? ??????? (?????? ???). var Speed=2 var StepTimeOut=500#??????? ????. ????????????? ?? ? ?????? ?????, ? ? ?????? ???? + ?????? ?????. # ??? ?????? - 500+Ping # ??? ????/?????? ?? ?????? - 300+Ping # ??? ?? ?????? - 150 + Ping var CheckCnt=1 #?????????? ?????? ????????. ??????????? ? ??????? ??? ???????. ???????????? ?????? ?? ??????? ?? ???????????? ????????. ??? ??????? ????? ????? ????. var DynamicPause=30 #??????????? ????? ? ??????. ??? ?????? ????? - ??? ?????? ?????? ? ??? ?????? ???????? ??????????. sub ttt() walker(2886-5,757+4,1) end sub Sub Walker(GoX,GoY,Prec) UO.SetGlobal("Logging","0") UO.SetGlobal("BlindWalk","0") 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) OR (GoDir==7) then return -1 else return 1 end if else if (GoDir==1) or (GoDir==5) 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 LogInfo('Start cross check') var ua1=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3) var ub1=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) var ua2=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3) var ub2=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) #Check for parallel lines if (ub1 == 0) or (ub2 == 0) then return false end if var u1=ua1/ub1 var u2=ua2/ub2 if IsDiap(u1,0,1,0.01) and IsDiap(u2,0,1,0.01) then LogInfo('Vectors crossing 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 else LogInfo('End cross check') return false 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 ########################## |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
12 ноября 2017 04:32
Сообщение #7
|
Всё в один файл поместил и заработало. |
|
|
|
Сообщений: 48 Рег. 5.11.2017 |
12 ноября 2017 12:08
Сообщение #8
|
# ???? ???????? ? ??????? Ну и кодировочка! |
|
|
|
Сообщений: 78 Рег. 4.10.2017 |
13 ноября 2017 03:00
Сообщение #9
|
был же на форуме простой ламбер , с бродилкой .. |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
13 ноября 2017 07:31
Сообщение #10
|
Нашел только этот вариант, если есть лучше, имеет смысл выложить в эту тему |
|
|
|
Сообщений: 48 Рег. 5.11.2017 |
23 ноября 2017 10:30
Сообщение #11
|
Калач, тебе что нужно то? |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
23 ноября 2017 15:15
Сообщение #12
|
Lussi, Ему ничего :) Просто Mystery Inside посетовал что нафиг вы ищите длинные когда есть прекрасные короткие. А Kalach написал что у него и с длинным нет проблем. Как то это чуть чуть двусмысленно звучит... Что бы не было проблем с кодировкой ("?????? X" вместо "координаты X") скрипты надо копировать с окна инжекта когда в системе включен английский язык. Это обязательное условие. Ну либо через тотал коммандер или блокнот. |
|
|
|
Сообщений: 139 Рег. 26.09.2011 |
25 ноября 2017 05:16
Сообщение #13
|
Lussi, По моему тема очень исчерпывающая :) Mirage, выше, доходчиво отписал ;) |
|
|
|
25 ноября 2017 13:08
Сообщение #14
|
|
Надо испробовать. |
|
|
|
Сообщений: 71 Рег. 14.11.2017 |
24 декабря 2017 17:07
Сообщение #15
|
Я этот чудоскрпит помню еще с дрв это в 2003 году так то было. Помню поставишь на ночь мультов с утра миллионер. |
|
|
|
Сообщений: 164 Рег. 6.03.2016 |
24 декабря 2017 19:45
Сообщение #16
|
вот норм скрипт на ламбер #Lumbjacking с автопоиском деревий (c) Destruction, v1.0 var hatchet = "0x0F43" Sub searchTree() var i, x, y, t, stp, max_search = 24 ; максимальная дистанция для генерации координат. var cx = uo.getX() var cy = uo.getY() for i = 1 to max_search for x =-i to i stp = 1 if not i == abs( x ) then stp = abs( i ) * 2 endif for y = -i to i step stp if NOT uo.getGlobal( 't:' + str( x + cx ) + "," + str( y + cy ) ) == "empty" then t = IsTreeTile( x + cx, y + cy ) if not t == false then uo.setGlobal( "tree_x", str( x + cx ) ) uo.setGlobal( "tree_y", str( y + cy ) ) uo.setGlobal( "tree_t", str( t ) ) return false else uo.setGlobal( 't:' + str( x + cx ) + "," + str( y + cy ), 'empty' ) endif endif next next next uo.print( "Found no tree, exit." ) uo.exec( "terminate autoLumber" ) return false endsub sub autoLumber() searchTree() doMineTree() endsub Sub doMineTree() var x, y, t var end = "appears immune|nothing here|reach this" var try = "You put|fail" repeat x = val( uo.getGlobal( "tree_x" ) ) y = val( uo.getGlobal( "tree_y" ) ) t = val( uo.getGlobal( "tree_t" ) ) uo.setGlobal( 't:' + str( x ) + "," + str( y ), "empty" ) Walker( x, y, 1 ) uo.exec( "exec searchTree" ) repeat if uo.waiting() then uo.canceltarget() endif deljournal( try + "|" + end ) uo.waittargettile( str( t ), str( x ), str( y ), str( uo.getZ() ) ) uo.usetype( hatchet ) repeat wait( 100 ) until uo.injournal( try + "|" + end ) until uo.injournal( end ) while uo.getGlobal( "tree_x" ) == str( x ) && uo.getGlobal( "tree_y" ) == str( y ) wait( 100 ) wend until false endsub Sub deljournal( msg ) while uo.injournal( msg ) uo.setjournalline( uo.injournal( msg ) -1, '' ) wend endsub Sub IsTreeTile( x, y ) var i, tree_count = 20 DIM tree[ val( str( tree_count ) ) ] tree[0] = 3274 tree[1] = 3275 tree[2] = 3276 tree[3] = 3277 tree[4] = 3280 tree[5] = 3283 tree[6] = 3286 tree[7] = 3289 tree[8] = 3291 tree[9] = 3292 tree[10] = 3294 tree[11] = 3295 tree[12] = 3296 tree[13] = 3299 tree[14] = 3302 tree[15] = 3394 tree[16] = 3395 tree[17] = 3417 tree[18] = 3440 tree[19] = 3461 for i = 0 to tree_count -1 if uo.privategettile( x, y, -1, tree[i], tree[i] ) then return tree[i] endif next return false endsub ########################################## ХОДИЛКА 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=15#Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет). var Speed=2 var StepTimeOut=500#Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга. # Для ходьбы - 500+Ping # Для бега/ходьбы на лошади - 300+Ping # Бег на лошади - 150 + Ping var CheckCnt=1 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС. var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора. sub ttt() walker(2886-5,757+4,1) end sub Sub Walker(GoX,GoY,Prec) UO.SetGlobal("Logging","0") UO.SetGlobal("BlindWalk","0") 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) OR (GoDir==7) then return -1 else return 1 end if else if (GoDir==1) or (GoDir==5) 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 LogInfo('Start cross check') var ua1=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3) var ub1=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) var ua2=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3) var ub2=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) #Check for parallel lines if (ub1 == 0) or (ub2 == 0) then return false end if var u1=ua1/ub1 var u2=ua2/ub2 if IsDiap(u1,0,1,0.01) and IsDiap(u2,0,1,0.01) then LogInfo('Vectors crossing 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 else LogInfo('End cross check') return false 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 ########################## |
|
|
|
Сейчас: 22 ноября 2024 20:43 |