Yoko
http://forum.yoko.com.ua/

Сверхточная ходилка (c) Beyonder
http://forum.yoko.com.ua/viewtopic.php?f=20&t=6742
Page 1 of 8

Author:  Destruction [ 2006-03-01 05:42:01 ]
Post subject:  Сверхточная ходилка (c) Beyonder

Имеется старая версия ходилки - юзает ASM... Как-то пусто без walker'ов, отпощу пока, что есть.

Автор скрипта - Beyonder.

Последняя версия (актуально на 7 мая 2010).

Code:
########################################## ХОДИЛКА 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 ##########################

Author:  Destruction [ 2006-03-01 19:04:01 ]
Post subject: 

LordTom wrote:
Это Ветра ходилка :lol:

Дану, эту ходилку я писал вместе с Beyonder'ом, и ты думаешь я её не узнаю?! Я даже понял, как она действует :-)

Author:  Night Wolf [ 2006-03-01 21:38:17 ]
Post subject: 

Ошибка в 213 строке: Funktion not found - UO.ASMMAPGETTILE

И как ее приделать к скрипту Асканелли на форенсик?

Author:  Night Wolf [ 2006-03-01 22:53:13 ]
Post subject: 

LordTom wrote:
Night Wolf wrote:
Ошибка в 213 строке: Funktion not found - UO.ASMMAPGETTILE

И как ее приделать к скрипту Асканелли на форенсик?


2) Спроси у асканели или давай сюда скрипт.


http://forum.yoko.com.ua/viewtopic.php?p=31602#31602
Мне нужна любая ходилка вида GotoXY(X,Y,R), где R это расстояние на которое надо подойти. Желательно без установки дополних программы типа асм.

Author:  Destruction [ 2006-03-02 00:43:11 ]
Post subject: 

LordTom, сие ходилка (c) Beyonder & Destruction. И никакого не ветра, не надо мне тут гнать, а?

Я думаю, сторожилы могут тебе рассказать, что бывает, если меня чутка повыводить на тему авторства.

Author:  Sanch [ 2006-03-15 11:31:16 ]
Post subject: 

Мож кто подскажет мне чайнику, для чего эта хадилка вообще нужна, че то не догоняю, хожу в уо я и руками не плохо :)

Author:  098 [ 2006-03-15 11:37:39 ]
Post subject: 

для того случая когда руки пересохли

Author:  098 [ 2006-03-15 15:27:39 ]
Post subject: 

я вот не врубаюсь- когда сия ходилка запустится - что произойдёт ?
нужно чтото указывать? и куда?

Author:  Destruction [ 2006-03-15 19:54:04 ]
Post subject: 

2LordTom, не надо никуда уходить, просто спорь со мной поменьше - я редко ошибаюсь, но бывает.

2Остальные, ходилка - неотъемлемая часть скрипта, в котором надо ходить, например на LumberJacking, т.к. хождение, обход препятствий и прочая нечисть это очень сложно - данное действо выделяется в отдельную функцию.

Author:  admir [ 2006-03-15 20:25:48 ]
Post subject: 

ходилка без АСМа с privategettile()
добавил Prec в параметр запуска функции
#Walker(X,Y,Prec)

, ходилка отличная правда иногда по кругу зацикливает ..... поэтому настраивайте ...

Code:
########################################## ХОДИЛКА 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. Ничего не возвращает.
#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 Prec=0
var MaxTraceDistance=10
var Speed=2
var StepTimeOut=300

Sub Walker(GoX,GoY,Prec)
  UO.SetGlobal("Logging","0")
  UO.SetGlobal("BlindWalk","0")
  var LastDir
  UO.SetGlobal("GlobalGoX",str(GoX))
  UO.SetGlobal("GlobalGoY",str(GoY))
  while not IsEnd(GoX,GoY,Prec)
    LogInfo('Just walking')
    LastDir=GoUntilHit(GoX,GoY,Prec)
    if not IsEnd(GoX,GoY,Prec) then
      LogInfo('Tracing')
      FullAroundTrace(LastDir,GoX,GoY,Prec)
    end if
  wend
end sub

Sub FullAroundTrace(StartDir,GoX,GoY,Prec)
  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
    endif
    if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
      return
    end if
    MovesDone=MovesDone+1
    CurDir=AddToDir(CurDir,-Direction,Prec)
  until MovesDone>MaxTraceDistance
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
  GoDir(Dir,Prec)
  repeat
    EndDir=GetDirToDir(UO.GetDir(),Prec)
    wait(100)
    Counter=Counter+1
  until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=8
  if Counter>=8 then
  return 0
  end if
  if StartY<>UO.GetY() or StartX<>UO.GetX() then
  return Dir
  else
  GoDir(Dir,Prec)
    repeat
      wait(100)
      Counter=Counter+1
    until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/100
    if Counter>=StepTimeOut/100 then
      LogInfo('Step timeout reached')
      return 0
    else
      return Dir
    end if
  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 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 ##########################

Author:  admir [ 2006-03-15 20:34:13 ]
Post subject: 

Destruction wrote:
LordTom, сие ходилка (c) Beyonder & Destruction. И никакого не ветра, не надо мне тут гнать, а?

Я думаю, сторожилы могут тебе рассказать, что бывает, если меня чутка повыводить на тему авторства.

старожилы могут рассказать много , да вот стоит ли уделять внимание такому как ты...
люди сами все видят , кто есть кто ...

Author:  Edred [ 2006-03-16 23:08:25 ]
Post subject: 

Destruction wrote:
2LordTom, не надо никуда уходить, просто спорь со мной поменьше - я редко ошибаюсь, но бывает.


Точнее: ты не редко ошибаешься, а ты редко признаешь, что ошибся... :lol:

Author:  Sfagnum [ 2006-03-17 21:07:58 ]
Post subject: 

хммм... а где впечатления? :roll:

Author:  Destruction [ 2006-03-17 21:33:22 ]
Post subject: 

Edred wrote:
Destruction wrote:
2LordTom, не надо никуда уходить, просто спорь со мной поменьше - я редко ошибаюсь, но бывает.


Точнее: ты не редко ошибаешься, а ты редко признаешь, что ошибся... :lol:

Нет, я редко ошибаюсь и еще реже признаю, что ошибся :wink:

Слушай, я тебе знаешь, что скажу, вооон в топ топике "Наследство Edred'а" автор все скрипты понатырил. Как ощущения? Вот у меня примерно такие же, т.к. Beyonder скрипт не один писал - я был морально с ним, команды подсказывал, помогал воплощать алгоритмы, искал баги.

ЗЫ: Афигенная вещь, главное не заставлять делать башие обходы, если нужна точность - надо воткнуть checklag()

Author:  Beyonder [ 2006-04-06 08:37:05 ]
Post subject: 

Очень большая просьба ко всем кто ходилку когда-то юзал.
Если у вас осталась последняя версия скрипта до отката форума, былобы офигенно ее сюда выложить. Потому что вместе с форумным откатом у меня полетел хард, и самой хорошей ходилки след простыл.

Author:  Destruction [ 2006-04-06 14:08:51 ]
Post subject: 

Beyonder wrote:
Очень большая просьба ко всем кто ходилку когда-то юзал.
Если у вас осталась последняя версия скрипта до отката форума, былобы офигенно ее сюда выложить. Потому что вместе с форумным откатом у меня полетел хард, и самой хорошей ходилки след простыл.
А-а-а, так форум у тебя стоял? :lol:

Ладно, будет время - переделаю на get|setEasyUO вместо глобалок (Beyonder - ты тестил, ты заметил, что с ними появились краши), да и вообще, всё, что смогу сделаю с ней.

PS: Которая из них ближе к последней? А то тут две версии крутяться.

Author:  ghost_hnt [ 2006-04-06 19:00:34 ]
Post subject: 

ходилка)))
кулл
т.е включил ее и нажимаешь кнопочки, на которых забиндена магия))
а если чар застрянет или на его пути куст или дерево или еще что-нить? :)

Author:  Destruction [ 2006-04-16 21:14:19 ]
Post subject: 

Чутка подправил то, что было у меня.

Переделал на (set|get)EasyUO и privategettile.

Что касается того, что выложили чуть выше - тама ашибка.
Code:
 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then


Откуда +1 то взяли?

Brodillka last:
Code:
##################################################### 
# WW  W  WW   AA    LL     Kk  k  EE  EE  RRR       #
# WW  W  WW  AA A   LL     Kk k   EEE     R  R      #
# WW WW  WW  AAAA   LL     KkK    EEE     RRR       #
#  WWW WWW  AA   A   LLLL  Kk kk  EE  EE  R  R      #
#####################################################
             
var Prec=0 # Как близко подойти?
var MaxTraceDistance=20 # Как далеко трессировать?
var Speed=2 # Скорость
var StepTimeOut=300 # Таймаут на шаг
uo.setEasyUO(3750,"1") # Вести лог?
uo.setEasyUO(3751,"0") # Ходить наощупь?

Sub Walker(GoX,GoY)
  var LastDir
  UO.setEasyUO(3752,str(GoX))
  UO.setEasyUO(3753,str(GoY))
  while not IsEnd(GoX,GoY)
    LogInfo('Just walking')
    LastDir=GoUntilHit(GoX,GoY)
    if not IsEnd(GoX,GoY) then
      LogInfo('Tracing')
      FullAroundTrace(LastDir,GoX,GoY)
    end if
  wend
end sub

Sub FullAroundTrace(StartDir,GoX,GoY)
  var LineX=UO.GetX()
  var LineY=UO.GetY()
  var CurDir=StartDir
  var Direction=CountDirection(GoX,GoY,CurDir)
  var StartX,StartY
  var MovesDone=0
  repeat
    StartX=UO.GetX()
    StartY=UO.GetY()
    CurDir=Tracer(CurDir,Direction)
    if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir()),LineX,LineY,GoX,GoY,StartX,StartY) then
      return
    end if
    MovesDone=MovesDone+1
    CurDir=AddToDir(CurDir,-Direction)
  until MovesDone>MaxTraceDistance
end sub

Sub CountDirection(GoX,GoY,StartDir)
  var GoDir=GetDir(GoX,GoY)
  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)
  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)
end sub

Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4)
  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)
  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)
  var LastDir
  LastDir=GetDir(GoX,GoY)
  var CouldMove
  repeat
    LastDir=GetDir(GoX,GoY)
    if LastDir<>0 and not IsEnd(GoX,GoY) then
      CouldMove=TryDir(LastDir)
    end if
  until LastDir==0 or IsEnd(GoX,GoY) or not CouldMove
  return LastDir
end sub

Sub IsEnd(GoX,GoY)
  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)
  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)
  var CurDir=StartDir
  var Result
  repeat
    Result=TryDir(CurDir)
    if not Result then
      CurDir=AddToDir(CurDir,Direction)
    end if
  until Result
  return Result
end sub

Sub AddToDir(Dir,Cnt)
  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)
  var BegX=UO.GetX() # Начальное Х
  var BegY=UO.GetY() # Начальное 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)
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)
  var StartDir=GetDirToDir(UO.GetDir())
  var StartX=UO.GetX()
  var StartY=UO.GetY()
  var EndDir
  var Counter=0
  GoDir(Dir)
  repeat
    EndDir=GetDirToDir(UO.GetDir())
    wait(100)
    Counter=Counter+1
  until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=8
  if Counter>=8 then
     return 0
  end if
  if StartY<>UO.GetY() or StartX<>UO.GetX() then
     return Dir
  else
     GoDir(Dir)
    repeat
      wait(100)
      Counter=Counter+1
    until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/100
    if Counter>=StepTimeOut/100 then
      LogInfo('Step timeout reached')
      return 0
    else
      return Dir
    end if
  end if
end sub

Sub GetDirToDir(GotDir)
var ChangedDir=-GotDir
ChangedDir=AddToDir(ChangedDir,5)
return ChangedDir
end sub

Sub DirToInj(Dir)
var OutDir
if Dir==1 then
OutDir=1
end if
if Dir==2 then
OutDir=2
end if
if Dir==3 then
OutDir=3
end if
if Dir==4 then
OutDir=6
end if
if Dir==5 then
OutDir=9
end if
if Dir==6 then
OutDir=8
end if
if Dir==7 then
OutDir=7
end if
if Dir==8 then
OutDir=4
end if
return OutDir
end sub

Sub GoDir(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

var DistanceX=Abs(UO.GetX()-val(UO.getEasyUO(3752)))
var DistanceY=Abs(UO.GetY()-val(UO.getEasyUO(3753)))
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(pX, pY)
  if UO.getEasyUO(3751) then
    return true
  endif
  var plen = 60
  dim Types[val(str(plen))]
  Types[0]=4
  Types[1]=3
  Types[2]=5
  Types[3]=6
  Types[4]=203
  Types[5]=197
  Types[6]=212
  Types[7]=242
  Types[8]=241
  Types[9]=196
  Types[10]=198
  Types[11]=199
  Types[12]=1713
  Types[13]=1724
  Types[14]=243
  Types[15]=240
  Types[16]=219
  Types[17]=209
  Types[18]=214
  Types[19]=57
  Types[20]=24
  Types[21]=52
  Types[22]=22
  Types[23]=56
  Types[24]=23
  Types[25]=25
  Types[26]=58
  Types[27]=53
  Types[28]=61
  Types[29]=59
  Types[30]=580
  Types[31]=585
  Types[32]=581
  Types[33]=582
  Types[34]=583
  Types[35]=584
  Types[36]=596
  Types[37]=152
  Types[38]=81
  Types[39]=93
  Types[40]=95
  Types[41]=83
  Types[42]=142
  Types[43]=503
  Types[44]=141
  Types[45]=143
  Types[46]=500
  Types[47]=1088
  Types[48]=1089
  Types[49]=1086
  Types[50]=155
  Types[51]=501
  Types[52]=98
  Types[53]=90
  Types[54]=502
  Types[55]=1087
  Types[56]=598
  Types[57]=582
  Types[58]=200
  Types[59]=216
 
  for var i=0 to plen-1
    if uo.privategettile(pX, pY, -1, Types[i], Types[i]) then
      return true
    end if
  next
  return false
end sub

Sub LogInfo(Line)
  if not UO.getEasyUO(3750)=="0" then
    UO.TextOpen()
    UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+str(Line));
  end if
end sub

Sub Abs(X)
  if X>0 then
    return X
  else
    return (-X)
  end if
end sub

Author:  SLAK [ 2006-04-16 22:32:36 ]
Post subject: 

Destruction wrote:

Что касается того, что выложили чуть выше - тама ашибка.
Code:
 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then


Откуда +1 то взяли?


от верблюда, там степ 2:
Code:
  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

Author:  Destruction [ 2006-04-17 02:22:23 ]
Post subject: 

SLAK wrote:
Destruction wrote:

Что касается того, что выложили чуть выше - тама ашибка.
Code:
 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then


Откуда +1 то взяли?


от верблюда, там степ 2:
Code:
  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

Ну дык получается, что PrivateGetTile оперирует между диапазоном Types[i] и Types[i+1], а это в корне неверно или я неверно понимаю команду privategettile.

Page 1 of 8 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/