BuildCraft Quarry-Like Turtle Program

Started by eshipplosk, Apr 20, 2025, 09:53 PM

Previous topic - Next topic
This is some code that I made to create a miner that is somewhat like BuildCraft's Quarry block. It is super simple to use and returns to chest to empty its inventory. Let me know if there are any bugs.
-------------------------------------------------
How to use:

Install program into in mining turtle:

pastebin get tqTKYuea miner

Make sure to put fuel/coal in the most bottom right inventory slot of the turtle.
Place turtle, then place a chest behind it so it can empty its inventory when its full.

Start miner:
miner
(give specified Length, Width, and Depth)
-------------------------------------------------
Pastebin url: https://pastebin.com/tqTKYuea

Code:
-- USER INPUT
print("Enter length:")
local length = tonumber(read())
print("Enter width:")
local width = tonumber(read())
print("Enter depth:")
local depth = tonumber(read())
 
local fuelSlot = 16
 
-- STATE
local x, y, z = 0, 0, 0 -- relative coordinates
local dir = 0           -- 0=N, 1=E, 2=S, 3=W
 
-- === MOVEMENT HELPERS ===
function refuel()
    if turtle.getFuelLevel() < 10 then
        turtle.select(fuelSlot)
        turtle.refuel(1)
    end
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)
    -- Go up first (safety)
    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
    -- Return to top-left corner of next layer
    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...")
turtle.digDown()
down()
 
for d = 1, depth do
    mineLayer()
    if d < depth then down() end
end
 
-- Final return to origin, face chest
goTo(0, 0, 0, 2)
for i = 1, 15 do
    turtle.select(i)
    turtle.drop()
end
turtle.select(1)
goTo(0, 0, 0, 0)
print("Mining complete. Ready to unload into chest.")