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

Anything and all.

Moderators: Murderator+, Murderator

Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

Хочу просканировать тайлы вокруг чара в радиусе допустим на 18 тайлов на проходимость, но незнаю как это лучше реализовать.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

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

Post by Mirage »

если выразиться математически то степень геморойности стремиться к невозможности :?

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

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

Post by ZeroDX »

Самое простое - пешком)
Что нибудь вроде

Code: Select all

If Walker(x,y,0) then
  UO.SetGlobal(str(x) + ',' + str(y), 'ok')
Endif
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Но не факт, что самое быстрое
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

Нет такие громадные массивы не нужны, дело будет в лесу, и я примерно знаю тайлы которые будут проходимы.
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Tiger1989 wrote:а вообще я хочу реализовать скрипт, с помощью которого можно будет убивать в лесу цели из лука или магией, поэтому всё это мне нужно.


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

PS точно не помню, но вроде как в ASM'ме была команда, возвращавшая номер тайла
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

Я примерно понял как эту проверку реализовать, теперь мне надо выбрать траекторию выстрела в цель, дело в том, что надо учитывать деревья и выбирать подходящую траекторию, а как не знаю
Image
Не совсем как в игре но все же примерно так выглядит

Голубым цветом обозначена цель
Синим цветом обозначено препятствие
Красным цветом обозначена зона из которой цель не доступна для атаки
Зеленым цветом обозначена зона из которой цель доступна для атаки
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Есть вариант перебора всех возможных траекторий.Это долго, но и тут можно начинать искать с тех, что поближе. Так же это можно делать в отдельном потоке...
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Начинать искать нужно с близжайших координат. Затем прочертить прямую, и сканировать все тайлы, на которых она располагается. Если препятствие следующие координаты. Да и продолжать поиск нужно от цели.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Tiger1989, есть какие-либо наработки?
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post 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() Дестракшена располагается в полезностях
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

Ой как всё не просто....)
завтра попробую что нибудь с ним сделать
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

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

Post by Tiger1989 »

Кстати стрела не всегда летит по прямой, это тоже надо учесть как нибудь...
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

учтено... :? Но и этого скрипта есть минусы
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

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

Post by Mirage »

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

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

PS мне не совсем понятно где на рисунке с стреляющий?
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Вот как я вижу ситуацию.

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

Начинать искать вектор следует подальше от цели, чтобы было время сделать пару выстрелов. Сканирование можно проводить из хайда, чтобы цель не выпендривалась.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Разумно будет вывести сканирование в отдельный поток.

Чем сложнее задача - тем она интереснее. Если получится - будет бот-охотник). Тут даже всякие сверхсложные ходилки отдыхают.
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Видимо не выспался вчера. Только что понял, что скрипт может вернуть не тайлы на векторе, а тайлы на векторе + лишнии тайлы
Post Reply