Code:
var id_BankStone = '0x40000DCC', id_BankContainer = '0x40015A1D', t_PickAxe = '0x0E85', id_Forge = '0x40034167'
var TileNum = '1339', MaxTraceDistance = 10, TraceLoopIncrease = 5, LimitTrace = 20
var Speed = 1, StepTimeOut = 770, CheckCnt = 2, DynamicPause = 100, UseHiding = 1
sub Start()
UO.Exec('exec Mining')
UO.Exec('exec Reconnector')
;UO.Exec('exec DeadWatch')
UO.Exec('exec AntiMacro')
Endsub
Sub AntiMacro()
var x = -1, y = -1, z = -1, value, msg = 'Сколько будет'
While true
If UO.InJournal(msg) then
Wait(500)
x = Compare()
y = Compare()
z = Compare()
If x > -1 and y > -1 and z > -1 then
DelJournal(msg)
UO.Print(str(x) + ' + ' + str(y) + ' + ' + str(z) + ' = ' + str(x + y + z))
UO.Say(str(x + y + z))
else
UO.Print('Ошибка в считывании журнала')
UO.Print(str(x) + ' + ' + str(y) + ' + ' + str(z) + ' = ' + str(x + y + z))
Endif
else
Wait(100)
Endif
Wend
Endsub
Sub Compare()
var a
Dim Num[10]
Num[0] = 'Нол'
Num[1] = 'Оди'
Num[2] = 'Дв'
Num[3] = 'Тр'
Num[4] = 'Четы'
Num[5] = 'Пят'
Num[6] = 'Шест'
Num[7] = 'Сем'
Num[8] = 'Восе'
Num[9] = 'Девя'
For a = 0 to 9
If UO.InJournal(Num[a]) and UO.JournalSerial(UO.InJournal(Num[a]) - 1) == UO.GetSerial('self') then
UO.SetJournalLine(UO.InJournal(Num[a]) - 1, '')
Return a
else
Wait(10)
Endif
Next
Return -1
Endsub
Sub Mining()
var a, Coor = '2559 496 2560 491 2560 487 2564 484 2565 479 2568 476 2573 476 2578 476 2579 481 2578 485 2573 485 2574 481 2569 481 2568 486 2571 489 2570 489 2565 489 2564 493 '
While true
For a = 1 to 18
Walker(val(GetWord(Coor, (a * 2) - 1)), val(GetWord(Coor, a * 2)), 0)
Wait(100)
Mining_Around()
Next
Wend
Endsub
Sub Mining_Around()
var msg_t = 'put the|loosen some rocks', msg_e = 'There is no ore|far away|mining|line of sight|t use'
var y, x, Time, mx, my, Delay = 5, Try = 0
For y = -2 to 2
For x = -2 to 2
Repeat
DelJournal(msg_t + '|' + msg_e)
UO.Print('Mining in ' + str(x) + ',' + str(y))
Time = UO.Timer()
Hide()
UO.WaitTargetTile(TileNum, str(UO.GetX() + x), str(UO.GetY() + y), 0)
UO.UseType(t_PickAxe)
Try = Try + 1
Repeat
Wait(100)
Until UO.InJournal(msg_t + '|' + msg_e) or Time + (Delay * 10) < UO.Timer()
If UO.InJournal('put the') then
Try = 0
EndIf
If UO.Weight >= UO.Str * 4 or not UO.ObjAtLayer('Rhand') then
mx = UO.GetX('self')
my = UO.GetY('self')
Smelt()
Unload()
Walker(mx, my, 0)
Endif
Until UO.InJournal(msg_e) or Try == 10
Next
Next
Endsub
Sub Smelt()
var a
Dim t_Ore[4]
t_Ore[0] = '0x19B9'
t_Ore[1] = '0x19B8'
t_Ore[2] = '0x19BA'
t_Ore[3] = '0x19B7'
Walker(2572, 475, 0)
For a = 0 to 3
While UO.Count(t_Ore[a])
If UO.SkillVal('Mining', 1) < 1000 then
UO.FindType(t_Ore[3], -1, 'backpack')
If UO.FindCount() then
UO.WaitTargetType(t_Ore[3])
UO.UseObject(id_Forge)
Wait(100)
else
UO.FindType(t_Ore[a], -1, 'backpack')
If UO.FindCount() then
CheckLag()
UO.MoveItem('finditem', 1, 'backpack', 25, 25, 0)
Wait(1100)
else
Wait(100)
Endif
Endif
else
UO.WaitTargetType(t_Ore[a])
UO.UseObject(id_Forge)
Wait(100)
Endif
Wend
Next
Endsub
Sub Unload()
var a
Dim t_Ingots[3]
t_Ingots[0] = '0x1BEF'
t_Ingots[1] = '0x1BE9'
t_Ingots[2] = '0x1BF5'
Walker(2568, 475, 0)
UO.UseObject(id_BankStone)
For a = 0 to 2
While UO.Count(t_Ingots[a])
CheckLag()
UO.FindType(t_Ingots[a], -1, 'backpack')
If UO.FindCount() then
UO.MoveItem('finditem', -1, id_BankContainer)
Wait(1000)
else
UO.Print('Непонятки')
Return
Endif
Wend
Next
If not UO.Count(t_PickAxe) then
UO.FindType(t_PickAxe, -1, id_BankContainer)
If UO.FindCount() then
CheckLag()
UO.MoveItem('finditem', -1, 'backpack')
Wait(1100)
UO.Equip('Rhand', 'finditem')
else
UO.Print('В банке нет Pickaxe')
UO.Print('Скрипт выключается')
UO.Exec('terminate all')
Endif
Endif
Endsub
Sub Hide()
var msg = 'seem to hide|have hidden', Time, Delay = 3
While not UO.Hidden() and UseHiding == 1
If UO.Warmode() then
UO.WarMode(0)
Endif
DelJournal(msg)
Time = UO.Timer()
UO.UseSkill('Hiding')
Repeat
Wait(100)
Until UO.InJournal(msg) or Time + (Delay * 10) < UO.Timer() or UO.Hidden()
Wend
Endsub
Sub DelJournal(msg)
While UO.InJournal(msg)
UO.SetJournalLine(UO.InJournal(msg) - 1, '')
Wend
Endsub
Sub CheckLag()
DelJournal('ackpack')
UO.Click('backpack')
Repeat
Wait(50)
Until UO.InJournal('ackpack')
Endsub
Sub GetWord(st, nom)
var tmpst, i, dlin, kol = 0, start = 0
dlin = len(st)
For i = 0 to dlin - 1
If mid(st, i, 1) == ' ' or i == dlin - 1 then
kol = kol + 1
If kol == nom then
tmpst = mid(st, start, i - start)
Return tmpst
else
While mid(st, i, 1) == ' '
i = i + 1
Wend
If kol == nom - 1 then
start = i
Endif
Endif
Endif
Next
tmpst = ''
Return tmpst
Endsub
Sub Abs(X)
If X > 0 then
Return X
else
Return (-X)
Endif
Endsub
Sub Walker(GoX, GoY, Prec)
var LastDir, MoveRes, TracerCnt
UO.SetGlobal('Logging', '0')
UO.SetGlobal('BlindWalk', '0')
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
Eeturn 1
Endif
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
Endsub
Sub FullAroundTrace(StartDir, GoX, GoY, Prec, MaxTrace)
var LineX = UO.GetX(), LineY = UO.GetY(), CurDir = StartDir
var Direction = CountDirection(GoX, GoY, CurDir, Prec)
var StartX, StartY, 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
Endif
MovesDone = MovesDone + 1
CurDir = AddToDir(CurDir, -Direction, Prec)
Until MovesDone > MaxTrace
Return 0
Endsub
Sub CountDirection(GoX, GoY, StartDir, Prec)
var GoDir = GetDir(GoX, GoY, Prec), MyX = UO.GetX(), MyY = UO.GetY()
If GoDir < StartDir then
Return -1
Endif
If GoDir > StartDir then
Return 1
Endif
If Abs(MyX - GoX) > Abs(MyY - GoY) then
If (GoDir == 3) or ( GoDir == 7) then
Return -1
else
Return 1
Endif
else
If (GoDir == 1) or (GoDir == 5) then
Return -1
else
Return 1
Endif
Endif
Endsub
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)
Endsub
Sub LinesCrossing(x1, y1, x2, y2, x3, y3, x4, y4, Prec)
If x1 == x3 and y1 == y3 then
Return false
Endif
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)
If (ub1 == 0) or (ub2 == 0) then
Return false
Endif
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
Endif
Endsub
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
Endif
Return false
Endsub
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)
Endif
Until LastDir == 0 or IsEnd(GoX, GoY, Prec) or not CouldMove
Return LastDir
Endsub
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
Endif
Endsub
Sub GetDir(GoX, GoY, Prec)
var MyX = UO.GetX(), MyY = UO.GetY(), DiffX = Abs(UO.GetX() - GoX), DiffY = Abs(UO.GetY() - GoY), GoDir = 0
If (DiffX / (DiffY + 0.1)) >= 2 then
If MyX > GoX then
GoDir = 7
else
GoDir = 3
Endif
else
If (DiffY / (DiffX + 0.1)) >= 2 then
If MyY > GoY then
GoDir = 5
else
GoDir = 1
Endif
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
Endif
Endif
Endif
Endif
Endif
Endif
Return GoDir
Endsub
Sub Tracer(StartDir, Direction, Prec)
var CurDir = StartDir, Result
Repeat
Result = TryDir(CurDir, Prec)
If not Result then
CurDir = AddToDir(CurDir, Direction, Prec)
Endif
Until Result
Return Result
Endsub
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
Endsub
Sub TryDir(Dir, Prec)
var BegX = UO.GetX(), BegY = UO.GetY(), Counter = 0, GoX = BegX, GoY = BegY
Hide()
GoX = XFromDir(Dir)
GoY = YFromDir(Dir)
If not IsPass(GoX, GoY) then
LogInfo(str(GoX) + ':' + str(GoY) + ' is not passable')
Return false
Endif
Return TurnAndGoDir(Dir, Prec)
Endsub
Sub XFromDir(Dir)
If Dir == 2 or Dir == 3 or Dir == 4 then
Return (UO.GetX() + 1)
Endif
If Dir == 6 or Dir == 7 or Dir == 8 then
Return (UO.GetX() - 1)
Endif
Return (UO.GetX())
Endsub
Sub YFromDir(Dir)
If Dir == 8 or Dir == 1 or Dir == 2 then
Return (UO.GetY() + 1)
Endif
If Dir == 4 or Dir == 5 or Dir == 6 then
Return (UO.GetY() - 1)
Endif
Return (UO.GetY())
Endsub
Sub TurnAndGoDir(Dir, Prec)
var StartDir = GetDirToDir(UO.GetDir(), Prec), StartX = UO.GetX(), StartY = UO.GetY()
var EndDir, Counter = 0, TestCounter = CheckCnt
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
Endif
If StartY <> UO.GetY() or StartX <> UO.GetX() then
Return Dir
Endif
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
If Counter >= StepTimeOut / DynamicPause then
LogInfo('Step timeout reached')
Return 0
else
Return Dir
Endif
Endsub
Sub GetDirToDir(GotDir, Prec)
var ChangedDir = -GotDir
ChangedDir = AddToDir(ChangedDir, 5, Prec)
Return ChangedDir
Endsub
Sub DirToInj(Dir)
Dim Dirs[8]
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])
Endsub
Sub PressDir(Dir)
Dim Dirs[8]
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)
Endsub
Sub GoDir(Dir,Prec)
var DistanceX = Abs(UO.GetX() - val(UO.GetGlobal('GlobalGoX'))), DistanceY = Abs(UO.GetY() - val(UO.GetGlobal('GlobalGoY'))), GoDistance
Dim Dirs[8]
Dirs[1] = 35
Dirs[2] = 40
Dirs[3] = 34
Dirs[4] = 39
Dirs[5] = 33
Dirs[6] = 38
Dirs[7] = 36
Dirs[8] = 37
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)
Endsub
Sub IsPass(X, Y)
var i
If UO.GetGlobal('BlindWalk') then
Return true
Endif
Dim Types[54]
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 i = 1 to 53 step 2
If UO.PrivateGetTile(X, Y, -1, Types[i], Types[i + 1]) then
Return true
Endif
Next
Return false
Endsub
Sub LogInfo(Line)
If not UO.GetGlobal('Logging') == '0' then
UO.TextOpen()
UO.TextPrint(str(UO.GetX()) + ':' + str(UO.GetY()) + ' - ' + Line)
Endif
Endsub
Sub Reconnector()
var ReconnectTime, RFlag
ReconnectTime = '0'
RFlag = 1
Repeat
While UO.ObjAtLayer('Bpack') == ''
If RFlag then
ReconnectTime = MakeTime()
RFlag = 0
Endif
Wait(20000)
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.Exec('terminate all')
;UO.Exec('exec autoload')
UO.TextOpen()
UO.TextPrint('Disconnected & Reconnected @ '+ReconnectTime)
RFlag = 1
ReconnectTime = '0'
Endif
Until false
Endsub
Sub MakeTime()
var Ret, Date, Time, a
Ret = str(UO.Time())
Time = ''
For a = 0 to len(Ret)
Time = Ret[len(Ret) - a] + Time
If (a == 2) or (a == 4) then
Time = ':' + Time
Endif
Next
Ret = str(UO.Date())
Date = ''
For a = 0 to len(Ret)
Date = Ret[len(Ret) - a] + Date
If (a == 2) or (a == 4) then
Date = '.' + Date
Endif
Next
Ret = Time + ' @ ' + Date
Return Ret
Endsub