
Проверка на проходимость
Moderators: Murderator+, Murderator
Re: Проверка на проходимость
Нужно как-то по другому определять принадлежность точки. Есть у кого формулы?
АВ = АС + ВС не подходит

Re: Проверка на проходимость
Вот переделал. Теперь вроде верно находит траекторию. Если не лень, протестируйте пожалуйста. Я всего 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.
Re: Проверка на проходимость
Вот что выдаёт

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




нолик - чар
крестик - цель
желтым цветом выделены тайлы, которые по мнению скрипта следует проверить на проходимость.
У меня вызывает сомнение первая картинка. Будет ли стрелять в такой ситуации, при условии,что все не желтые клетки утыканы каким-нибудь сеном, забором итд. Проверить не могу, т.к. своей сферы у меня нету, а на других у меня нет ни где персонажа, который по финансам потянет моделирование ситуации.
В общем прошу помощи. Нужно проверить будет ли стрелять или нет.
Re: Проверка на проходимость
Не стреляет!
Re: Проверка на проходимость
Смог добиться только утолщение траектории.

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





Вопрос к спецам: Как сфера просчитывает траекторию? По какой формуле?
Last edited by ZeroDX on 2011-06-21 11:26:08, edited 1 time in total.
Re: Проверка на проходимость
вот как ты нарисовал в последнем случае - так и считает.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки

и

считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки

и

считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.
Re: Проверка на проходимость
Знать бы ещё как это в формулу вывести
Re: Проверка на проходимость
Если откинуть математические изыскания что конкретно ты хочешь получить от скрипта?
Re: Проверка на проходимость
Просто закинуть в функцию (х,у) точки а, (х,у) точки в, а в ответ тайлы, на которых не должно быть препятствий для выстрела.
Re: Проверка на проходимость
Зеро молодец какую работу проделал респект
Re: Проверка на проходимость
Так я же ни чего не сделал, а то что сделал работает....
некорректно.

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

Re: Проверка на проходимость
Дело в лесу будет) Не думаю, что ГМы будут в лесу ставить трапы). А что касается
то хочется сделать более изящное решение)
Code: Select all
Атака цели при условии определенной дистанции
Если у жертвы не уменьшаются жизни определенное время или жертва пропадает из зоны видимости
атака прекращается
то хочется сделать более изящное решение)
Re: Проверка на проходимость
Возьмите сервер с открытым исходным кодом и посмотрите...
Re: Проверка на проходимость
Йа в этом ламер
Ждем решения.

Ждем решения.

Re: Проверка на проходимость
Поискал исходники сферы... не нашёл.
Re: Проверка на проходимость
Дали мне Line of sight system. Сразу проблемма, он на С++ или С (не разбираюсь, не программист я).
Если у кого есть знания + свободное время + желание оказать помощь, прошу сюда. Там вроде как с проверками и прочее, нужна только формула или алгоритм какой-нить.
Если у кого есть знания + свободное время + желание оказать помощь, прошу сюда. Там вроде как с проверками и прочее, нужна только формула или алгоритм какой-нить.
Re: Проверка на проходимость

LOS в RunUO просто и наглядно рассчитывается, знания С# не потребуются.
Основная задача построить список затронутых кубов (у нас же все таки трех мерное пространство:) ).
Строится вектор по двум заданным точкам, длинна этого вектора - длинна диагонали параллелепипеда, это очевидно:)
Приращение по каждой координате считается как координата вектора деленная на его длину.
Ну а дальше все очень просто, с погрешностью в 0.5 выбираются все кубы через которые проходит вектор, в образованном им параллелепипеде:)
Координаты кубов - целые числа.
Дальше все кубы проверяются не перекрываются ли они статикой, мультисами, и динамическими объектами.
Делается интересное допущение в зависимости от между чем рассчитывается видимость. Если расчет от Моба к поверхности, то к Z координате Моба прибавляется 14 (уровень глаз:) ), если между двумя Мобами, то прибавка по зрению у обоих (у слима глаза тоже на высоте 14%) ).
Re: Проверка на проходимость
Только что заметил ссылку от ZeroDX:)
ZeroDX тебе привели версию самой OSI, а не Sphere, и то сервера который был выложен 98-99 году в месте с игрой:)
Поскольку LOS контролируется сервером, то и реализацию надо смотреть ближе к самой реализации именно конкретного сервера.
ZeroDX тебе привели версию самой OSI, а не Sphere, и то сервера который был выложен 98-99 году в месте с игрой:)
Поскольку LOS контролируется сервером, то и реализацию надо смотреть ближе к самой реализации именно конкретного сервера.
Re: Проверка на проходимость
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 Гдето был у меня косяк, теперь не падает но строит криво.
Видимо в мат формуле гдето неточность: