Проблемы:
1. После кила элема чар куда-то идет а не возобновляет копку.
2. Не понимаю что изменить в ходилке чтобы чар вставал рядом с элемом а не на его месте - стамину снимает за проход по мобу.
Code: Select all
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