Давно не проскакивало хороших скриптов с автопоиском деревий, а ведь это неплохой по-сути дела скрипт получается..
Я собственно говоря набросал вкратце:
Code:
#Lumbjacking с автопоиском деревий (c) Destruction, v1.0
var hatchet = "0x0F43"
Sub searchTree()
var i, x, y, t, stp, max_search = 24 ; максимальная дистанция для генерации координат.
var cx = uo.getX()
var cy = uo.getY()
for i = 1 to max_search
for x =-i to i
stp = 1
if not i == abs( x ) then
stp = abs( i ) * 2
endif
for y = -i to i step stp
if NOT uo.getGlobal( 't:' + str( x + cx ) + "," + str( y + cy ) ) == "empty" then
t = IsTreeTile( x + cx, y + cy )
if not t == false then
uo.setGlobal( "tree_x", str( x + cx ) )
uo.setGlobal( "tree_y", str( y + cy ) )
uo.setGlobal( "tree_t", str( t ) )
return false
else
uo.setGlobal( 't:' + str( x + cx ) + "," + str( y + cy ), 'empty' )
endif
endif
next
next
next
uo.print( "Found no tree, exit." )
uo.exec( "terminate autoLumber" )
return false
endsub
sub autoLumber()
searchTree()
doMineTree()
endsub
Sub doMineTree()
var x, y, t
var end = "appears immune|nothing here|reach this"
var try = "You put|fail"
repeat
x = val( uo.getGlobal( "tree_x" ) )
y = val( uo.getGlobal( "tree_y" ) )
t = val( uo.getGlobal( "tree_t" ) )
uo.setGlobal( 't:' + str( x ) + "," + str( y ), "empty" )
Walker( x, y, 1 )
uo.exec( "exec searchTree" )
repeat
if uo.waiting() then
uo.canceltarget()
endif
deljournal( try + "|" + end )
uo.waittargettile( str( t ), str( x ), str( y ), str( uo.getZ() ) )
uo.usetype( hatchet )
repeat
wait( 100 )
until uo.injournal( try + "|" + end )
until uo.injournal( end )
while uo.getGlobal( "tree_x" ) == str( x ) && uo.getGlobal( "tree_y" ) == str( y )
wait( 100 )
wend
until false
endsub
Sub deljournal( msg )
while uo.injournal( msg )
uo.setjournalline( uo.injournal( msg ) -1, '' )
wend
endsub
Sub IsTreeTile( x, y )
var i, tree_count = 20
DIM tree[ val( str( tree_count ) ) ]
tree[0] = 3274
tree[1] = 3275
tree[2] = 3276
tree[3] = 3277
tree[4] = 3280
tree[5] = 3283
tree[6] = 3286
tree[7] = 3289
tree[8] = 3291
tree[9] = 3292
tree[10] = 3294
tree[11] = 3295
tree[12] = 3296
tree[13] = 3299
tree[14] = 3302
tree[15] = 3394
tree[16] = 3395
tree[17] = 3417
tree[18] = 3440
tree[19] = 3461
for i = 0 to tree_count -1
if uo.privategettile( x, y, -1, tree[i], tree[i] ) then
return tree[i]
endif
next
return false
endsub
Для работы скрипта потребуется ходилка вида Walker( x, y, prec ), я использовал ходилку (c) Beyonder.
Собственно это лишь набросок, если сюда прикрутить пару-тройку рун, то получится может весьма симпатичная штука... Ну или можно прикрутить авторазметку массива для другого скрипта, который больше нравится
Описания нету, не писал..
У скрипта есть один минус перед скриптами с разметкой - я не придумал как корректно определить z-координату дерева, поэтому она не всегда верная получается, что не совсем порядочно.. Вернее определить её можно, но только после попытки вырубки.. вообще надо будет подумать..
Вкратце о работе скрипта: после запуска основной ф-ции autoLumber - скрипт начинает искать дерево в радиусе 24 тайлов (если его там не будет - будет весьма нехорошо...), найдя дерево - запускается ф-ция вырубки дерева, которая в первую очередь запускает процесс поиска следущего дерева в отдельном потоке и отправляется к дереву, подойдя к дереву - функция его вырубает до предела, если нужно - ждёт пока не будет найдено следущее дерево, как только следущее дерево найдено - функция вырубки начинается сначала.
PS: Т.к. это только набросок, то не найдя дерева - скрипт зациклится.. Вобщем дописывать под свои нужды
Ходилка (с) Beyonder -
viewtopic.php?p=66813#66813