Page 1 of 1

Автосмена вооружения

Posted: 2007-05-10 20:27:13
by ArNeithen
Суть идеи: скрипт непрерывно проверяет расстояние до противника и если тот подходит в упор - меняет лук на оружие ближнего боя.
Но (!) только если в руках экипирован лук в этот момент.

Я дошёл вот до этого:

Code: Select all

sub AutoChange()
while not uo.Dead()
UO.GetX('laststatus')
UO.GetY('laststatus')
if (UO.GetX('laststatus')-UO.GetX('self'))<2 or (UO.GetY('laststatus')-UO.GetY('self'))<2
and if UO.Equipt('Lhand','0x13B1')
then
UO.Exec("exec sword") ##[sub sword() - скрипт одевания меча и щита]
end if
wend
endsub


Был ещё вариант аналогичный, но через

Code: Select all

uo.GetDistance('laststatus')
...
 if uo.GetDistance('laststatus')<2



Ошибка выскакивает в строчке с if - очевидно, что так сравнивать нельзя...


Подскажите пожалуйста как правильно сделать?



.

Posted: 2007-05-10 21:30:56
by Rivory
Если я не ошибаюсь, надо юзать такую конструкцию

Code: Select all

str(uo.getX....
str(uo.getY...

в сравнениях, т.к. нам нужно число в сравнениях, а uo.getX передаёт чтото другое (в одной теме Дестракшен чтото такое обьяснял)

тоесть твой текст должен быть таким

Code: Select all

if (str(UO.GetX('laststatus'))-str(UO.GetX('self')))<2 or (str(UO.GetY('laststatus'))-str(UO.GetY('self')))<2 
and if UO.Equipt('Lhand','0x13B1')
then

Posted: 2007-05-10 21:34:51
by ArNeithen
Rivory wrote:Если я не ошибаюсь, надо юзать такую конструкцию

.....



То есть модификация в исходном виде:


Code: Select all

sub AutoChange()
while not uo.Dead()
str(UO.GetX('laststatus'))
str(UO.GetY('laststatus'))
if (str(UO.GetX('laststatus'))-str(UO.GetX('self')))<2 or (str(UO.GetY('laststatus'))-str(UO.GetY('self')))<2
and if UO.Equipt('Lhand','0x13B1')
then
UO.Exec("exec sword")
end if
wend
endsub



А всё равно parse error в стоке с if ...


.

Posted: 2007-05-10 22:39:01
by Nmy

Code: Select all

uo.getdistance([object])

Code: Select all

UO.Exec("exec sword") 

на

Code: Select all

uo.usetype('0x0000')


Code: Select all

if UO.Equipt('Lhand','0x13B1') 

здесь неправильно...

Code: Select all

sub main()
while 1
if uo.getdistance('lastattack') < 2 and uo.getlayer('_0x13B1')=="Rhand" then
uo.usetype('0x13FC')
end if
wait(250)
wend
end sub

Posted: 2007-05-11 07:46:42
by ArNeithen
Не проходит проверка

Code: Select all

uo.getlayer('0x13B1')=="Rhand"


Тест такой был:

Code: Select all

sub AutoChange() 
while 1
if uo.getlayer('0x13B1')=="Rhand" then
uo.usetype('0x13FC')
end if
wait(250)
wend
end sub


Ведь по идее в таком виде он должен вообще сразу менять оружие
если вдруг лук да окажется в руках, м? Не проходит... =/

Posted: 2007-05-11 08:22:51
by Nmy
возьми глаза в руки

Posted: 2007-05-11 09:23:44
by ArNeithen
Mr Nmy wrote:возьми глаза в руки


Если вы про

Code: Select all

uo.getlayer('_0x13B1')=="Rhand" 


То со слэшем тоже не работает...
Rhand или Lhand не влияет...

Posted: 2007-05-11 12:21:38
by Nmy
я тестил и у меня все работало
а зачем слеш нужен- зайди в хелпе, посмотри линк objects

обрати внимание

Code: Select all

if uo.getdistance('lastattack') < 2 and uo.getlayer('_0x13B1')=="Rhand" then 

если последний атакуемый в растояние меньше чем в 2 клетки и одет такой тип в руке, то переодевать то и то

Posted: 2007-05-11 12:42:56
by Destruction

Code: Select all

sub WeaponChanger()
var bow = "0x0000" ; тип лука
var chg = "0x0000" ; тип ближнего оружия
repeat
   if uo.getDistance( 'laststatus' ) < 2 && uo.getGraphic( uo.objatlayer( 'Rhand' ) ) == bow then
      uo.equipt( chg )
   endif
   wait( 100 )
until false
endsub

Posted: 2007-05-11 13:00:18
by ArNeithen
2Mr Nmy Ага, нашёл у себя ошибку ) Огромное спасибо, теперь всё работает. )
2Destruction За ваш вариант - отдельно, то что нужно ) Благодарю

Posted: 2007-05-12 01:20:11
by Destruction
ArNeithen wrote:2Mr Nmy Ага, нашёл у себя ошибку ) Огромное спасибо, теперь всё работает. )
2Destruction За ваш вариант - отдельно, то что нужно ) Благодарю

У меня пустой цикл был.. поправил :)