Приветствую всех. Переделал малость. Без килов энтов/элемов и т.д. тупо рубить/копать.
Тестил по паре часов оба скрипта. Вроде не глючат.
Забыл как под спойлер кидать...
Майнинг:Если появляется окно антимакроса встает на паузу пока не введете код (неверный код не вводил, поэтому незнаю какое сообщение появляется, если кто попробует напищите - добавлю в скрипт), выкидывает/пропускает все что указано в hX oreX. Разделил то что для кравта/починки домов и арма/вепов.
Если не надо что-то выкидывать/пропускать то удалить в 2х местах скрипта запись вида "or UO.InJournal(ore1)"- не будет выкидывать Marganece.
msX не трогать, иначе не будет копать.
Sub drop() найти "color[0]='0x06D6' ;Marganece", удалить строку. Упорядочить список. И изменить значения в var amount=15 dim color[15].
Последняя запись color[14] а в переменных указано 15. отсчет идет с 0, поэтому и 15
sub main() var x, y,z VAR LastTimer var ms1="can't see" var ms2="heavy" var ms3="location" var ms4="far away" var ms5="in rock" var ms6="elsewhere" var ms7="nothing" var ms8="You cannot mine" var ms9="Correct code." var h1="Gypsum" var h2="Zink" var h3="Stone" var h4="Marble" var h5="Sandstone" var h6="Plaster" var ore1="Marganece" var ore2="Iron" var ore3="Copper" var ore4="Tourmaline" var ore5="Tin" var ore6="Bronze" var ore7="Lead" var ore8="Corrundum" var ore9="Titan" UO.Set('finddistance','2') z=UO.GetZ("self") for x=-2 to 2 for y=-2 to 2 UO.Print(str(x)+" "+str(y)) Repeat UO.DeleteJournal() UO.Exec("warmode 0") UO.WaitTargetTile("1341",STR(UO.GetX()+x),STR(UO.GetY()+Y),z) UO.UseType('0x0E85') CheckLag() LastTimer=UO.Timer() Repeat If uo.lastgump('replyed') == 0 && uo.lastgump('text') == 'Please enter code:' Then uo.textopen() uo.textprint('Ахтунг') While not uo.InJournal(ms9) wait(100) Wend End If wait(100) Until UO.InJournal(ms1) or UO.InJournal(ms2) 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 UO.InJournal(ms9) or UO.InJournal(ore1) or UO.InJournal(ore2) or UO.InJournal(ore4) or UO.InJournal(ore5) or UO.InJournal(ore6) or UO.InJournal(ore7) or UO.InJournal(ore8) or UO.InJournal(ore9) or UO.InJournal(h1) or UO.InJournal(h2) or UO.InJournal(h3) or UO.InJournal(h4) or UO.InJournal(h5) or UO.InJournal(h6) or UO.Timer()>LastTimer+500 uo.exec("warmode 1") wait(50) uo.exec("warmode 0") Until UO.InJournal(ms3) or UO.InJournal(ms4) or UO.InJournal(ms5) or UO.InJournal(ms6) or UO.InJournal(ms7) or UO.InJournal(ore1) or UO.InJournal(ore2) or UO.InJournal(ore4) or UO.InJournal(ore5) or UO.InJournal(ore6) or UO.InJournal(ore7) or UO.InJournal(ore8) or UO.InJournal(ore9) or UO.InJournal(h1) or UO.InJournal(h2) or UO.InJournal(h3) or UO.InJournal(h4) or UO.InJournal(h5) or UO.InJournal(h6) drop() next next end sub Sub drop() var i var amount=15 dim color[15] color[0]='0x06D6' ;Marganece color[1]='0x0000' ;Iron color[2]='0x0601' ;Copper color[3]='0x04C2' ;Tourmaline color[4]='0x052D' ;Tin color[5]='0x0488' ;Bronze color[6]='0x084D' ;Lead color[7]='0x060C' ;Corrundum color[8]='0x0453' ;Titan color[9]='0x03E3' ;Gypsum color[10]='0x0026' ;Zink color[11]='0x0909' ;Stone color[12]='0x079E' ;Marble color[13]='0x0090' ;Sandstone color[14]='0x0097' ;Plaster uo.ignorereset() repeat uo.deletejournal() for i = 0 to amount-1 uo.findtype('0x19B9',color[i],'backpack') if uo.Targeting()==1 then uo.canceltarget() end if If uo.findcount() > 0 then UO.WaitTargetObject('finditem') UO.Drophere('finditem') Wait(100) End If Next end sub sub smelt() UO.set('finddistance',1) UO.IgnoreReset() While not uo.dead() UO.FindType('0x19B9',-1,'ground') UO.WaitTargetObject('finditem') UO.Grab('1','finditem') CheckLag() UO.UseType('0x19B7') wait(500) Wend end sub Sub CheckLag() UO.DeleteJournal() UO.Click('backpack') repeat wait(100) until UO.InJournal("backpack") end sub Sub test() #Вырубает все кроме main uo.exec('terminate alln_main') end sub
Ламбер. Ничего не пропускат и не выкидывает. Если доберусь до него исправлю.
Изменять только "var read = 1" на 1/0. При маркировке "0" в паке должна быть кирка.
var MaxTraceDistance = 1 ; Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву. var TraceLoopIncrease = 1 ; Увеличение MaxTraceDistance при исчерпании количества ходов. var LimitTrace = 10 ; Сколько шагов в обе стороны от начальной точки обхода прекращают ходилку (выхода нет). var Speed = 3 ; Сколько шагов делать за раз между проверками. var DynamicPause = 30 ; Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора. var steptimer = 2 ; Таймер на шаг(Значение 1 = 100мс). Время за которое чар проходит 1 тайл, если за это время чар не сдвинется с места скрипт расценит это как препятствие и начнет обходить. var read = 1 ;1 если считывать из файла, 0 если собирать из клиента sub Lumberjacking() var flag, treecount = 0, clicks, TopX = 324, TopY = 65, i = 0, j = 0, k = 0, r = 0, q = 0, ii, jj, circle, timer, f = file("C:\trees.dat") dim TreeX[5000], TreeY[5000], TreeT[5000] dim TreeTile[29] TreeTile[0]=3277 TreeTile[1]=3280 TreeTile[2]=3283 TreeTile[3]=3286 TreeTile[4]=3289 TreeTile[5]=3291 TreeTile[6]=3294 TreeTile[7]=3296 TreeTile[8]=3299 TreeTile[9]=3302 TreeTile[10]=3393 TreeTile[11]=3394 TreeTile[12]=3395 TreeTile[13]=3396 TreeTile[14]=3415 TreeTile[15]=3416 TreeTile[16]=3417 TreeTile[17]=3418 TreeTile[18]=3419 TreeTile[19]=3438 TreeTile[20]=3439 TreeTile[21]=3440 TreeTile[22]=3441 TreeTile[23]=3442 TreeTile[24]=3460 TreeTile[25]=3461 TreeTile[26]=3462 TreeTile[27]=3290 TreeTile[28]=3288 if read == 1 then uo.print("Download coordinates from a file...") f.open() treecount = safe call f.ReadNumber() for i = 1 to treecount TreeT[i] = safe call f.ReadNumber() TreeX[i] = safe call f.ReadNumber() TreeY[i] = safe call f.ReadNumber() next f.close() else uo.print("Collect coordinates of the client...") repeat clicks = 0 flag = 0 uo.deletejournal() uo.usetype("0x0F43") while not uo.targeting() wait(100) wend while uo.targeting() wait(100) wend uo.deletejournal() ##################### # Проверяем дерево ли это # ################### flag = 0 for k = 0 to 28 if uo.lasttile(0) == TreeTile[k] then flag = 1 end if next if uo.lasttile(1) == uo.getx() and uo.lasttile(2) == uo.gety() then flag = 2 end if if flag == 1 then treecount = treecount + 1 TreeX[treecount] = uo.lasttile(1) TreeY[treecount] = uo.lasttile(2) TreeT[treecount] = uo.lasttile(0) uo.print("Trees found "+str(treecount)+" : x="+str(uo.Lasttile(1))+" y="+str(uo.LastTile(2))+" "+str(treecount)) end if until (flag == 2) or (treecount == 5000) uo.print("The coordinates of the trees recorded in the file C:\trees.dat") SaveToFile(treecount, TreeX, TreeY, TreeT) end if uo.print("Trees found: "+str(treecount)) wait(2000) ########################## # Ходим по собранным координатам # ######################### while 1 == 1 if treecount > 0 then for i = 1 to treecount uo.print("Go to the tree "+str(i)+": x="+str(TreeX[i])+" y="+str(TreeY[i])) flag = Walker(TreeX[i], TreeY[i], 1) if flag == 1 then circle = 0 repeat uo.deletejournal() uo.waittargettile(TreeT[i], TreeX[i], TreeY[i], uo.GetZ()) uo.usetype("0x0F43") timer = uo.timer() while not uo.injournal("far away|nothing|reach|stop") and not uo.timer() > timer + 300 wait(100) wend until uo.injournal("far away|nothing") end if next end if wend end Sub Sub SaveToFile(treecount, TreeX, TreeY, TreeT) var f=file("C:\trees.dat") var s = 0, i = 0 f.open() f.create() s=safe call f.writeln(treecount) for i = 1 to treecount s=safe call f.writeln(str(TreeT[i])+" "+str(TreeX[i])+" "+str(TreeY[i])) next f.close() end Sub Sub Walker(GoX, GoY, Prec) 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 LastDir=GoUntilHit(GoX,GoY,Prec) if IsEnd(GoX,GoY,Prec) then return 1 end if 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) or (GoDir==7) then return -1 else return 1 end if else if (GoDir==1) or (GoDir==5) 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 ua1=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3) var ub1=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) var ua2=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3) var ub2=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) #Check for parallel lines if (ub1 == 0) or (ub2 == 0) then return false end if var u1=ua1/ub1 var u2=ua2/ub2 if IsDiap(u1,0,1,0.01) and IsDiap(u2,0,1,0.01) then return true else return false 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=TurnAndGoDir(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 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=TurnAndGoDir(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 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), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer #Start Primary test if GoDir(Dir, Prec) then return Dir else return 0 end if end Sub Sub GetDirToDir(GotDir,Prec) var ChangedDir=-GotDir ChangedDir=AddToDir(ChangedDir,5,Prec) return ChangedDir end Sub Sub GoDir(Dir, Prec) var circle, StartDir=GetDirToDir(UO.GetDir(), Prec), StartX=UO.GetX(), StartY=UO.GetY(), EndDir, timer 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 and (DistanceX - Prec) > (DistanceY - Prec) then GoDistance=DistanceX - Prec else if (DistanceY - Prec) < Speed and (DistanceY - Prec) > (DistanceX - Prec) then GoDistance=DistanceY - Prec else GoDistance=Speed end if end if circle = 0 repeat UO.Press(Dirs[Dir]) timer = uo.timer() + steptimer repeat EndDir=GetDirToDir(UO.GetDir(), Prec) wait(DynamicPause) until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or timer <= uo.timer() if StartDir<>EndDir then GoDistance = GoDistance + 1 StartDir = EndDir end if circle = circle + 1 until circle == GoDistance or GoDistance == 0 or timer <= uo.timer() if timer <= uo.timer() then return false else return true end if end Sub Sub Abs(X) if X>0 then return X else return ( - X) end if end Sub