Page 6 of 6
Re: Проверка на проходимость
Posted: 2011-11-12 00:23:32
by ZeroDX
Опять же что будет за бот-охотник такой.
Что касается стрельбы
Расчет траектории.В функцию закидываются координаты цели и координаты позиции стрельбы. Она это все расчитывает и возвращает строку типа "а x1 у1 x2 y2... ", где а - кол-во тайлов.
Сканер тайловВот тут косяк. 100% работоспособности скорее всего не будет (причина где-то в этой теме). В функцию закидывается строка с тайлами, скан, если все ок пусть вернет 1, если нет - координаты тайлов или 0.
Поиск новой позиции для стрельбыВот тут и пригодится хранение негодных для стрельбы тайлов. Если негодный тайл на отрезке - точка отстойная и надо искать получше (это надо вшить в "Расчет траектории").
Если все ок, выход на точку, стрельба (как последняя проверка на годность отрезка для дальнего боя). Ах да! Траектория должна быть максимально длинной, дабы не пришлось махать кочергой. Вообще трудностей будет очень много. Даже больше чем очень много.
Остальное придумается по ходу написания (воскрешение, крафт луков стрел, ходьба по вейпоинтам итд). Но пока не будет стрельбы - все остальное писать бессмысленно

Re: Проверка на проходимость
Posted: 2011-11-12 06:46:23
by CFA81
Итак, по порядку.
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.
На сферах разных версий проверка слегка отличается (с выключенным AdvancedLOS) - более старая (0.51) проверяет препятствия только на траектории. Более новая (я смотрел 0.57) проверяет также препятствия при диагональном шаге траектории (на картинке отмечены красными фиговинами), причем если препятствие есть только в одной из диагональных клеток, то все ок, если же в обоих то увы, fail.
а что за прога? Самописная?
да
Поясню, что в этих трех вариантах, чары стоят на одном и том же месте. Стреляет только если на желтых клетках нет препятствий и только при таких раскладах. четвертого не дано.
Попробуй вбить в программку координаты А(2 2 z) B(4 8 z) и сравнить с картинками с этого же поста с картинками.
И хотелось бы поглядень на сам расчёт в виде кода (понимаю только инжект(бэйсик???) и немного С++), если это конечно не государственная тайна
см выше, но если не стреляет при наличии препятствия на любой клетке, то вероятно проверяется отсутствие препятствия на любой угловой клетке, а не только на обоих сразу.
Картинку смотри ниже.
Это не государственная тайна, выкладываю исходники и скомпиленый экзешник. Писано все на делфи.
Upd: посмотрел внимательнее картинки в
этом посте - все правильно - проверяется наличие препятствий в обоих угловых тайлах при диагональном шаге траектории. Препятствие только в одном из них простреливается без проблем.
Re: Проверка на проходимость
Posted: 2011-12-12 20:39:37
by ZeroDX
А вот эта чья? х + 15, у + 10

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
Re: Проверка на проходимость
Posted: 2011-12-13 17:41:51
by CFA81
Это сфера без AdvancedLOS. У нее очень характерная траектория.
Upd: картинка из одного моего предыдущего поста - почти один в один, но у тебя 0,0 - 11,16

Кстати, в качестве рекламы - я добавил в стелсе проверку LoS для POL, RunUO и сферы

Re: Проверка на проходимость
Posted: 2011-12-13 21:14:05
by ZeroDX
Нееее... У меня как раз вот так
var String = VectorPoints(UO.GetX(), UO.GetY(), UO.GetX() + 15, UO.GetY() + 10), i
Re: Проверка на проходимость
Posted: 2011-12-14 06:10:28
by CFA81
Да, действительно, невнимательно посмотрел. Дорисовал картинку зелеными плитками - на сфере получается вот такая траектория, ну в общем такая, как на предыдущем скрине.
А твоя траектория просто рассчитана, или проверена на практике?
Re: Проверка на проходимость
Posted: 2011-12-14 12:54:03
by ZeroDX
Проверить такое мне не под силу, потому что чар так далеко не стреляет.
Re: Проверка на проходимость
Posted: 2011-12-14 13:31:53
by CFA81
ZeroDX wrote:Проверить такое мне не под силу, потому что чар так далеко не стреляет.
Но скажем стрелку кастует без проблем. А проверка los что для магии, что для стрельбы из лука одинаковая.
Re: Проверка на проходимость
Posted: 2011-12-14 15:29:23
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
Re: Проверка на проходимость
Posted: 2011-12-14 16:42:03
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
Re: Проверка на проходимость
Posted: 2011-12-17 15:49:14
by ZeroDX
Спасибо! Поправил в пред. посте
Re: Проверка на проходимость
Posted: 2015-11-10 18:47:11
by kobol
Интересна обратная задача - найти клетки, которые заслонены предметами и в которые противник не сможет попасть стрелой\кастом. С тем чтобы там спрятаться. )
Ну и - может ли инжа отрисовывать на этих клетках пометки?
Re: Проверка на проходимость
Posted: 2015-11-11 05:22:08
by Mirage
UO.MFGI
как раз и рисует то что ты хочешь там где ты хочешь. Проблема найти то что ты хочешь

Re: Проверка на проходимость
Posted: 2015-11-11 19:18:47
by kobol
Не нашлось в поиске UO.MFG.
Что это такое?
Другая задача - куда нужно дропнуть предметы, чтобы перекрыться от кастов монстров. Тоже востребовано может быть )
Re: Проверка на проходимость
Posted: 2015-11-11 23:11:40
by Mirage
uo.mfgi( 'add', объект, X, Y, Z ) ; нарисует
только для чара ОСЯЗАЕМО какой то объект в координате XYZ
Если нарисуешь стену то сквозь неё не пройти но только твоему чару. Раньше так забирались на чужие заборы
uo.mfgi( 'add', '7847', X, Y, Z ) ; нарисует точку обозначающую респ как их видят ГМы
uo.mfgi( 'add', '6017', X, Y, Z ) ; нарисует плитку травы - удобно в шахте или на рыбалке
Примеры работы в скрипте выше и на скринах - красные плитки как раз нарисованы командой.
Насчет кидать взад -
вот тут один из вариантов как можно исполнить
Re: Проверка на проходимость
Posted: 2015-11-11 23:24:45
by kobol
Это круто! ) Буду посмотреть. А коды объектов где можно взять?
зы. И правда рисует!!

Re: Проверка на проходимость
Posted: 2015-11-12 19:40:16
by Mirage
InsideUO как вариант. Внизу Model №

- Снимок.JPG (47.63 KiB) Viewed 3224 times
Re: Проверка на проходимость
Posted: 2015-11-12 19:56:44
by kobol
Mirage wrote:InsideUO как вариант. ..
Спасибо!