Yoko

All sides of Injection
It is currently 2024-03-28 23:17:06

All times are UTC+02:00




Post new topic  Reply to topic  [ 10 posts ] 

Результаты тестирования скрипта
Работает 53%  53%  [ 10 ]
Не работает 47%  47%  [ 9 ]
Total votes: 19
Author Message
 Post subject: Cartography
PostPosted: 2006-12-02 20:10:06 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Собственно скрипт - картография.

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

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


Last edited by Destruction on 2006-12-06 09:20:19, edited 4 times in total.

Top
   
 Post subject:
PostPosted: 2006-12-06 09:10:36 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Ппц, наголосовали тут.. Говорю же нужны нормальные тестеры -)

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

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

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


Top
   
 Post subject:
PostPosted: 2007-01-20 11:25:25 
Offline

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


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


Top
   
 Post subject:
PostPosted: 2007-01-20 13:35:04 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Идите вы в.. поиск, по названию ошибки.

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


Top
   
 Post subject:
PostPosted: 2007-01-22 20:54:39 
Offline

Joined: 2006-06-16 14:43:25
Posts: 34
Destruction wrote:
Идите вы в.. поиск, по названию ошибки.

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


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


Top
   
 Post subject:
PostPosted: 2007-01-23 03:49:30 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Знаешь, если можно сидеть на вокзале и просить деньги - это не повод отказываться от хорошей работы.

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


Top
   
 Post subject:
PostPosted: 2007-01-23 18:04:22 
Offline

Joined: 2006-06-16 14:43:25
Posts: 34
Деструкт, если бы я мог я бы именно это и сделал, но я в скриптах практачески 0, пытаюсь разобраццо, но... И обращаюсь я в таких ситуациях когда действительно непонимаю что нужно сделать, хелп плЗ!


Top
   
 Post subject:
PostPosted: 2007-01-24 07:23:47 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
nerac wrote:
Деструкт, если бы я мог я бы именно это и сделал, но я в скриптах практачески 0, пытаюсь разобраццо, но... И обращаюсь я в таких ситуациях когда действительно непонимаю что нужно сделать, хелп плЗ!

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

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

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

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


Top
   
 Post subject:
PostPosted: 2007-02-05 12:38:24 
Offline
Expert!
User avatar

Joined: 2004-10-15 22:38:04
Posts: 1396
Location: Moscow City.
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

_________________
The End.


Top
   
 Post subject:
PostPosted: 2007-02-05 17:36:07 
Offline

Joined: 2006-06-16 14:43:25
Posts: 34
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


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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 10 posts ] 

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited