Nmy wrote:
скрипт очень стар. мининг по рунам с дрв не пробовали?
язык программ какой установлен? потому что если английский, то русские сообщения не будут понятны в файле для скрипта.
в принципе он мне копал, когда изменил
Mirage wrote:
Обычно достаточно UO.WaitTargetTile("1341",STR(UO.GetX()+x),STR(UO.GetY()+Y),str(z))
Если не достаточно - ищи мининг с UO.PrivateGetTile. В моем, например, я переписал все возможные тайлы под 2.0.3 клиент (их там чуть больше чем 5
)
Если не сложно ссылку попробую скорее всего да потому что у меня чтук 15 разных и не один не роет((
вот с функцией PrivateGetTile но он капает и не выкапывает физлит копку..
Code:
var bag = '0x4104B505' ; сундук куда скидывать руду и откуда брать инструменты
var instr = '0x0E85'
var ore1 = '0x19B7'
var ore2 = '0x19BA'
var ore3 = '0x19B8'
var ore4 = '0x19B9'
var Lasttimer
sub main()
repeat
walker(1343, 1650, 0)
UO.UseObject(bag)
wait(1000)
putore() ; скидываем руду
getinstr() ; добираем инструменты
walker(1343, 1650, 0) ; координаты до шахты
walker(1874, 271, 0)
walker(1887, 271, 0)
walker(1897, 271, 0)
walker(1904, 271, 0)
Mine()
walker(1912, 273, 0)
Mine()
walker(1916, 281, 0)
Mine()
walker(1921, 276, 0)
Mine()
walker(1921, 269, 0)
Mine()
walker(1924, 264, 0)
Mine()
walker(1917, 271, 0)
walker(1901, 271, 0)
walker(1887, 271, 0)
walker(1874, 271, 0)
walker(1874, 267, 0) ; координата у домика
until UO.Dead()
end sub
sub getinstr()
get(instr, bag, 3, 1)
get(instr, bag, 3, 1)
get(instr, bag, 3, 1)
endsub
sub putore()
put(ore1,bag)
put(ore2,bag)
put(ore3,bag)
put(ore4,bag)
end sub
################ Рудокоп #################
sub Mine()
VAR Shovel1 = '0x0F39'
VAR Shovel2 = '0x0F3A'
VAR Pickaxe1 = '0x0E85'
VAR Pickaxe2 = '0x0E86'
VAR MaxRange = 5
VAR X, Y, Z, Tiles
VAR mX, mY, mZ
VAR MaxVes = 610
mX = UO.GetX('self')
mY = UO.GetY('self')
mZ = UO.GetZ('self')
for Y = MaxRange - ( MaxRange * 2 ) to MaxRange
for X = MaxRange - ( MaxRange * 2 ) to MaxRange
Tiles = MiningTiles(mX+X, mY+Y)
if Tiles then
UO.DeleteJournal()
repeat
############################
#ПЕРЕГРУЗ!!!#
############################
If UO.Weight > MaxVes Then
UO.Print('Перегруз!')
return
endif
############################
UO.Set('quiet','1')
UO.DeleteJournal()
UO.Warmode(0)
UO.WaitTargetTile(Tiles, mX+X, mY+Y, mZ)
UO.FindType(Shovel1,-1,'my')
if UO.FindCount() then
UO.UseType(Shovel1)
else
UO.FindType(Shovel2,-1,'my')
if UO.FindCount() then
UO.UseType(Shovel2)
else
UO.FindType(Pickaxe1,-1,'my')
if UO.FindCount() then
UO.UseType(Pickaxe1)
else
UO.FindType(Pickaxe2,-1,'my')
if UO.FindCount() then
UO.UseType(Pickaxe2)
else
UO.Set('quiet','0')
UO.Print("ERROR: Нечем копать!!!")
return
endif
endif
endif
endif
LastTimer=UO.Timer()
repeat
wait(100)
until UO.InJournal("%|destroyed|loosen|то слишком далеко отсюда|выкопали|0xAD00|0xA867|0xA2DE|0xAD03|0x5DE0|0x5DE1|0x5DE2|0x5DE3|0x5DE4|0x5DE5|0x5DE6|0x5DE7|Вы положили|put the|is nothing here to mine|Wthere do you|не удалось|У вас нет|have no line|ничего|Тут ничего|Попробуйте|Try mining elsewhere") || UO.Timer()>LastTimer+100 || UO.Weight > MaxVes || UO.Dead()
until UO.InJournal("%|destroyed|0xAD00|0xA867|0xA2DE|не осталось руды.|is nothing here to mine|нет руды|У вас нет|have no line|Попробуйте|Try mining elsewhere") || UO.Timer()>LastTimer+500 || UO.Weight > MaxVes || UO.Dead()
############################
#ПЕРЕГРУЗ!!!#
############################
If UO.Weight > MaxVes Then
UO.Print('Перегруз!')
return
endif
############################
endif
next
next
UO.Set('quiet','0')
UO.Print("Все")
UO.Sound(100)
return 0
end sub
sub MiningTiles(X,Y)
var i
if UO.PrivateGetTile(X, Y, -1, 616, 618) then
for i=616 to 618
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 1339, 1363) then
for i=1339 to 1363
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 2272, 2282) then
for i=2272 to 2282
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 4963, 4973) then
for i=4963 to 4973
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 6001, 6012) then
for i=6001 to 6012
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 13121, 13369) then
for i=13121 to 13369
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 13446, 13455) then
for i=13446 to 13455
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 13484, 13492) then
for i=13484 to 13492
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
if UO.PrivateGetTile(X, Y, -1, 13625, 13628) then
for i=13625 to 13628
if UO.PrivateGetTile(X, Y, -1, i, i) then
return i
end if
next
end if
return 1; No Mining Tiles
end sub
sub GET(item, cont, min, max)
If UO.Count( item ) < min Then
# UO.Print("Кончилось сырье в рукзаке")
UO.FindType( item, '-1', cont )
if UO.FindCount() > 0 Then
# UO.Print('Сырья в сундуке: ' + Str( UO.FindCount( item ) ) )
uo.moveitem('finditem', max, 'backpack')
checklag()
else
# UO.Print( 'Полностью кончилось сырье' )
UO.CancelMenu()
return
endif
Endif
end sub
sub PUT(item, cont)
while UO.Count( item ) > 0
UO.FindType( item, -1, -1 )
UO.MoveItem( 'finditem', 0, cont )
checklag()
wend
end sub
sub DeleteJournal(msg)
While UO.InJournal(msg)
UO.SetJournalLine(UO.InJournal(msg) - 1,'')
wend
endsub
sub MyTerminate()
UO.Set('quiet','1')
UO.CancelMenu()
UO.IgnoreReset()
UO.Set('quiet','0')
UO.Exec('terminate all')
end sub
sub checklag()
DeleteJournal("backpack")
UO.Click("backpack")
repeat
wait(100)
until UO.InJournal("backpack")
end sub
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; var Prec=3 # Как близко следует подойти к цели (Precision)
; В функции 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 шаг обхода).
var MaxTraceDistance = 1 ; Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
var TraceLoopIncrease = 1 ; Увеличение MaxTraceDistance при исчерпании количества ходов.
var LimitTrace = 10 ; Сколько шагов в обе стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed = 3 ; Сколько шагов делать за раз между проверками.
var DynamicPause = 50 ; Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.
var steptimer = 2 ; Таймер на шаг(Значение 1 = 100мс). Время за которое чар проходит 1 тайл, если за это время чар не сдвинется с места скрипт расценит это как препятствие и начнет обходить.
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
sub Reconnector()
var ReconnectTime, RFlag
ReconnectTime = '0'
RFlag = 1
Repeat
While (UO.ObjAtLayer('Bpack') == '')
If RFlag Then
ReconnectTime = MakeTime()
RFlag = 0
endif
Wait(20000) # WorldSave Protection
UO.Say('')
Wait(3000)
UO.Say('')
Wait(3000)
UO.Say('')
Wait(3000)
UO.LDblClick(357,164)
UO.LClick(616,459)
Wait(3000)
Wend
Wait(3000)
If (RFlag == 0) and (ReconnectTime <> '0') Then
uo.TextOpen()
uo.TextPrint('Disconnected & Reconnected @ '+ReconnectTime)
RFlag = 1
ReconnectTime = '0'
End If
Until false
end sub
sub MakeTime()
VAR D, T, Ret, i
Ret = STR(UO.Time())
T = ""
For i = 0 To Len(Ret)
T = Ret[Len(Ret)-i] + T
If (I == 2) OR (I == 4) Then
T = ":" + T
EndIf
Next
Ret = STR(UO.Date())
D = ""
For i = 0 To Len(Ret)
D = Ret[Len(Ret)-i] + D
If (I == 2) OR (I == 4) Then
D = "." + D
EndIf
Next
Ret = T + " @ " + D
RETURN Ret
end sub
sub TerminateAll()
uo.Exec('Terminate All')
End Sub