Вроде что-то исправил, но есть некоторые моменты которые я не смог проверить. Не проверил ресалку, не было возможности, да и сомнения у меня что она будет работать, так как при появлении всяких криминальных элементов и ПК, ресалка вырубается. Еще есть момент с гейтом из шахты в Брит. Если в гейт можно рпойти только по двойному клику, то в скритпе в процедуре GoBrit() закомментирована строка:
Code:
UO.UseObject('') ;ID гейта из Минокской шахты в Брит.Раскомментируй ее и вставь ID гейта.
Так же чар не будет прятаться, потому что добыча руды и уход в хайд не синхронизированы.
Ну и сам скрипт:
Code:
################################################################
### Переменные #################################################
################################################################
###
### Для начала подготовится, положить в банк мешок(bag) и такой же в MageChest
### В мешки положить реги рекола Black Pearl, Mandrake Root, Blood Moss
### Самое главное выяснить Серийник банка!!!
### В банк положить руны к дому(одного типа!!! Тип рун в банке и в MageChest должны совпадать!!!)
### Положить в MageChest Руны в шахту(одного типа)
###
################################################################
################################################################
################################################################
var a, coord #, x, y - здесь они не нужны. , name - нигде не встречается.
var myXX, myYY, p = 0
var bagreg, Chest
### ID друзей для игнора при поиске ПК и Криминал (эти переменные лишние)
#var Charon='0x00324C05' #Этот скрипт друзьей нигде не игнорирует.
#var Buiok='0x000C430F' #Скрипт ищет всех и должен убегать от
#var friend3='0x001EEB63' #всех серых и ПК. (поэтому закомментировал)
var MCave='2558,501-2578,476' ;диапозон координат пещеры
var BankBrit='1446,1702-1421,1671' ;диапозон координат Банка в Брите
var Home='1829,786-1843,800' ;диапозон координат Дома
var kalitka='0x0847' ;Тип закрытой калитки
var door='0x06A5' ;тип закрытой двери в дом
VAR bag='0x0E76' ;тип мешка с регами
VAR bankbox='0x40355E29' ;Id банка (для того, что бы узнать ID банка, командой ",info" -
;- на любой предмет и скопировать из полученной информации -
;- значение C= -> 0x40156896 <-
VAR rune='0x1F14' ;Тип руны может быть 2-х типов
; '0x1F14' и '0x1F15'
VAR CraftChest='0x402C32D2' ;Сундук Крафта с паками под руду и инготы
VAR MageChest='0x402B6E6A' ;Сундук Мага с паками и мешком-с-регами для Рекола
VAR kirka = "0x0E86" ;Тип кирки. 2 вида может "0x0E85" и "0x0E86"
VAR OreBox = "0x4050B366" ;Контейнер для руды
VAR HiOreBox = "0x4050B362" ;Контейнер для "выхи"
VAR text1="There is no ore|You have no line|That is to far away|You can't think|You have no line of|too far away|mining in rock."
VAR text2="You put the|You loosen some|You can't think|That is to far away|There is no ore|You have no line of|too far away|mining in rock."
VAR run=118 ;Код клавиши с биндом "AlwesRun"
################################################################
### Функция Main ###############################################
################################################################
sub main()
UO.exec("exec ressurect")
UO.exec("exec FindMan")
UO.exec("exec mine")
endsub
#По всей видимости это был тест функции GetRun.
#В данном скрипте не нужно. (закомментировал)
#sub r()
# var r = UO.getrun('self')
# UO.print(str(r))
#endsub
################################################################
### Функция mine ##################################№№№##########
################################################################
sub mine() ; Kopania
UO.ignorereset()
walker(2578,480,1)
var pause=0
myXX=UO.getX(); zapominaet mesto otkuda nacel kopati
myYY=UO.getY();
var PX, PY, PZ, IX, IY
PX = UO.GetX()
PY = UO.GetY()
PZ = UO.GetZ()
while UO.Weight <= (UO.STR * 4)
For Iy=-4 to 4
For Ix=-4 to 4
UO.deletejournal()
while not UO.Dead() and not UO.InJournal(text1) && UO.weight<=UO.str*4
if p==1 then
if not UO.hidden() then
InJournal('You have hidden',60)
endif
endif
UO.WaitTargetTile(-1,Str(PX+Ix),Str(PY+Iy),Str(PZ))
UO.usetype(kirka)
InJournal(text2,0)
if UO.injournal('You loosen some') then
pause=pause+1
if pause>4 then
wait(10000)
pause=0
endif
else
pause=0
endif
wait(200)
wend
next
wait(200)
next
wait(200)
wend
UO.exec('exec GoBrit')
endsub
################################################################
###### FindMan #################################################
################################################################
Sub FindMan()
UO.set('finddistance','20')
var b=4, p=0
UO.ignorereset()
UO.ignore('self')
repeat
if UO.InJournal("You have been revealed|You can't seem") then
p=1
DelTextInJournal("You have been revealed|You can't seem")
UO.showjournal(20)
endif
if p==1 then
p=0
if not UO.hidden() then
UO.warmode(0)
UO.useskill("Hiding")
endif
else
UO.findman(b)
wait(500)
if UO.findcount()>0 || UO.injournal('attacking you') then
UO.print('ATAC')
UO.print(UO.getname('finditem')+' '+str(UO.getdistance('finditem')))
UO.forget('finditem')
UO.exec('terminate all; exec GoBrit')
endif
wait(100)
endif
if b==4 then
b=6
else
b=4
endif
until UO.dead()
endsub
################################################################
### Функция GoBrit #################################№###########
################################################################
Sub GoBrit()
UO.exec('terminate mine')
UO.ignorereset()
UO.press(run)
wait(50)
UO.press(35)
if UO.getrun()==0 then
UO.press(run)
endif
walker(2581,480,0)
#UO.UseObject('') ;ID гейта из Минокской шахты в Брит.
wait(50)
UO.press(35)
wait(50)
UO.press(35)
wait(50)
UO.press(run)
UO.press(35)
wait(50)
if UO.getrun()==1 then
UO.press(run)
endif
walker(1433,1693,1)
wait(5000)
coord=GetXY('self')
if ComXY(BankBrit,coord)==true then
UO.exec('terminate FindMan; exec GoHome')
else
GoBrit()
endif
endsub
sub GoHome()
OpenChest()
wait(1000)
GotoHomeT()
move()
wait(5000)
OpenChest()
wait(2000)
UO.exec('terminate all; exec main')
endsub
################################################################
### Функция OpenChest ############################№#############
################################################################
sub OpenChest()
UO.findtype('0x0E42',-1,'ground')
if UO.findcount()>0 then
UO.useobject(MageChest)
chest=MageChest
else
UO.Say("bank")
chest=bankbox
endif
wait(1000)
CheckLag()
UO.findtype(bag,-1,chest)
bagreg=UO.getserial('finditem')
UO.useobject(bagreg)
wait(1000)
CheckLag()
FindRune(chest)
endsub
################################################################
### Функция FindRune ###############################№###########
################################################################
sub FindRune(b)
var idrune
UO.findtype(rune,-1,b)
idrune=UO.getserial('finditem')
Cast(idrune)
endsub
################################################################
### Функция Cast(rune) #########################################
################################################################
Sub Cast(rune)
var a
coord = GetXY('self')
if ComXY(Home,coord)==true then
a=true
else
a=false
endif
MoveReg(bagreg)
var mana
if UO.bm>0 && UO.bp>0 && UO.mr>0 then
cast:
if UO.mana < 20 then
med()
wait(2000)
goto cast
endif
mana = UO.mana
UO.cast('Recall',rune)
DelTextInJournal("fizzle")
while mana <= UO.mana
wait(200)
wend
if ComXY(MCave,coord)==false then
if ComXY(Home,coord)==a then
wait(1000)
CheckLag()
if UO.injournal("fizzle") then
MoveReg(bagreg)
goto cast
endif
wait(200)
endif
endif
else
UO.print('Stop')
UO.closeuo()
endif
wait(1000)
endsub
################################################################
### Функция Move reg ###########################################
################################################################
sub MoveReg(id)
UO.print('Move Reagents')
var a
dim reg[3]
reg[0] = "0x0F7A" ;Black Pearls
reg[1] = "0x0F7B" ;Blood Moss
reg[2] = "0x0F86" ;Mandrake Roots
for a=0 to 2
if UO.count(reg[a])<1 then
UO.findtype(reg[a],-1,id)
UO.moveitem('finditem',2,'backpack')
wait(700)
CheckLag()
endif
next
endsub
################################################################
### Функция-массив Регов #######################################
################################################################
#Функция нигде не встречается, поэтому закомментировал.
#Sub mreg(reg)
# reg[0] = "0x0F7A" ;Black Pearls
# reg[1] = "0x0F7B" ;Blood Moss
# reg[2] = "0x0F86" ;Mandrake Roots
# return reg
#endsub
################################################################
### Функция meditation #########################################
################################################################
sub med()
UO.print('Meditation')
while UO.mana < UO.int
UO.UseSkill("Meditation")
injournal("You are at peace|You lose your concentration",60)
wend
endsub
################################################################
### Функция Goto Home ##########################################
################################################################
sub GotoHomeT()
UO.set('finddistance',4)
UO.print('Go to Home')
if type(kalitka)==true then
UO.press(121)
CheckLag()
else
wait(200)
endif
walker(2895,584,0)
UO.press(121)
CheckLag()
if type(kalitka)==false then
walker(2895,584,0)
UO.press(121)
CheckLag()
endif
wait(200)
walker(2895,584,0)
if type(door)==true then
UO.press(121)
CheckLag()
else
wait(200)
endif
walker(2895,584,0)
UO.press(121)
CheckLag()
wait(500)
if type(door)==false then
UO.press(121)
CheckLag()
else
wait(200)
endif
CheckLag()
endsub
Sub type(tip)
UO.findtype(tip,-1,'ground')
if UO.findcount()>0 then
return true
else
return false
endif
endsub
################################################################
### Функция MoveOre ############################################
################################################################
sub move()
UO.useobject(CraftChest)
CheckLag()
UO.print('MOVEORE')
wait(2000)
var e
dim a[4]
a[0] = 0x19B7
a[1] = 0x19BA
a[2] = 0x19B8
a[3] = 0x19B9
UO.useobject(OreBox)
CheckLag()
for e = 0 to 3
repeat
UO.findtype(a[e],-1,'backpack')
UO.moveitem('finditem',0,OreBox)
wait(900)
CheckLag()
until UO.findcount()==0
next
wait(1000)
MoveHi()
endsub
Sub MoveHi()
var e, c
dim a[4],x[19]
a[0] = 0x19B9 ;4 and more ore
a[1] = 0x19B7 ;1 ore
a[2] = 0x19BA ;2 ore
a[3] = 0x19B8 ;3 ore
x[0] = '0x09B9' ;Acid ore
x[1] = '0x09A4' ;Cristaline ore
x[2] = '0x0085' ;Dragon ore
x[3] = '0x09D3' ;Steel ore
x[4] = '0x09E6' ;Elvin ore
x[5] = '0x09F0' ;Gorgan ore
x[6] = '0x008F' ;Send rock ore
x[7] = '0x04C2' ;Blood rock ore
x[8] = '0x09DA' ;Vulcan ore
x[9] = '0x0028' ;Obsidian ore
x[10] = '0x08AF' ;Plutonium ore
x[11] = '0x09EC' ;Blood crest ore
x[12] = '0x0455' ;Black rock ore
x[13] = '0x010F' ;Krynite ore
x[14] = '0x0BA7' ;Eldar ore
x[15] = '0x00CE' ;Valorite ore
x[16] = '0x052D' ;Mitheril ore
x[17] = '0x07D5' ;Verite ore
x[18] = '0x0060' ;Aqua ore
UO.useobject(HiOreBox)
wait(700)
CheckLag()
for e=0 to 3
for c=0 to 18
repeat
UO.findtype(a[e],x[c],OreBox)
if UO.findcount()>0 then
UO.moveitem('finditem',0,HiOreBox)
CheckLag()
wait(400)
endif
wait(100)
until UO.findcount()==0
next
next
endsub
sub ressurect()
repeat
; ©dark_kynep
if UO.Life < 1 then
UO.useobject('self')
CheckLag()
UO.warmode(0)
UO.LClick(977,56)
CheckLag()
wait(1000)
UO.LClick(267,309)
CheckLag()
wait(1000)
UO.LClick(172,200)
CheckLag()
wait(1000)
walker(2468,531,1)
UO.useobject('0x4001D120')
CheckLag()
walker(2466,542,0)
CheckLag()
walker(2506,542,0)
Alive()
else
wait(1000)
;UO.Print("You are Alive!!!")
endif
until 1==2 #UO.dead()
endsub
Sub Alive()
OpenChest()
GotoHomeT()
Heal()
OpenChest()
UO.exec('terminate all; exec main')
endsub
sub Heal()
UO.useobject('0x4023D30F')
CheckLag()
wait(500)
UO.findtype('0x0E21',-1,'0x4023D30F')
UO.moveitem('finditem',10,'backpack',10,10,0)
CheckLag()
wait(500)
repeat
UO.bandageself()
wait(5000)
until UO.life==UO.str
wait(500)
UO.useobject(CraftChest)
CheckLag()
wait(500)
UO.findtype(kirka,-1,CraftChest)
UO.moveitem('finditem',1,'backpack',100,10,0)
CheckLag()
wait(500)
endsub
################################################################
### Функция паузы по проверке журнала или таймера ##############
################################################################
Sub InJournal(t,time)
;UO.print('EXEC INJOURNAL(T,TIME)')
var timer=UO.timer()
DelTextInJournal(t)
if time==0 then
;UO.print('TIME==0')
while not UO.Dead() and not UO.InJournal(t)
wait(200)
wend
else
;UO.print('TIME<>0')
while not UO.Dead() and not UO.InJournal(t) && UO.timer()<timer+time
wait(200)
wend
endif
endsub
################################################################
### Функция удаления из журнала Текста #########################
################################################################
Sub DelTextInJournal(msg) ; msg это параметр, см. выше как его передают
var nom=UO.InJournal(msg) ; ищем сообщение и в переменную его
if nom>0 then
UO.SetJournalLine(Nom - 1," ") ; подменим сообщение
DelTextInJournal(msg) ; вызов функцией самой себя, рекурсия
endif
endsub
################################################################
### Функция отклик сервера #####################################
################################################################
Sub CheckLag()
DelTextInJournal("backpack") ; вытрим ТОЛЬКО нужные нам сообщения в журнале
UO.Click('backpack') ; одиночный клик по вашему backpack
#InJournal("backpack",0)
while not UO.InJournal("backpack")
wait(100)
wend
endsub
################################################################
### Функция World save now #####################################
################################################################
Sub ws()
if UO.injournal("World is saving now...") then
InJournal("World data saving",1800)
endif
endsub
########################### ХОДИЛКА 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=5 #Увеличение MaxTraceDistance при исчерпании количества ходов
var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed=1
var StepTimeOut=600 #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга.
# Для ходьбы - 500+Ping
# Для бега/ходьбы на лошади - 300+Ping
# Бег на лошади - 150 + Ping
var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС.
var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
Sub Walker(GoX,GoY,Prec)
UO.warmode(0)
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
endif
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
endsub
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
endif
MovesDone=MovesDone+1
CurDir=AddToDir(CurDir,-Direction,Prec)
until MovesDone>MaxTrace
return 0
endsub
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
endif
if GoDir>StartDir then
return 1
endif
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
endif
else
if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then
return -1
else
return 1
endif
endif
endsub
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)
endsub
Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
if x1==x3 and y1==y3 then
return false
endif
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
endif
endsub
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
endif
return false
endsub
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)
endif
until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
return LastDir
endsub
Sub IsEnd(GoX,GoY,Prec)
if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
LogInfo('END FOUND')
return true
else
if Abs(UO.GetX()-GoX)>=100 and Abs(UO.GetY()-GoY)>=100 then
LogInfo('END FOUND')
return true
else
return false
endif
#return false
endif
endsub
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
endif
else
if (DiffY/(DiffX+0.1))>=2 then
if (MyY>GoY) then
GoDir=5
else
GoDir=1
endif
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
endif
endif
endif
endif
endif
endif
return GoDir
endsub
Sub Tracer(StartDir,Direction,Prec)
var CurDir=StartDir
var Result
repeat
Result=TryDir(CurDir,Prec)
if not Result then
CurDir=AddToDir(CurDir,Direction,Prec)
endif
until Result
return Result
endsub
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
endsub
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
endif
return TurnAndGoDir(Dir,Prec)
endsub
Sub XFromDir(Dir)
if Dir==2 OR Dir==3 Or Dir==4 then
return (UO.GetX()+1)
endif
if Dir==6 OR Dir==7 Or Dir==8 then
return (UO.GetX()-1)
endif
return (UO.GetX())
endsub
Sub YFromDir(Dir)
if Dir==8 OR Dir==1 Or Dir==2 then
return (UO.GetY()+1)
endif
if Dir==4 OR Dir==5 Or Dir==6 then
return (UO.GetY()-1)
endif
return (UO.GetY())
endsub
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
endif
#End direction Test
if StartY<>UO.GetY() or StartX<>UO.GetX() then
return Dir
endif
#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
endif
endsub
Sub GetDirToDir(GotDir,Prec)
var ChangedDir=-GotDir
ChangedDir=AddToDir(ChangedDir,5,Prec)
return ChangedDir
endsub
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])
endsub
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)
endsub
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)
endsub
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
endif
next
return false
endsub
Sub LogInfo(Line)
if not UO.GetGlobal("Logging")=="0" then
UO.TextOpen()
UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
endif
endsub
Sub Abs(X)
if X>0 then
return X
else
return (-X)
endif
endsub
################################################################
# конец ходилки ################################################
################################################################
#Функция возвращает коодринаты чара строкой через запятую.
Sub GetXY(man)
var x, y, xy
x=UO.getx(man)
y=UO.gety(man)
xy=str(x)+','+str(y)
return xy
endsub
#Функция возвращает результат проверки:
#находится ли чар в указанной области координат.
Sub ComXY(coordinate,coord) #область координат, текущие координаты чара.
var myx, myy, x1, y1, L, pref, minx, maxx, miny, maxy, x, y
L=len(coordinate)
;UO.print('Длина строки = '+str(L))
;wait(100)
x1=XY(coordinate,'-',0)
;UO.print('Координаты а: '+x1)
;wait(100)
y1=XY(coordinate,'-',1)
;UO.print('Координаты б: '+y1)
;wait(100)
minx=XY(x1,',',0)
;UO.print('Координата minx: '+minx)
;wait(100)
miny=XY(x1,',',1)
UO.print('Координата miny: '+miny)
wait(100)
maxx=XY(y1,',',0)
;UO.print('Координата maxx: '+maxx)
;wait(100)
maxy=XY(y1,',',1)
;UO.print('Координата maxy: '+maxy)
;wait(100)
myx=XY(coord,',',0)
;UO.print('Координата myx: '+myx)
;wait(1000)
myy=XY(coord,',',1)
;UO.print('Координата myy: '+myy)
if minx>maxx then
x=minx
;UO.print('X1=MinX='+x1)
;wait(100)
minx=maxx
;UO.print('MinX=MaxX='+minx)
;wait(100)
maxx=x
;UO.print('maxx=x1='+minx)
;wait(100)
endif
if miny>maxy then
y=miny
;UO.print('Y1=MinY='+y)
;wait(100)
miny=maxy
;UO.print('MinY=MaxY='+miny)
;wait(100)
maxy=y
;UO.print('maxy=y1='+maxy)
;wait(100)
endif
; wait(100)
if myx>minx && myx<maxx && myy>miny && myy<maxy then
return true
else
return false
endif
endsub
#Функция возвращает часть строки.
# con - строка
# d - разделитель
# c - если 0, то вернуть часть строки до разделителя
# если 1, то вернуть часть строки после разделителя.
Sub XY(con,d,c)
var pref, L, z
L=len(con)
for pref=0 to L
if con[pref]==d then
if c==0 then
z=left(con,pref)
endif
wait(50)
if c==1 then
z=right(con,L-pref-1)
endif
endif
next
return z
endsub