Page 1 of 2

Проблемка... думаю решаемая....

Posted: 2006-09-14 19:14:44
by comatoza
Здравствуйте, многоуважаемые...

начну с начала... играю в данное время на шарде Destiny of Middle-Earth
а ноги у моей проблемки растут оттуда, что для того чтобы использовать одну из абилок класса вор необходимо находиться строго за спиной у оппонента и смотреть с ним в одном направлении...

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

Описание: GetDistance •
Синтакс: number uo.GetDistance([object])
Тема: Команды скриптов Ключевые слова: uoscript, objhandling


--------------------------------------------------------------------------------

Возвращает параметр обьекта object (по умолчанию - персонажа игрока) - расстояние до обьекта, которое вычисляется как минимальное из расстояний по осям X и Y.


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

подскажите - как это сделать иначе?

есть у меня ышо версия с проверкой координат и направления взгляда...
но это 8 на (4(координаты чара и жертвы)+2(куда смотрит чар и жертва)) 48 проверок в секунду.... думаю будет лагать нереально....

ах да.... собственно примерно так выглядит то, что я наваял

Code: Select all

sub navodka()
 var dist, dir, myDir, i
 uo.addobject('my', '0x01380a8a')
 dist=uo.getdistance('zertva')
 dir=uo.getdir('zertva')
 mydir=uo.getDir('my')
 uo.getx('my')
 uo.gety('my')
 while  str(dist)<>1 AND str(dir)<>str(mydir)
  dist=uo.GetDistance('zertva')
  dir=uo.getdir('zertva')
  mydir=uo.getDir('my')
  wait(1)
 wend
 uo.waittargetobject('zertva')
 uo.msg('.ab 1')
end sub

заранее спасибо...

Posted: 2006-09-14 19:40:48
by DerMeister =)
Нифгига не понял что именно ты хочешь.

подскажите - как это сделать иначе?

Что именно "иначе"?
ЗЫ: Это просто убило:
while str(dist)<>1 AND str(dir)<>str(mydir)

Posted: 2006-09-14 19:49:26
by comatoza
DerMeister =) wrote:Нифгига не понял что именно ты хочешь.

подскажите - как это сделать иначе?

Что именно "иначе"?
ЗЫ: Это просто убило:
while str(dist)<>1 AND str(dir)<>str(mydir)


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

Posted: 2006-09-14 19:55:13
by DerMeister =)
Это гдеж у тебя числа то?
Если x - число, то str(x) - строка, а ты её пытаешься с числом 1 сравнить... У тебя условие (str(dist)<>1) выполняется всегда так как строка ВСЕГДА НЕравна числу (кроме нулевой строки и числа 0) :lol: ;)

Теперь насчёт твоего вопроса - всё очень просто, надо тока всять и написать по новой, а то то что у тебя это галиматья (без обид ;) ).
Будет время, раскину мозгами.

Posted: 2006-09-14 20:06:37
by comatoza
спасибо что объяснил :)
а то я думаю чего это он просто dir yне выводит по print а str(dir) выводит :)
а насчёт галиматьи... это первое что мне пришлось писать после возвращения к УО :)
кстати до миддлы играл на рессе был там такой вор nuDoBKa :)
ЗЫ програмистом не являюсь и никогда им себя не считал :)
но вот поломать голову люблю... и эта задачка засадила меня часов на 6 :)
будет возможность помоги :)
как я уже говорил - заранее спасибо :)

Posted: 2006-09-14 21:14:49
by DerMeister =)
Нужно маленькое уточнение - За спиной понятно, а вот количество возможных положений чё то не понятно... Вобщем, сколько возможных различных положений "за спиной"... ? наверно я плохо обьяснил... блин... говорила мама - читай книги. =_)

Posted: 2006-09-14 22:43:10
by comatoza
чётко за спиной....
т.е. тока так

я->ж->

<-ж<-я

ну и те же вариации вверх вниз и диагональные...

Posted: 2006-09-14 23:06:47
by DerMeister =)
comatoza wrote:чётко за спиной....
т.е. тока так

я->ж->

<-ж<-я

ну и те же вариации вверх вниз и диагональные...

Вот решение для диагональной "вариации" (взаимное расположение - на одной оси):

Code: Select all

Скрипт не рабочий!
sub main()
var en
uo.addobject('en') #добавляем врага
  while uo.targeting()
  wait(250)
  wend
while uo.getdir('en')<>uo.getdir() || (uo.getx('en')-uo.getx()<>getorient('x') && uo.gety('en')-uo.gety()<>getorient('y'))
#условие ожидания
wait(200) #Если не будет лагов, то можно и поменьше сделать
wend
uo.waittargetobject('en')
uo.msg('.ab 1')
end sub

sub getorient(axis)
#(c)Der, getorient() beta
var orient=999 #так надо
if axis=='x' then
  if uo.getdir()==9 then
  orient=-1
  endif
  if uo.getdir()==1 then
  orient=1
  endif
end if
if axis=='y' then
  if uo.getdir()==7 then
  orient=-1
  endif
  if uo.getdir()==3 then
  orient=1
  endif
end if
return orient
endsub


Вот что у меня получилось... я не тестил... Если не запустится или будет некорректно работать, то отпишись об этом (как можно подробнее).

ЗЫ: На "вариацию" "всех сторон света" нужно немножко переделать условие и процедуру getorient Но это уже завтра, счас я хочу спать. Вобщем, жду результатов теста.

-----------------------------------------------
Потестил, поговорил с умными людми... Понял, что это работать не может. =_(

Posted: 2006-09-14 23:44:30
by comatoza
работает....
задержка великовата.... но это исправимо :)

Posted: 2006-09-16 12:23:15
by Grin
ох ужас;)
уроки геометрии прошли даром?;) расчитать клетко за спиной подойти на нее...
дистанци проверить просто главное чтобы х и у лежали в пределах [0,1]
единстеное замечание только что GetDir и AddDir работают по разным направления

Posted: 2006-09-16 12:31:25
by DerMeister =)
Grin wrote:ох ужас;)
уроки геометрии прошли даром?;) расчитать клетко за спиной подойти на нее...
дистанци проверить просто главное чтобы х и у лежали в пределах [0,1]
единстеное замечание только что GetDir и AddDir работают по разным направления


Можно по подробней про по каждому пункту... Особенно по последнему ;)

Posted: 2006-09-16 14:48:54
by DerMeister =)
comatoza wrote:работает....
задержка великовата.... но это исправимо :)



Это работать не может. УЖоС ,а не скрипт...

Posted: 2006-09-16 16:10:33
by comatoza
DerMeister =) wrote:
comatoza wrote:работает....
задержка великовата.... но это исправимо :)



Это работать не может. УЖоС ,а не скрипт...


ужас не ужас... а кой что упростил в той версии в которой я тупо перебирал через if все варианты возможные :)

Posted: 2006-09-16 16:14:54
by DerMeister =)
Твоя задача реализуется очень просто. Если тебе интересно, то я, вернувшись с дачи, напишу "как надо". Еще, тебе может помочь Grin. Если оч. срочно, то к нему.

Posted: 2006-09-16 16:29:05
by comatoza
Grin wrote:ох ужас;)
уроки геометрии прошли даром?;) расчитать клетко за спиной подойти на нее...
дистанци проверить просто главное чтобы х и у лежали в пределах [0,1]
единстеное замечание только что GetDir и AddDir работают по разным направления

если я верно понял говорится о следующем....
должно выполняться условие:
((абсолютное значение от (координата Х жертвы минус координат Х чара) = 1 и абсолютное значение от (координата У жертвы минус координата У чара) = 0) или (абсолютное значение от (координата Х жертвы минус координат Х чара) = 0 и абсолютное значение от (координата У жертвы минус координата У чара) = 1)) И (направление взглядов совпадает)


по-моему так....
вот тока знание инжевской орфографии у меня слабовато.... как взять абсолютную величину?
с остальным сам справлюсь....

Posted: 2006-09-16 17:12:25
by comatoza
кстати :)
дальнейшая работа моего извращённого мозга подсказала ышо один тактический ход :)
но! для него мне требуется осуществить прицел в определённые координаты... и если Х,У,Z я вытащить смогу... то как вытащить tilenum? ф смысле не оставнавливаясь и вынимая его из текстового окна :)
т.е. допустим так:

Code: Select all

uo.infotile(x,y,z)
tilenu
uo.waittargettile(tilenum, x,y,z)

Posted: 2006-09-16 17:24:00
by Grin
Казалось бы что все что тебе нужно так это infotile
а дальше вот такой скриптик
uo.infotile()
while uo.targeting()
wait(100)
wend
Но так завелось, что это работать небудет;)
Но можно сделать другое змечание info как не страно также заполняет lasttile;)
поэтому делаем такое..
uo.info()
while uo.targeting()
wait(100)
wend
tilenum=uo.LastTile(0)
и тд
читай инфу про uo.LastTile

Posted: 2006-09-16 17:51:58
by comatoza
а ларчик просто открывался :)
пасибки :)

Posted: 2006-09-28 19:54:50
by comatoza

Code: Select all

sub navodka()
 var i, X, Y
 x=abs(uo.getx()-uo.getx('zertva'))
 y=abs(uo.gety()-uo.gety('zertva'))
 while not (x < 2 AND y < 2 AND uo.getdir()==uo.getdir('zertva'))
  wait(10)
 wend
 uo.waittargetobject('zertva')
 uo.msg('.ab 1')
end sub

получается вот такая бодяга, тока abs он не знает... а как иначе модуль взять?

Posted: 2006-09-28 21:13:57
by DerMeister =)
А чё, самому слабо процедуру написать?

Code: Select all

sub abs(x)
    if (x < 0) then
        x = -x
    end if
    return x
end sub