Page 2 of 6
Re: Проверка на проходимость
Posted: 2011-06-03 11:00:55
by ZeroDX
Нужно как-то по другому определять принадлежность точки. Есть у кого формулы?

АВ = АС + ВС не подходит
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
Вот что выдаёт
нолик - чар
крестик - цель
желтым цветом выделены тайлы, которые по мнению скрипта следует проверить на проходимость.
У меня вызывает сомнение первая картинка. Будет ли стрелять в такой ситуации, при условии,что все не желтые клетки утыканы каким-нибудь сеном, забором итд. Проверить не могу, т.к. своей сферы у меня нету, а на других у меня нет ни где персонажа, который по финансам потянет моделирование ситуации.
В общем прошу помощи. Нужно проверить будет ли стрелять или нет.
Re: Проверка на проходимость
Posted: 2011-06-03 20:40:32
by ZeroDX
Не стреляет!
Re: Проверка на проходимость
Posted: 2011-06-04 17:04:33
by ZeroDX
Re: Проверка на проходимость
Posted: 2011-06-05 09:36:32
by Mirage
вот как ты нарисовал в последнем случае - так и считает.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки

и

считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.
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
Так я же ни чего не сделал, а то что сделал работает....

некорректно.
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
Йа в этом ламер
Ждем решения.

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 Гдето был у меня косяк, теперь не падает но строит криво.
Видимо в мат формуле гдето неточность: