192 lines
3.7 KiB
Lua
192 lines
3.7 KiB
Lua
-- 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 .. " <length>")
|
|
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.")
|