Yoko

All sides of Injection
It is currently 2017-09-25 06:20:56

All times are UTC+02:00




Post new topic  This topic is locked, you cannot edit posts or make further replies.  [ 187 posts ]  Go to page Previous 16 7 8 9 10 Next
Author Message
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 18:37:18 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Я так понял это значит на одном тайле земли сразу три тайла(бывает и больше) статики. Как это можно обыграть?

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 18:41:30 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
Бинго!
Ну, я не просто так же писал это на 6 странице:
Code:
sub Test()
   uo.setmulpath('E:\Ultima Online')
   var tileid = uo.getstatictiles(uo.getx(), uo.gety() + 1, 0)
   uo.print('tileid='+tileid)
   if tileid=='' then
      uo.print('Тут нет статики.')
      return
   endif
   dim tiles[20] #20 хватит думаю
   var l=Str2Tiles(tiles,tileid)
   var i,f
   if l>0 then
      for i=0 to l-1
         f=UO.GetTileFlags(1,tiles[i])
         uo.print('tile='+tiles[i])
         uo.print('flags='+f)
         if contains(uo.hex2int(f),0x40) then
            uo.print("Непроходимый тайл!")
         else
            uo.print("Проходимый тайл!")
         end if
      next
   endif
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

Если решил с Z координатой выводить - допили во 2 функцию ещё 1 массив для Z и разбор Z координат.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 18:53:41 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Так он возвращает сразу на три тайла информацию а не на один. Я так понимаю, нужно проверять только один, самый последний в списке, так как он верхний?

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 18:58:31 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
+ Нашел место, там куча тайлов, при нажатии теста вылетает уо с надписью Abnormal program termination

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:06:15 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
Juicy Fruit wrote:
GetLandscapeTile возвращает информацию в формате TileID, при включенной ShowZ в формате TileID(Z)
GetStaticTiles так же, как и GetLandscapeTile, но перечисляет все тайлы статики, находящиеся в заданных координатах через запятую. Если тайлов статики не обнаружено - вернет пустую строку.
При ошибке возвращают строку -1.

Читай описание внимательнее)
Дай координаты места.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:08:52 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Скала в Cove 2231,1234,0

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:27:54 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
Code:
tileid=0x179B,0x179B,0x1799,0x1797,0x179C,0x1799,0x1799,0x17AD,0x1798,0x179C,0x179B,0x0CAF,0x17B2,0x0CAF,0x1797,0x1799,0x1798,0x179A,0x17A9,0x179B
tile=0x179B
flags=0x000000C1
Непроходимый тайл!
tile=0x179B
flags=0x000000C1
Непроходимый тайл!
tile=0x1799
flags=0x000000C1
Непроходимый тайл!
tile=0x1797
flags=0x000000C1
Непроходимый тайл!
tile=0x179C
flags=0x000000C1
Непроходимый тайл!
tile=0x1799
flags=0x000000C1
Непроходимый тайл!
tile=0x1799
flags=0x000000C1
Непроходимый тайл!
tile=0x17AD
flags=0x000000C1
Непроходимый тайл!
tile=0x1798
flags=0x000000C1
Непроходимый тайл!
tile=0x179C
flags=0x000000C1
Непроходимый тайл!
tile=0x179B
flags=0x000000C1
Непроходимый тайл!
tile=0x0CAF
flags=0x00000201
Проходимый тайл!
tile=0x17B2
flags=0x000000C1
Непроходимый тайл!
tile=0x0CAF
flags=0x00000201
Проходимый тайл!
tile=0x1797
flags=0x000000C1
Непроходимый тайл!
tile=0x1799
flags=0x000000C1
Непроходимый тайл!
tile=0x1798
flags=0x000000C1
Непроходимый тайл!
tile=0x179A
flags=0x040000C1
Непроходимый тайл!
tile=0x17A9
flags=0x000000C1
Непроходимый тайл!
tile=0x179B
flags=0x000000C1
Непроходимый тайл!

dim tiles[20] поставь побольше, там всего 20 тайлов. Значит, может быть и больше.
Ошибку не выдал.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:34:19 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Поставил 50, не вылетает. Но скрипт скажет что прохода нет если хоть в одном тайле из всех есть флаг 0х40. Я стою в спиче, он выдает мне пачку непроходимых, значит скрипт в таких местах будет говорить что прохода нет.

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:34:57 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Запиливай в инжу ходилку из стелса :P

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:43:39 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
У меня в модуле есть, но ооооочень долгая и корявая :DD
Если все тайлы смотреть - да, если отсеивать по Z координате - то можно избежать этого, сравнивать свою Z и +/-10Z тайла, к примеру.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:52:42 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
В общем как всегда, без костылей никуда. Буду ходить без проверки, для мининга не проблема, для ламбера... наверное тоже, так как еще сама по себе ходилка неадекватная а может это она так из за кривой проверки петляла. Щас затестирую как будет ходить, надеюсь не будет в лесу тайлов непроходимых там где свободное место.

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 19:58:53 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Quote:
Скала в Cove 2231,1234,0

На родной карте там просто много кустов. Тайлы обычные - ни под ни над точкой ничего нет. Скала и проходимая земля рядом.

Координаты "не проходимых" тайлов пиши если в лесу будешь натыкаться - погляжу на разных версиях карты и клиента. Может это особенность сервера, может глюк, может карта такая.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-18 20:23:20 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Выложил ходилку с новой проверкой тут viewtopic.php?f=20&t=6742&p=94554#p94554 Проверяет столько тайлов перед собой, сколько нужно сделать шагов. Обход при этом петляет на пол км. Хотелось бы чтобы просто проверял три тайла наискосок в одну сторону и если и там нет прохода то 3 тайла в противоположную сторону.

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 17:41:18 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
Слил всю инфу по доступным функциям в первый пост.

Переписал алгоритм поиска пути. Теперь он не колдует пол часа над файлами УО. Вычисление пути на фрагменте карты 150х150 (без учета игровых объектов) заняло около секунды. С учетом объектов УО - 3 секунды.
Описание класса:
Code:
PathFind(UOPath, MapNum, Z, Alg) - Первый конструктор. UOPath - путь к папке УО с *.mul файлами, MapNum - номер карты, для которой вычисляется путь, Z координата (пока что не работает), Alg - Выбор алгоритма поиска пути, может принимать значения 0 (волновой алгоритм поиска) и 1 (алгоритм поиска А*) см. википедию по сути алгоритмов.
PathFind(UOPath, MapNum, Z, Alg, ScreenCatalog) - Второй конструктор. По первым 4 параметрам см. выше. ScreenCatalog - путь к папке, куда сохранять изображения с фрагментом карты, на котором ведется поиск пути. На картинке отражается цветом:
Белый - Свободные тайлы
Черный - Заблокированные тайлы
Синий - Вода
Темно-бардовый - Мост (тайлы статики, имеющие флаг 0x00000400 (Bridge))
Темно-синий - Точка, от куда ведется расчет пути
Фиолетовый - Точка, куда ведет путь
Setup(PX, PY, TX, TY) - Устанавливает начальную и конечную точки и извлекает по ним путь.
PX PY - координаты начальной точки пути.
TX TY - координаты конечной точки пути.
First() - Доступ к первому элементу массива.
Last() - Доступ к последнему элементу массива.
SetPos(Position) - Изменить текущий указатель позиции в массиве на Position. Индексы от 0 до Size()-1
GetPos() - Получить текущий указатель на позицию в массиве.
GetX() - Получить координату Х текущий позиции.
GetY() - Получить координату Y текущий позиции.
Next() - Доступ в следующему элементу массива. Вернёт 1 если удачно. 0 если это конец массива.
Back() - Доступ в предъидущему элементу массива. Вернёт 1 если удачно. 0 если это начало массива.
Size() - Вернёт размер массива.
Clear() - Очистит массив с картой и вектор пути.
AddObj(Graphic, X, Y) - Добавит в класс игровой объект с типом Graphic (строка) в координатах X и Y (числа)


Работает с файлами: map*.mul, statics*.mul, staidx*.mul, tiledata.mul, multi.mul, art.mul, artidx.mul, verdata.mul
Карта, созданная классом:
Image

Пример кода поиска пути:
Code:
var UOPath='E:\Ultima Online Abyss' #Путь к папке с *.mul файлами УО
var ScreenPath='E:\UOPathScreens' #Путь к папке, куда сохранять скрины поиска пути
var PathAlg=1 #Индекс алгоритма
var PathMap=0 #Индекс карты
var CheckUOObject=1 #Учитывать игровые объекты при поиске пути? 0 - нет; 1 - да

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

sub tWalk1()
   var i,gr=''
   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'))
            endif
            uo.ignore('finditem')
            uo.findtype(-1,-1,'ground')
         until not uo.findcount()
      endif
      uo.ignorereset()
   endif
   uo.print('Setup...')
   mapout.Setup(x,y,ChestX,ChestY) #Запускаем алгоритм поиска
   if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
      uo.print('Путь вычислен!')
      mapout.first() #Ставим указатель на первый элемент массива
      repeat
         #Тут делаем коррекцию ходьбы.
         uo.print('X='+str(mapout.getx())+' Y='+str(mapout.gety()))
         wait(10)
      until not mapout.next() #Крутим цикл, пока массив не дойдет до конца
      #Тут производим какие-то действия, добираем ресы из сундука или ресаемся...
      mapout.last() #Устанавливаем указатель на последний элемент массива (он уже там, но малоли...)
      repeat
         #Тут делаем коррекцию ходьбы.
         uo.print('X='+str(mapout.getx())+' Y='+str(mapout.gety()))
         wait(10)
      until not mapout.back() #Крутим цикл до начала вектора
   else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
      uo.print('Ошибка вычисления пути!')
   endif
end sub

Может застрять на входах/выходах из пещер, там сложная статика, пока ещё не разобрался с ней. Клиент не может пройти на свободном месте.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 18:10:36 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
А саму функцию движения приделаешь?

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 18:26:33 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
За функцию движения можно взять твою ходилку (модифицированную Беяндера), только без проверок на тайл и т.п. От нее нужно по сути только изменение направления чара и сделать шаг.
В модуль нет смысла "вшивать" ходилку. Он не умеет определять координаты, направление чара и т.п.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 18:55:55 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Тогда нужно будет поковырять её. Даже делать для этой твоей определялки просто новый кусок, там много лишнего, нужно под эту сделать свою. Ты мне обьясни как чар будет получать координаты в какую сторону идти? Путь он определил, ну а куда шагать, чтобы шел именно по тем тайлам которым нужно. Я так понимаю долженб быть список точек на каждом изменении направления, когда чар поворачивает в любое из 8 направлений нужно знать точку этого места. В итоге будем просто жать на нужную кнопку пока чар не дойдет до нужных координат, потом жмем другую кнопку и т.д.

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 18:59:16 
Offline

Joined: 2011-06-11 19:54:23
Posts: 823
Code:
      mapout.first() #Ставим указатель на первый элемент массива
      repeat
         walker(mapout.getx(),mapout.gety(),1) #Ходилка на нужный тайл
      until not mapout.next() #Крутим цикл, пока массив не дойдет до конца
Если так понятнее будет.


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 19:14:01 
Offline

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

_________________
CodeSweeper


Top
   
 
 Post subject: Re: Script.dll + include
PostPosted: 2013-06-22 21:53:27 
Offline

Joined: 2011-05-23 00:33:30
Posts: 941
Quote:
ScreenPath='E:\UOPathScreens' #Путь к папке, куда сохранять скрины поиска пути

Это обязательно? и как отключить если что.

_________________
CodeSweeper


Top
   
 
Display posts from previous:  Sort by  
Post new topic  This topic is locked, you cannot edit posts or make further replies.  [ 187 posts ]  Go to page Previous 16 7 8 9 10 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 1 guest


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