Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local posX = 1
- local posY = 1
- local posZ = 1
- local dirX = 0
- local dirZ = 0
- local homeX = 0
- local homeY = 0
- local homeZ = 0
- local allOres = {}
- local eventQueue = {}
- local dataList = {}
- function checkPos()
- posX,posY,posZ = gps.locate()
- end
- function setup()
- checkPos()
- homeX = posX
- homeY = posY
- homeZ = posZ
- dataList["Pos"] = {posX,posY,posZ}
- turtle.forward()
- newX,newY,newZ = gps.locate()
- turtle.back()
- dirX = newX-posX
- dirZ = newZ-posZ
- print(dirX,dirZ)
- end
- local modem = peripheral.find("modem")
- modem.open(10)
- setup()
- function distToHome()
- local diffX = math.abs(posX - homeX)
- local diffY = math.abs(posY - homeY)
- local diffZ = math.abs(posZ - homeZ)
- return diffX+diffY+diffZ
- end
- function checkFuel()
- local fuel = turtle.getFuelLevel()
- if(distToHome() >= fuel) then
- moveTo(homeX,homeY,homeZ)
- end
- end
- function tryUp()
- if(turtle.detectUp()) then
- turtle.digUp()
- end
- turtle.up()
- checkFuel()
- end
- function tryDown()
- if(turtle.detectDown()) then
- turtle.digDown()
- end
- turtle.down()
- checkFuel()
- end
- function tryForward()
- if(turtle.detect()) then
- turtle.dig()
- end
- turtle.forward()
- checkFuel()
- end
- function left()
- if(dirX == 1) then
- dirX = 0
- dirZ = -1
- elseif(dirX == -1) then
- dirX = 0
- dirZ = 1
- elseif(dirZ == 1) then
- dirX = 1
- dirZ = 0
- elseif(dirZ == -1) then
- dirX = -1
- dirZ = 0
- end
- turtle.turnLeft()
- end
- function right()
- end
- function turnTo(x,z)
- while(true) do
- if(dirX == x and dirZ == z) then
- break
- end
- left()
- end
- end
- function moveTo(x,y,z)
- checkPos()
- while(posY ~= y) do
- local diff = y-posY
- if(diff > 0) then
- tryUp()
- else
- tryDown()
- end
- checkPos()
- end
- if(x-posX > 0) then
- turnTo(1,0)
- elseif(x-posX < 0) then
- turnTo(-1,0)
- end
- while(posX ~= x) do
- tryForward()
- checkPos()
- end
- if(z-posZ > 0) then
- turnTo(0,1)
- elseif(z-posZ < 0) then
- turnTo(0,-1)
- end
- while(posZ ~= z) do
- tryForward()
- checkPos()
- end
- checkPos()
- end
- function detectOre()
- local bUp,up = turtle.inspectUp()
- local bDown,down = turtle.inspectDown()
- if(bUp and up.tags["forge:ores"]) then
- return up
- end
- if(bDown and down.tags["forge:ores"]) then
- return down
- end
- local b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- return forward
- end
- left()
- b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- left()
- left()
- left()
- return forward
- end
- left()
- left()
- b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- left()
- return forward
- end
- left()
- return nil
- end
- function checkOre()
- local oreList = {}
- local bUp,up = turtle.inspectUp()
- local bDown,down = turtle.inspectDown()
- if(bUp and up.tags["forge:ores"]) then
- table.insert( oreList, {0,1,0,})
- allOres[up.name] = true
- end
- if(bDown and down.tags["forge:ores"]) then
- table.insert( oreList, {0,-1,0})
- allOres[down.name] = true
- end
- local b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- table.insert( oreList, {dirX,0,dirZ})
- allOres[forward.name] = true
- end
- left()
- b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- table.insert( oreList, {dirX,0,dirZ})
- allOres[forward.name] = true
- end
- left()
- b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- table.insert( oreList, {dirX,0,dirZ})
- allOres[forward.name] = true
- end
- left()
- b,forward = turtle.inspect()
- if(b and forward.tags["forge:ores"]) then
- table.insert( oreList, {dirX,0,dirZ})
- allOres[forward.name] = true
- end
- left()
- return oreList
- end
- function cmd(sname,p)
- if(sname == "home") then
- moveTo(homeX,posY,homeZ)
- moveTo(homeX,homeY,homeZ)
- return {"Done"}
- elseif(sname == "moveRP") then
- moveTo(posX + p[1], posY + p[2], posZ + p[3])
- local ore = detectOre()
- if(ore) then
- return {"Value",ore.name}
- end
- elseif(sname == "moveRH") then
- moveTo(homeX + p[1], homeY + p[2], homeZ + p[3])
- local ore = detectOre()
- if(ore) then
- return {"Value",ore.name}
- end
- elseif(sname == "moveA") then
- moveTo(p[1],p[2],p[3])
- local ore = detectOre()
- if(ore) then
- return {"Value",ore.name}
- end
- elseif(sname == "chest") then
- turnTo(1,0,0)
- for i=1,16 do
- local item = turtle.getItemDetail(i)
- if(item and allOres[item.name]) then
- turtle.select(i)
- turtle.drop()
- end
- end
- turnTo(-1,0,0)
- for i=1,16 do
- turtle.select(i)
- turtle.drop()
- end
- return("Done")
- elseif(sname == "vein") then
- checkPos()
- local returnX = posX
- local returnY = posY
- local returnZ = posZ
- local oreList = {}
- local minedList = {}
- local tempore = checkOre()
- for k,v in pairs(tempore) do
- table.insert( oreList, {posX + v[1], posY + v[2], posZ + v[3]} )
- minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})] = true
- end
- while(true) do
- checkPos()
- table.sort(oreList, function (left, right)
- local dl = (left[1] - posX)^2 + (left[2] - posY)^2 + (left[3] - posZ)^2
- local dr = (right[1] - posX)^2 + (right[2] - posY)^2 + (right[3] - posZ)^2
- return dl < dr
- end)
- local ore = table.remove(oreList,1)
- moveTo(ore[1],ore[2],ore[3])
- local tempore = checkOre()
- for k,v in pairs(tempore) do
- if(minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})]) then
- print("already added earlyer")
- else
- minedList[table.concat({posX + v[1], posY + v[2], posZ + v[3]})] = true
- table.insert( oreList, {posX + v[1], posY + v[2], posZ + v[3]} )
- end
- end
- if(#oreList == 0) then
- break
- end
- end
- print("RETURN TO",returnX,returnY,returnZ)
- moveTo(returnX,returnY,returnZ)
- end
- return {"Done"}
- end
- function listen()
- while(true) do
- local _,side,rc,sc,data = os.pullEvent("modem_message")
- if(sc == 65534) then
- elseif(data == "stop") then
- moveTo(homeX,posY,homeZ)
- moveTo(homeX,homeY,homeZ)
- elseif(data == "home") then
- checkPos()
- homeX = posX
- homeY = posY
- homeZ = posZ
- else
- req = data[1]
- sname = data[2]
- p = data[3]
- if(req == "GET") then
- modem.transmit(sc,0,dataList[sname])
- else
- table.insert( eventQueue,{sc,sname,p})
- end
- end
- end
- end
- function main()
- while(true) do
- if(#eventQueue > 0) then
- currentTask = table.remove(eventQueue,1)
- modem.transmit(currentTask[1],0,cmd(currentTask[2],currentTask[3]))
- end
- os.queueEvent("randomEvent")
- os.pullEvent()
- end
- end
- parallel.waitForAny(listen,main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement