Проверка на проходимость

Anything and all.

Moderators: Murderator+, Murderator

ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Нужно как-то по другому определять принадлежность точки. Есть у кого формулы? :roll: АВ = АС + ВС не подходит
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Вот переделал. Теперь вроде верно находит траекторию. Если не лень, протестируйте пожалуйста. Я всего 1 раз проверил, а надо уходить.

Code: Select all

sub test()
  var String = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('lastattack'), UO.GetY('lastattack')), i
  var Count = val(GetWord(String, 1))
  For i = 2 to Count * 2 + 1 step 2
    UO.MFGI('add', '1339', GetWord(String, i), GetWord(String, i + 1), UO.GetZ('self'), '0x0025', 'cave floor')
  Next
Endsub

sub ttt()
  var string = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('self') + 5, UO.GetY('self') + 2)
  UO.Print(string)
Endsub

sub VectorPoints(startx, starty, endx, endy)
  var Coordinates = ' ', Amount = 0, Vector, x, y, i, j
  Vector = (str(endx - startx) + ',' + str(endy - starty))
  If startx >= endx then
    i = -1
   else
    i = 1
  Endif
  If starty >= endy then
    j = -1
   else
    j = 1
  Endif
  For x = startx to endx step i
    For y = starty to endy step j
      If IsOnVector(x, y, startx, starty, endx, endy) then
        Amount = Amount + 1
        Coordinates = (Coordinates + str(x) + ' ' + str(y) + ' ')
      Endif
    Next
  Next
  Return (str(Amount) + Coordinates)
Endsub

Sub IsOnVector(x, y, startx, starty, endx, endy)
  var A = starty - endy, B = endx - startx, C = startx * endy - starty * endx
  If IsInRange(A * x + B * y + C, -3, 3) then
    If IsInRange(x, startx, endx) then
      If IsInRange(y, starty, endy) then
        Return 1
      Endif
    Endif
  Endif
  Return 0
Endsub

Sub IsInRange(val, val1, val2)
  If val1 < val2 then
    If val <= val2 and val >= val1 then
      Return 1
     else
      Return 0
    Endif
   else
    If val <= val1 and val >= val2 then
      Return 1
     else
      Return 0
    Endif
  Endif
Endsub

Sub Absolute(val)
  If val > 0 then
    Return val
   else
    Return -val
  Endif
Endsub

Sub GetWord(st, nom)
  var tmpst, i, dlin, kol = 0, start = 0
  dlin = len(st)
  For i = 0 to dlin - 1
    If mid(st, i, 1) == ' ' or i == dlin - 1 then
      kol = kol + 1
      If kol == nom then
        tmpst = mid(st, start, i - start)
        Return tmpst
       else
        While mid(st, i, 1) == ' '
          i = i + 1
        Wend
        If kol == nom - 1 then
          start = i
        Endif
      Endif
    Endif
  Next
  tmpst = ''
  Return tmpst
Endsub
Last edited by ZeroDX on 2011-06-20 12:41:07, edited 1 time in total.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Вот что выдаёт
Image Image Image Image

нолик - чар
крестик - цель
желтым цветом выделены тайлы, которые по мнению скрипта следует проверить на проходимость.

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

В общем прошу помощи. Нужно проверить будет ли стрелять или нет.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Не стреляет!
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Смог добиться только утолщение траектории.
Image Image Image Image Image

Вопрос к спецам: Как сфера просчитывает траекторию? По какой формуле?
Last edited by ZeroDX on 2011-06-21 11:26:08, edited 1 time in total.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

вот как ты нарисовал в последнем случае - так и считает.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки
Image
и
Image
считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Знать бы ещё как это в формулу вывести
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Если откинуть математические изыскания что конкретно ты хочешь получить от скрипта?
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Просто закинуть в функцию (х,у) точки а, (х,у) точки в, а в ответ тайлы, на которых не должно быть препятствий для выстрела.
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

Re: Проверка на проходимость

Post by Tiger1989 »

Зеро молодец какую работу проделал респект
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Так я же ни чего не сделал, а то что сделал работает.... :roll: некорректно.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Не хочу нарушать процесс скриптования но немного оффтопа по теме должен написать.

Если скрипт рассматривать как "полезную теоретическую возможность инжекта" которую можно использовать в векторной геометрии то скрипт несомненно правильный и достойный быть прикрепленным когда родится окончательный вариант.
К сожалению того практического применения в игре которого от него хотет автор темы скрипт иметь не будет. Объясню почему.
Если брать скрипт для простого стреляния - стоит или не стоит стрелять. Существует более простой вариант скрипта.

Code: Select all

Атака цели при условии определенной дистанции
Если у жертвы не уменьшаются жизни определенное время или жертва пропадает из зоны видимости
атака прекращается

Если брать скрипт как плацдарм для поиска оптимального ПРОХОДИМОГО пути то подумайте вот над чем.
Существуют тайлы на которые игрок вступить не может причем они имеют 0 "тип", ГМ может (и ОЧЕНЬ ЧАСТО ДЕЛАЕТ) расставить невидимые для игрока предметы. А невидимый предмет не видится не только игроком но и инжектом. Некоторые объукты мира (каменные панели, ковры, паркет и ламинат) которые размещают ГМы легко могут находится как на проходимых тайлах так и на непроходимых. А по ним ходить можно.
Так что идея поиска пути это как построение коммунизма. Прекрасно в своем недостижении.

PS мое мнение которое может быть ошибочным ;)
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Дело в лесу будет) Не думаю, что ГМы будут в лесу ставить трапы). А что касается

Code: Select all

Атака цели при условии определенной дистанции
Если у жертвы не уменьшаются жизни определенное время или жертва пропадает из зоны видимости
атака прекращается

то хочется сделать более изящное решение)
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Возьмите сервер с открытым исходным кодом и посмотрите...
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Йа в этом ламер :roll:
Ждем решения. :mrgreen:
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Поискал исходники сферы... не нашёл.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Дали мне Line of sight system. Сразу проблемма, он на С++ или С (не разбираюсь, не программист я).

Если у кого есть знания + свободное время + желание оказать помощь, прошу сюда. Там вроде как с проверками и прочее, нужна только формула или алгоритм какой-нить.
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

:) Есть POL, RunUO все с исходным кодом...

LOS в RunUO просто и наглядно рассчитывается, знания С# не потребуются.

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

Приращение по каждой координате считается как координата вектора деленная на его длину.

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

Дальше все кубы проверяются не перекрываются ли они статикой, мультисами, и динамическими объектами.

Делается интересное допущение в зависимости от между чем рассчитывается видимость. Если расчет от Моба к поверхности, то к Z координате Моба прибавляется 14 (уровень глаз:) ), если между двумя Мобами, то прибавка по зрению у обоих (у слима глаза тоже на высоте 14%) ).
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Только что заметил ссылку от ZeroDX:)

ZeroDX тебе привели версию самой OSI, а не Sphere, и то сервера который был выложен 98-99 году в месте с игрой:)

Поскольку LOS контролируется сервером, то и реализацию надо смотреть ближе к самой реализации именно конкретного сервера.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Code: Select all

sub main()
   UO.Exec ('addobject target')
   while uo.targeting()
      wait(100)
   wend
   var string = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('target'), UO.GetY('target'))
   uo.textprint(string)
Endsub
sub deltile()
    var MaxRange = 18
    var X, Y, Z, Tiles
    var mX, mY, mZ
    mX = UO.GetX('self')
    mY = UO.GetY('self')
    mZ = UO.GetZ('self')
    for Y = MaxRange - ( MaxRange * 2 ) to MaxRange
        for X = MaxRange - ( MaxRange * 2 ) to MaxRange
            UO.MFGI('clear', '1339', mX+X, mY+Y, UO.GetZ('self'))
        next
    next
end sub
sub VectorPoints(startx, starty, endx, endy)
   var Coordinates = ' ', Amount = 0, Vector, x, y, i, j
   Vector = (str(endx - startx) + ',' + str(endy - starty))
   If startx >= endx then
      i = -1
   else
      i = 1
   Endif
   If starty >= endy then
      j = -1
   else
      j = 1
   Endif
   For x = startx to endx step i
      For y = starty to endy step j
         If IsOnVector(x, y, startx, starty, endx, endy) then
            Amount = Amount + 1
            Coordinates = (Coordinates + str(x) + ' ' + str(y) + ' ')
            UO.MFGI('add', '1339', x, y, UO.GetZ('self'))
         Endif
      Next
   Next
   Return (str(Amount) + Coordinates)
Endsub
Sub IsOnVector(x, y, startx, starty, endx, endy)
   var A = starty - endy, B = endx - startx, C = startx * endy - starty * endx
   If IsInRange(A * x + B * y + C, -3, 3) then
      If IsInRange(x, startx, endx) then
         If IsInRange(y, starty, endy) then
            Return 1
         Endif
      Endif
   Endif
   Return 0
Endsub
Sub IsInRange(val, val1, val2)
   If val1 < val2 then
      If val <= val2 and val >= val1 then
         Return 1
      else
         Return 0
      Endif
   else
      If val <= val1 and val >= val2 then
         Return 1
      else
         Return 0
      Endif
   Endif
Endsub
Sub Absolute(val)
   If val > 0 then
      Return val
   else
      Return -val
   Endif
Endsub
Sub GetWord(st, nom)
   var tmpst, i, dlin, kol = 0, start = 0
   dlin = len(st)
   For i = 0 to dlin - 1
      If mid(st, i, 1) == ' ' or i == dlin - 1 then
         kol = kol + 1
         If kol == nom then
            tmpst = mid(st, start, i - start)
            Return tmpst
         else
            While mid(st, i, 1) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   Return tmpst
Endsub


Если цель находится на одной Z с тобой то построит путь до неё.
Если не на одной Z - у меня 9 из 10 падает клиент.

PS Гдето был у меня косяк, теперь не падает но строит криво.

Видимо в мат формуле гдето неточность:
Post Reply