Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- minimal intrusion miner
- args = { ... } -- xdig zdig xdrop ydrop zdrop fdrop
- if #args ~= 6 then exit() end
- local digSpots = {{0,0},{-2,1},{-4,2},{-3,4},{-1,3}}
- local fuelSlot = 16
- local yTravel = 75 -- height to travel at
- local dropPos = {tonumber(args[3]), tonumber(args[4]), tonumber(args[5]), tonumber(args[6])}
- local pos = {0,0,0,1} -- x,y,z,f
- local statefile = "state"
- local fh = fs.open(statefile,"r")
- for i = 1,4 do
- pos[i] = tonumber(fh.readLine())
- end
- fh.close()
- -- pos[1], pos[2], pos[3] = gps.locate(1)
- -- print("which direction am i facing?")
- -- pos[4] = tonumber(read())
- print(pos[1].." "..pos[2].." "..pos[3].." "..pos[4])
- local movement = {{0,0,1,0},{-1,0,0,0},{0,0,-1,0},{1,0,0,0},{0,1,0,0},{0,0,0,1}} -- directions 1-4, up, down, turn left, turn right
- function matrixOp(a,b,op)
- local c = {}
- if #a == #b then
- for i = 1,#a do
- if op == "+" then
- c[i] = a[i] + b[i]
- elseif op == "-" then
- c[i] = a[i] - b[i]
- end
- end
- end
- return c
- end
- function updateState()
- local fh = fs.open(statefile,"w")
- for i = 1,4 do
- fh.writeLine(tostring(pos[i]))
- end
- fh.close()
- print(pos[1].." "..pos[2].." "..pos[3].." "..pos[4])
- end
- function move(direction, attack)
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- if direction == "f" then
- moved = turtle.forward()
- while not moved do
- print("can't move forward")
- if attack then
- turtle.attack()
- end
- os.sleep(1)
- moved = turtle.forward()
- end
- if moved then
- pos = matrixOp(pos,movement[pos[4]],"+")
- end
- elseif direction == "b" then
- moved = turtle.back()
- while not moved do
- print("can't move back")
- os.sleep(1)
- moved = turtle.back()
- end
- if moved then
- pos = matrixOp(pos,movement[pos[4]],"-")
- end
- elseif direction == "u" then
- moved = turtle.up()
- while not moved do
- print("can't move up")
- if attack then
- turtle.attackUp()
- end
- os.sleep(1)
- moved = turtle.up()
- end
- if moved then
- pos = matrixOp(pos,movement[5],"+")
- end
- elseif direction == "d" then
- moved = turtle.down()
- while not moved do
- print("can't move down")
- if attack then
- turtle.attackDown()
- end
- os.sleep(1)
- moved = turtle.down()
- end
- if moved then
- pos = matrixOp(pos,movement[5],"-")
- end
- elseif direction == "r" then
- turtle.turnRight()
- pos = matrixOp(pos,movement[6],"+")
- if pos[4] > 4 then
- pos[4] = 1
- end
- elseif direction == "l" then
- turtle.turnLeft()
- pos = matrixOp(pos,movement[6],"-")
- if pos[4] < 1 then
- pos[4] = 4
- end
- end
- updateState()
- end
- function goto(newpos)
- --numberfy the args
- for i = 1,#newpos do
- newpos[i] = tonumber(newpos[i])
- end
- --goto travel height
- if (newpos[1] ~= pos[1]) or (newpos[3] ~= pos[3]) then
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[2] - yTravel))) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- while pos[2] < yTravel do
- move("u", false)
- end
- while pos[2] > yTravel do
- move("d", false)
- end
- --goto x
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[1] - newpos[1]))) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- while pos[1] < newpos[1] do
- while pos[4] ~= 4 do
- move("r", false)
- end
- move("f", false)
- end
- while pos[1] > newpos[1] do
- while pos[4] ~= 2 do
- move("r", false)
- end
- move("f", false)
- end
- --goto z
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[3] - newpos[3]))) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- while pos[3] < newpos[3] do
- while pos[4] ~= 1 do
- move("r", false)
- end
- move("f", false)
- end
- while pos[3] > newpos[3] do
- while pos[4] ~= 3 do
- move("r", false)
- end
- move("f", false)
- end
- end
- --goto y
- if newpos[2] > 0 then
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(math.abs(pos[2] - newpos[2]))) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- while pos[2] < newpos[2] do
- move("u", false)
- end
- while pos[2] > newpos[2] do
- move("d", false)
- end
- else -- y = -1 to go down until you touch ground
- while not turtle.detectDown() do
- if (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) then
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- move("d", false)
- end
- end
- --face correctly (if set)
- if #newpos == 4 then
- while pos[4] ~= newpos[4] do
- move("r", false)
- end
- end
- end
- function dropInv()
- goto(dropPos)
- --restock on fuel
- turtle.select(fuelSlot)
- turtle.suckDown()
- for i = 4,15 do
- turtle.select(i)
- turtle.transferTo(fuelSlot) -- if it's the fuel we use, put it into the fuel slot
- if turtle.getItemCount(i) > 0 then
- while not turtle.drop() do -- if there's something left, drop it
- sleep(1) -- wait a moment if you can't drop it
- end
- end
- end
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 10) do
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- turtle.select(1)
- for i = 1,3 do
- move("b", false)
- end
- end
- function digShaft()
- while (turtle.getFuelLevel() ~= "unlimited") and (turtle.getFuelLevel() < 1.2*(pos[2])) do -- refuel enough to go to bedrock
- turtle.select(fuelSlot)
- turtle.refuel(1)
- end
- local hitBedrock = false
- while not hitBedrock do
- if turtle.detectDown() then -- block below
- if not turtle.digDown() then -- can't dig block below
- hitBedrock = true
- end
- if turtle.getItemCount(15) > 0 then -- inventory filling up
- oldpos = pos
- dropInv()
- goto(oldpos)
- end
- end
- if hitBedrock then
- break
- end
- move("d", true)
- for k = 1,4 do
- if turtle.detect() then -- block in front
- local takeBlock = true -- assume block is interesting
- for c = 3,1,-1 do
- turtle.select(c)
- if turtle.compare() then -- if it's in slot 1-3, it's not interesting
- takeBlock = false
- end
- end
- if takeBlock then -- block is interesting, dig it up
- turtle.dig()
- if turtle.getItemCount(15) > 0 then -- inventory filling up
- oldpos = pos
- dropInv()
- goto(oldpos)
- end
- end
- end
- if k < 4 then
- move("r",false)
- end
- end
- end
- end
- rows = 0
- cols = 0
- --for rows = 0,5 do
- -- for cols = 0,5 do
- for n = 1,#digSpots do
- local dpos = {}
- dpos[1] = tonumber(args[1]) + digSpots[n][1] + 5 * cols
- dpos[2] = -1
- dpos[3] = tonumber(args[2]) + digSpots[n][2] + 5 * rows
- goto(dpos)
- digShaft()
- end
- -- end
- --end
- dropInv()
- print("done with mining at "..args[1].." "..args[2])
Advertisement
Add Comment
Please, Sign In to add comment