Опять переделал скриптик. В общем копка, выгрузка и килл элемов. Проблемы: 1. После кила элема чар куда-то идет а не возобновляет копку. 2. Не понимаю что изменить в ходилке чтобы чар вставал рядом с элемом а не на его месте - стамину снимает за проход по мобу.
Code: var MaxTraceDistance=10 var TraceLoopIncrease=5 #Увеличение MaxTraceDistance при исчерпании количества ходов var LimitTrace=25 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет). var Speed=1 var StepTimeOut=500 #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга. var CheckCnt=1 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС. var DynamicPause=10 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора. var TryRecall=1 uo.exec("set norbcheck 1") uo.exec("set norbcalc 1") VAR UnloadCont='0x40131140' #сундук для руды var LoadCont='0x40130C9E' #сундук с реколами, инвизками. var s=500 #Максимальный вес
#Marking запускает процедуру маркировки точек копки. Для завершения указать на себя.
sub Runebook() uo.print('Runebook:') uo.exec('addobject Runebook') while uo.targeting() wait(100) wend End Sub
sub start() uo.Exec('exec terminate') uo.Exec('exec Enemy') uo.exec('exec healing') uo.exec('exec main') End sub
sub Marking() var i,s=0,flag=0 var f=file("c:\rock.txt") dim RockX[500],RockY[500],RockT[500] var Count=0
while not flag ==1 uo.usetype ('0x0E85') WaitForTarget() while uo.targeting() wait(100) wend if uo.LastTile(1)==UO.GetX("self") then if uo.lastTile(2)==UO.GetY("self") then flag=1 endif endif if flag == 0 then RockX[Count]=uo.LastTile(1) RockY[Count]=uo.lastTile(2) RockT[Count]=uo.LastTile(0) uo.print('Найдена кочка № '+str(count)+': x='+str(uo.lasttile(1))+' y='+str(uo.lastTile(2))) Count = Count+1 endif wend uo.print ("Найдено " + str(Count) + " кочек") f.open() f.create() s=safe call f.writeln(Count) for i=0 to Count-1 s=safe call f.writeln(str(RockT[i])+' '+str(RockX[i])+' '+str(RockY[i])) next f.close() end sub #################################################
Sub main() var i,flag,j var Count var f=file("c:\rock.txt") dim RockX[500],RockY[500],RockT[500] uo.deletejournal()
###############Загружаем из файла################ f.open() Count=safe call f.readNumber() uo.print("Загружено "+str(Count)+ " кочек")
for i=0 to Count-1 RockT[i]=safe call f.ReadNumber() RockX[i]=safe call f.ReadNumber() RockY[i]=safe call f.ReadNumber() next f.close()
###############Ходим по координатам############## while not uo.dead() uo.deletejournal() if Count>0 then for i=0 to Count-1 flag=0 j=0 uo.print('Go to '+str(i)+': x='+str(Rockx[i])+' y='+str(RockY[i]))
while not flag==1 flag=Walker(RockX[i],RockY[i],1) wait(100) wend uo.deletejournal() mining() next endif wend uo.print("Complete") end sub ##################################################################
Sub mining() var x,y,z, n VAR LastTimer for var i=0 to 50 UO.Set('finddistance','2') z=UO.GetZ("self") for x=-2 to 2 for y=-2 to 2 UO.Print(str(x)+" "+str(y)) UO.Press(9) wait(100) UO.WaitTargetTile("1341",STR(UO.GetX()+x),STR(UO.GetY()+Y),str(z)) UO.UseType('0x0E85') LastTimer=UO.Timer() Repeat wait(100) Until uo.InJournal('There is nothing here to mine for.') or uo.InJournal('That is too far away.') or uo.InJournal('You cannot mine so close to yourself.') or uo.InJournal('You have no line') or uo.InJournal('You stop Mining') or uo.InJournal('Try mining elsewhere.') or uo.InJournal('is attacking you') or uo.InJournal('You fail to do that! You are hungry!') or UO.Timer()>LastTimer+500 or uo.weight>s End If If uo.weight>s Then x=2 y=2 back() End If UO.DeleteJournal() If uo.dead() Then uo.exec('terminate all') End If sbros() Next Next end sub
Sub save() var Time=time() UO.Press(9) Wait(100) uo.say('.drink invis') wait(100) uo.textopen() uo.textprint('Elemental!') UO.TextPrint(SAFECALL Time()) uo.recall('Runebook', 2) wait(15000) uo.say('Bank') unload() uo.exec('terminate all') end sub
Sub back() UO.Press(9) wait(100) ToUnload() Load() ToMine() end sub
Sub sbros() var i,j Dim OreType[3] OreType[01]='0x19B9' ## 1 ore OreType[02]='0x19B9' ## 2 ore OreType[03]='0x19B8' ## 3 ore
Dim OreColor[8] ## Сброс руды OreColor[1] = '0x06D6' ### Marganec OreColor[2] = '0x060C' ### Corrundum OreColor[3] = '0x052D' ### Tin OreColor[4] = '0x04C2' ### Tourmaline OreColor[5] = '0x0488' ### Bronze OreColor[6] = '0x084D' ### Lead
for j=1 to 3 for i=1 to 6 uo.findtype(OreType[j],OreColor[i],'backpack') while uo.findcount()>0 uo.drop('-1',str(uo.getx()),str(uo.gety()),0,"finditem") wait(1500) uo.findtype(OreType[j],OreColor[i],'backpack') wend next next end sub
####### Sub WaitForTarget() for var i=0 to 50 if uo.Targeting()==1 then return 1 end if wait(200) next return 0 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) 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 LogInfo('Start cross check') 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 LogInfo('Vectors crossing 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 else LogInfo('End cross check') 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=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
Sub Numb(num) if num>=0 then return num else return num*(-1) end if end sub
Sub unload() var Time=time() if uo.waiting() then uo.canceltarget() endif VAR a,Exit
DIM Ore[5] Ore[0]=0x19B9 ; 4 and more ore Ore[1]=0x19B7 ; 1 ore Ore[2]=0x19BA ; 2 ore Ore[3]=0x19B8 ; 3 ore
uo.useobject(UnloadCont) UO.TextOpen('') UO.TextPrint('Выгрузка') UO.TextPrint(SAFECALL Time()) UO.TextPrint('') wait(500) For a=0 to 3 Exit=0 repeat UO.FindType(Ore[a],'backpack') if UO.GetQuantity('finditem')>0 then UO.Moveitem('finditem','0',UnloadCont) CheckLag() wait(1500) Else Exit=1 endif until Exit==1 Next wait(100) uo.useobject(LoadCont) wait(1000) uo.FindType('0x183B','backpack') if UO.GetQuantity('finditem')>0 then UO.Moveitem('finditem','-1',LoadCont) End If wait(500) uo.FindType('0x09AA','backpack') if UO.GetQuantity('finditem')>0 then UO.Moveitem('finditem','-1',LoadCont) End If end sub
Sub load() uo.useobject(LoadCont) wait(1000) CheckLag() uo.FindType('0x183B',-1,LoadCont) #Берем инвизку if UO.GetQuantity('finditem')>0 then uo.Grab('4','finditem') End If wait(1000) CheckLag() uo.FindType('0x1F4C',-1,LoadCont) #Берем реколы if UO.GetQuantity('finditem')>0 then uo.Grab('10','finditem') End If wait(1000) CheckLag() wait(500) uo.recall('Runebook', 1) wait(1000) CheckLag() uo.FindType('0x1F4C','backpack') #Выгружаем реколы UO.Moveitem('finditem','-1',LoadCont) end sub
Sub ToUnload() If uo.mana<25 Then uo.useskill('Meditation') End If While uo.mana<25 wait(100) Wend uo.recall('Runebook', 2) WaitRecall() wait(500) uo.say('Bank') wait(1000) unload() end sub
Sub ToMine() uo.useskill('Meditation') While uo.mana<25 wait(100) Wend CheckLag() uo.recall('Runebook', 3) WaitRecall() uo.useskill('Meditation') wait(5000) end sub
Sub WaitRecall() var mx var my mx = UO.GetX("self") my = UO.GetY("self") UO.Warmode("0") UO.UseSkill("Hiding") While UO.GetX("self")==mx and UO.GetY("self")==my wait(100) wend end sub
sub Enemy() var NoEnemy = 0 UO.Set('finddistance', 30) While not uo.dead() UO.Findtype('0x000E',-1, 'ground') If UO.Findcount() > 0 then uo.textopen() uo.textprint('Elemental!') UO.TextPrint(SAFECALL Time()) uo.exec('terminate main') attack() uo.Exec('exec main') End If wait(100) Wend end Sub
Sub attack() var mob var mobX var mobY UO.Set('finddistance', 30) UO.Findtype('0x000E',-1, 'ground') mob=UO.GetSerial('finditem') UO.Exec('warmode 1') wait(100) uo.usetype('0x13FE') wait(200) UO.Attack(mob) mobX = uo.getX(mob) mobY = uo.getY(mob) repeat Walk(mobX, mobY) wait(10) until UO.InJournal('Body of Elemental') or uo.dead(mob) loot() UO.DeleteJournal() wait(2000) endsub
Sub Healing() While not uo.dead() If uo.life < 70 then uo.say('.drink heal') wait(4000) End If wait(100) Wend end sub
Sub Walk(x,y) go: if uo.getY() > uo.gety("laststatus") then uo.press(33) else uo.press(35) endif while not uo.getX() == uo.getx("laststatus")+1 || not uo.getY() == uo.gety("laststatus")+1 if not uo.getX() == uo.getx("laststatus") then if uo.getX() > uo.getx("laststatus") then if uo.getY() > uo.gety("laststatus") then uo.press(38) endif if uo.getY() < uo.gety("laststatus") then uo.press(37) endif if uo.getY() == uo.gety("laststatus") then uo.press(36) endif endif if uo.getX() < uo.getx("laststatus") then if uo.gety() > uo.gety("laststatus") then uo.press(39) endif if uo.gety() < uo.gety("laststatus") then uo.press(40) endif if uo.gety() == uo.gety("laststatus") then uo.press(34) endif endif endif if uo.getX() == uo.getx("laststatus") then if uo.gety() > uo.gety("laststatus") then uo.press(33) endif if uo.gety() < uo.gety("laststatus") then uo.press(35) endif if uo.gety() == uo.gety("laststatus") then wait(10) endif endif wend if uo.getx() == uo.getx("laststatus") then if uo.gety() == uo.gety("laststatus") then wait(10) endif endif end sub
Sub loot() var i DIM Loot[6] Loot[1]=0x0eed; GP Loot[2]=0x09AA; Trasure Loot[3]=0x19B9 ; 4 and more ore Loot[4]=0x19B7 ; 1 ore Loot[5]=0x19BA ; 2 ore Loot[6]=0x19B8 ; 3 ore For i=1 to 6 UO.UseObject('lastcorpse') UO.FindType(Loot[i],-1,'lastcorpse') If UO.GetQuantity('finditem') then UO.Grab(0,'finditem') Wait(1600) End If Next end sub
Sub CheckLag() if uo.Waiting()>0 then uo.Exec('canceltarget') end if uo.DeleteJournal() uo.Click('backpack') repeat wait(100) until uo.InJournal('backpack') end sub
Sub Terminate() While not uo.dead() wait(1000) Wend uo.textopen() uo.textprint('Время смерти:') UO.TextPrint(SAFECALL Time()) uo.exec('terminate all') end sub
Sub Time() Var CurrentTime = UO.Time() Var Hr = Mid(STR(CurrentTime),0,2) Var MIN = Mid(STR(CurrentTime),2,2) Var SEC = Mid(STR(CurrentTime),4,2) Return (HR+':'+MIN+':'+SEC) end sub
|