Описание: Чар копает в шахте брита, набрал вес - телепорт домой. Убили - пошел воскресился и опять копать. Добор регов присутствует. Короче вечная копка, запускайте скрипт и смело уезжайте в отпуск =)
Инструкция: Все, что от вас требуется, это поменять ID сундуков, и настроить телепорт по рунбуку, чтобы реколился по номерам ваших рун домой и в пещеру. Значит 1ую руну маркните где-то в районе 24 координаты из массива, а вторую в районе 50, это для того, чтобы чар не уперался в стену, т.к. ходилка тут хоть и хорошая, но не идеальная =) И еще, когда чар реколится домой, он делает 5 шагов вверх к сундуку, куда будет класть руду, и 5 шагов от сундука, когда все перемещения и проверки закончит. Советую зарядить рунбук на 100-200 зарядов.
Code: Select all
##############################################
############## ОСНОВНАЯ ЧАСТЬ ################
##############################################
sub main()
Var i, j, l
Dim x[58]
x[1] = 1278
x[2] = 1276
x[3] = 1274
x[4] = 1271
x[5] = 1269
x[6] = 1273
x[7] = 1275
x[8] = 1275
x[9] = 1275
x[10] = 1274
x[11] = 1273
x[12] = 1272
x[13] = 1271
x[14] = 1271
x[15] = 1268
x[16] = 1266
x[17] = 1265
x[18] = 1267
x[19] = 1265
x[20] = 1263
x[21] = 1260
x[22] = 1260
x[23] = 1258
x[24] = 1256
x[25] = 1255
x[26] = 1262
x[27] = 1260
x[28] = 1257
x[29] = 1261
x[30] = 1257
x[31] = 1260
x[32] = 1261
x[33] = 1261
x[34] = 1261
x[35] = 1261
x[36] = 1259
x[37] = 1255
x[38] = 1252
x[39] = 1253
x[40] = 1250
x[41] = 1249
x[42] = 1247
x[43] = 1245
x[44] = 1242
x[45] = 1240
x[46] = 1238
x[47] = 1235
x[48] = 1232
x[49] = 1232
x[50] = 1237
x[51] = 1241
x[52] = 1235
x[53] = 1234
x[54] = 1235
x[55] = 1232
x[56] = 1229
x[57] = 1227
x[58] = 1230
Dim y[58]
y[1] = 1217
y[2] = 1215
y[3] = 1213
y[4] = 1214
y[5] = 1212
y[6] = 1216
y[7] = 1218
y[8] = 1221
y[9] = 1223
y[10] = 1225
y[11] = 1223
y[12] = 1220
y[13] = 1224
y[14] = 1226
y[15] = 1225
y[16] = 1223
y[17] = 1220
y[18] = 1217
y[19] = 1215
y[20] = 1217
y[21] = 1221
y[22] = 1226
y[23] = 1228
y[24] = 1230 ##################
y[25] = 1232
y[26] = 1227
y[27] = 1230
y[28] = 1234
y[29] = 1234
y[30] = 1238
y[31] = 1239
y[32] = 1242
y[33] = 1244
y[34] = 1247
y[35] = 1250
y[36] = 1246
y[37] = 1245
y[38] = 1245
y[39] = 1242
y[40] = 1242
y[41] = 1246
y[42] = 1245
y[43] = 1242
y[44] = 1244
y[45] = 1246
y[46] = 1248
y[47] = 1247
y[48] = 1248
y[49] = 1251
y[50] = 1251
y[51] = 1254
y[52] = 1249
y[53] = 1256
y[54] = 1259
y[55] = 1260
y[56] = 1260
y[57] = 1257
y[58] = 1252
for i = 1 to 58
j = 0
l = 0
Walker(x[i],y[i],1)
if uo.life == 0 then
if i < 36 then
ress()
mine1()
wait(10000)
else
ress1()
mine2()
wait(10000)
end if
end if
if uo.weight>500 then
Home()
if uo.life == 0 then
if i < 36 then
ress()
mine1()
wait(10000)
else
ress1()
mine2()
wait(10000)
end if
else
wait(10000)
repeat
j = j + 1
uo.press(38)
wait(500)
until j > 4
wait(500)
pereklad2()
wait(500)
pereklad3()
wait(500)
CheckingItems()
wait(500)
repeat
uo.press(40)
wait(500)
l = l + 1
until l > 4
if i < 36 then
mine1()
wait(6000)
else
mine2()
wait(6000)
end if
hide()
end if
end if
Walker(x[i],y[i],1)
minround()
if i == 58 then
i = 0
mine1()
end if
Next
end sub
###############################################
############## ПЕРЕКЛАД РУДЫ ##################
###############################################
sub pereklad2()
VAR b
var Sunduk1 = 0x40034F27
DIM Ore[4]
Ore[0] = '0x19B7' #
Ore[1] = '0x19B8' #
Ore[2] = '0x19BA' #
Ore[3] = '0x19B9' #
uo.useobject(Sunduk1)
for b=0 to 3
if uo.count(Ore[b]) > 0 then
uo.findtype(Ore[b], '-1', 'backpack')
if uo.findcount() > 0 then
repeat
uo.moveitem('finditem', '0', Sunduk1)
wait(1000)
UO.FindType(Ore[b],'-1','backpack')
until not UO.FindCount()
else
uo.print('Нечего перемещать')
return
endif
endif
next
end sub
#######################################################
################# ПЕРЕКЛАД КАМНЕЙ #####################
#######################################################
sub pereklad3()
#****???*****#
# (C) Cooper
#****v1.0****#
var tovar = 0x136C
var istok = 0x40045286
var priem = 0x40058E8C
UO.FindType(tovar,'-1','backpack')
If UO.FindCount() > 0 then
repeat
UO.MoveItem('finditem', '0', priem)
wait(500)
UO.FindType(tovar,'-1','backpack')
until not UO.FindCount()
UO.Print('Все переложил')
else
UO.Print('Нечего перекладывать')
endif
end sub
########################################################
############# ТЕЛЕПОРТ ДОМОЙ ###########################
########################################################
sub Home()
UO.Recall('0x400482CD','1') ##### 1 номер слота ###
wait(70000)
end sub
########################################################
############# ТЕЛЕПОРТ В ПЕЩЕРУ 1 ########################
########################################################
sub mine1()
UO.Recall('0x400482CD','2') ;
end sub
########################################################
############# ТЕЛЕПОРТ В ПЕЩЕРУ 2 ########################
########################################################
sub mine2()
UO.Recall('0x400482CD','3') ;
end sub
########################################################
############# ТЕЛЕПОРТ В ПЕЩЕРУ 3 ########################
########################################################
sub mine3()
UO.Recall('0x400482CD','4') ; не трогать =)
end sub
########################################################
############# СЧЕТЧИК ШАГОВ ############################
########################################################
###UO.print("Точка номер "+str(i) +" Осталось еще обойти= " +str(58-i))###
########################################################
############# ВОСКРЕШАЕМСЯ 1 ###########################
########################################################
sub ress()
uo.WarMode(0)
Walker(1263,1226,1)
Walker(1261,1251,1)
Walker(1270,1254,1)
wait(500000)
uo.usefromground('0x0005')
wait(10000)
end sub
########################################################
############ ВОСКРЕШАЕМСЯ 2 ############################
########################################################
sub ress1()
uo.WarMode(0)
Walker(1239,1247,1)
Walker(1243,1245,1)
Walker(1258,1245,1)
Walker(1269,1255,1)
wait(500000)
uo.usefromground('0x0005')
wait(10000)
end sub
sub main5()
Walker(1260,1221,1)
end sub
#########################################################
################ КОПАЕМ #################################
#########################################################
sub minround()
VAR Kirka = '0x0E85' ;
VAR TileNum = '1339' ;
VAR x, y, t, k, a
VAR MaxTime = 100 ;
VAR ms1 = "There is nothing"
VAR ms2 = "You cannot mine"
VAR ms3 = "You put the"
VAR ms4 = "You loosen some rocks"
VAR ms5 = "reach that."
VAR ms6 = "Try mining"
VAR ms7 = "You have no"
VAR ms8 = "You must wait"
VAR ms9 = "Iron"
VAR ms10 = "Copper"
VAR ms11 = "Silver"
for y=0 to 2
for x=-2 to 2
k = 0
repeat
hide()
UO.DeleteJournal()
t = UO.Timer()
k = k + 1
wait(300)
UO.WaitTargetTile( 0, STR( UO.GetX() + x ), STR( UO.GetY() + y ), 0)
UO.UseType( Kirka )
repeat
wait(500)
until UO.InJournal(ms1) OR uo.dead() OR uo.life == 0 OR UO.InJournal(ms2) OR UO.InJournal(ms9) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR ((t + MaxTime) < UO.Timer())
until uo.life == 0 OR uo.dead() OR k > 25 OR UO.InJournal(ms9) OR UO.InJournal(ms10) OR UO.InJournal(ms11) OR ( NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) AND NOT UO.InJournal(ms9) AND NOT UO.InJournal(ms10))
next
next
end sub
#############################################################
##################### ПРЯЧЕМСЯ ##############################
#############################################################
sub hide()
if not uo.hidden() then
uo.WarMode(0)
uo.useskill('Hiding')
wait(4000)
end if
end sub
############################################################
############# ПЕРЕХОДНИК ###################################
############################################################
sub perexod()
UO.Exec('terminate main')
wait(1000)
uo.exec('exec main')
end sub
############################################################
################ ДОБОР РЕГОВ ###############################
############################################################
sub CheckingItems()
VAR b
VAR Sunduk1 = 0x4004D626 ######## ТИП СУНДУКА С РЕГАМИ ####
DIM Reg[3]
Reg[0] = '0x0F7A' #Black Pearl#
Reg[1] = '0x0F7B' #Bood Moss#
Reg[2] = '0x0F86' #Mandrake Root#
uo.useobject(Sunduk1)
for b = 0 to 2
if uo.count(Reg[b]) < 5 then
uo.findtype(Reg[b], '-1', Sunduk1)
if uo.findcount() > 0 then
uo.moveitem('finditem', '10')
wait(1000)
else
uo.print('Нет необходимого количества регов в сундуке')
return
endif
endif
next
end sub
########################################## ХОДИЛКА 3 ##########################
#var Prec=3 # Как близко следует подойти к цели (Precision)
#var MaxTraceDistance=15 # Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень #большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
#var Speed=2 # Длина шага. Сколько шагов делать за раз. Выше 3 ставить смысла нет. Тоесть тупое умножение шагов. Для ламбера #идеально 3, для майнинга - 1.
#var StepTimeOut=400 # Если уперлись в неопознанный обьект, сколько мсек ждать сдвига с места. Если по простому - таймаут #шага. Если поставить сильно маленькие, ходилка начнет трассировать пустые места.
#UO.SetGlobal("Logging","1") # - показывать отладочные сообщения.
#UO.SetGlobal("BlindWalk","0") # - не использовать проверку тайлов, а использовать ходьбу наощупь. Для майнинга ОБЯЗАТЕЛЬНО #ВКЛЮЧИТЬ.
#В функции IsPass, содержиться список проходимых тайлов.
#Walker(X,Y,Prec) - идем к цели с координатами X,Y. Возвращает 1 в случае успешного достижения цели, и 0 - при невозможном обходе (путь не найден)
#Tracer(StartDir,Direction) - трассировка 1 шага. Возвращает направление по которому получилось сдвинуться с места. StartDir #- направление последнего движения, Direction (-1 или +1) направление обхода. -1 - по часовой стрелке, +1 против часовой #стрелки. Направления скрипт использует личного формата:
#1 - влево вниз
#2 - вниз
#3 - вправо вниз
#4 - вправо
#5 - вправо вверх
#6 - вверх
#7 - влево вверх
#8 - влево
#Tracer(StartDir,Direction) - идеально подходит для рыбалки вдоль берега так как она будет обходить берег бесконечно (1 #запуск функции = 1 шаг обхода).
#####################################################
# WW W WW AA LL Kk KK EE EE RRR #
# WW W WW AA A LL Kk K EEE R R #
# WW W WW AA A LL KKK EEEEE R R #
# WW WW WW AAAA LL KKK EEE RRR #
# WWW WWW AA A LLLL KK Kk EE EE R RR #
####################################################
var MaxTraceDistance=10
var TraceLoopIncrease=7 #Увеличение MaxTraceDistance при исчерпании количества ходов
var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed=1
var StepTimeOut=500 #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга.
# Для ходьбы - 500+Ping
# Для бега/ходьбы на лошади - 300+Ping
# Бег на лошади - 150 + Ping
var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС.
var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
sub ttt()
walker(1165,1661,1)
end sub
Sub Walker(GoX,GoY,Prec)
UO.SetGlobal("Logging","0")
UO.SetGlobal("BlindWalk","0")
var LastDir
var MoveRes
var TracerCnt
UO.SetGlobal("GlobalGoX",str(GoX))
UO.SetGlobal("GlobalGoY",str(GoY))
while not IsEnd(GoX,GoY,Prec)
TracerCnt = MaxTraceDistance
repeat
LogInfo('Just walking')
LastDir=GoUntilHit(GoX,GoY,Prec)
if IsEnd(GoX,GoY,Prec) then
return 1
end if
LogInfo('Tracing')
MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt)
if TracerCnt > LimitTrace then
return 0
endif
TracerCnt = TracerCnt + TraceLoopIncrease
until MoveRes == 1
wend
return 1
end sub
Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace)
var LineX=UO.GetX()
var LineY=UO.GetY()
var CurDir=StartDir
var Direction=CountDirection(GoX,GoY,CurDir,Prec)
var StartX,StartY
var MovesDone=0
repeat
StartX=UO.GetX()
StartY=UO.GetY()
CurDir=Tracer(CurDir,Direction,Prec)
if (CurDir==GetDir(GoX,GoY,Prec)) then
return 1
endif
if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
return 1
end if
MovesDone=MovesDone+1
CurDir=AddToDir(CurDir,-Direction,Prec)
until MovesDone>MaxTrace
return 0
end sub
Sub CountDirection(GoX,GoY,StartDir,Prec)
var GoDir=GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
if GoDir<StartDir then
return -1
end if
if GoDir>StartDir then
return 1
end if
if Abs(MyX-GoX)>Abs(MyY-GoY) then
if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then
return -1
else
return 1
end if
else
if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then
return -1
else
return 1
end if
end if
end sub
Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec)
var x3,y3,x4,y4
x3=StartX
y3=StartY
x4=StartX+(XFromDir(Dir)-StartX)*Speed
y4=StartY+(YFromDir(Dir)-StartY)*Speed
return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
end sub
Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
if x1==x3 and y1==y3 then
return false
end if
var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1)
var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1)
if z1*z2>0 then
return false
else
LogInfo('Vector info:')
LogInfo('x1= '+str(x1))
LogInfo('y1= '+str(y1))
LogInfo('x2= '+str(x2))
LogInfo('y2= '+str(y2))
LogInfo('x3= '+str(x3))
LogInfo('y3= '+str(y3))
LogInfo('x4= '+str(x4))
LogInfo('y4= '+str(y4))
return true
end if
end sub
Sub IsDiap(X,X0,X1,Prec)
if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then
return true
end if
return false
end sub
Sub GoUntilHit(GoX,GoY,Prec)
var LastDir
LastDir=GetDir(GoX,GoY,Prec)
var CouldMove
repeat
LastDir=GetDir(GoX,GoY,Prec)
if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then
CouldMove=TryDir(LastDir,Prec)
end if
until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
return LastDir
end sub
Sub IsEnd(GoX,GoY,Prec)
if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
LogInfo('END FOUND')
return true
else
return false
end if
end sub
Sub GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
var DiffX=Abs(UO.GetX()-GoX)
var DiffY=Abs(UO.GetY()-GoY)
var GoDir=0
if (DiffX/(DiffY+0.1))>=2 then
if (MyX>GoX) then
GoDir=7
else
GoDir=3
end if
else
if (DiffY/(DiffX+0.1))>=2 then
if (MyY>GoY) then
GoDir=5
else
GoDir=1
end if
else
if (MyX>GoX) and (MyY>GoY) then
GoDir=6
else
if (MyX>GoX) and (MyY<GoY) then
GoDir=8
else
if (MyX<GoX) and (MyY>GoY) then
GoDir=4
else
if (MyX<GoX) and (MyY<GoY) then
GoDir=2
end if
end if
end if
end if
end if
end if
return GoDir
end sub
Sub Tracer(StartDir,Direction,Prec)
var CurDir=StartDir
var Result
repeat
Result=TryDir(CurDir,Prec)
if not Result then
CurDir=AddToDir(CurDir,Direction,Prec)
end if
until Result
return Result
end sub
Sub AddToDir(Dir,Cnt,Prec)
var NewDir=Dir
NewDir=NewDir+Cnt
while NewDir>8
NewDir=NewDir-8
wend
while NewDir<1
NewDir=NewDir+8
wend
return NewDir
end sub
Sub TryDir(Dir,Prec)
var BegX=UO.GetX() # Ia?aeuiia O
var BegY=UO.GetY() # Ia?aeuiia Y
var Counter=0
var GoX=BegX
var GoY=BegY
GoX=XFromDir(Dir)
GoY=YFromDir(Dir)
if not IsPass(GoX,GoY) then
LogInfo(str(GoX)+':'+str(GoY)+' is not passable')
return false
end if
return TurnAndGoDir(Dir,Prec)
end sub
Sub XFromDir(Dir)
if Dir==2 OR Dir==3 Or Dir==4 then
return (UO.GetX()+1)
end if
if Dir==6 OR Dir==7 Or Dir==8 then
return (UO.GetX()-1)
end if
return (UO.GetX())
end sub
Sub YFromDir(Dir)
if Dir==8 OR Dir==1 Or Dir==2 then
return (UO.GetY()+1)
end if
if Dir==4 OR Dir==5 Or Dir==6 then
return (UO.GetY()-1)
end if
return (UO.GetY())
end sub
Sub TurnAndGoDir(Dir,Prec)
var StartDir=GetDirToDir(UO.GetDir(),Prec)
var StartX=UO.GetX()
var StartY=UO.GetY()
var EndDir
var Counter=0
var TestCounter=CheckCnt
#Direction Test
repeat
Counter = 0
LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter))
PressDir(Dir)
repeat
EndDir=GetDirToDir(UO.GetDir(),Prec)
wait(DynamicPause)
Counter=Counter+1
until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
TestCounter = TestCounter - 1
LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter))
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
if Counter>=StepTimeOut/DynamicPause then
LogInfo('Direction timeout reached')
return 0
end if
#End direction Test
if StartY<>UO.GetY() or StartX<>UO.GetX() then
return Dir
end if
#Start Primary test
TestCounter=CheckCnt
repeat
GoDir(Dir,Prec)
Counter=0
repeat
wait(DynamicPause)
Counter=Counter+1
until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
TestCounter = TestCounter - 1
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
#End primary test
if Counter>=StepTimeOut/DynamicPause then
LogInfo('Step timeout reached')
return 0
else
return Dir
end if
end sub
Sub GetDirToDir(GotDir,Prec)
var ChangedDir=-GotDir
ChangedDir=AddToDir(ChangedDir,5,Prec)
return ChangedDir
end sub
Sub DirToInj(Dir)
dim Dirs[9]
Dirs[1]=1
Dirs[2]=2
Dirs[3]=3
Dirs[4]=6
Dirs[5]=9
Dirs[6]=8
Dirs[7]=7
Dirs[8]=4
return (Dirs[Dir])
end sub
Sub PressDir(Dir)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37
UO.Press(Dirs[Dir],1)
end sub
Sub GoDir(Dir,Prec)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37
var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX")))
var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
var GoDistance
if (DistanceX-Prec)<Speed then
GoDistance=DistanceX-Prec
else
if (DistanceY-Prec)<Speed then
GoDistance=DistanceY-Prec
else
GoDistance=Speed
endif
endif
UO.Press(Dirs[Dir],GoDistance)
end sub
Sub IsPass(X,Y)
if UO.GetGlobal("BlindWalk") then
return true
endif
dim Types[60]
Types[1]=3
Types[2]=25
Types[3]=51
Types[4]=63
Types[5]=113
Types[6]=140
Types[7]=172
Types[8]=219
Types[9]=232
Types[10]=235
Types[11]=239
Types[12]=243
Types[13]=248
Types[14]=251
Types[15]=264
Types[16]=267
Types[17]=282
Types[18]=289
Types[19]=321
Types[20]=379
Types[21]=420
Types[22]=440
Types[23]=476
Types[24]=499
Types[25]=513
Types[26]=542
Types[27]=578
Types[28]=586
Types[29]=622
Types[30]=700
Types[31]=804
Types[32]=1740
Types[33]=1758
Types[34]=1770
Types[35]=1779
Types[36]=1779
Types[37]=1881
Types[38]=1886
Types[39]=1801
Types[40]=1805
Types[41]=1813
Types[42]=1820
Types[43]=1831
Types[44]=1833
Types[45]=1843
Types[46]=1850
Types[47]=1873
Types[48]=1876
Types[49]=1885
Types[50]=1888
Types[51]=1946
Types[52]=1969
Types[53]=2500
Types[54]=2539
for var i=1 TO 53 STEP 2
if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
return true
end if
next
return false
end sub
Sub LogInfo(Line)
if not UO.GetGlobal("Logging")=="0" then
UO.TextOpen()
UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
end if
end sub
Sub Abs(X)
if X>0 then
return X
else
return (-X)
end if
end sub
########################################## КОНЕЦ ХОДИЛКИ 3 ##########################