В этом скрипте на догонялку если чар(догонялка) и чар(цель) окажутся на одной клетке(так сказать войдет в чара) то скрипт выключается, Вопрос...как сделать так чтобы даже, если цель забежит в чара(догонялка) скрипт не вырубался, а работал все время пока я сам не выключу работу скрипта?
sub chase()
If UO.Targeting() Then
UO.CancelTarget()
Endif
UO.Print( 'Please, choice of enemy:' )
UO.AddObject( 'enemy' )
While UO.Targeting()
wait(100)
Wend
If uo.getglobal('chase')=='On' then
uo.setglobal('chase',0)
uo.print(' !!! -= Chase Terminated =- !!! ')
uo.exec('Terminate chase')
else
uo.setglobal('chase','On')
uo.print(' !!! -= Chasing =- !!! ')
endif
VAR target
target = uo.getserial('enemy')
while not uo.dead() and target<>"" and uo.getdistance(target)
if UO.GetDistance(target)>1 then
uo.say('')
Chaser(target)
endif
wend
uo.setglobal('chase',0)
uo.print(' !!! -= Chasing ended =- !!! ')
end sub
;-----------------------------------------------------------------
sub Chaser(Target)
VAR dx, dy
While 1
If Target<>"" and uo.getdistance(target) and not uo.dead() Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
If UO.GetDistance(Target)<2 Then
return
Endif
else
Return
Endif
If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
UO.Press(40) ; DownArrow
Endif
If dx>0 AND dy<0 Then
UO.Press(39) ; RightArrow
Endif
If dx<0 AND dy>0 Then
UO.Press(37) ; LeftArrow
Endif
If dx<0 AND dy<0 Then
UO.Press(38) ; UpArrow
Endif
Endif
If dx<>0 AND dy==0 Then
If dx>0 Then
UO.Press(34) ; PgDown
Endif
If dx<0 Then
UO.Press(36) ; Home key
Endif
Endif
If dx==0 AND dy<>0 Then
If dy>0 Then
UO.Press(35) ; End
Endif
If dy<0 Then
UO.Press(33) ; PgUp
Endif
Endif
Wend
end sub
вот так не должен прекращать (опечатался) преследование
Правда непонятно зачем вводить цикл While 1... внизу
Вот так будет догонять любого кого укажешь.
sub chase()
VAR target
If UO.Targeting() Then
UO.CancelTarget()
Endif
UO.Print( 'Please, choice of enemy:' )
UO.AddObject( 'enemy' )
While UO.Targeting()
wait(100)
Wend
target = uo.getserial('enemy')
while not uo.dead() and target<>""
if UO.GetDistance(target)>1 then
Chaser(target)
endif
wait(100)
wend
end sub
Sub Chaser(Target)
VAR dx, dy
While uo.getdistance(target) >1
If Target<>"" and uo.getdistance(target) >1 and not uo.dead() Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
If UO.GetDistance(Target)<2 Then
return
Endif
else
Return
Endif
If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
UO.Press(40) ; DownArrow
Endif
If dx>0 AND dy<0 Then
UO.Press(39) ; RightArrow
Endif
If dx<0 AND dy>0 Then
UO.Press(37) ; LeftArrow
Endif
If dx<0 AND dy<0 Then
UO.Press(38) ; UpArrow
Endif
Endif
If dx<>0 AND dy==0 Then
If dx>0 Then
UO.Press(34) ; PgDown
Endif
If dx<0 Then
UO.Press(36) ; Home key
Endif
Endif
If dx==0 AND dy<>0 Then
If dy>0 Then
UO.Press(35) ; End
Endif
If dy<0 Then
UO.Press(33) ; PgUp
Endif
Endif
Wend
end sub
Last edited by Mirage on 2010-02-12 14:25:55, edited 1 time in total.
в чем по твоему я ошибся и что именно он просил?
При запуске скрипта чар указывает кого догонять и просто догоняет. Запуск скрипта производится забинденной командой "exec chase". Убивание скрипта производится забинденным на кнопку "say ,terminate all".
У него в скрипте была ошибка - цикл работал до тех пор пока дистанция была больше 1 я убрал условие.
У тебя в скрипте ошибка 2 работающих одновременно бесконечных цикла. Обнуление глобальных переменных тут не нужно в принципе.
ты бы проверил мой вариант сперва
Mirage wrote:в чем по твоему я ошибся и что именно он просил?
При запуске скрипта чар указывает кого догонять и просто догоняет. Запуск скрипта производится забинденной командой "exec chase". Убивание скрипта производится забинденным на кнопку "say ,terminate all".
У него в скрипте была ошибка - цикл работал до тех пор пока дистанция была больше 1 я убрал условие.
У тебя в скрипте ошибка 2 работающих одновременно бесконечных цикла. Обнуление глобальных переменных тут не нужно в принципе.
ты бы проверил мой вариант сперва
А, ну да, ты просто написал, что НЕ должен продолжать преследование, я поэтому не посмотрел твой скрипт =) Ну как бы не ошибка, что циклы бесконечные идут, все равно кнопкой убивает =) А глобалы да, убрать надо было мне.
Cори опечатался
Просто первый раз указал где ошибка была. Щаз поправил нормально чтобы работало и не было ничего лишнего.
PS Ходилка самая примитивная. Можно серьезнее прикрутить - будет даже в здания забегать и по леснице.
попробовал этот скрипт в действии, играю на шарде ФВарс, препятствия обходит, но такие как дома, например, если догоняемый стоит через дом на одной линии координат останавливает движение...но у меня вопрос другой, скажите, почему чар не бежит а топает пешком на этом скрипте???
sub RelPor()
var msg = 'fizzle', Time, Delay = 5, mx, my, ManaNeed = 10
If UO.Targeting() then
UO.CancelTarget()
Endif
UO.Print('Укажите на догоняемого персонажа')
UO.AddObject('obj_Enemy')
While UO.Targeting()
UO.CancelTarget()
Wend
While not UO.Dead() or not UO.Dead('obj_Enemy')
If UO.GetDistance('obj_Enemy') > 1 and UO.Mana >= ManaNeed then
mx = UO.GetX()
my = UO.GetY()
DelJournal(msg)
Time = UO.Timer()
UO.WaitTargetTile(-1, UO.GetX('obj_Enemy'), UO.GetY('obj_Enemy'), UO.GetZ('obj_Enemy'))
UO.Cast('Teleport')
Repeat
Wait(100)
Until UO.InJournal(msg) or Time + Delay * 10 < UO.Timer() or mx <> UO.GetX() or my <> UO.GetY()
else
Wait(100)
Endif
Wend
Endsub
Sub DelJournal(msg)
While UO.InJournal(msg)
UO.SetJournalLine(UO.InJournal(msg) - 1, '')
Wend
Endsub
sub RelPor()
var msg = 'fizzle', Time, Delay = 5, mx, my, ManaNeed = 10
If UO.Targeting() then
UO.CancelTarget()
Endif
UO.Print('Укажите на догоняемого персонажа')
UO.AddObject('obj_Enemy')
While UO.Targeting()
UO.CancelTarget()
Wend
While not UO.Dead() or not UO.Dead('obj_Enemy')
If UO.GetDistance('obj_Enemy') > 1 and UO.Mana >= ManaNeed then
mx = UO.GetX()
my = UO.GetY()
DelJournal(msg)
Time = UO.Timer()
UO.WaitTargetTile(-1, UO.GetX('obj_Enemy'), UO.GetY('obj_Enemy'), UO.GetZ('obj_Enemy'))
UO.Cast('Teleport')
Repeat
Wait(100)
Until UO.InJournal(msg) or Time + Delay * 10 < UO.Timer() or mx <> UO.GetX() or my <> UO.GetY()
else
Wait(100)
Endif
Wend
Endsub
Sub DelJournal(msg)
While UO.InJournal(msg)
UO.SetJournalLine(UO.InJournal(msg) - 1, '')
Wend
Endsub