Yoko

All sides of Injection
It is currently 2024-04-19 20:37:57

All times are UTC+02:00




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

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Нужно как-то по другому определять принадлежность точки. Есть у кого формулы? :roll: АВ = АС + ВС не подходит


Top
   
PostPosted: 2011-06-03 13:48:13 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Вот переделал. Теперь вроде верно находит траекторию. Если не лень, протестируйте пожалуйста. Я всего 1 раз проверил, а надо уходить.
Code:
sub test()
  var String = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('lastattack'), UO.GetY('lastattack')), i
  var Count = val(GetWord(String, 1))
  For i = 2 to Count * 2 + 1 step 2
    UO.MFGI('add', '1339', GetWord(String, i), GetWord(String, i + 1), UO.GetZ('self'), '0x0025', 'cave floor')
  Next
Endsub

sub ttt()
  var string = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('self') + 5, UO.GetY('self') + 2)
  UO.Print(string)
Endsub

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 A = starty - endy, B = endx - startx, C = startx * endy - starty * endx
  If IsInRange(A * x + B * y + C, -3, 3) then
    If IsInRange(x, startx, endx) then
      If IsInRange(y, starty, endy) then
        Return 1
      Endif
    Endif
  Endif
  Return 0
Endsub

Sub IsInRange(val, val1, val2)
  If val1 < val2 then
    If val <= val2 and val >= val1 then
      Return 1
     else
      Return 0
    Endif
   else
    If val <= val1 and val >= val2 then
      Return 1
     else
      Return 0
    Endif
  Endif
Endsub

Sub Absolute(val)
  If val > 0 then
    Return val
   else
    Return -val
  Endif
Endsub

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


Last edited by ZeroDX on 2011-06-20 12:41:07, edited 1 time in total.

Top
   
PostPosted: 2011-06-03 16:46:54 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Вот что выдаёт
Image Image Image Image

нолик - чар
крестик - цель
желтым цветом выделены тайлы, которые по мнению скрипта следует проверить на проходимость.

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

В общем прошу помощи. Нужно проверить будет ли стрелять или нет.


Top
   
PostPosted: 2011-06-03 20:40:32 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Не стреляет!


Top
   
PostPosted: 2011-06-04 17:04:33 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Смог добиться только утолщение траектории.
Image Image Image Image Image

Вопрос к спецам: Как сфера просчитывает траекторию? По какой формуле?


Last edited by ZeroDX on 2011-06-21 11:26:08, edited 1 time in total.

Top
   
PostPosted: 2011-06-05 09:36:32 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
вот как ты нарисовал в последнем случае - так и считает.
Диагональные тайлы считаются не проходимыми если рассматривать как в шахматах ходит "слон"
соответственно карткинки
Image
и
Image
считаются не проходимыми (не простреливаемыми) если в белых клетках находятся объекты.
Обязательна должна быть буква "ЗЮ" как на последнем твоем рисунке.

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


Top
   
PostPosted: 2011-06-05 15:44:34 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Знать бы ещё как это в формулу вывести


Top
   
PostPosted: 2011-06-05 18:47:36 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Если откинуть математические изыскания что конкретно ты хочешь получить от скрипта?

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


Top
   
PostPosted: 2011-06-05 19:09:16 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Просто закинуть в функцию (х,у) точки а, (х,у) точки в, а в ответ тайлы, на которых не должно быть препятствий для выстрела.


Top
   
PostPosted: 2011-06-06 00:35:52 
Offline

Joined: 2010-06-19 22:59:51
Posts: 35
Зеро молодец какую работу проделал респект


Top
   
PostPosted: 2011-06-06 02:13:21 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Так я же ни чего не сделал, а то что сделал работает.... :roll: некорректно.


Top
   
PostPosted: 2011-06-06 08:12:34 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Не хочу нарушать процесс скриптования но немного оффтопа по теме должен написать.

Если скрипт рассматривать как "полезную теоретическую возможность инжекта" которую можно использовать в векторной геометрии то скрипт несомненно правильный и достойный быть прикрепленным когда родится окончательный вариант.
К сожалению того практического применения в игре которого от него хотет автор темы скрипт иметь не будет. Объясню почему.
Если брать скрипт для простого стреляния - стоит или не стоит стрелять. Существует более простой вариант скрипта.
Code:
Атака цели при условии определенной дистанции
Если у жертвы не уменьшаются жизни определенное время или жертва пропадает из зоны видимости
атака прекращается

Если брать скрипт как плацдарм для поиска оптимального ПРОХОДИМОГО пути то подумайте вот над чем.
Существуют тайлы на которые игрок вступить не может причем они имеют 0 "тип", ГМ может (и ОЧЕНЬ ЧАСТО ДЕЛАЕТ) расставить невидимые для игрока предметы. А невидимый предмет не видится не только игроком но и инжектом. Некоторые объукты мира (каменные панели, ковры, паркет и ламинат) которые размещают ГМы легко могут находится как на проходимых тайлах так и на непроходимых. А по ним ходить можно.
Так что идея поиска пути это как построение коммунизма. Прекрасно в своем недостижении.

PS мое мнение которое может быть ошибочным ;)

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


Top
   
PostPosted: 2011-06-06 09:58:12 
Offline
User avatar

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

то хочется сделать более изящное решение)


Top
   
PostPosted: 2011-06-06 14:57:16 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Возьмите сервер с открытым исходным кодом и посмотрите...


Top
   
PostPosted: 2011-06-06 17:01:57 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Йа в этом ламер :roll:
Ждем решения. :mrgreen:

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


Top
   
PostPosted: 2011-06-06 17:23:49 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Поискал исходники сферы... не нашёл.


Top
   
PostPosted: 2011-06-06 22:00:59 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Дали мне Line of sight system. Сразу проблемма, он на С++ или С (не разбираюсь, не программист я).

Если у кого есть знания + свободное время + желание оказать помощь, прошу сюда. Там вроде как с проверками и прочее, нужна только формула или алгоритм какой-нить.


Top
   
PostPosted: 2011-06-07 07:47:59 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
:) Есть POL, RunUO все с исходным кодом...

LOS в RunUO просто и наглядно рассчитывается, знания С# не потребуются.

Основная задача построить список затронутых кубов (у нас же все таки трех мерное пространство:) ).
Строится вектор по двум заданным точкам, длинна этого вектора - длинна диагонали параллелепипеда, это очевидно:)

Приращение по каждой координате считается как координата вектора деленная на его длину.

Ну а дальше все очень просто, с погрешностью в 0.5 выбираются все кубы через которые проходит вектор, в образованном им параллелепипеде:)
Координаты кубов - целые числа.

Дальше все кубы проверяются не перекрываются ли они статикой, мультисами, и динамическими объектами.

Делается интересное допущение в зависимости от между чем рассчитывается видимость. Если расчет от Моба к поверхности, то к Z координате Моба прибавляется 14 (уровень глаз:) ), если между двумя Мобами, то прибавка по зрению у обоих (у слима глаза тоже на высоте 14%) ).


Top
   
PostPosted: 2011-06-07 09:48:34 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Только что заметил ссылку от ZeroDX:)

ZeroDX тебе привели версию самой OSI, а не Sphere, и то сервера который был выложен 98-99 году в месте с игрой:)

Поскольку LOS контролируется сервером, то и реализацию надо смотреть ближе к самой реализации именно конкретного сервера.


Top
   
PostPosted: 2011-06-20 13:19:28 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Code:
sub main()
   UO.Exec ('addobject target')
   while uo.targeting()
      wait(100)
   wend
   var string = VectorPoints(UO.GetX('self'), UO.GetY('self'), UO.GetX('target'), UO.GetY('target'))
   uo.textprint(string)
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(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) + ' ')
            UO.MFGI('add', '1339', x, y, UO.GetZ('self'))
         Endif
      Next
   Next
   Return (str(Amount) + Coordinates)
Endsub
Sub IsOnVector(x, y, startx, starty, endx, endy)
   var A = starty - endy, B = endx - startx, C = startx * endy - starty * endx
   If IsInRange(A * x + B * y + C, -3, 3) then
      If IsInRange(x, startx, endx) then
         If IsInRange(y, starty, endy) then
            Return 1
         Endif
      Endif
   Endif
   Return 0
Endsub
Sub IsInRange(val, val1, val2)
   If val1 < val2 then
      If val <= val2 and val >= val1 then
         Return 1
      else
         Return 0
      Endif
   else
      If val <= val1 and val >= val2 then
         Return 1
      else
         Return 0
      Endif
   Endif
Endsub
Sub Absolute(val)
   If val > 0 then
      Return val
   else
      Return -val
   Endif
Endsub
Sub GetWord(st, nom)
   var tmpst, i, dlin, kol = 0, start = 0
   dlin = len(st)
   For i = 0 to dlin - 1
      If mid(st, i, 1) == ' ' 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) == ' '
               i = i + 1
            Wend
            If kol == nom - 1 then
               start = i
            Endif
         Endif
      Endif
   Next
   tmpst = ''
   Return tmpst
Endsub


Если цель находится на одной Z с тобой то построит путь до неё.
Если не на одной Z - у меня 9 из 10 падает клиент.

PS Гдето был у меня косяк, теперь не падает но строит криво.

Видимо в мат формуле гдето неточность:

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


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 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 27 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