Собственно скрипт - картография.
Что скрипт делает?
Скрипт бегает по городу, скупает карты, разрисовывает, выкидывает.
Что скрипт не делает?
Скрипт не реколится - это нарушает всю идею скрипта.
Функции разметки маршрута для скрипта:
Code:
sub Razmetka.Start()
uo.textopen()
uo.setglobal( "razmetka_id", "0" )
endsub
sub Razmetka.AddCoordinates()
var current = uo.getglobal( "razmetka_id" )
uo.textprint( 'path[' + current + '] = "' + str(uo.getX()) + ' ' + str(uo.getY()) + '"' )
uo.setglobal( "razmetka_id", str(val(current)+1) )
uo.print( "Координаты занесены в список" )
endsub
sub Razmetka.AddVendor()
var current = uo.getglobal( "razmetka_id" )
uo.addObject( "vendor" )
while uo.targeting()
wait(100)
wend
uo.textprint( 'path[' + current + '] = "'+uo.getserial('vendor')+'"' )
uo.setglobal( "razmetka_id", str(val(current)+1) )
uo.print( "Вендор занесён в список" )
endsub
sub Razmetka.AddDoor()
var current = uo.getglobal( "razmetka_id" )
uo.print( "Внимание! Дверь должна быть закрыта!" )
uo.addObject( "door" )
while uo.targeting()
wait(100)
wend
uo.textprint( 'path[' + current + '] = "'+uo.getserial('door')+':'+uo.getgraphic('door')+'"' )
uo.setglobal( "razmetka_id", str(val(current)+1) )
uo.print( "Дверь занесена в список" )
endsub
sub Razmetka.Back()
uo.setglobal( "razmetka_id", str(val(uo.getglobal( "razmetka_id" ))-1) )
uo.print( "Пункт разметки удалён" )
uo.print( "Внимание! В окне осталась лишняя строка" )
endsub
Т.к. бродилки не особо хорошо определяют, куда надо идти - то приходится размечать один маршрут по нескольким участкам, что достаточно кропотливое занятие, посему прилагается скрипт разметки.
Функции:
Razmetka.Start - следует запустить 1 раз перед началом разметки маршрута.
Razmetka.AddCoordinates - добавить в маршрут текущие координаты чара.
Razmetka.AddVendor - добавить в маршрут вендора (скрипт подойдёт к вендору, это следует учитывать).
Razmetka.AddDoor - добавить в скрипт разметки дверь.
Razmetka.Back - отменить последнее действие в маршруте, собственно из текстового окна информация никуда не денятся, будет лишь уменьшен счётчик.
Непосредственно скрипт (внимательно прочтите комментарии!):
Code:
; Cartography v1.1 (c) 2006, Destruction.
; для работы скрипта, необходимо создать байт лист с названием
; 'blank maps' и соответствующим содержанием -)
; так же рекомендуется включить в настройках UO
; опцию 'Show Names of Approaching Players', это позволит скрипту
; звать вендоров по имени, по умолчанию опция включена.
sub Cartography()
var x, y, i, path_length = 37 ; количество пунктов в списке
var door_id, door_type, debug = false ; режим отладки
var goback = false ; бежать обратно по указанному маршруту
DIM path[ val( str( path_length ) ) ]
; список пунктов по которым надо ходить вида:
; x y, например 1192 1668
; Если указать ID вендора - то скрипт подойдёт к нему и купит карты
; Так же можно указать ID двери, которую надо открыть, в виде:
; ID:TYPE, где это соответсвующие свойства двери в закрытом состоянии
; Кроме того, с версии 1.1 можно реколиться, для этого укажите переменную runebook
; Для рекола следует писать так:
; external,runebook,ID где ID - ID кнопки в рунбуке, по которой надо сделать рекол.
path[0] = "1414 1748"
path[1] = "0x000027FD"
path[2] = "1414 1748"
path[3] = "1422 1748"
path[4] = "0x4000FBE4:0x06AF"
path[5] = "1424 1748"
path[6] = "1434 1748"
path[7] = "1434 1761"
path[8] = "0x000252EB"
path[9] = "0x00019A9F"
path[10] = "1434 1757"
path[11] = "1434 1731"
path[12] = "1469 1731"
path[13] = "1484 1734"
path[14] = "1484 1744"
path[15] = "1480 1747"
path[16] = "0x4000FC4A:0x06AF"
path[17] = "1478 1747"
path[18] = "1476 1745"
path[19] = "1476 1743"
path[20] = "1473 1743"
path[21] = "0x00033F43"
path[22] = "external,runebook,7" ; x: 2211, y: 1116
path[23] = "0x0002CC4C"
path[24] = "external,runebook,8" ; x: 602 , y: 2281
path[25] = "0x00066656"
path[26] = "0x00010E75"
path[27] = "external,runebook,9" ; x: 3672, y: 2289
path[28] = "0x000627BF"
path[29] = "0x0000870D"
path[30] = "external,runebook,11"; x: 2085, y: 2854
path[31] = "0x00005EBD"
path[32] = "0x00063A75"
path[33] = "external,runebook,12"; x: 1450, y: 1662
path[34] = "0x00000DF5"
path[35] = "0x0001F458"
path[36] = "external,runebook,10"; x: 1413, y: 1748
repeat
; бежим туды -)
for i = 0 to path_length -1
if Cart.isID( path[ i ] ) then
x = uo.getX( path[ i ] )
y = uo.getY( path[ i ] )
if debug then
uo.print( "Иду в вендору: "+uo.getname(path[i])+"("+str(x)+","+str(y)+")" )
endif
Walker( x, y, 1 )
uo.buy( "blank maps", uo.getName( path[i] ) )
checklag()
endif
if Cart.isCoordinates( path[ i ] ) then
x = val( explode( path[ i ], " ", 0 ) )
y = val( explode( path[ i ], " ", 1 ) )
if debug then
uo.print( "Иду к координатам: "+str(x)+", "+str(y) )
endif
Walker( x, y, 0 )
endif
if Cart.isDoor( path[ i ] ) then
door_id = explode( path[ i ], ":", 0 )
door_type = explode( path[ i ], ":", 1 )
if debug then
uo.print( "Дверь: "+door_id )
endif
if uo.getGraphic( door_id ) == door_type then
if debug then
uo.print( "Дверь закрыта - открываю" )
endif
uo.useobject( door_id )
checklag()
if debug then
uo.print( "Открыл дверь" )
endif
endif
endif
if explode( path[ i ], ",", 0 ) == "external" then
; use external function
uo.setglobal( "cart.external", "true" )
uo.setglobal( "cart.value", explode( path[ i ], ",", 2 ) )
uo.exec( "exec Cart.External.runebook" )
while uo.getglobal( "cart.external" ) == "true"
wait(100)
wend
endif
craftMaps()
next
if goback then
; бежим обратно -)
for i = path_length-1 to 0 step -1
if Cart.isID( path[ i ] ) then
x = uo.getX( path[ i ] )
y = uo.getY( path[ i ] )
if debug then
uo.print( "Иду к вендору: "+uo.getname( path[ i ] ) + "("+str(x)+", "+str(y)+") - возврат" )
endif
Walker( x, y, 1 )
endif
if Cart.isCoordinates( path[ i ] ) then
x = val( explode( path[ i ], " ", 0 ) )
y = val( explode( path[ i ], " ", 1 ) )
if debug then
uo.print( "Иду к координатам: " + str(x)+", "+str(y) )
endif
Walker( x, y, 0 )
endif
if Cart.isDoor( path[ i ] ) then
door_id = explode( path[ i ], ":", 0 )
door_type = explode( path[ i ], ":", 1 )
uo.print( "Дверь:" + door_id )
if uo.getGraphic( door_id ) == door_type then
if debug then
uo.print( "Дверь закрыта - открываю" )
endif
uo.useobject( door_id )
checklag()
if debug then
uo.print( "Открыл дверь" )
endif
endif
endif
next
endif
until uo.skillval( "Cartography", 1 ) >= 1000
uo.closeuo()
endsub
Sub Cart.External.runebook()
var x = uo.getX(), y = uo.getY()
var runebook = "0x4000287E" ; Runebook ID
var rune = uo.getGlobal( "cart.value" )
repeat
while uo.mana < uo.int
uo.useskill( 'Meditation' )
wait(500)
wend
uo.recall( runebook, rune )
repeat
wait(100)
until uo.injournal( 'broke' ) || uo.getX() <> x || uo.getY() <> y
until uo.getX() <> x || uo.getY() <> y
uo.setglobal( "cart.external", "false" )
endsub
; Функция крафтит карты из бланк мапов, которые уже есть в бекпаке.
; При этом разрисованные карты выкидываются под ноги
Sub craftMaps()
var fail = "fail|trembling hand results" ; сообщение о неудачном крафте
var succ = "put the map" ; сообщение об удачном крафте
var blank_name = "a Blank Map" ; название чистой карты
var blank_type = "0x14EB" ; тип чистой карты
uo.findtype( blank_type, "-1" )
while uo.findcount()
uo.click( "finditem" )
checklag()
if uo.getname( "finditem" ) == blank_name then
deljournal( fail + "|" + succ )
uo.waitmenu( "What sort of map", "Detail Map" )
uo.useobject( "finditem" )
repeat
wait(100)
until uo.injournal( fail + "|" + succ )
else
uo.moveitem( "finditem", "0", "ground" )
checklag()
endif
uo.findtype( blank_type, "-1" )
wend
endsub
; Функция для скрипта картографи (c) Destruction.
; Проверяет, данные - дверь ли это.
Sub Cart.isDoor( string )
if explode( string, ":", 0 ) then
return true
endif
return false
endsub
; Функция для скрипта картографи (c) Destruction.
; Проверяет, данные - координаты ли это.
Sub Cart.isCoordinates( string )
if explode( string, " ", 0 ) then
return true
endif
return false
endsub
; Функция для скрипта картографи (c) Destruction.
; Проверяет, данные - ID ли это.
Sub Cart.isID( string )
if string[1] == "x" && strlen( string ) == 10 then
return true
endif
return false
endsub
Примечание: Скрипт требует ходилку вида Walker(x, y, prec). Кроме того используются базовые функции, которые можно найти в топике с соответствующим названием (Function not found - полезности).
PS: Скрипт протестировал, все заявленные функции работают.