Yoko
http://forum.yoko.com.ua/

Cartography
http://forum.yoko.com.ua/viewtopic.php?f=15&t=10271
Page 1 of 1

Author:  Destruction [ 2006-12-02 20:10:06 ]
Post subject:  Cartography

Собственно скрипт - картография.

Что скрипт делает?
Скрипт бегает по городу, скупает карты, разрисовывает, выкидывает.
Что скрипт не делает?
Скрипт не реколится - это нарушает всю идею скрипта.

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

Author:  Destruction [ 2006-12-06 09:10:36 ]
Post subject: 

Ппц, наголосовали тут.. Говорю же нужны нормальные тестеры -)

Так, добавил реколы, ща поправлю первый пост.

К скрипту приложил начальную разметочку для шарда Dominaria. Для других не пойдёт, т.к. жётсок пробиваются ID, однако координаты mapmaker'ов могут пригодиться.

Обратите внимание, что реколы надо набивать вручную, а использовать хождение по обратному маршруту с реколами не получиться.

Author:  nerac [ 2007-01-20 11:25:25 ]
Post subject: 

У меня выскакивает ошибка в этом месте
Code:
Ôóíêöèÿ äëÿ ñêðèïòà êàðòîãðàôè (c) Destruction. 
; Ïðîâåðÿåò, äàííûå - êîîðäèíàòû ëè ýòî.
Sub Cart.isCoordinates( string )
if explode( string, " ", 0 ) then
   return true
endif
return false   
endsub


А именно тут
Code:
if explode( string, " ", 0 ) then

Author:  Destruction [ 2007-01-20 13:35:04 ]
Post subject: 

Идите вы в.. поиск, по названию ошибки.

Или потрудитесь прочитать сообщение полностью.

Author:  nerac [ 2007-01-22 20:54:39 ]
Post subject: 

Destruction wrote:
Идите вы в.. поиск, по названию ошибки.

Или потрудитесь прочитать сообщение полностью.


Ну, что помочь сложно чтоли???

Author:  Destruction [ 2007-01-23 03:49:30 ]
Post subject: 

Знаешь, если можно сидеть на вокзале и просить деньги - это не повод отказываться от хорошей работы.

Ничего так аналогия. Это я к тому, что иди работай, а не выпрашивай - ты вполне можешь сам решить эту проблему.

Author:  nerac [ 2007-01-23 18:04:22 ]
Post subject: 

Деструкт, если бы я мог я бы именно это и сделал, но я в скриптах практачески 0, пытаюсь разобраццо, но... И обращаюсь я в таких ситуациях когда действительно непонимаю что нужно сделать, хелп плЗ!

Author:  Destruction [ 2007-01-24 07:23:47 ]
Post subject: 

nerac wrote:
Деструкт, если бы я мог я бы именно это и сделал, но я в скриптах практачески 0, пытаюсь разобраццо, но... И обращаюсь я в таких ситуациях когда действительно непонимаю что нужно сделать, хелп плЗ!

Скрипты тут не причём.

Было бы не лень - ты бы попробывал как минимум поискать по ошибке.

Будешь продолжать флудить - закину твой айпишник админу, скажу, спамер :lol:

Прекращай ленится :!: :!: :!:

Author:  I'm [ 2007-02-05 12:38:24 ]
Post subject: 

Destruction. тыкай носом ты модератор.
nerac. все таки попробуй использовать поиск.

Тема Function not found — полезности
viewtopic.php?t=7379

Code:
Sub explode( string, pattern, num )
var i, counter = 0, entry = 0
for i=0 to strlen( string ) -1
   if mid( string, i, strlen( pattern ) )  == pattern then
      counter = counter + 1
      if num == counter-1 then
         return mid( string, entry, i-entry )
      endif
      entry = i + 1
   endif
next
if entry == 0 then
   return false
endif
return mid( string, entry, strlen(string)-entry )
endsub

Author:  nerac [ 2007-02-05 17:36:07 ]
Post subject: 

I'm wrote:
Destruction. тыкай носом ты модератор.
nerac. все таки попробуй использовать поиск.

Тема Function not found — полезности
viewtopic.php?t=7379

Code:
Sub explode( string, pattern, num )
var i, counter = 0, entry = 0
for i=0 to strlen( string ) -1
   if mid( string, i, strlen( pattern ) )  == pattern then
      counter = counter + 1
      if num == counter-1 then
         return mid( string, entry, i-entry )
      endif
      entry = i + 1
   endif
next
if entry == 0 then
   return false
endif
return mid( string, entry, strlen(string)-entry )
endsub


Спасибо, посмотрю!

Page 1 of 1 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/