CCCPaste

Turtle Quarry v.2

-- === 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.")