-- === USER INPUT ===
print("Enter length:")
local length = tonumber(read())
print("Enter width:")
local width = tonumber(read())
print("Enter depth:")
local depth = tonumber(read())
print("Enter starting Y offset (e.g. 50 means start mining 50 down):")
local startYOffset = tonumber(read())
local fuelSlot = 16
local minFuelLevel = 100 -- If fuel lower than this, go refuel
-- === STATE ===
local x, y, z = 0, 0, 0
local dir = 0 -- 0=N, 1=E, 2=S, 3=W
-- === MOVEMENT HELPERS ===
function refuel()
local fuelLevel = turtle.getFuelLevel()
if fuelLevel == "unlimited" then return end
if fuelLevel < minFuelLevel then
print("Fuel low (" .. fuelLevel .. "). Returning to refuel...")
local saveX, saveY, saveZ, saveDir = x, y, z, dir
goTo(0, 0, 0, 0)
refuelFromChest()
goTo(saveX, saveY, saveZ, saveDir)
end
end
function refuelFromChest()
turtle.select(fuelSlot)
print("Refueling from chest above...")
while turtle.getFuelLevel() < minFuelLevel do
turtle.suckUp()
if turtle.getItemCount(fuelSlot) == 0 then
print("No fuel found in chest! Waiting...")
sleep(5)
else
turtle.refuel()
end
end
print("Refueled to " .. turtle.getFuelLevel())
end
function tryDig() while turtle.detect() do turtle.dig(); sleep(0.4) end end
function tryDigDown() while turtle.detectDown() do turtle.digDown(); sleep(0.4) end end
function tryDigUp() while turtle.detectUp() do turtle.digUp(); sleep(0.4) end end
function forward()
refuel()
tryDig()
while not turtle.forward() do sleep(0.2) end
if dir == 0 then z = z + 1
elseif dir == 1 then x = x + 1
elseif dir == 2 then z = z - 1
elseif dir == 3 then x = x - 1 end
end
function back()
refuel()
while not turtle.back() do sleep(0.2) end
if dir == 0 then z = z - 1
elseif dir == 1 then x = x - 1
elseif dir == 2 then z = z + 1
elseif dir == 3 then x = x + 1 end
end
function down()
refuel()
tryDigDown()
while not turtle.down() do sleep(0.2) end
y = y - 1
end
function up()
refuel()
tryDigUp()
while not turtle.up() do sleep(0.2) end
y = y + 1
end
function turnLeft()
turtle.turnLeft()
dir = (dir - 1) % 4
if dir < 0 then dir = dir + 4 end
end
function turnRight()
turtle.turnRight()
dir = (dir + 1) % 4
end
function face(target)
while dir ~= target do turnRight() end
end
-- === GO TO COORDINATE ===
function goTo(targetX, targetY, targetZ, targetDir)
while y < targetY do up() end
while y > targetY do down() end
if x < targetX then face(1) while x < targetX do forward() end
elseif x > targetX then face(3) while x > targetX do forward() end end
if z < targetZ then face(0) while z < targetZ do forward() end
elseif z > targetZ then face(2) while z > targetZ do forward() end end
face(targetDir or 0)
end
-- === INVENTORY HANDLING ===
function isInventoryFull()
for i = 1, 15 do
if turtle.getItemCount(i) == 0 then return false end
end
return true
end
function dropItems()
local saveX, saveY, saveZ, saveDir = x, y, z, dir
goTo(0, 0, 0, 2)
for i = 1, 15 do
turtle.select(i)
turtle.drop()
end
turtle.select(1)
goTo(saveX, saveY, saveZ, saveDir)
end
-- === MINING FUNCTION ===
function mineLayer()
for row = 1, width do
for col = 1, length - 1 do
forward()
if isInventoryFull() then dropItems() end
end
if row < width then
if row % 2 == 1 then turnRight(); forward(); turnRight()
else turnLeft(); forward(); turnLeft() end
end
end
if width % 2 == 1 then face(2) for i = 1, length - 1 do forward() end end
face(3) for i = 1, width - 1 do forward() end
face(0)
end
-- === MAIN EXECUTION ===
print("Starting mining program...")
-- Go down to starting offset before mining
for i = 1, startYOffset do
if turtle.detectDown() then turtle.digDown() end
down()
end
print("Reached start Y level, beginning mining...")
for d = 1, depth do
mineLayer()
if d < depth then down() end
end
-- Final return and unload
goTo(0, 0, 0, 2)
for i = 1, 15 do
turtle.select(i)
turtle.drop()
end
turtle.select(1)
print("Mining complete. Returned home.")