Page 1 of 6

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

Posted: 2011-06-02 10:52:43
by Tiger1989
Хочу просканировать тайлы вокруг чара в радиусе допустим на 18 тайлов на проходимость, но незнаю как это лучше реализовать.

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

Posted: 2011-06-02 13:53:56
by Mirage
если выразиться математически то степень геморойности стремиться к невозможности :?

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

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

Posted: 2011-06-02 14:40:42
by ZeroDX
Самое простое - пешком)
Что нибудь вроде

Code: Select all

If Walker(x,y,0) then
  UO.SetGlobal(str(x) + ',' + str(y), 'ok')
Endif

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

Posted: 2011-06-02 14:50:37
by Mirage
От блин я чето стормозил :(

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

Posted: 2011-06-02 15:19:19
by ZeroDX
Но не факт, что самое быстрое

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

Posted: 2011-06-02 16:00:29
by Tiger1989
Нет такие громадные массивы не нужны, дело будет в лесу, и я примерно знаю тайлы которые будут проходимы.

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

Posted: 2011-06-02 16:03:02
by Tiger1989
а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.

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

Posted: 2011-06-02 16:27:10
by ZeroDX
Tiger1989 wrote:а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.


Тогда тебе нужно сканировать тайл через UO.PrivateGetTile(), если дело в лесу, то на динамические объекты сканировать не надо (если только кто-нить не залокает какой-нить маркет-стоун в лесу).

PS точно не помню, но вроде как в ASM'ме была команда, возвращавшая номер тайла

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

Posted: 2011-06-02 18:22:16
by Tiger1989
Я примерно понял как эту проверку реализовать, теперь мне надо выбрать траекторию выстрела в цель, дело в том, что надо учитывать деревья и выбирать подходящую траекторию, а как не знаю
Image
Не совсем как в игре но все же примерно так выглядит

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

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

Posted: 2011-06-02 18:47:37
by ZeroDX
Есть вариант перебора всех возможных траекторий.Это долго, но и тут можно начинать искать с тех, что поближе. Так же это можно делать в отдельном потоке...

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

Posted: 2011-06-02 18:56:56
by ZeroDX
Начинать искать нужно с близжайших координат. Затем прочертить прямую, и сканировать все тайлы, на которых она располагается. Если препятствие следующие координаты. Да и продолжать поиск нужно от цели.

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

Posted: 2011-06-02 19:54:17
by ZeroDX
Tiger1989, есть какие-либо наработки?

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

Posted: 2011-06-02 21:22:01
by ZeroDX
Не так все было сложно...

Функция вернёт строку вида '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: Проверка на проходимость

Posted: 2011-06-02 23:51:51
by Tiger1989
Ой как всё не просто....)
завтра попробую что нибудь с ним сделать

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

Posted: 2011-06-03 09:13:56
by Tiger1989
Кстати стрела не всегда летит по прямой, это тоже надо учесть как нибудь...

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

Posted: 2011-06-03 09:56:15
by ZeroDX
учтено... :? Но и этого скрипта есть минусы

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

Posted: 2011-06-03 10:30:43
by Mirage
стрела летит всегда по прямой от точки А до точки Б. Другое дело точка Б может передвигаться после выпуска заклинания, но тут уже скриптом ничего не поделаешь. Так что надо рассчитывать положение точки Б в момент начала произнесения заклинания.
Нескромный вопрос - как вы высчитываете траекторию выстрела если
1) стрелять можно только по объекту а не в координату (лук, стрелка, фаерболл)
2) если в момент начала каста (среднее время 1-3 секунды) цель делает 1 шаг за препятствие - каст сбивается - причем с филзом - тратится мана.
3) уж если полетело то ему срать - у нас на шарде стрелка догоняла чара через полтора экрана через лес. То есть выстрел как лазер - лупануло моментально а уж цель почувствовала через пару секунд "дискомфорт".

Весьма специфическая задача у автора стоит. Хотя помоему ничего не получится (по крайней мере в том виде как хочет автор)
Это примерно как идея кидать объект в противоположную сторону от той куда смотрит чар чтобы затормозить преследователей. 50 строк ненужного текста вместо 1 команды на хоткее.

PS мне не совсем понятно где на рисунке с стреляющий?

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

Posted: 2011-06-03 10:47:52
by ZeroDX
Вот как я вижу ситуацию.

Ходим по вайпоинтам в лесу, если нашли цель - найти вектор до неё (мой скрипт возвращает тайлы, принадлежащие вектору). Сканировать тайлы на предмет проходимости, если хотя бы один не алё - прокладываем вектор от другой точки. Если все тайлы алё - идём на точку и стреляем пока: цель не умрёт, цель не приблизится, не умрёт чар, вектор до цели - не алё.

Начинать искать вектор следует подальше от цели, чтобы было время сделать пару выстрелов. Сканирование можно проводить из хайда, чтобы цель не выпендривалась.

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

Posted: 2011-06-03 10:50:38
by ZeroDX
Разумно будет вывести сканирование в отдельный поток.

Чем сложнее задача - тем она интереснее. Если получится - будет бот-охотник). Тут даже всякие сверхсложные ходилки отдыхают.

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

Posted: 2011-06-03 10:57:57
by ZeroDX
Видимо не выспался вчера. Только что понял, что скрипт может вернуть не тайлы на векторе, а тайлы на векторе + лишнии тайлы