Script.dll + include
Moderators: Murderator+, Murderator
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
Не, не обязательно, просто без нее создавай путь, 4 параметра вместо 5.
Путь к картинкам нужен только чтоб можно было наглядно посмотреть, какой путь был выбран, были ли учтены игровые объекты (не статика игры) и т.д.
Путь к картинкам нужен только чтоб можно было наглядно посмотреть, какой путь был выбран, были ли учтены игровые объекты (не статика игры) и т.д.
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
Сделал, если все правильно понял то должна работать, только теперь весь скрипт это Walker(GoX, GoY, Prec) так что если значение Prec у тебя задавалось где-то отдельно, убери это. Не тестил. Так же я подумал что until not mapout.next() значит идти пока не прийдем к заданым координатам, а это конечные координаты без учета Prec, если правильно понял то Prec будет учтен, если нет - переделаю как надо когда обьяснишь что не так

Code: Select all
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
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
Попробовал включить ходилку, написало Setup... и всё. Проц 100% память сожрало так же всю, тормоза и ничего не деалет больше.
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
С координатами не намудрил?
Пока что, желательное расстояние не больше 100 тайлов. Простые прогулки от дерева к дереву, до сундука или от вендора к вендору.
Пока что, желательное расстояние не больше 100 тайлов. Простые прогулки от дерева к дереву, до сундука или от вендора к вендору.
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
Там было не более 10 тайлов и практически открытое пространство. Хотя я понял, я же сделал чтобы был как валкер GoX, GoY, Prec а у тебя координаты не из этого берет. Сейчас попробую сделать так как нужно 

Last edited by Incorrect User on 2013-06-24 19:57:19, edited 1 time in total.
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
оО такого явно не должно было случиться)
Сколько тестил и так и сяк - все норм.
Путь к мулам и т.п. проверь, все ли верно указано?
Сколько тестил и так и сяк - все норм.
Путь к мулам и т.п. проверь, все ли верно указано?
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
Вот теоретически рабочий вариант, теперь пишет Ошибка вычисления пути. Стою за 8 тайлов от точки назначения.
Code: Select all
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
if CheckUOObject then
var dx = Abs(x-GoX)
var dy = Abs(y-GoY)
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,GoX,GoY) #Запускаем алгоритм поиска
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
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
PathAlg поставь 1
Что ниже работает. Только что проверил и с учетом игровых объектов и без него.
Только путь к УО и т.п. надо глобально вывести.
Но это если на пути точно не встретятся преграды (ящик поставлят, непроходимый клиентом тайл и т.п.)
Что ниже работает. Только что проверил и с учетом игровых объектов и без него.
Только путь к УО и т.п. надо глобально вывести.
Но это если на пути точно не встретятся преграды (ящик поставлят, непроходимый клиентом тайл и т.п.)
Code: Select all
sub Walker(GoX, GoY)
var i, gr="", CheckUOObject=1
var mapout=PathFind('E:\Ultima Online',0,uo.getz(),1,'E:\UOPathScreens')
var x=uo.getx() #От куда начинаем путь по X
var y=uo.gety() #От куда начинаем путь по Y
if CheckUOObject then
var dx = Abs(x-GoX)
var dy = Abs(y-GoY)
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,GoX,GoY) #Запускаем алгоритм поиска
if mapout.Size() then #Если есть размер вектора пути - алгоритм успешно нашел путь
uo.print("Путь вычислен!")
mapout.first() #Ставим указатель на первый элемент массива
repeat
WalkTo(mapout.getx()-uo.getx(),mapout.gety()-uo.gety())
until not mapout.next() #Крутим цикл, пока массив не дойдет до конца
else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
uo.print("Ошибка вычисления пути!")
end if
end sub
Sub WalkTo(x,y)
var dly=400 #Задержка на перемещения
dim keys[8]
keys[0]=33
keys[1]=39
keys[2]=34
keys[3]=40
keys[4]=35
keys[5]=37
keys[6]=36
keys[7]=38
var key=GetDirTo(x,y)
if (key==-1) then
uo.print('Уже стоим на этой точке.')
return
endif
while (uo.getdir()<>key)
uo.press(keys[key])
wait(dly)
wend
uo.press(keys[key])
wait(dly)
end sub
Sub GetDirTo(dx,dy)
If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
return 3
Endif
If dx>0 AND dy<0 Then
return 1
Endif
If dx<0 AND dy>0 Then
return 5
Endif
If dx<0 AND dy<0 Then
return 7
Endif
Endif
If dx<>0 AND dy==0 Then
If dx>0 Then
return 2
Endif
If dx<0 Then
return 6
Endif
Endif
If dx==0 AND dy<>0 Then
If dy>0 Then
return 4
Endif
If dy<0 Then
return 0
Endif
Endif
return -1
end sub
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
В любых координатах такое происходит?
Дай координаты начала и конца пути
Дай координаты начала и конца пути
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
Все вычисляет нормально.
http://rghost.ru/46993405
Карта пути.
Проверь всетаки путь к папке с мулами еще раз.
http://rghost.ru/46993405
Карта пути.
Проверь всетаки путь к папке с мулами еще раз.
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
У тебя там препятствия? на картинке идет не на прямую а петлей.
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
Препятствий нет, алгоритм вычисления такой 
Не всегда находит самый короткий путь до точки, иногда петляет.

Не всегда находит самый короткий путь до точки, иногда петляет.
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
У меня так и не работает. А как он ищет путь что получается такой круг? Я всегда представлял ходилку проверкой тайлов перед собой, в направлении куда нужно идти, пройти столько сколько есть свободных чтобы не доходил 1 тайл до препятствия и искать обход. А у вас все как-то загадочно...
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
Этот 0 индекс http://ru.wikipedia.org/wiki/Волновой_алгоритм
Это 1 индекс http://ru.wikipedia.org/wiki/Алгоритм_поиска_A*
Как-то так) Если интересуют проги, откуда брал алгоритмы - напиши в личку.
Это 1 индекс http://ru.wikipedia.org/wiki/Алгоритм_поиска_A*
Как-то так) Если интересуют проги, откуда брал алгоритмы - напиши в личку.
-
- Posts: 949
- Joined: 2011-05-23 00:33:30
Re: Script.dll + include
В общем, кому нужно, скрипт типа Wlaker(x,y,prec). Проверить нет возможности.
А я наверное буду стелс пробовать крутить.
Code: Select all
var UOPath = "C:\UltimaOnline" #Путь к папке с *.mul файлами УО
var ScreenPath = "C:\Screens" #Путь к папке, куда сохранять скрины поиска пути
var PathAlg = 1 #Индекс алгоритма
var PathMap = 0 #Индекс карты
var CheckUOObject = 1 #Учитывать игровые объекты при поиске пути 0 - нет; 1 - да
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
if CheckUOObject then
var dx = Abs(x-GoX)
var dy = Abs(y-GoY)
if dx<dy then #Получим наибольшее значение дистанции до объекта
dx=dy
end if
if remain(dx,2) then #Если есть остаток от деления на 2, то прибавим 1
dx=dx+1
end if
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,GoX,GoY) #Запускаем алгоритм поиска
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(30)
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(30)
until not mapout.back() #Крутим цикл до начала вектора
else #Если нет размера вектора пути - путь не найден. Можно попробовать создать поиск с другим алгоритмом.
uo.print("Ошибка вычисления пути!")
end if
end sub
Sub Abs(i)
if i<0 then
i=i*(-1)
end if
return i
end sub
А я наверное буду стелс пробовать крутить.
-
- Posts: 820
- Joined: 2011-06-11 19:54:23
Re: Script.dll + include
UP! Теперь не крашит при тыке на Quit в мэйнгампе клиента.