Yoko

All sides of Injection
It is currently 2024-04-18 09:59:38

All times are UTC+02:00




Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 1 2 3 4 5 6
Author Message
PostPosted: 2011-11-12 00:23:32 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Опять же что будет за бот-охотник такой.

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

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

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

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

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

Остальное придумается по ходу написания (воскрешение, крафт луков стрел, ходьба по вейпоинтам итд). Но пока не будет стрельбы - все остальное писать бессмысленно :(


Top
   
PostPosted: 2011-11-12 06:46:23 
Offline

Joined: 2011-10-17 12:43:40
Posts: 6
Итак, по порядку.
Quote:
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

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

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

да

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

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

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

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

Upd: посмотрел внимательнее картинки в этом посте - все правильно - проверяется наличие препятствий в обоих угловых тайлах при диагональном шаге траектории. Препятствие только в одном из них простреливается без проблем.


Attachments:
2-2-4-8.jpg
2-2-4-8.jpg [ 146.25 KiB | Viewed 3587 times ]
optimizer_exe.zip [233.97 KiB]
Downloaded 133 times
optimizer_src.zip [12.91 KiB]
Downloaded 125 times
Top
   
PostPosted: 2011-12-12 20:39:37 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
А вот эта чья? х + 15, у + 10
Image
Code:
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


Top
   
PostPosted: 2011-12-13 17:41:51 
Offline

Joined: 2011-10-17 12:43:40
Posts: 6
Это сфера без AdvancedLOS. У нее очень характерная траектория.
Upd: картинка из одного моего предыдущего поста - почти один в один, но у тебя 0,0 - 11,16
Image
Кстати, в качестве рекламы - я добавил в стелсе проверку LoS для POL, RunUO и сферы :)


Top
   
PostPosted: 2011-12-13 21:14:05 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Нееее... У меня как раз вот так
var String = VectorPoints(UO.GetX(), UO.GetY(), UO.GetX() + 15, UO.GetY() + 10), i


Top
   
PostPosted: 2011-12-14 06:10:28 
Offline

Joined: 2011-10-17 12:43:40
Posts: 6
Да, действительно, невнимательно посмотрел. Дорисовал картинку зелеными плитками - на сфере получается вот такая траектория, ну в общем такая, как на предыдущем скрине.
А твоя траектория просто рассчитана, или проверена на практике?


Attachments:
los-sp.jpg
los-sp.jpg [ 56.23 KiB | Viewed 3525 times ]
Top
   
PostPosted: 2011-12-14 12:54:03 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Проверить такое мне не под силу, потому что чар так далеко не стреляет.


Top
   
PostPosted: 2011-12-14 13:31:53 
Offline

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

Но скажем стрелку кастует без проблем. А проверка los что для магии, что для стрельбы из лука одинаковая.


Top
   
PostPosted: 2011-12-14 15:29:23 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
коряво у меня расчитано - не кастует.
Покопался в сурсах твоей проги. Позаимствовал парочку решений, дабы ещё больше сократить код. Расччитывает также коряво, как и раньше, но хоть убей не вижу разницы.
Code:
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.

Top
   
PostPosted: 2011-12-14 16:42:03 
Offline

Joined: 2011-10-17 12:43:40
Posts: 6
Проблема тут - нужно брать целую часть после деления
Code:
      If ax / ay > 2 or ay / ax > 2 then
        If ax / ay > 2 then

Так рисует правильно
Code:
      If int(ax / ay) > 2 or int(ay / ax) > 2 then
        If int(ax / ay) > 2 then


Top
   
PostPosted: 2011-12-17 15:49:14 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Спасибо! Поправил в пред. посте


Top
   
PostPosted: 2015-11-10 18:47:11 
Offline
User avatar

Joined: 2012-12-15 12:03:25
Posts: 119
Location: C-Петербург
Интересна обратная задача - найти клетки, которые заслонены предметами и в которые противник не сможет попасть стрелой\кастом. С тем чтобы там спрятаться. )
Ну и - может ли инжа отрисовывать на этих клетках пометки?


Top
   
PostPosted: 2015-11-11 05:22:08 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
UO.MFGI
как раз и рисует то что ты хочешь там где ты хочешь. Проблема найти то что ты хочешь :)

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2015-11-11 19:18:47 
Offline
User avatar

Joined: 2012-12-15 12:03:25
Posts: 119
Location: C-Петербург
Не нашлось в поиске UO.MFG. :shock:
Что это такое?

Другая задача - куда нужно дропнуть предметы, чтобы перекрыться от кастов монстров. Тоже востребовано может быть )


Top
   
PostPosted: 2015-11-11 23:11:40 
Offline
User avatar

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

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

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

Насчет кидать взад - вот тут один из вариантов как можно исполнить

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2015-11-11 23:24:45 
Offline
User avatar

Joined: 2012-12-15 12:03:25
Posts: 119
Location: C-Петербург
Это круто! ) Буду посмотреть. А коды объектов где можно взять?
зы. И правда рисует!! :D


Top
   
PostPosted: 2015-11-12 19:40:16 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
InsideUO как вариант. Внизу Model №
Attachment:
Снимок.JPG
Снимок.JPG [ 47.63 KiB | Viewed 2796 times ]

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2015-11-12 19:56:44 
Offline
User avatar

Joined: 2012-12-15 12:03:25
Posts: 119
Location: C-Петербург
Mirage wrote:
InsideUO как вариант. ..

Спасибо!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 1 2 3 4 5 6

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 24 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited