Значит так, скрипт полностью рабочий. За все время, которое он у меня работал не было ни одной ошибки. Писал специально для шарда uo-dominaria.ru. Скрипт очень просто написан, так что разобраться в нем не составит труда. Присутствует относительно большое количество проверок, но лучше перебдеть.. =)
Описание: Чар копает в шахте брита, набрал вес - телепорт домой. Убили - пошел воскресился и опять копать. Добор регов присутствует. Короче вечная копка, запускайте скрипт и смело уезжайте в отпуск =)
Инструкция: Все, что от вас требуется, это поменять ID сундуков, и настроить телепорт по рунбуку, чтобы реколился по номерам ваших рун домой и в пещеру. Значит 1ую руну маркните где-то в районе 24 координаты из массива, а вторую в районе 50, это для того, чтобы чар не уперался в стену, т.к. ходилка тут хоть и хорошая, но не идеальная =) И еще, когда чар реколится домой, он делает 5 шагов вверх к сундуку, куда будет класть руду, и 5 шагов от сундука, когда все перемещения и проверки закончит. Советую зарядить рунбук на 100-200 зарядов.
Code: ############################################## ############## ОСНОВНАЯ ЧАСТЬ ################ ##############################################
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 ##########################
|