Сделал, если все правильно понял то должна работать, только теперь весь скрипт это Walker(GoX, GoY, Prec) так что если значение Prec у тебя задавалось где-то отдельно, убери это. Не тестил. Так же я подумал что until not mapout.next() значит идти пока не прийдем к заданым координатам, а это конечные координаты без учета Prec, если правильно понял то Prec будет учтен, если нет - переделаю как надо когда обьяснишь что не так
Code:
sub Walker(GoX, GoY, Prec)
var i, gr="", endwalk, button, DistanceX, DistanceY, StartDir, StartX, StartY, EndDir, timer
var steptimer = 200 ; Таймер на шаг
var mapout=PathFind(UOPath,PathMap,uo.getz(),PathAlg,ScreenPath)
var x=uo.getx() #От куда начинаем путь по X
var y=uo.gety() #От куда начинаем путь по Y
var ChestX=1773 #Куда идем по X
var ChestY=3096 #Куда идем по Y
if CheckUOObject then
var dx = Abs(x-ChestX)
var dy = Abs(y-ChestY)
if dx<dy then #Получим наибольшее значение дистанции до объекта
dx=dy
endif
if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
dx=dx+1
endif
dx=dx*2 #Максимальная дистанция поиска объектов для алгоритма = максимальная дистанция * 2
uo.set("finddistance",str(dx))
uo.findtype(-1,-1,"ground")
uo.ignorereset()
if uo.findcount() then #Поиск предметов на земле, пока не кончатся
repeat
gr=uo.getgraphic("finditem")
#Проверка на людей. Все живые объекты нужно исключить из списка. Проверка Z координаты, если не больше 10 то заносим в список
if gr<>"0x0190" and gr<>"0x0191" and abs(uo.getz("finditem")-uo.getz("self"))<10 then
mapout.addobj(gr,uo.getx("finditem"),uo.gety("finditem"))
end if
uo.ignore("finditem")
uo.findtype(-1,-1,"ground")
until not uo.findcount()
end if
uo.ignorereset()
end if
uo.print("Setup...")
mapout.Setup(x,y,ChestX,ChestY) #Запускаем алгоритм поиска
if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
uo.print("Путь вычислен!")
mapout.first() #Ставим указатель на первый элемент массива
endwalk = 0
DistanceX = str(uo.getx() - GoX)
DistanceY = str(uo.gety() - GoY)
if mapout.getx() == uo.getx() and mapout.gety() < uo.gety() then
button = 33
EndDir = 0
end if
if mapout.getx() > uo.getx() and mapout.gety() < uo.gety() then
button = 39
EndDir = 1
end if
if mapout.getx() > uo.getx() and mapout.gety() == uo.gety() then
button = 34
EndDir = 2
end if
if mapout.getx() > uo.getx() and mapout.gety() > uo.gety() then
button = 40
EndDir = 3
end if
if mapout.getx() == uo.getx() and mapout.gety() > uo.gety() then
button = 35
EndDir = 4
end if
if mapout.getx() < uo.getx() and mapout.gety() > uo.gety() then
button = 37
EndDir = 5
end if
if mapout.getx() < uo.getx() and mapout.gety() == uo.gety() then
button = 36
EndDir = 6
end if
if mapout.getx() < uo.getx() and mapout.gety() < uo.gety() then
button = 38
EndDir = 7
end if
if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
endwalk = 1
else
if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
endwalk = 1
end if
end if
repeat
if endwalk == 0 then
repeat
StartDir=UO.GetDir()
StartX=UO.GetX()
StartY=UO.GetY()
UO.Press(button)
timer = uo.timer() + steptimer
repeat
wait(10)
until StartDir <> EndDir or StartY <> UO.GetY() or StartX <> UO.GetX() or timer <= uo.timer()
if StartDir <> EndDir then
StartDir = EndDir
end if
DistanceX = str(uo.getx() - GoX)
DistanceY = str(uo.gety() - GoY)
if (DistanceX - Prec) <= Prec and (DistanceX - Prec) > (DistanceY - Prec) then
endwalk = 1
else
if (DistanceY - Prec) <= Prec and (DistanceY - Prec) > (DistanceX - Prec) then
endwalk = 1
end if
end if
until endwalk == 1 or (mapout.getx() == uo.getx() and mapout.gety() == uo.gety())
end if
until not mapout.next() or endwalk == 1 #Крутим цикл, пока массив не дойдет до конца
#Тут производим какие-то действия, добираем ресы из сундука или ресаемся...
mapout.last() #Устанавливаем указатель на последний элемент массива (он уже там, но малоли...)
repeat
#Тут делаем коррекцию ходьбы.
uo.print("X="+str(mapout.getx())+" Y="+str(mapout.gety()))
wait(10)
until not mapout.back() #Крутим цикл до начала вектора
else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
uo.print("Ошибка вычисления пути!")
end if
end sub
Sub Abs(i)
if i<0 then
i=i*(-1)
endif
return i
end sub