Когда замаркаешь кординаты он начинает копать но когда переходит на другой он не капает а вылазит таргет
#@include equip.scl #@include unload.scl #@include walker1.scl
################################################################################
# НАСТРОЙКА И ИСПОЛЬЗОВАНИЕ # 1) запустить функцию setup # 2) в качестве первой точки указать точку выгрузки руды # на расстоянии не более 3х клеток от этой точки должны быть # прилоченны все виды выкапываемой руды # 3) 2 и 3 точки - опорные для прохода в шахт # 4) далее указать до 100 точек в которых надо копать # 5) для окончания разметки, указать на себя # 6) после разметки, настройка закончена # 7) можно запускать функцию mining # # при разметке важно не подходить близко к указываемой точке ################################################################################
sub mining() var points = 0 dim mineX[100] dim mineY[100]
points = loadPointsXY(mineX, mineY, FileName())
uo.say('.macro on') equipForMining()
Walker(mineX[1], mineY[1]) Walker(mineX[2], mineY[2])
var f = 3 var i var ret
uo.deleteJournal()
repeat uo.print('walk to point ' + str(f)) Walker(mineX[f], mineY[f]) #ret = MiningHere() ret = MiningHereDumb()
#если атакуют или много веса - на разгрузку if ((ret == 2) or (uo.weight > uo.str*3.2)) then uo.print('walk to unload') for i = f to 0 step -1 Walker(mineX[i], mineY[i]) next
unloadOres()
Walker(mineX[1], mineY[1]) Walker(mineX[2], mineY[2]) f = 3 else f = f + 1 #возвращаемся в первую точку if (f >= points) then for i = f-1 to 3 step -1 Walker(mineX[i], mineY[i]) next f =3 end if #fix "already doing"? wait(2000) end if
until uo.life == 0
end sub
sub setup() uo.AddType('pickaxe', '0x0E85') uo.AddType('ore', '0x19B9') uo.saveconfig()
equipForMining()
dim tileArr[100] dim xArr[100] dim yArr[100] dim zArr[100]
var points = markPoints(tileArr, xArr, yArr, zArr) savePointsXY(xArr, yArr, FileName(), points) end sub
#нормальный мининг с проверкой сообщений, нападения, зависания, ... sub MiningHere() var msg1 = 'You place' var msg2 = 'You fail to find' var msg3 = 'You cannot prospect'
var msg4 = 'There is no ore here to mine' var msg5 = 'You cannot mine that' var msg6 = 'attacking you'
var done = 0 var counter = 0 var delay = 500 var lastLife = uo.Life var pickaxe = uo.ObjAtLayer('Rhand')
uo.deletejournal()
uo.useObject(pickaxe) wait (400) uo.press(119)
repeat if (uo.injournal(msg1) or uo.injournal(msg2) or uo.injournal(msg3)) then #процесс идет counter = 0 end if
if (uo.injournal(msg4) or uo.injournal(msg5)) then #процесс не идет done = 1 end if
if (uo.injournal(msg6) or (uo.Life < lastLife)) then #кто-то нас аттачит uo.print('under attack!') done = 2 uo.deleteJournal() end if
if (uo.Life > lastLife) then lastLife = uo.Life end if
if (counter > 15000) then #процесс не идет, пробуем начать снова CheckLag() if (uo.targeting()) then wait (400) uo.press(119) end if
uo.useObject(pickaxe) wait (400) uo.press(119) counter = 0 end if
uo.deleteJournal() wait(delay) counter = counter + delay until done or uo.Life == 0
return done end sub
#тупой мининг - использовать 1 раз кирку и стоят 1 минуту sub MiningHereDumb() var counter = 0 var delay = 500 var pickaxe = uo.ObjAtLayer('Rhand')
uo.useObject(pickaxe) wait (400) uo.press(119)
repeat wait(delay) counter = counter + delay until counter > 70000 or uo.Life == 0
return 0 end sub
#выгрузка руды #если не сможет выгрузить хотя бы 1 тип руды - #зависнет в вечной попытке его выгрузить sub unloadOres() var idx = 0 var type = '' var color = ''
uo.findType('ore') while uo.findCount() type = uo.GetGraphic('finditem') color = uo.GetColor('finditem') unLoad(type, color, 3) uo.findType('0x19B9') wend
end sub
sub equipForMining() UnEquip('Rhand') UnEquip('Lhand') EquipT('Rhand', 'pickaxe') end sub
sub FileName() return 'minePoints-' + UO.GetSerial('self') + '.txt' end sub
sub markPoints(tileArr, xArr, yArr, zArr) var count = 0 var done = 0
var tile, x, y, z var hatchet = uo.ObjAtLayer('Rhand')
repeat uo.UseObject(hatchet) wait(1000) while uo.targeting() wait(500) wend tile = uo.LastTile(0) x = uo.LastTile(1) y = uo.LastTile(2) z = uo.LastTile(3)
if (x == uo.GetX() and y == uo.GetY()) then done = 1 else tileArr[count] = tile xArr[count] = x yArr[count] = y zArr[count] = z count = count + 1 uo.print('Added point ' + STR(count) + ' (' + STR(x) +', ' + STR(y) + ')') end if until done
uo.print('Done. ' + STR(count) + ' points added')
return count end sub
sub savePointsXY(xArr, yArr, name, cnt) var fl = File(name) fl.open() fl.create()
safecall fl.writeln(STR(cnt))
for var f = 0 to cnt - 1 safecall fl.writeln(STR(xArr[f]) + ' ' + STR(yArr[f])) next uo.print(STR(cnt) + ' points saved')
fl.close() end sub
sub loadPointsXY(xArr, yArr, name) var fl = File(name) fl.open() var cnt = safecall fl.ReadNumber() for var f = 0 to cnt - 1 xArr[f] = safecall fl.ReadNumber() yArr[f] = safecall fl.ReadNumber() next fl.close() uo.print(STR(cnt) + ' points loaded')
return cnt end sub
#@autocode #------------------------------------------------ # included file equip.scl #------------------------------------------------
#@include checklag.scl
sub UnEquip(layer) uo.unequip(layer) CheckLag() while uo.ObjAtLayer(layer) <> '' uo.unequip(layer) CheckLag() wait(1000) wend end sub
sub EquipT(layer, type) uo.equipt(layer, type) CheckLag() while uo.ObjAtLayer(layer) == '' uo.equipt(layer, type) CheckLag() wait(1000) wend end sub
#------------------------------------------------ # included file unload.scl #------------------------------------------------
#@include checklag.scl
#выкладныванме из бекпака итемов с типом type #и цветом color на землю в прилоченную кучку #находящуюся на расстояние не больше distance
sub unLoad(type, color, distance) var inBackpack = '' var onGround = '' uo.Set('finddistance', distance)
uo.FindType(type, color, 'ground') onGround = uo.GetSerial('finditem')
uo.FindType(type, color) inBackpack = uo.GetSerial('finditem')
if (onGround <> '0x00000000' and inBackpack <> '0x00000000') then var x, y, z x = uo.GetX(onGround) y = uo.GetY(onGround) z = uo.GetZ(onGround) uo.Click(inBackpack) CheckLag() uo.print(uo.GetName(inBackpack)) uo.MoveItem(inBackpack, 0, onGround, x, y, z) wait(1500) CheckLag() end if
uo.Set('finddistance', 14) end sub
#------------------------------------------------ # included file walker1.scl #------------------------------------------------
#@include math.scl
var prec = 0
sub Walker(x,y) var ld=0,ldc=0 var dx,dy var mx,my var ox,oy,mk,k start: mx=UO.GetX() my=UO.GetY() dx=abs(mx-x) dy=abs(my-y) if dy>dx then dx=dy end if if dx<=prec then return end if if dx<3 then mk=70 else mk=15 end if
ox=mx oy=my for k=1 to mk mx=UO.GetX() my=UO.GetY() if mx<>ox or my<>oy then goto sdidapl end if wait(10) next sdidapl:
mx=UO.GetX() my=UO.GetY() dx=abs(mx-x) dy=abs(my-y)
if dy>dx then dx=dy end if
if dx<=prec then return end if
if ld==dx then ldc=ldc+1 if ldc>100 then uo.print("Can not reach location!") return end if else ld=dx end if
if mx==x then if my==y then return endif if my>y then UO.Press(33) goto start endif UO.Press(35) goto start end if
if mx<x then if my>y then UO.Press(39) goto start endif if my==y then UO.Press(34) goto start endif UO.Press(40) goto start end if if my<y then UO.Press(37) goto start endif if my==y then UO.Press(36) goto start endif UO.Press(38) goto start end sub
#------------------------------------------------ # included file checklag.scl #------------------------------------------------
#проверка на лаг. одиночный клик на backpack и ожидание в журнале #слов "backpack" sub CheckLag() if (uo.Waiting() or uo.targeting()) then uo.canceltarget() end if
uo.DeleteJournal() uo.Click('backpack') repeat wait(200) until uo.InJournal('backpack') uo.DeleteJournal() end sub #------------------------------------------------ # included file math.scl #------------------------------------------------
#математические функции #Abs - модуль числа #Sign - знак числа (для отрицательтных чисел -1, для положительных +1)
Sub Abs(x) if (x<0) then x = -x end if
return x end sub
sub Sign(n) if (n < 0) then n = -1 end if
if (n > 0) then n = 1 end if
return n end sub
|