Yoko

All sides of Injection
It is currently 2024-04-20 05:33:33

All times are UTC+02:00




Post new topic  Reply to topic  [ 142 posts ]  Go to page Previous 14 5 6 7 8 Next
Author Message
PostPosted: 2013-06-17 03:05:31 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Поюзал это приватгеттайл, могу сказать однозначно что значения он видит два, например мост, и воду под ним. У моста диапазон 1993-2000. У воды 6038-6066. Мы указываем в скрипте что все тайлы которые ниже 2540 считаются проходимыми а все что выше, вплоть до 13571 считаются не проходимыми. Становимся на мост, запускаем скрипт
Code:
sub Test()
  var x = uo.getx(), y = uo.gety() + 1
  if UO.PrivateGetTile(X, Y,  -1, 2540, 13571) then
    uo.print("Прохода нет!")
  else
    uo.print("Проход открыт!")
  end if
end sub

Тайлы моста 1993-2000, соответственно скрипт должен ответить что проход открыт. Но нет :P Чтобы скрипт сработал нужно дополнительно указать тайлы моста
Code:
sub Test()
  var x = uo.getx(), y = uo.gety() + 1
  if UO.PrivateGetTile(X, Y,  -1, 2540, 13571) and not UO.PrivateGetTile(X, Y,  -1, 1993, 2000) then
    uo.print("Прохода нет!")
  else
    uo.print("Проход открыт!")
  end if
end sub

В таком случае скрипт срабатывает правильно, но я обнаружил чт она некоторых тайлах моста скрипт не работает, хотя номера тайлов моста те же, возможно там появляется еще какое-то третъе значение :shock: Предположительно он выдает нам значение нижнего тайла(например земли) но он так же получает значение верхнего тайла на той же точке(например дерева), возможно в некоторых местах есть не два а три тайла слоями и он выдает значение самого нижнего. Хотя с другой стороны у деревьев такого нет, там все срабатывает как надо, а на мосту и некоторых других точках такие непонятные заморочки.

Так же у меня сложилось впечатление что если тайла три то он показывает не три а два, так как на мосту там где он считает что нет прохода выходит он не видит что есть указанные тайлы моста 1993-2000. В общем разобрать с работой этого приватгеттайла нужно и тогда доделаем проверку тайлов до конца. И более четкие значения проходимых/непроходимых тайлов не помешали бы.

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 05:38:00 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Проверку 3-х тайлов убрал, очень большие петли нарезает. Как точно работает обход я не знаю, но с этим играться нужно когда будут полностью собраны тайлы для проверки, так как много всяких кустов принимаются за препятствие. Пока пользую с выключенной проверкой тайлов.

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 06:52:07 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Долго крутил в голове что что то мне не ясно в твоих набросках.
Существуют 2 вида тайлов. Тайлы земли (трава, песок, береговые откосы, входы в пещеры, вода не рыболовная) и тайлы статики (стулья, деревья, мосты, вода рыболовная). В оригинале скрипта используются тайлы земли. У тебя зачем то вылезли тайлы статики.
А не понятно почему Beyonder использовал такой набор тайлов карты. Зачем ты лепишь какие то проходимости и не проходимости из тайлов статики...
Сейчас скажу страшную и лютую вещь для тебя.
На самом деле если использовать утилиту InsideUO то видно что проходимых тайлов значительно больше чем написал автор скрипта. А НЕ проходимых значительно меньше чем ты пытаешься дописать.
Для примера твой диапазон 500-600. В нем находится магма и звездный пол (чар по умолчанию по нему не может ходить).

ЗЫ как ты вообще тайлы то берешь? Наугад что ли? Или ты реально бродишь по миру - "О не прохожу! Что за тайл?" :|

ЗЫЗЫ Пригляделся, понял что ты делаешь от противного. В IsPass(X, Y) - указываешь тайлы в которых нельзя ходить (у автора - проходимые тайлы). ОК. А как тогда вода в тайлах земли "310" и откуда у тебя вылезло проходимость "610" которое как бы cave wall?
И вот это тоже чума:
if UO.PrivateGetTile(X, Y, -1, 2540, 13571) or not UO.PrivateGetTile(X, Y, -1, 601, 13571)
можно посчитать что это тоже самое что и
if not UO.PrivateGetTile(X, Y, -1, 601, 2539) в твоем случае от противного.
В общем какой то капец, сумбур и как обычно никакого планирования.

ЗЫЗЫЗЫ
Идея использовать такую конструкцию:
Code:
sub IsPass(X, Y)
  if UO.GetGlobal("BlindWalk") == "1" then
    return true
  end if
  if UO.PrivateGetTile(X, Y,  -1, 2540, 13571) or (UO.PrivateGetTile(X, Y,  -1, 500,600) and not UO.PrivateGetTile(X, Y,  -1, 0, 499) and not UO.PrivateGetTile(X, Y,  -1, 601, 13571)) then
    return false
  else
    return true
  end if
end sub
хорошая. Только применение не правильное. Все таки лучше перечислить проходимые тайлы - их меньше но они идут подряд - так что диапазоном брать удобнее и красивше чем списком.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2013-06-17 07:23:55 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Ты не понял ничего. Я же обьяснил, на мосту стоишь, тайлы моста указаны, он идет себе идет, потом вдруг начинает на ровном месте обходить. проверяешь приватгеттайлом пишет нет там нет тайлов из диапазона моста, хотя они есть. Вот для этого стоишь и ищешь номер второго тайла чтобы узнать что за херня. И врдруг оказывается что он там не видит тайл моста а видит тайл воды. Что делать? ХЗ, в некоторых местах помогло то что я тебе уже показывал. В некоторых еще не разобрался. А ходилка бейондера не определяла тайлы вообще, стоишь перед деревом проверяешь диапазон деревьев - пишет нет такого, тоно так же как и на мосту. Вот такие качели. Я не ищу специально, я вбил диапазон он должен работать, но оказалось что приватгеттайл работает не так как нужно. Похоже те кто писал ходилку этого не знали вообще.

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 07:50:47 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Обьясню просто и понятно.

1. Берем старую ходилку со списком проходимых тайлов.
2. Подходим к дереву и тыкаем проверку приватгеттайлом.
3. Ответ - проход открыт, хотя деревьев в списке проходимых тайлов нет :?
4. Почему так вышло я выше пытался обьяснить. На одной точке может быть 2(или больше...?) номеров тайлов, и приватгеттайл видит их оба, и если номер второго тайла совпадет со списком проходимых(земля проходимый тайл, сверху на земле стоит пенек) то скрипт выдаст нам что место проходимо. Именно так и есть в ходилке бейондера. Ведь мы просим его искать тайл с номером к примеру 3(есть в списке проходимых), и он нам его находит, и прямо на этом тайле стоит наше дерево но найти дерево мы его не просили. И так же бывает момент когда он не находит тайл на земле из диапазона, хотя такой тайл находится прямо под тобой что показывает infotile.

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 11:13:11 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Как тогда ты себе представляешь организацию поиска по Z координате если ПоД землей (проходимые тайлы) будет вода (не проходимые тайлы)?
Надо сверять координату Z чара и тайла куда он хочет наступить. Хотя тоже бывают исключения - в некоторых местах карта скачет более чем на 10 высоту.
Предмет так же может находится высоко в воздухе - дерево или предмет мебели. И потенциально не будет мешать проходу чара, но он его найдет и не будет обходить.
В общем надо полностью поиск переделывать. Проще использовать патфиндер в изе или стелсе. Им можно ткнуть тайлов на 20 в сторону и чар сам дойдет по кротчайшему пути.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2013-06-17 16:57:17 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Quote:
Как тогда ты себе представляешь организацию поиска по Z координате если ПоД землей (проходимые тайлы) будет вода (не проходимые тайлы)?

И это я тоже обьяснил, если он видит тайл воды, и при этом в той же точке он не видит тайлов моста значит это просто вода и прохода нет, что показано в примере
Code:
sub Test()
  var x = uo.getx(), y = uo.gety() + 1
  if UO.PrivateGetTile(X, Y,  -1, 2540, 13571) and not UO.PrivateGetTile(X, Y,  -1, 1993, 2000) then
    uo.print("Прохода нет!")
  else
    uo.print("Проход открыт!")
  end if
end sub

И так он работает, но есть тайлы где он просто не видит тайлы моста либо там не тайлы воды.

Стелс не вариант, во всяком случае текущая версия, да и учить это все по-новой нет желания. Изиуо... что это? Где почитать, скачать, в чем отличия от инжекта?

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 17:16:29 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Посмотрел изи уо, еще печальнее чем стелс. Буду пользовать то что есть, инжект не пилят уже давно, так и скриптеров не осталось заядлых, все только копипастят одно и то же.

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-17 17:50:48 
Offline

Joined: 2011-06-11 19:54:23
Posts: 820
Incorrect User wrote:
Стелс не вариант, во всяком случае текущая версия, да и учить это все по-новой нет желания.
Если знаешь инжект довольно хорошо, то перейти на стелс - пол дня посидеть на форуме стелса и ты знаешь стелс достаточно хорошо, чтоб написать то, что ты задумал (весь скрипт целиком) а ходилка там встроенная, вызывается одной функцией: http://stealth.od.ua/Doc:RU/Api/NewMoveXY


Top
   
PostPosted: 2013-06-17 18:40:52 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Но я так понял, как работает приватгеттайл так и не поняли целиком.

1. Он может найти два вида тайлов Static и Maptile, различий между ними он не понимает.

2. Он может не видеть тайл статики а видеть только маптайл.

3. Если есть два тайла разного диапазона не обязательно что он среагирует на нужный, например тайл воды 6*** тайл моста 2000, мы пишетм в скрипте что если в заданных координатах есть тайл выше 3000 то это не проходимое место. Так как у нас в этом месте есть тайл выше 3000, тайл воды, то скрипт скажет нам что место не проходимо. При этом может быть, что мы будем искать тайл моста, указав диапазон его номеров, и он не будет находить тайлы данного типа, с чем это связано мне пока не известно.

4. Из всего вышеперечисленого выходит что нужно проверять место на наличие маптайл, и приэтом проверять на этом же тайле наличие статики, тогда мы будем получать положительный результат, так как тайла на одной клетке может быть два а мы всегда ищем только один, например диапазоном выше и он нам его найдет. Вот для этого и нужно проверять нет ли на этом тайле еще одного с диапазоном ниже, чтобы убедиться что на этом месте только один тайл и что он нашел именно нужный нам а не второй.

Сложно обьяснить в общем мне :) Коряво все, но имеем что имеем, еще попробую понять почему не видит тайлы моста, это вообще мистика :shock:

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-18 20:19:38 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Текущий вариант ходилки, работает только с скриптовым модулем от сюда viewtopic.php?f=12&t=16689 Для использования отключайте проверку тайлов, так как будет сильно петлять, здесь странно работает обход.
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; var Prec=3 # Как близко следует подойти к цели (Precision)
; В функции 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 шаг обхода).
var MaxTraceDistance = 1 ; Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
var TraceLoopIncrease = 1 ; Увеличение MaxTraceDistance при исчерпании количества ходов.
var LimitTrace = 10 ; Сколько шагов в обе стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed = 3 ; Сколько шагов делать за раз между проверками.
var DynamicPause = 70 ; Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
var steptimer = 2 ; Таймер на шаг(Значение 1 = 100мс). Время за которое чар проходит 1 тайл, если за это время чар не сдвинется с места скрипт расценит это как препятствие и начнет обходить.

sub Walker(GoX, GoY, Prec)
  uo.setglobal("BlindWalk", "0") ; не использовать проверку тайлов, а использовать ходьбу наощупь. 0 - проверяем тайлы, 1 - не проверяем.
  var LastDir
  var MoveRes
  var TracerCnt
  uo.setglobal("GlobalGoX", str(GoX))
  uo.setglobal("GlobalGoY", str(GoY))
  while not IsEnd(GoX,GoY,Prec)
    TracerCnt = MaxTraceDistance
    repeat
      LastDir=GoUntilHit(GoX,GoY,Prec)
      if IsEnd(GoX,GoY,Prec) then
        return 1
      end if
      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
  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
    return true
  else
    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
    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 i, BegX=UO.GetX(), BegY=UO.GetY(), GoX=BegX, GoY=BegY, GoDistance, DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX"))), DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
  if (DistanceX - Prec) < Speed and (DistanceX - Prec) > (DistanceY - Prec) then
    GoDistance=DistanceX - Prec
  else
    if (DistanceY - Prec) < Speed and (DistanceY - Prec) > (DistanceX - Prec) then
      GoDistance=DistanceY - Prec
    else
      GoDistance=Speed
    end if
  end if
  GoX=XFromDir(Dir)
  GoY=YFromDir(Dir)
  uo.print(GoDistance)
  if GoDistance > 1 then
    for i = 1 to GoDistance
      if not IsPass(GoX, GoY) then
        return false
      end if
      if GoX > uo.getx() then
        GoX = GoX + 1
      end if
      if GoX < uo.getx() then
        GoX = GoX - 1
      end if
      if GoY > uo.gety() then
        GoY = GoY + 1
      end if
      if GoY < uo.gety() then
        GoY = GoY - 1
      end if
    next
  else
    if not IsPass(GoX, GoY) then
      return false
    end if
  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), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer
  #Start Primary test
  if GoDir(Dir, Prec) then
    return Dir
  else
    return 0
  end if
end sub

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

sub GoDir(Dir, Prec)
  var circle, StartDir=GetDirToDir(UO.GetDir(), Prec), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer
  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 and (DistanceX - Prec) > (DistanceY - Prec) then
    GoDistance=DistanceX - Prec
  else
    if (DistanceY - Prec) < Speed and (DistanceY - Prec) > (DistanceX - Prec) then
      GoDistance=DistanceY - Prec
    else
      GoDistance=Speed
    end if
  end if
  circle = 0
  repeat
    UO.Press(Dirs[Dir])
    timer = uo.timer() + steptimer
    repeat
      EndDir=GetDirToDir(UO.GetDir(), Prec)
      wait(DynamicPause)
    until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or timer <= uo.timer()
    if StartDir<>EndDir then
      GoDistance = GoDistance + 1
      StartDir = EndDir
    end if
    circle = circle + 1
  until circle == GoDistance or GoDistance == 0 or timer <= uo.timer()
  if timer <= uo.timer() then
    return false
  else
    return true
  end if
end sub

sub IsPass(x, y)
  var tileid, i, f, l
  if UO.GetGlobal("BlindWalk") == "1" then
    return true
  end if
  tileid = uo.getstatictiles(x, y, 0)
  if tileid == "" then
    tileid = uo.getlandscapetile(x, y, 0)
    if contains(uo.hex2int(UO.GetTileFlags(0, tileid)), 0x40) then
      return false
    end if
  end if
  dim tiles[50]
  l = Str2Tiles(tiles,tileid)
  if l > 0 then
    for i=0 to l-1
      f=UO.GetTileFlags(1,tiles[i])
      if contains(uo.hex2int(f),0x40) then
        return false
      end if
    next
  end if
  return true
end sub

Sub Str2Tiles(a,s)
   var i, l = len(s), b = "", ptr=0
   if not l then
      return 0
   endif
   for i=0 to l-1
      if s[i] <> "," then
         b=b+s[i]
      else
         a[ptr]=b
         b=""
         ptr=ptr+1
      endif
   next
   a[ptr]=b
   ptr=ptr+1
   return ptr
end sub

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

_________________
CodeSweeper


Last edited by Incorrect User on 2013-06-18 21:58:54, edited 1 time in total.

Top
   
PostPosted: 2013-06-18 20:59:12 
Offline

Joined: 2011-06-11 19:54:23
Posts: 820
Code:
sub IsPass(x, y)
  var tileid, i, f, l
  if UO.GetGlobal("BlindWalk") == "1" then
    return true
  end if
  tileid = uo.getstatictiles(x, y, 0)
  if tileid == "" then
    tileid = uo.getlandscapetile(x, y, 0)
    if contains(uo.hex2int(UO.GetTileFlags(0, tileid)), 0x40) then
      return false
    end if
  end if
  dim tiles[50]
  l = Str2Tiles(tiles,tileid)
  if l > 0 then
    for i=0 to l-1
      f=UO.GetTileFlags(1,tiles[i])
      if contains(uo.hex2int(f),0x40) then
        return false
      end if
    next
  end if
  return true
end sub

Только вот так, ато он у тебя зависнет на тайлах земли.


Top
   
PostPosted: 2013-06-18 21:09:45 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Ходил ей?

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-18 21:48:59 
Offline

Joined: 2011-06-11 19:54:23
Posts: 820
Нет, но это и так видно
Code:
  if l > 0 then
    for i=0 to l-1
      f=UO.GetTileFlags(1,tiles[i])
      if contains(uo.hex2int(f),0x40) then
        return false
      else #Не делай в цикле такие обрывы. Если текущий тайл проходимый - не значит, что остальные тоже проходимые.
        return true
      end if
    next
  end if


Top
   
PostPosted: 2013-06-18 21:58:19 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Точно, тайлов же больше одного, а я на старой волне 8)

_________________
CodeSweeper


Top
   
PostPosted: 2013-06-25 02:54:16 
Offline

Joined: 2011-05-23 00:33:30
Posts: 949
Окончательная версия ходилки, модуль проверки тайлов удален полностью так как он был изначально не рабочим. Ходилка работает стабильно. Чем больше значение MaxTraceDistance тем большую петлю будет нарезать при обходе, для себя поставил значение - 1. Работает с любым скриптовым модулем.
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; var Prec=3 # Как близко следует подойти к цели (Precision)
; В функции 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 шаг обхода).
var MaxTraceDistance = 1 ; Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
var TraceLoopIncrease = 1 ; Увеличение MaxTraceDistance при исчерпании количества ходов.
var LimitTrace = 10 ; Сколько шагов в обе стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed = 3 ; Сколько шагов делать за раз между проверками.
var DynamicPause = 30 ; Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
var steptimer = 2 ; Таймер на шаг(Значение 1 = 100мс). Время за которое чар проходит 1 тайл, если за это время чар не сдвинется с места скрипт расценит это как препятствие и начнет обходить.

sub Walker(GoX, GoY, Prec)
  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
      LastDir=GoUntilHit(GoX,GoY,Prec)
      if IsEnd(GoX,GoY,Prec) then
        return 1
      end if
      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
  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
    return true
  else
    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=TurnAndGoDir(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
    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=TurnAndGoDir(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 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), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer
  #Start Primary test
  if GoDir(Dir, Prec) then
    return Dir
  else
    return 0
  end if
end sub

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

sub GoDir(Dir, Prec)
  var circle, StartDir=GetDirToDir(UO.GetDir(), Prec), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer
  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 and (DistanceX - Prec) > (DistanceY - Prec) then
    GoDistance=DistanceX - Prec
  else
    if (DistanceY - Prec) < Speed and (DistanceY - Prec) > (DistanceX - Prec) then
      GoDistance=DistanceY - Prec
    else
      GoDistance=Speed
    end if
  end if
  circle = 0
  repeat
    UO.Press(Dirs[Dir])
    timer = uo.timer() + steptimer
    repeat
      EndDir=GetDirToDir(UO.GetDir(), Prec)
      wait(DynamicPause)
    until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or timer <= uo.timer()
    if StartDir<>EndDir then
      GoDistance = GoDistance + 1
      StartDir = EndDir
    end if
    circle = circle + 1
  until circle == GoDistance or GoDistance == 0 or timer <= uo.timer()
  if timer <= uo.timer() then
    return false
  else
    return true
  end if
end sub

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

_________________
CodeSweeper


Top
   
PostPosted: 2013-08-22 23:46:24 
Offline
User avatar

Joined: 2013-07-27 15:27:11
Posts: 14
Code:
  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

Почему написано, что в массиве 9 пунктов, хотя их всего 8?

_________________
Будь осторожен в своих суждениях о людях. Скорее всего, ты ошибаешься.


Top
   
PostPosted: 2013-08-23 15:08:04 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
9 точка 0,0 = "серая" 5

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2015-02-18 21:06:47 
Offline

Joined: 2012-07-27 23:43:14
Posts: 249
помогите по возможности пожалуйста! скрипт на топанье (не сложное). 2 тайла подойти на ровной поверхности (преграда: максимум стул)

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

Code:
if CheckStam==1 then
While UO.Stamina < 60
uo.Print("Low Stamina")
wait(2000)
wend
end if

UO.Exec(walkn(0,0,'finditem'))
LastTimer=UO.Timer()


тут в этом топике есть ходилка Бейондера. скажите пожалуйста как её правельно прикрепить? Чтобы она со скриптом совмещалась. куда конкретно надо ее приделать?


Top
   
PostPosted: 2015-02-19 08:11:42 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Code:
sub ttt()
walker(1165,1661,1)
end sub

это пример ходилки в ходилке :)

в твоем случае должно быть вот так

Code:
if CheckStam==1 then
While UO.Stamina < 60
uo.Print("Low Stamina")
wait(2000)
wend
end if

поиск какого то предмета
нашли 'finditem'

walker(uo.getx('finditem'),uo.gety('finditem'),1)
LastTimer=UO.Timer()

подойдет к найденному предмету на дистанцию 1 тайл. Если предмет живой и двигается то подойдет в точку в которой он был найден.
Если это не решение то надо более подробно расписывать задачу, а не писать - "а куда вот эту строку мне в скрипт вставить?" Очевидный ответ - "в скрипт" :roll:

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 142 posts ]  Go to page Previous 14 5 6 7 8 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 43 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited