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

Anything and all.

Moderators: Murderator+, Murderator

ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Опять же что будет за бот-охотник такой.

Что касается стрельбы

Расчет траектории.
В функцию закидываются координаты цели и координаты позиции стрельбы. Она это все расчитывает и возвращает строку типа "а x1 у1 x2 y2... ", где а - кол-во тайлов.

Сканер тайлов
Вот тут косяк. 100% работоспособности скорее всего не будет (причина где-то в этой теме). В функцию закидывается строка с тайлами, скан, если все ок пусть вернет 1, если нет - координаты тайлов или 0.

Поиск новой позиции для стрельбы
Вот тут и пригодится хранение негодных для стрельбы тайлов. Если негодный тайл на отрезке - точка отстойная и надо искать получше (это надо вшить в "Расчет траектории").

Если все ок, выход на точку, стрельба (как последняя проверка на годность отрезка для дальнего боя). Ах да! Траектория должна быть максимально длинной, дабы не пришлось махать кочергой. Вообще трудностей будет очень много. Даже больше чем очень много.

Остальное придумается по ходу написания (воскрешение, крафт луков стрел, ходьба по вейпоинтам итд). Но пока не будет стрельбы - все остальное писать бессмысленно :(
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

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

Post by CFA81 »

Итак, по порядку.
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

На сферах разных версий проверка слегка отличается (с выключенным AdvancedLOS) - более старая (0.51) проверяет препятствия только на траектории. Более новая (я смотрел 0.57) проверяет также препятствия при диагональном шаге траектории (на картинке отмечены красными фиговинами), причем если препятствие есть только в одной из диагональных клеток, то все ок, если же в обоих то увы, fail.

а что за прога? Самописная?

да

Поясню, что в этих трех вариантах, чары стоят на одном и том же месте. Стреляет только если на желтых клетках нет препятствий и только при таких раскладах. четвертого не дано.

Попробуй вбить в программку координаты А(2 2 z) B(4 8 z) и сравнить с картинками с этого же поста с картинками.

И хотелось бы поглядень на сам расчёт в виде кода (понимаю только инжект(бэйсик???) и немного С++), если это конечно не государственная тайна

см выше, но если не стреляет при наличии препятствия на любой клетке, то вероятно проверяется отсутствие препятствия на любой угловой клетке, а не только на обоих сразу.
Картинку смотри ниже.
Это не государственная тайна, выкладываю исходники и скомпиленый экзешник. Писано все на делфи.

Upd: посмотрел внимательнее картинки в этом посте - все правильно - проверяется наличие препятствий в обоих угловых тайлах при диагональном шаге траектории. Препятствие только в одном из них простреливается без проблем.
Attachments
2-2-4-8.jpg
2-2-4-8.jpg (146.25 KiB) Viewed 4020 times
optimizer_exe.zip
(233.97 KiB) Downloaded 200 times
optimizer_src.zip
(12.91 KiB) Downloaded 189 times
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

А вот эта чья? х + 15, у + 10
Image

Code: Select all

sub test()
  var String = VectorPoints(UO.GetX(), UO.GetY(), UO.GetX() + 15, UO.GetY() + 10), i
  UO.Print(String)
  For i = 2 to GetWordAmount(String, ' ') step 2
    UO.MFGI('add', '1339', GetWord(String, i - 1, ' '), GetWord(String, i, ' '), UO.GetZ() + 20, '0x0025', 'cave floor')
  Next
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(sx, sy, ex, ey)
  var Coordinates = str(sx) + ' ' + str(sy) + ' ', dx, dy, ax, ay, a, b
  Repeat
    dx = sx - ex
    dy = sy - ey
    ax = Absolute(dx)
    ay = Absolute(dy)
    If dx == 0 or dy == 0 then
      a = 0
      b = 0
     else
      a = ax / ay
      b = ay / ax
    Endif
    If ax == 0 or ay == 0 or a > 2 or b > 2 then
      If ay == 0 or a > 2 then
        If dx > 0 then
          sx = sx - 1
         else
          sx = sx + 1
        Endif
      Endif
      If ax == 0 or b > 2 then
        If dy > 0 then
          sy = sy - 1
         else
          sy = sy + 1
        Endif
      Endif
     else
      If dy > 0 and dx < 0 then
        sx = sx + 1
        sy = sy - 1
      Endif
      If dy < 0 and dx > 0 then
        sx = sx - 1
        sy = sy + 1
      Endif
      If dy < 0 and dx < 0 then
        sx = sx + 1
        sy = sy + 1
      Endif
      If dy > 0 and dx > 0 then
        sx = sx - 1
        sy = sy - 1
      Endif
    Endif
    Coordinates = Coordinates + str(sx) + ' ' + str(sy) + ' '
    UO.Print(str(sx) + ' ' + str(sy))
    UO.Print(str(ax) + ' ' + str(ay))
  Until sx == ex and sy == ey
  Return Coordinates
Endsub

Sub GetWord(st, nom, div)
  var tmpst, i, dlin, kol = 0, start = 0
  dlin = len(st)
  For i = 0 to dlin - 1
    If mid(st, i, 1) == div 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) == div
          i = i + 1
        Wend
        If kol == nom - 1 then
          start = i
        Endif
      Endif
    Endif
  Next
  tmpst = ''
  Return tmpst
Endsub

Sub GetWordAmount(str, div)
  var i, Amount = 0
  For i = 0 to len(str) - 1
    If str[i] == div then
      Amount = Amount + 1
    Endif
  Next
  Return Amount
Endsub

Sub Absolute(val)
  If val < 0 then
    Return -val
   else
    Return val
  Endif
Endsub
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

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

Post by CFA81 »

Это сфера без AdvancedLOS. У нее очень характерная траектория.
Upd: картинка из одного моего предыдущего поста - почти один в один, но у тебя 0,0 - 11,16
Image
Кстати, в качестве рекламы - я добавил в стелсе проверку LoS для POL, RunUO и сферы :)
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Нееее... У меня как раз вот так
var String = VectorPoints(UO.GetX(), UO.GetY(), UO.GetX() + 15, UO.GetY() + 10), i
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

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

Post by CFA81 »

Да, действительно, невнимательно посмотрел. Дорисовал картинку зелеными плитками - на сфере получается вот такая траектория, ну в общем такая, как на предыдущем скрине.
А твоя траектория просто рассчитана, или проверена на практике?
Attachments
los-sp.jpg
los-sp.jpg (56.23 KiB) Viewed 3958 times
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Проверить такое мне не под силу, потому что чар так далеко не стреляет.
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

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

Post by CFA81 »

ZeroDX wrote:Проверить такое мне не под силу, потому что чар так далеко не стреляет.

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

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

Post by ZeroDX »

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

Code: Select all

sub test()
  var String = VectorPoints(UO.GetX(), UO.GetY(), UO.GetX() + 15, UO.GetY() + 10), i
  UO.Print(String)
  For i = 2 to GetWordAmount(String, ' ') step 2
    UO.MFGI('add', '1339', GetWord(String, i - 1, ' '), GetWord(String, i, ' '), UO.GetZ() + 1, '0x0025', 'cave floor')
  Next
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(sx, sy, ex, ey)
  var Coordinates = str(sx) + ' ' + str(sy) + ' ', dx, dy, ax, ay, slope
  Repeat
    dx = sx - ex
    dy = sy - ey
    ax = Absolute(dx)
    ay = Absolute(dy)
    If dx <> 0 and dy <> 0 then
      If int(ax / ay) > 2 or int(ay / ax) > 2 then
        If int(ax / ay) > 2 then
          slope = 'x'
         else
          slope = 'y'
        Endif
       else
        slope = 0
      Endif
     else
      slope = 1
    Endif
    If slope then
      If ay == 0 or slope == 'x' then
        sx = sx - Sing(dx)
      Endif
      If ax == 0 or slope == 'y' then
        sy = sy - Sing(dy)
      Endif
     else
      sx = sx - Sing(dx)
      sy = sy - Sing(dy)
    Endif
    Coordinates = Coordinates + str(sx) + ' ' + str(sy) + ' '
    UO.Print(str(sx) + ' ' + str(sy))
    UO.Print(str(ax) + ' ' + str(ay))
  Until sx == ex and sy == ey
  Return Coordinates
Endsub

Sub GetWord(st, nom, div)
  var tmpst, i, dlin, kol = 0, start = 0
  dlin = len(st)
  For i = 0 to dlin - 1
    If mid(st, i, 1) == div 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) == div
          i = i + 1
        Wend
        If kol == nom - 1 then
          start = i
        Endif
      Endif
    Endif
  Next
  tmpst = ''
  Return tmpst
Endsub

Sub GetWordAmount(str, div)
  var i, Amount = 0
  For i = 0 to len(str) - 1
    If str[i] == div then
      Amount = Amount + 1
    Endif
  Next
  Return Amount
Endsub

Sub Sing(val)
  If val < 0 then
    Return -1
   else
    Return 1
  Endif
Endsub

Sub Absolute(val)
  If val < 0 then
    Return -val
   else
    Return val
  Endif
Endsub
Last edited by ZeroDX on 2011-12-17 15:48:49, edited 1 time in total.
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

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

Post by CFA81 »

Проблема тут - нужно брать целую часть после деления

Code: Select all

      If ax / ay > 2 or ay / ax > 2 then
        If ax / ay > 2 then

Так рисует правильно

Code: Select all

      If int(ax / ay) > 2 or int(ay / ax) > 2 then
        If int(ax / ay) > 2 then
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

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

Post by ZeroDX »

Спасибо! Поправил в пред. посте
kobol
Posts: 119
Joined: 2012-12-15 12:03:25
Location: C-Петербург

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

Post by kobol »

Интересна обратная задача - найти клетки, которые заслонены предметами и в которые противник не сможет попасть стрелой\кастом. С тем чтобы там спрятаться. )
Ну и - может ли инжа отрисовывать на этих клетках пометки?
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

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

Post by Mirage »

UO.MFGI
как раз и рисует то что ты хочешь там где ты хочешь. Проблема найти то что ты хочешь :)
kobol
Posts: 119
Joined: 2012-12-15 12:03:25
Location: C-Петербург

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

Post by kobol »

Не нашлось в поиске UO.MFG. :shock:
Что это такое?

Другая задача - куда нужно дропнуть предметы, чтобы перекрыться от кастов монстров. Тоже востребовано может быть )
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

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

Post by Mirage »

uo.mfgi( 'add', объект, X, Y, Z ) ; нарисует только для чара ОСЯЗАЕМО какой то объект в координате XYZ
Если нарисуешь стену то сквозь неё не пройти но только твоему чару. Раньше так забирались на чужие заборы :)

uo.mfgi( 'add', '7847', X, Y, Z ) ; нарисует точку обозначающую респ как их видят ГМы
uo.mfgi( 'add', '6017', X, Y, Z ) ; нарисует плитку травы - удобно в шахте или на рыбалке

Примеры работы в скрипте выше и на скринах - красные плитки как раз нарисованы командой.

Насчет кидать взад - вот тут один из вариантов как можно исполнить
kobol
Posts: 119
Joined: 2012-12-15 12:03:25
Location: C-Петербург

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

Post by kobol »

Это круто! ) Буду посмотреть. А коды объектов где можно взять?
зы. И правда рисует!! :D
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

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

Post by Mirage »

InsideUO как вариант. Внизу Model №
Снимок.JPG
Снимок.JPG (47.63 KiB) Viewed 3229 times
kobol
Posts: 119
Joined: 2012-12-15 12:03:25
Location: C-Петербург

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

Post by kobol »

Mirage wrote:InsideUO как вариант. ..

Спасибо!
Post Reply