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

Script.dll + include
http://forum.yoko.com.ua/viewtopic.php?f=12&t=16689
Page 9 of 10

Author:  Juicy Fruit [ 2013-06-22 23:04:41 ]
Post subject:  Re: Script.dll + include

Не, не обязательно, просто без нее создавай путь, 4 параметра вместо 5.
Путь к картинкам нужен только чтоб можно было наглядно посмотреть, какой путь был выбран, были ли учтены игровые объекты (не статика игры) и т.д.

Author:  Incorrect User [ 2013-06-23 01:26:56 ]
Post subject:  Re: Script.dll + include

Сделал, если все правильно понял то должна работать, только теперь весь скрипт это Walker(GoX, GoY, Prec) так что если значение Prec у тебя задавалось где-то отдельно, убери это. Не тестил. Так же я подумал что until not mapout.next() значит идти пока не прийдем к заданым координатам, а это конечные координаты без учета Prec, если правильно понял то Prec будет учтен, если нет - переделаю как надо когда обьяснишь что не так :)
Code:
sub Walker(GoX, GoY, Prec)
  var i, gr="", endwalk, button, DistanceX, DistanceY, StartDir, StartX, StartY, EndDir, timer
  var steptimer = 200 ; Таймер на шаг
  var mapout=PathFind(UOPath,PathMap,uo.getz(),PathAlg,ScreenPath)
  var x=uo.getx() #От куда начинаем путь по X
  var y=uo.gety() #От куда начинаем путь по Y
  var ChestX=1773 #Куда идем по X
  var ChestY=3096 #Куда идем по Y
  if CheckUOObject then
    var dx = Abs(x-ChestX)
    var dy = Abs(y-ChestY)
    if dx<dy then #Получим наибольшее значение дистанции до объекта
      dx=dy
    endif
    if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
      dx=dx+1
    endif
    dx=dx*2 #Максимальная дистанция поиска объектов для алгоритма = максимальная дистанция * 2
    uo.set("finddistance",str(dx))
    uo.findtype(-1,-1,"ground")
    uo.ignorereset()
    if uo.findcount() then #Поиск предметов на земле, пока не кончатся
      repeat
        gr=uo.getgraphic("finditem")
        #Проверка на людей. Все живые объекты нужно исключить из списка. Проверка Z координаты, если не больше 10 то заносим в список
        if gr<>"0x0190" and gr<>"0x0191" and abs(uo.getz("finditem")-uo.getz("self"))<10 then
          mapout.addobj(gr,uo.getx("finditem"),uo.gety("finditem"))
        end if
        uo.ignore("finditem")
        uo.findtype(-1,-1,"ground")
      until not uo.findcount()
    end if
    uo.ignorereset()
  end if
  uo.print("Setup...")
  mapout.Setup(x,y,ChestX,ChestY) #Запускаем алгоритм поиска
  if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
    uo.print("Путь вычислен!")
    mapout.first() #Ставим указатель на первый элемент массива
    endwalk = 0
    DistanceX = str(uo.getx() - GoX)
    DistanceY = str(uo.gety() - GoY)
    if mapout.getx() == uo.getx() and mapout.gety() < uo.gety() then
      button = 33
      EndDir = 0
    end if
    if mapout.getx() > uo.getx() and mapout.gety() < uo.gety() then
      button = 39
      EndDir = 1
    end if
    if mapout.getx() > uo.getx() and mapout.gety() == uo.gety() then
      button = 34
      EndDir = 2
    end if
    if mapout.getx() > uo.getx() and mapout.gety() > uo.gety() then
      button = 40
      EndDir = 3
    end if
    if mapout.getx() == uo.getx() and mapout.gety() > uo.gety() then
      button = 35
      EndDir = 4
    end if
    if mapout.getx() < uo.getx() and mapout.gety() > uo.gety() then
      button = 37
      EndDir = 5
    end if
    if mapout.getx() < uo.getx() and mapout.gety() == uo.gety() then
      button = 36
      EndDir = 6
    end if
    if mapout.getx() < uo.getx() and mapout.gety() < uo.gety() then
      button = 38
      EndDir = 7
    end if
    if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
      endwalk = 1
    else
      if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
        endwalk = 1
      end if
    end if
    repeat
      if endwalk == 0 then
        repeat
          StartDir=UO.GetDir()
          StartX=UO.GetX()
          StartY=UO.GetY()
          UO.Press(button)
          timer = uo.timer() + steptimer
          repeat
            wait(10)
          until StartDir <> EndDir or StartY <> UO.GetY() or StartX <> UO.GetX() or timer <= uo.timer()
          if StartDir <> EndDir then
            StartDir = EndDir
          end if
          DistanceX = str(uo.getx() - GoX)
          DistanceY = str(uo.gety() - GoY)
          if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
            endwalk = 1
          else
            if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
              endwalk = 1
            end if
          end if
        until endwalk == 1 or (mapout.getx() == uo.getx() and mapout.gety() == uo.gety())
      end if
    until not mapout.next() or endwalk == 1 #Крутим цикл, пока массив не дойдет до конца
    #Тут производим какие-то действия, добираем ресы из сундука или ресаемся...
    mapout.last() #Устанавливаем указатель на последний элемент массива (он уже там, но малоли...)
    repeat
      #Тут делаем коррекцию ходьбы.
      uo.print("X="+str(mapout.getx())+" Y="+str(mapout.gety()))
      wait(10)
    until not mapout.back() #Крутим цикл до начала вектора
  else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
    uo.print("Ошибка вычисления пути!")
  end if
end sub

Sub Abs(i)
  if i<0 then
    i=i*(-1)
  endif
  return i
end sub

Author:  Incorrect User [ 2013-06-24 17:11:18 ]
Post subject:  Re: Script.dll + include

Попробовал включить ходилку, написало Setup... и всё. Проц 100% память сожрало так же всю, тормоза и ничего не деалет больше.

Author:  Juicy Fruit [ 2013-06-24 19:51:06 ]
Post subject:  Re: Script.dll + include

С координатами не намудрил?
Пока что, желательное расстояние не больше 100 тайлов. Простые прогулки от дерева к дереву, до сундука или от вендора к вендору.

Author:  Incorrect User [ 2013-06-24 19:53:50 ]
Post subject:  Re: Script.dll + include

Там было не более 10 тайлов и практически открытое пространство. Хотя я понял, я же сделал чтобы был как валкер GoX, GoY, Prec а у тебя координаты не из этого берет. Сейчас попробую сделать так как нужно :roll:

Author:  Juicy Fruit [ 2013-06-24 19:55:33 ]
Post subject:  Re: Script.dll + include

оО такого явно не должно было случиться)
Сколько тестил и так и сяк - все норм.
Путь к мулам и т.п. проверь, все ли верно указано?

Author:  Incorrect User [ 2013-06-24 20:02:01 ]
Post subject:  Re: Script.dll + include

Вот теоретически рабочий вариант, теперь пишет Ошибка вычисления пути. Стою за 8 тайлов от точки назначения.
Code:
sub Walker(GoX, GoY, Prec)
  var i, gr="", endwalk, button, DistanceX, DistanceY, StartDir, StartX, StartY, EndDir, timer
  var steptimer = 200 ; Таймер на шаг
  var mapout=PathFind(UOPath,PathMap,uo.getz(),PathAlg,ScreenPath)
  var x=uo.getx() #От куда начинаем путь по X
  var y=uo.gety() #От куда начинаем путь по Y
  if CheckUOObject then
    var dx = Abs(x-GoX)
    var dy = Abs(y-GoY)
    if dx<dy then #Получим наибольшее значение дистанции до объекта
      dx=dy
    endif
    if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
      dx=dx+1
    endif
    dx=dx*2 #Максимальная дистанция поиска объектов для алгоритма = максимальная дистанция * 2
    uo.set("finddistance",str(dx))
    uo.findtype(-1,-1,"ground")
    uo.ignorereset()
    if uo.findcount() then #Поиск предметов на земле, пока не кончатся
      repeat
        gr=uo.getgraphic("finditem")
        #Проверка на людей. Все живые объекты нужно исключить из списка. Проверка Z координаты, если не больше 10 то заносим в список
        if gr<>"0x0190" and gr<>"0x0191" and abs(uo.getz("finditem")-uo.getz("self"))<10 then
          mapout.addobj(gr,uo.getx("finditem"),uo.gety("finditem"))
        end if
        uo.ignore("finditem")
        uo.findtype(-1,-1,"ground")
      until not uo.findcount()
    end if
    uo.ignorereset()
  end if
  uo.print("Setup...")
  mapout.Setup(x,y,GoX,GoY) #Запускаем алгоритм поиска
  if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
    uo.print("Путь вычислен!")
    mapout.first() #Ставим указатель на первый элемент массива
    endwalk = 0
    DistanceX = str(uo.getx() - GoX)
    DistanceY = str(uo.gety() - GoY)
    if mapout.getx() == uo.getx() and mapout.gety() < uo.gety() then
      button = 33
      EndDir = 0
    end if
    if mapout.getx() > uo.getx() and mapout.gety() < uo.gety() then
      button = 39
      EndDir = 1
    end if
    if mapout.getx() > uo.getx() and mapout.gety() == uo.gety() then
      button = 34
      EndDir = 2
    end if
    if mapout.getx() > uo.getx() and mapout.gety() > uo.gety() then
      button = 40
      EndDir = 3
    end if
    if mapout.getx() == uo.getx() and mapout.gety() > uo.gety() then
      button = 35
      EndDir = 4
    end if
    if mapout.getx() < uo.getx() and mapout.gety() > uo.gety() then
      button = 37
      EndDir = 5
    end if
    if mapout.getx() < uo.getx() and mapout.gety() == uo.gety() then
      button = 36
      EndDir = 6
    end if
    if mapout.getx() < uo.getx() and mapout.gety() < uo.gety() then
      button = 38
      EndDir = 7
    end if
    if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
      endwalk = 1
    else
      if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
        endwalk = 1
      end if
    end if
    repeat
      if endwalk == 0 then
        repeat
          StartDir=UO.GetDir()
          StartX=UO.GetX()
          StartY=UO.GetY()
          UO.Press(button)
          timer = uo.timer() + steptimer
          repeat
            wait(10)
          until StartDir <> EndDir or StartY <> UO.GetY() or StartX <> UO.GetX() or timer <= uo.timer()
          if StartDir <> EndDir then
            StartDir = EndDir
          end if
          DistanceX = str(uo.getx() - GoX)
          DistanceY = str(uo.gety() - GoY)
          if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
            endwalk = 1
          else
            if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
              endwalk = 1
            end if
          end if
        until endwalk == 1 or (mapout.getx() == uo.getx() and mapout.gety() == uo.gety())
      end if
    until not mapout.next() or endwalk == 1 #Крутим цикл, пока массив не дойдет до конца
    #Тут производим какие-то действия, добираем ресы из сундука или ресаемся...
    mapout.last() #Устанавливаем указатель на последний элемент массива (он уже там, но малоли...)
    repeat
      #Тут делаем коррекцию ходьбы.
      uo.print("X="+str(mapout.getx())+" Y="+str(mapout.gety()))
      wait(10)
    until not mapout.back() #Крутим цикл до начала вектора
  else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
    uo.print("Ошибка вычисления пути!")
  end if
end sub

Author:  Juicy Fruit [ 2013-06-24 20:22:27 ]
Post subject:  Re: Script.dll + include

PathAlg поставь 1

Что ниже работает. Только что проверил и с учетом игровых объектов и без него.
Только путь к УО и т.п. надо глобально вывести.
Но это если на пути точно не встретятся преграды (ящик поставлят, непроходимый клиентом тайл и т.п.)
Code:
sub Walker(GoX, GoY)
   var i, gr="", CheckUOObject=1
   var mapout=PathFind('E:\Ultima Online',0,uo.getz(),1,'E:\UOPathScreens')
   var x=uo.getx() #От куда начинаем путь по X
   var y=uo.gety() #От куда начинаем путь по Y
   if CheckUOObject then
      var dx = Abs(x-GoX)
      var dy = Abs(y-GoY)
      if dx<dy then #Получим наибольшее значение дистанции до объекта
         dx=dy
      endif
      if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
         dx=dx+1
      endif
      dx=dx*2 #Максимальная дистанция поиска объектов для алгоритма = максимальная дистанция * 2
      uo.set("finddistance",str(dx))
      uo.findtype(-1,-1,"ground")
      uo.ignorereset()
      if uo.findcount() then #Поиск предметов на земле, пока не кончатся
         repeat
            gr=uo.getgraphic("finditem")
            #Проверка на людей. Все живые объекты нужно исключить из списка. Проверка Z координаты, если не больше 10 то заносим в список
            if gr<>"0x0190" and gr<>"0x0191" and abs(uo.getz("finditem")-uo.getz("self"))<10 then
               mapout.addobj(gr,uo.getx("finditem"),uo.gety("finditem"))
            end if
            uo.ignore("finditem")
            uo.findtype(-1,-1,"ground")
         until not uo.findcount()
      end if
      uo.ignorereset()
   end if
   uo.print("Setup...")
   mapout.Setup(x,y,GoX,GoY) #Запускаем алгоритм поиска
   if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
      uo.print("Путь вычислен!")
      mapout.first() #Ставим указатель на первый элемент массива
      repeat
         WalkTo(mapout.getx()-uo.getx(),mapout.gety()-uo.gety())
      until not mapout.next() #Крутим цикл, пока массив не дойдет до конца
   else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
      uo.print("Ошибка вычисления пути!")
   end if
end sub

Sub WalkTo(x,y)
   var dly=400 #Задержка на перемещения
   dim keys[8]
   keys[0]=33
   keys[1]=39
   keys[2]=34
   keys[3]=40
   keys[4]=35
   keys[5]=37
   keys[6]=36
   keys[7]=38
   var key=GetDirTo(x,y)
   if (key==-1) then
      uo.print('Уже стоим на этой точке.')
      return
   endif
   while (uo.getdir()<>key)
      uo.press(keys[key])
      wait(dly)
   wend
   uo.press(keys[key])
   wait(dly)
end sub

Sub GetDirTo(dx,dy)
   If dx<>0 AND dy<>0 Then
      If dx>0 AND dy>0 Then
         return 3
      Endif
      If dx>0 AND dy<0 Then
         return 1
      Endif
      If dx<0 AND dy>0 Then
         return 5
      Endif
      If dx<0 AND dy<0 Then
         return 7
      Endif
   Endif
   If dx<>0 AND dy==0 Then
      If dx>0 Then
         return 2
      Endif
      If dx<0 Then
         return 6
      Endif
   Endif
   If dx==0 AND dy<>0 Then
      If dy>0 Then
         return 4
      Endif
      If dy<0 Then
         return 0
      Endif
   Endif
   return -1
end sub

Author:  Incorrect User [ 2013-06-24 20:29:28 ]
Post subject:  Re: Script.dll + include

И на твоей и на моей пишет ошибка вычисления пути.

Author:  Juicy Fruit [ 2013-06-24 20:46:59 ]
Post subject:  Re: Script.dll + include

В любых координатах такое происходит?
Дай координаты начала и конца пути

Author:  Incorrect User [ 2013-06-24 20:55:47 ]
Post subject:  Re: Script.dll + include

Начало 2244, 1213 Конец 2244, 1208

Author:  Juicy Fruit [ 2013-06-24 21:14:46 ]
Post subject:  Re: Script.dll + include

Все вычисляет нормально.
http://rghost.ru/46993405
Карта пути.
Проверь всетаки путь к папке с мулами еще раз.

Author:  Incorrect User [ 2013-06-24 21:22:01 ]
Post subject:  Re: Script.dll + include

В путях ошибки нет, вынесены отдельно.

Author:  Incorrect User [ 2013-06-24 21:28:09 ]
Post subject:  Re: Script.dll + include

У тебя там препятствия? на картинке идет не на прямую а петлей.

Author:  Juicy Fruit [ 2013-06-24 21:41:42 ]
Post subject:  Re: Script.dll + include

Препятствий нет, алгоритм вычисления такой :D
Не всегда находит самый короткий путь до точки, иногда петляет.

Author:  Incorrect User [ 2013-06-26 15:44:13 ]
Post subject:  Re: Script.dll + include

У меня так и не работает. А как он ищет путь что получается такой круг? Я всегда представлял ходилку проверкой тайлов перед собой, в направлении куда нужно идти, пройти столько сколько есть свободных чтобы не доходил 1 тайл до препятствия и искать обход. А у вас все как-то загадочно...

Author:  Juicy Fruit [ 2013-06-26 17:53:52 ]
Post subject:  Re: Script.dll + include

Этот 0 индекс http://ru.wikipedia.org/wiki/Волновой_алгоритм
Это 1 индекс http://ru.wikipedia.org/wiki/Алгоритм_поиска_A*
Как-то так) Если интересуют проги, откуда брал алгоритмы - напиши в личку.

Author:  Incorrect User [ 2013-06-26 21:11:39 ]
Post subject:  Re: Script.dll + include

В общем, кому нужно, скрипт типа Wlaker(x,y,prec). Проверить нет возможности.
Code:
var UOPath = "C:\UltimaOnline" #Путь к папке с *.mul файлами УО
var ScreenPath = "C:\Screens" #Путь к папке, куда сохранять скрины поиска пути
var PathAlg = 1 #Индекс алгоритма
var PathMap = 0 #Индекс карты
var CheckUOObject = 1 #Учитывать игровые объекты при поиске пути 0 - нет; 1 - да
sub Walker(GoX, GoY, Prec)
  var i, gr="", endwalk, button, DistanceX, DistanceY, StartDir, StartX, StartY, EndDir, timer
  var steptimer = 200 ; Таймер на шаг
  var mapout=PathFind(UOPath,PathMap,uo.getz(),PathAlg,ScreenPath)
  var x=uo.getx() #От куда начинаем путь по X
  var y=uo.gety() #От куда начинаем путь по Y
  if CheckUOObject then
    var dx = Abs(x-GoX)
    var dy = Abs(y-GoY)
    if dx<dy then #Получим наибольшее значение дистанции до объекта
      dx=dy
    end if
    if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
      dx=dx+1
    end if
    dx=dx*2 #Максимальная дистанция поиска объектов для алгоритма = максимальная дистанция * 2
    uo.set("finddistance",str(dx))
    uo.findtype(-1,-1,"ground")
    uo.ignorereset()
    if uo.findcount() then #Поиск предметов на земле, пока не кончатся
      repeat
        gr=uo.getgraphic("finditem")
        #Проверка на людей. Все живые объекты нужно исключить из списка. Проверка Z координаты, если не больше 10 то заносим в список
        if gr<>"0x0190" and gr<>"0x0191" and abs(uo.getz("finditem")-uo.getz("self"))<10 then
          mapout.addobj(gr,uo.getx("finditem"),uo.gety("finditem"))
        end if
        uo.ignore("finditem")
        uo.findtype(-1,-1,"ground")
      until not uo.findcount()
    end if
    uo.ignorereset()
  end if
  uo.print("Setup...")
  mapout.Setup(x,y,GoX,GoY) #Запускаем алгоритм поиска
  if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
    uo.print("Путь вычислен!")
    mapout.first() #Ставим указатель на первый элемент массива
    endwalk = 0
    DistanceX = str(uo.getx() - GoX)
    DistanceY = str(uo.gety() - GoY)
    if mapout.getx() == uo.getx() and mapout.gety() < uo.gety() then
      button = 33
      EndDir = 0
    end if
    if mapout.getx() > uo.getx() and mapout.gety() < uo.gety() then
      button = 39
      EndDir = 1
    end if
    if mapout.getx() > uo.getx() and mapout.gety() == uo.gety() then
      button = 34
      EndDir = 2
    end if
    if mapout.getx() > uo.getx() and mapout.gety() > uo.gety() then
      button = 40
      EndDir = 3
    end if
    if mapout.getx() == uo.getx() and mapout.gety() > uo.gety() then
      button = 35
      EndDir = 4
    end if
    if mapout.getx() < uo.getx() and mapout.gety() > uo.gety() then
      button = 37
      EndDir = 5
    end if
    if mapout.getx() < uo.getx() and mapout.gety() == uo.gety() then
      button = 36
      EndDir = 6
    end if
    if mapout.getx() < uo.getx() and mapout.gety() < uo.gety() then
      button = 38
      EndDir = 7
    end if
    if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
      endwalk = 1
    else
      if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
        endwalk = 1
      end if
    end if
    repeat
      if endwalk == 0 then
        repeat
          StartDir=UO.GetDir()
          StartX=UO.GetX()
          StartY=UO.GetY()
          UO.Press(button)
          timer = uo.timer() + steptimer
          repeat
            wait(30)
          until StartDir <> EndDir or StartY <> UO.GetY() or StartX <> UO.GetX() or timer <= uo.timer()
          if StartDir <> EndDir then
            StartDir = EndDir
          end if
          DistanceX = str(uo.getx() - GoX)
          DistanceY = str(uo.gety() - GoY)
          if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
            endwalk = 1
          else
            if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
              endwalk = 1
            end if
          end if
        until endwalk == 1 or (mapout.getx() == uo.getx() and mapout.gety() == uo.gety())
      end if
    until not mapout.next() or endwalk == 1 #Крутим цикл, пока массив не дойдет до конца
    #Тут производим какие-то действия, добираем ресы из сундука или ресаемся...
    mapout.last() #Устанавливаем указатель на последний элемент массива (он уже там, но малоли...)
    repeat
      #Тут делаем коррекцию ходьбы.
      uo.print("X="+str(mapout.getx())+" Y="+str(mapout.gety()))
      wait(30)
    until not mapout.back() #Крутим цикл до начала вектора
  else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
    uo.print("Ошибка вычисления пути!")
  end if
end sub

Sub Abs(i)
  if i<0 then
    i=i*(-1)
  end if
  return i
end sub

А я наверное буду стелс пробовать крутить.

Author:  Juicy Fruit [ 2013-08-28 18:45:04 ]
Post subject:  Re: Script.dll + include

UP! Теперь не крашит при тыке на Quit в мэйнгампе клиента.

Author:  Mirage [ 2013-08-29 06:38:33 ]
Post subject:  Re: Script.dll + include

а что было?

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