Проверка на проходимость
Moderators: Murderator+, Murderator
Проверка на проходимость
Хочу просканировать тайлы вокруг чара в радиусе допустим на 18 тайлов на проходимость, но незнаю как это лучше реализовать.
Re: Проверка на проходимость
если выразиться математически то степень геморойности стремиться к невозможности
1) можно искать динамические объекты на земле. Но так ты не найдешь тайлы.
2) Можно прозванивать ВСЕ существующие тайлы и сравнивать их с типом проходимых. Будет 2 массива в одном из которых будет около 20-30К элементов (у нас на шарде можно копать тайлы с номерами 13625, 13628 ) => длительность убивает эффективность.
3) можно кидать перед собой монетку - если она упадет на землю и поднимется потом - значит тайл проходимый.
4) как то по другому

1) можно искать динамические объекты на земле. Но так ты не найдешь тайлы.
2) Можно прозванивать ВСЕ существующие тайлы и сравнивать их с типом проходимых. Будет 2 массива в одном из которых будет около 20-30К элементов (у нас на шарде можно копать тайлы с номерами 13625, 13628 ) => длительность убивает эффективность.
3) можно кидать перед собой монетку - если она упадет на землю и поднимется потом - значит тайл проходимый.
4) как то по другому

Re: Проверка на проходимость
Самое простое - пешком)
Что нибудь вроде
Что нибудь вроде
Code: Select all
If Walker(x,y,0) then
UO.SetGlobal(str(x) + ',' + str(y), 'ok')
Endif
Re: Проверка на проходимость
Но не факт, что самое быстрое
Re: Проверка на проходимость
Нет такие громадные массивы не нужны, дело будет в лесу, и я примерно знаю тайлы которые будут проходимы.
Re: Проверка на проходимость
а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.
Re: Проверка на проходимость
Tiger1989 wrote:а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.
Тогда тебе нужно сканировать тайл через UO.PrivateGetTile(), если дело в лесу, то на динамические объекты сканировать не надо (если только кто-нить не залокает какой-нить маркет-стоун в лесу).
PS точно не помню, но вроде как в ASM'ме была команда, возвращавшая номер тайла
Re: Проверка на проходимость
Я примерно понял как эту проверку реализовать, теперь мне надо выбрать траекторию выстрела в цель, дело в том, что надо учитывать деревья и выбирать подходящую траекторию, а как не знаю

Не совсем как в игре но все же примерно так выглядит
Голубым цветом обозначена цель
Синим цветом обозначено препятствие
Красным цветом обозначена зона из которой цель не доступна для атаки
Зеленым цветом обозначена зона из которой цель доступна для атаки

Не совсем как в игре но все же примерно так выглядит
Голубым цветом обозначена цель
Синим цветом обозначено препятствие
Красным цветом обозначена зона из которой цель не доступна для атаки
Зеленым цветом обозначена зона из которой цель доступна для атаки
Re: Проверка на проходимость
Есть вариант перебора всех возможных траекторий.Это долго, но и тут можно начинать искать с тех, что поближе. Так же это можно делать в отдельном потоке...
Re: Проверка на проходимость
Начинать искать нужно с близжайших координат. Затем прочертить прямую, и сканировать все тайлы, на которых она располагается. Если препятствие следующие координаты. Да и продолжать поиск нужно от цели.
Re: Проверка на проходимость
Tiger1989, есть какие-либо наработки?
Re: Проверка на проходимость
Не так все было сложно...
Функция вернёт строку вида '3 1541 123 1541 122 1541 121'
3 - Количество точек, а дальше координаты x,y самих точек.
На мой взгляд наиболее удобно будет
Ну и сам скрипт...
GetWord() Дестракшена располагается в полезностях
Функция вернёт строку вида '3 1541 123 1541 122 1541 121'
3 - Количество точек, а дальше координаты x,y самих точек.
На мой взгляд наиболее удобно будет
Code: Select all
Sub asd()
var a, i
var string = VectorPoints(startx, starty, endx, endy)
i = GetWord(string, 1)
For a = 2 to 2 * i step 2
UO.PrivateGetTile(GetWord(string, a), GetWord(string, a + 1), blablabla)
Next
Endsub
Ну и сам скрипт...
Code: Select all
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 lenAB = GetLength(startx, starty, endx, endy), lenAC = GetLength(startx, starty, x, y), lenBC = GetLength(x, y, endx, endy)
If lenAB == lenAc + lenBC then
Return 1
else
Return 0
Endif
Endsub
Sub GetLength(startx, starty, endx, endy)
var a = Absolute(endx - startx), b = Absolute(endy - starty)
If a >= b then
Return a
else
Return b
Endif
Endsub
Sub Absolute(val)
If val > 0 then
Return val
else
Return -val
Endif
Endsub
GetWord() Дестракшена располагается в полезностях
Re: Проверка на проходимость
Ой как всё не просто....)
завтра попробую что нибудь с ним сделать
завтра попробую что нибудь с ним сделать
Re: Проверка на проходимость
Кстати стрела не всегда летит по прямой, это тоже надо учесть как нибудь...
Re: Проверка на проходимость
учтено...
Но и этого скрипта есть минусы

Re: Проверка на проходимость
стрела летит всегда по прямой от точки А до точки Б. Другое дело точка Б может передвигаться после выпуска заклинания, но тут уже скриптом ничего не поделаешь. Так что надо рассчитывать положение точки Б в момент начала произнесения заклинания.
Нескромный вопрос - как вы высчитываете траекторию выстрела если
1) стрелять можно только по объекту а не в координату (лук, стрелка, фаерболл)
2) если в момент начала каста (среднее время 1-3 секунды) цель делает 1 шаг за препятствие - каст сбивается - причем с филзом - тратится мана.
3) уж если полетело то ему срать - у нас на шарде стрелка догоняла чара через полтора экрана через лес. То есть выстрел как лазер - лупануло моментально а уж цель почувствовала через пару секунд "дискомфорт".
Весьма специфическая задача у автора стоит. Хотя помоему ничего не получится (по крайней мере в том виде как хочет автор)
Это примерно как идея кидать объект в противоположную сторону от той куда смотрит чар чтобы затормозить преследователей. 50 строк ненужного текста вместо 1 команды на хоткее.
PS мне не совсем понятно где на рисунке с стреляющий?
Нескромный вопрос - как вы высчитываете траекторию выстрела если
1) стрелять можно только по объекту а не в координату (лук, стрелка, фаерболл)
2) если в момент начала каста (среднее время 1-3 секунды) цель делает 1 шаг за препятствие - каст сбивается - причем с филзом - тратится мана.
3) уж если полетело то ему срать - у нас на шарде стрелка догоняла чара через полтора экрана через лес. То есть выстрел как лазер - лупануло моментально а уж цель почувствовала через пару секунд "дискомфорт".
Весьма специфическая задача у автора стоит. Хотя помоему ничего не получится (по крайней мере в том виде как хочет автор)
Это примерно как идея кидать объект в противоположную сторону от той куда смотрит чар чтобы затормозить преследователей. 50 строк ненужного текста вместо 1 команды на хоткее.
PS мне не совсем понятно где на рисунке с стреляющий?
Re: Проверка на проходимость
Вот как я вижу ситуацию.
Ходим по вайпоинтам в лесу, если нашли цель - найти вектор до неё (мой скрипт возвращает тайлы, принадлежащие вектору). Сканировать тайлы на предмет проходимости, если хотя бы один не алё - прокладываем вектор от другой точки. Если все тайлы алё - идём на точку и стреляем пока: цель не умрёт, цель не приблизится, не умрёт чар, вектор до цели - не алё.
Начинать искать вектор следует подальше от цели, чтобы было время сделать пару выстрелов. Сканирование можно проводить из хайда, чтобы цель не выпендривалась.
Ходим по вайпоинтам в лесу, если нашли цель - найти вектор до неё (мой скрипт возвращает тайлы, принадлежащие вектору). Сканировать тайлы на предмет проходимости, если хотя бы один не алё - прокладываем вектор от другой точки. Если все тайлы алё - идём на точку и стреляем пока: цель не умрёт, цель не приблизится, не умрёт чар, вектор до цели - не алё.
Начинать искать вектор следует подальше от цели, чтобы было время сделать пару выстрелов. Сканирование можно проводить из хайда, чтобы цель не выпендривалась.
Re: Проверка на проходимость
Разумно будет вывести сканирование в отдельный поток.
Чем сложнее задача - тем она интереснее. Если получится - будет бот-охотник). Тут даже всякие сверхсложные ходилки отдыхают.
Чем сложнее задача - тем она интереснее. Если получится - будет бот-охотник). Тут даже всякие сверхсложные ходилки отдыхают.
Re: Проверка на проходимость
Видимо не выспался вчера. Только что понял, что скрипт может вернуть не тайлы на векторе, а тайлы на векторе + лишнии тайлы