Решил я понять, как работает ходилка бьёндера. Посмотрел, ни чего не понял вообще, и решил написать свою (попроще), с таким же обходом. (туда 10 шагов, сюда 10 шагов). И спустя часок, в блокноте родилась вот такая вот ходячая беда. В общем тут несколько проблемм.
3) Закоментировов while в LegToIt и уперев в стену (которая было с противоположной от целевой точки стороны) добился обхода этой стены (вечного), но и тут меня ждал облом... При смене направления, он не делает шаг, а просто крутанется в сторону (но это решить можно дублированием UO.Press())
2) Runtime error
1) Определение направления. Вроде все правильно расставил, но зараза делает шаг в другую сторону.
Code: Select all
var Pause = 200, StepDelay = 500, MaximalBypassDistance = 10, Bypass = 0, Turn = 1
sub test()
If LegToIt(1527, 1778, 1) then
UO.Print('Success')
else
UO.Print('Fail')
Endif
Endif
Sub LegToIt(x, y, prec)
var BypassDistance = MaximalBypassDistance, Direction
While Absolute(UO.GetX() - x) >= prec or Absolute(UO.GetY() - y) >= prec
Direction = FindDirection(x, y)
If not AttemptDirection(Direction) then
If Bypass(Direction) then
Bypass = 0
MaximalBypassDistance = BypassDistance
else
Turn = -Turn
MaximalBypassDistance = MaximalBypassDistance * 2
If Bypass(Direction) then
Bypass = 0
MaximalBypassDistance = BypassDistance
else
Return 0
Endif
Endif
Endif
Wend
Return 1
Endsub
Sub Bypass(dir)
var NewDirection, StepOver = 0
Repeat
If Bypass >= MaximalBypassDistance then
Return 0
else
If AttemptDirection(dir) then
StepOver = 1
Bypass = Bypass + 1
else
NewDirection = ChangeRoute(dir)
Bypass(NewDirection)
Endif
Endif
Until StepOver == 1
Return 1
Endsub
Sub AttemptDirection(dir)
var StartX = UO.GetX(), StartY = UO.GetY(), Time
Time = UO.Timer()
Step(dir)
Repeat
Wait(50)
Until StartX <> UO.GetX() or StartY <> UO.GetY() or Time + StepDelay / 100 <= UO.Timer()
If StartX <> UO.GetX() or StartY <> UO.GetY() then
Return 1
else
Return 0
Endif
Endsub
Sub ChangeRoute(dir)
var NewDirection
NewDirection = dir + Turn
If NewDirection > 8 then
NewDirection = NewDirection - 8
Endif
If NewDirection < 1 then
NewDirection = NewDirection + 8
Endif
Step(NewDirection)
UO.Print('ChangeRoute ' + str(NewDirection))
Return NewDirection
Endsub
Sub Step(dir)
Dim Key[8]
Key[1] = 36
Key[2] = 38
Key[3] = 33
Key[4] = 39
Key[5] = 34
Key[6] = 40
Key[7] = 35
Key[8] = 37
UO.Press(Key[dir])
Wait(Pause)
Endsub
Sub FindDirection(x, y)
var Direction
If UO.GetX() < x and UO.GetY() < y then
Direction = 6
Endif
If UO.GetX() < x and UO.GetY() == y then
Direction = 5
Endif
If UO.GetX() < x and UO.GetY() > y then
Direction = 4
Endif
If UO.GetX() > x and UO.GetY() < y then
Direction = 8
Endif
If UO.GetX() > x and UO.GetY() == y then
Direction = 1
Endif
If UO.GetX() > x and UO.GetY() > y then
Direction = 2
Endif
If UO.GetX() == x and UO.GetY() < y then
Direction = 7
Endif
If UO.GetX() == x and UO.GetY() > y then
Direction = 3
Endif
UO.Print('FindDirection ' + str(Direction))
Return Direction
Endsub
Sub Absolute(val)
If val >= 0 then
Return val
else
Return -val
Endif
Endsub
В общем... Кто чем сможет
