Yoko
http://forum.yoko.com.ua/

Проверка на проходимость
http://forum.yoko.com.ua/viewtopic.php?f=20&t=16645
Page 1 of 6

Author:  Tiger1989 [ 2011-06-02 10:52:43 ]
Post subject:  Проверка на проходимость

Хочу просканировать тайлы вокруг чара в радиусе допустим на 18 тайлов на проходимость, но незнаю как это лучше реализовать.

Author:  Mirage [ 2011-06-02 13:53:56 ]
Post subject:  Re: Проверка на проходимость

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

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

Author:  ZeroDX [ 2011-06-02 14:40:42 ]
Post subject:  Re: Проверка на проходимость

Самое простое - пешком)
Что нибудь вроде
Code:
If Walker(x,y,0) then
  UO.SetGlobal(str(x) + ',' + str(y), 'ok')
Endif

Author:  Mirage [ 2011-06-02 14:50:37 ]
Post subject:  Re: Проверка на проходимость

От блин я чето стормозил :(

Author:  ZeroDX [ 2011-06-02 15:19:19 ]
Post subject:  Re: Проверка на проходимость

Но не факт, что самое быстрое

Author:  Tiger1989 [ 2011-06-02 16:00:29 ]
Post subject:  Re: Проверка на проходимость

Нет такие громадные массивы не нужны, дело будет в лесу, и я примерно знаю тайлы которые будут проходимы.

Author:  Tiger1989 [ 2011-06-02 16:03:02 ]
Post subject:  Re: Проверка на проходимость

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

Author:  ZeroDX [ 2011-06-02 16:27:10 ]
Post subject:  Re: Проверка на проходимость

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


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

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

Author:  Tiger1989 [ 2011-06-02 18:22:16 ]
Post subject:  Re: Проверка на проходимость

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

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

Author:  ZeroDX [ 2011-06-02 18:47:37 ]
Post subject:  Re: Проверка на проходимость

Есть вариант перебора всех возможных траекторий.Это долго, но и тут можно начинать искать с тех, что поближе. Так же это можно делать в отдельном потоке...

Author:  ZeroDX [ 2011-06-02 18:56:56 ]
Post subject:  Re: Проверка на проходимость

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

Author:  ZeroDX [ 2011-06-02 19:54:17 ]
Post subject:  Re: Проверка на проходимость

Tiger1989, есть какие-либо наработки?

Author:  ZeroDX [ 2011-06-02 21:22:01 ]
Post subject:  Re: Проверка на проходимость

Не так все было сложно...

Функция вернёт строку вида '3 1541 123 1541 122 1541 121'
3 - Количество точек, а дальше координаты x,y самих точек.

На мой взгляд наиболее удобно будет

Code:
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:
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() Дестракшена располагается в полезностях

Author:  Tiger1989 [ 2011-06-02 23:51:51 ]
Post subject:  Re: Проверка на проходимость

Ой как всё не просто....)
завтра попробую что нибудь с ним сделать

Author:  Tiger1989 [ 2011-06-03 09:13:56 ]
Post subject:  Re: Проверка на проходимость

Кстати стрела не всегда летит по прямой, это тоже надо учесть как нибудь...

Author:  ZeroDX [ 2011-06-03 09:56:15 ]
Post subject:  Re: Проверка на проходимость

учтено... :? Но и этого скрипта есть минусы

Author:  Mirage [ 2011-06-03 10:30:43 ]
Post subject:  Re: Проверка на проходимость

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

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

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

Author:  ZeroDX [ 2011-06-03 10:47:52 ]
Post subject:  Re: Проверка на проходимость

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

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

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

Author:  ZeroDX [ 2011-06-03 10:50:38 ]
Post subject:  Re: Проверка на проходимость

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

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

Author:  ZeroDX [ 2011-06-03 10:57:57 ]
Post subject:  Re: Проверка на проходимость

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

Page 1 of 6 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/