Сверхточная ходилка (c) Beyonder

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Сверхточная ходилка (c) Beyonder

Post by Destruction »

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

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

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

Code: Select all

########################################## ХОДИЛКА 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 ##########################
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

LordTom wrote:Это Ветра ходилка :lol:
Дану, эту ходилку я писал вместе с Beyonder'ом, и ты думаешь я её не узнаю?! Я даже понял, как она действует :-)
Night Wolf
Posts: 26
Joined: 2005-01-12 13:33:49

Post by Night Wolf »

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

И как ее приделать к скрипту Асканелли на форенсик?
Night Wolf
Posts: 26
Joined: 2005-01-12 13:33:49

Post by Night Wolf »

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 это расстояние на которое надо подойти. Желательно без установки дополних программы типа асм.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

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

Я думаю, сторожилы могут тебе рассказать, что бывает, если меня чутка повыводить на тему авторства.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Мож кто подскажет мне чайнику, для чего эта хадилка вообще нужна, че то не догоняю, хожу в уо я и руками не плохо :)
098
Posts: 125
Joined: 2006-02-01 20:19:03

Post by 098 »

для того случая когда руки пересохли
098
Posts: 125
Joined: 2006-02-01 20:19:03

Post by 098 »

я вот не врубаюсь- когда сия ходилка запустится - что произойдёт ?
нужно чтото указывать? и куда?
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

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

2Остальные, ходилка - неотъемлемая часть скрипта, в котором надо ходить, например на LumberJacking, т.к. хождение, обход препятствий и прочая нечисть это очень сложно - данное действо выделяется в отдельную функцию.
admir
Posts: 528
Joined: 2005-01-13 07:20:54

Post by admir »

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

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

Code: Select all

########################################## ХОДИЛКА 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 ##########################
admir
Posts: 528
Joined: 2005-01-13 07:20:54

Post by admir »

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

Я думаю, сторожилы могут тебе рассказать, что бывает, если меня чутка повыводить на тему авторства.
старожилы могут рассказать много , да вот стоит ли уделять внимание такому как ты...
люди сами все видят , кто есть кто ...
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Destruction wrote:2LordTom, не надо никуда уходить, просто спорь со мной поменьше - я редко ошибаюсь, но бывает.
Точнее: ты не редко ошибаешься, а ты редко признаешь, что ошибся... :lol:
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

хммм... а где впечатления? :roll:
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Edred wrote:
Destruction wrote:2LordTom, не надо никуда уходить, просто спорь со мной поменьше - я редко ошибаюсь, но бывает.
Точнее: ты не редко ошибаешься, а ты редко признаешь, что ошибся... :lol:
Нет, я редко ошибаюсь и еще реже признаю, что ошибся :wink:

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

ЗЫ: Афигенная вещь, главное не заставлять делать башие обходы, если нужна точность - надо воткнуть checklag()
Beyonder
Expert!
Posts: 388
Joined: 2005-04-23 10:19:43
Contact:

Post by Beyonder »

Очень большая просьба ко всем кто ходилку когда-то юзал.
Если у вас осталась последняя версия скрипта до отката форума, былобы офигенно ее сюда выложить. Потому что вместе с форумным откатом у меня полетел хард, и самой хорошей ходилки след простыл.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

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

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

PS: Которая из них ближе к последней? А то тут две версии крутяться.
ghost_hnt
Posts: 156
Joined: 2006-02-03 19:32:33

Post by ghost_hnt »

ходилка)))
кулл
т.е включил ее и нажимаешь кнопочки, на которых забиндена магия))
а если чар застрянет или на его пути куст или дерево или еще что-нить? :)
ЦСКА- чЕмПиОн, кто не верит, тот ...... (нехороший человек)
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

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

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

Что касается того, что выложили чуть выше - тама ашибка.

Code: Select all

 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
Откуда +1 то взяли?

Brodillka last:

Code: Select all

##################################################### 
# 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
SLAK
Posts: 182
Joined: 2005-08-19 16:12:23
Contact:

Post by SLAK »

Destruction wrote:
Что касается того, что выложили чуть выше - тама ашибка.

Code: Select all

 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
Откуда +1 то взяли?
от верблюда, там степ 2:

Code: Select all

  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
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

SLAK wrote:
Destruction wrote:
Что касается того, что выложили чуть выше - тама ашибка.

Code: Select all

 if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
Откуда +1 то взяли?
от верблюда, там степ 2:

Code: Select all

  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 и Types[i+1], а это в корне неверно или я неверно понимаю команду privategettile.
Post Reply