-- SPDX-FileCopyrightText: 2017 Daniel Ratcliffe -- -- SPDX-License-Identifier: LicenseRef-CCPL if not turtle then printError("Requires a Turtle") return end local tArgs = { ... } if #tArgs ~= 1 then local programName = arg[0] or fs.getName(shell.getRunningProgram()) print("Usage: " .. programName .. " ") return end -- Mine in a quarry pattern until we hit something we can't dig local length = tonumber(tArgs[1]) if length < 1 then print("Tunnel length must be positive") return end local collected = 0 local function collect() collected = collected + 1 if math.fmod(collected, 25) == 0 then print("Mined " .. collected .. " items.") end end local function tryDig() while turtle.detect() do if turtle.dig() then collect() sleep(0.5) else return false end end return true end local function tryDigUp() while turtle.detectUp() do if turtle.digUp() then collect() sleep(0.5) else return false end end return true end local function tryDigDown() while turtle.detectDown() do if turtle.digDown() then collect() sleep(0.5) else return false end end return true end local function refuel() local fuelLevel = turtle.getFuelLevel() if fuelLevel == "unlimited" or fuelLevel > 0 then return end local function tryRefuel() for n = 1, 16 do if turtle.getItemCount(n) > 0 then turtle.select(n) if turtle.refuel(1) then turtle.select(1) return true end end end turtle.select(1) return false end if not tryRefuel() then print("Add more fuel to continue.") while not tryRefuel() do os.pullEvent("turtle_inventory") end print("Resuming Tunnel.") end end local function tryUp() refuel() while not turtle.up() do if turtle.detectUp() then if not tryDigUp() then return false end elseif turtle.attackUp() then collect() else sleep(0.5) end end return true end local function tryDown() refuel() while not turtle.down() do if turtle.detectDown() then if not tryDigDown() then return false end elseif turtle.attackDown() then collect() else sleep(0.5) end end return true end local function tryForward() refuel() while not turtle.forward() do if turtle.detect() then if not tryDig() then return false end elseif turtle.attack() then collect() else sleep(0.5) end end return true end print("Tunnelling...") for n = 1, length do turtle.placeDown() tryDigUp() turtle.turnLeft() tryDig() tryUp() tryDig() turtle.turnRight() turtle.turnRight() tryDig() tryDown() tryDig() turtle.turnLeft() if n < length then tryDig() if not tryForward() then print("Aborting Tunnel.") break end else print("Tunnel complete.") end end --[[ print( "Returning to start..." ) -- Return to where we started turtle.turnLeft() turtle.turnLeft() while depth > 0 do if turtle.forward() then depth = depth - 1 else turtle.dig() end end turtle.turnRight() turtle.turnRight() ]] print("Tunnel complete.") print("Mined " .. collected .. " items total.")