Page 2 of 6

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

Posted: 2011-06-03 11:00:55
by ZeroDX
Нужно как-то по другому определять принадлежность точки. Есть у кого формулы? :roll: АВ = АС + ВС не подходит

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

Posted: 2011-06-03 13:48:13
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

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

Posted: 2011-06-03 16:46:54
by ZeroDX
Вот что выдаёт
Image Image Image Image

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

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

В общем прошу помощи. Нужно проверить будет ли стрелять или нет.

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

Posted: 2011-06-03 20:40:32
by ZeroDX
Не стреляет!

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

Posted: 2011-06-04 17:04:33
by ZeroDX
Смог добиться только утолщение траектории.
Image Image Image Image Image

Вопрос к спецам: Как сфера просчитывает траекторию? По какой формуле?

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

Posted: 2011-06-05 09:36:32
by Mirage
вот как ты нарисовал в последнем случае - так и считает.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки
Image
и
Image
считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.

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

Posted: 2011-06-05 15:44:34
by ZeroDX
Знать бы ещё как это в формулу вывести

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

Posted: 2011-06-05 18:47:36
by Mirage
Если откинуть математические изыскания что конкретно ты хочешь получить от скрипта?

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

Posted: 2011-06-05 19:09:16
by ZeroDX
Просто закинуть в функцию (х,у) точки а, (х,у) точки в, а в ответ тайлы, на которых не должно быть препятствий для выстрела.

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

Posted: 2011-06-06 00:35:52
by Tiger1989
Зеро молодец какую работу проделал респект

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

Posted: 2011-06-06 02:13:21
by ZeroDX
Так я же ни чего не сделал, а то что сделал работает.... :roll: некорректно.

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

Posted: 2011-06-06 08:12:34
by Mirage
Не хочу нарушать процесс скриптования но немного оффтопа по теме должен написать.

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

Code: Select all

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

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

PS мое мнение которое может быть ошибочным ;)

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

Posted: 2011-06-06 09:58:12
by ZeroDX
Дело в лесу будет) Не думаю, что ГМы будут в лесу ставить трапы). А что касается

Code: Select all

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

то хочется сделать более изящное решение)

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

Posted: 2011-06-06 14:57:16
by Grin
Возьмите сервер с открытым исходным кодом и посмотрите...

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

Posted: 2011-06-06 17:01:57
by Mirage
Йа в этом ламер :roll:
Ждем решения. :mrgreen:

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

Posted: 2011-06-06 17:23:49
by ZeroDX
Поискал исходники сферы... не нашёл.

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

Posted: 2011-06-06 22:00:59
by ZeroDX
Дали мне Line of sight system. Сразу проблемма, он на С++ или С (не разбираюсь, не программист я).

Если у кого есть знания + свободное время + желание оказать помощь, прошу сюда. Там вроде как с проверками и прочее, нужна только формула или алгоритм какой-нить.

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

Posted: 2011-06-07 07:47:59
by Grin
:) Есть POL, RunUO все с исходным кодом...

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

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

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

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

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

Делается интересное допущение в зависимости от между чем рассчитывается видимость. Если расчет от Моба к поверхности, то к Z координате Моба прибавляется 14 (уровень глаз:) ), если между двумя Мобами, то прибавка по зрению у обоих (у слима глаза тоже на высоте 14%) ).

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

Posted: 2011-06-07 09:48:34
by Grin
Только что заметил ссылку от ZeroDX:)

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

Поскольку LOS контролируется сервером, то и реализацию надо смотреть ближе к самой реализации именно конкретного сервера.

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

Posted: 2011-06-20 13:19:28
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 Гдето был у меня косяк, теперь не падает но строит криво.

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