Собственно скрипт - картография.
Что скрипт делает?
Скрипт бегает по городу, скупает карты, разрисовывает, выкидывает.
Что скрипт не делает?
Скрипт не реколится - это нарушает всю идею скрипта.
Функции разметки маршрута для скрипта:
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: Скрипт протестировал, все заявленные функции работают.
|