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