Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local TRASH = {
- ["minecraft:cobblestone"] = true,
- ["minecraft:dirt"] = true,
- ["minecraft:gravel"] = true,
- ["minecraft:stone"] = true,
- ["minecraft:netherrack"] = true,
- }
- local width = tonumber(arg[1])
- local length = tonumber(arg[2])
- local depth = tonumber(arg[3])
- if not (width and length and depth) then
- print("Usage: quarry <width> <length> <depth>")
- return
- end
- local posX, posY, posZ = 0, 0, 0
- local dir = 0 -- 0=north,1=east,2=south,3=west
- local startX, startY = 0, 0
- local surfaceZ = 0 -- constant chest height
- local function compactInventory()
- for i = 1, 15 do
- local detail_i = turtle.getItemDetail(i)
- if detail_i then
- for j = i + 1, 16 do
- local detail_j = turtle.getItemDetail(j)
- if detail_j and detail_j.name == detail_i.name then
- turtle.select(j)
- turtle.transferTo(i)
- end
- end
- end
- end
- turtle.select(1)
- end
- local function dropTrash()
- compactInventory()
- for slot = 1, 16 do
- local detail = turtle.getItemDetail(slot)
- if detail and TRASH[detail.name] then
- turtle.select(slot)
- turtle.drop()
- end
- end
- turtle.select(1)
- end
- local function depositItems()
- compactInventory()
- for slot = 1, 16 do
- local detail = turtle.getItemDetail(slot)
- if detail and not TRASH[detail.name] then
- turtle.select(slot)
- turtle.drop()
- end
- end
- turtle.select(1)
- end
- local function tryDigForward()
- while turtle.detect() do
- if not turtle.dig() then return false end
- sleep(0.2)
- end
- return true
- end
- local function tryDigUp()
- while turtle.detectUp() do
- if not turtle.digUp() then return false end
- sleep(0.2)
- end
- return true
- end
- local function tryDigDown()
- while turtle.detectDown() do
- if not turtle.digDown() then return false end
- sleep(0.2)
- end
- return true
- end
- local function forward()
- while not turtle.forward() do
- if not tryDigForward() then return false end
- sleep(0.2)
- end
- if dir == 0 then posY = posY + 1
- elseif dir == 1 then posX = posX + 1
- elseif dir == 2 then posY = posY - 1
- elseif dir == 3 then posX = posX - 1
- end
- return true
- end
- local function back()
- while not turtle.back() do sleep(0.2) end
- if dir == 0 then posY = posY - 1
- elseif dir == 1 then posX = posX - 1
- elseif dir == 2 then posY = posY + 1
- elseif dir == 3 then posX = posX + 1
- end
- return true
- end
- local function up()
- while not turtle.up() do
- if not tryDigUp() then return false end
- sleep(0.2)
- end
- posZ = posZ - 1
- return true
- end
- local function down()
- while not turtle.down() do
- if not tryDigDown() then return false end
- sleep(0.2)
- end
- posZ = posZ + 1
- return true
- end
- local function right()
- turtle.turnRight()
- dir = (dir + 1) % 4
- return true
- end
- local function left()
- turtle.turnLeft()
- dir = (dir - 1) % 4
- if dir < 0 then dir = dir + 4 end
- return true
- end
- local function turnTo(targetDir)
- local diff = (targetDir - dir) % 4
- if diff == 3 then
- left()
- else
- for i = 1, diff do
- right()
- end
- end
- end
- local function moveForwardN(n)
- for _ = 1, n do
- if not forward() then
- error("Failed moving forward")
- end
- end
- end
- local function returnToStartHorizontal()
- if posX > startX then
- turnTo(3)
- moveForwardN(posX - startX)
- elseif posX < startX then
- turnTo(1)
- moveForwardN(startX - posX)
- end
- if posY > startY then
- turnTo(2)
- moveForwardN(posY - startY)
- elseif posY < startY then
- turnTo(0)
- moveForwardN(startY - posY)
- end
- turnTo(0)
- end
- local function returnToChestSurface()
- -- Move horizontally to startX, startY
- returnToStartHorizontal()
- -- Move vertically to surfaceZ
- while posZ > surfaceZ do
- if not up() then return false end
- end
- while posZ < surfaceZ do
- if not down() then return false end
- end
- -- Face south (direction 2) so front faces chest
- turnTo(2)
- return true
- end
- -- When depositing items after return:
- depositItems()
- -- Then turn 180° to face quarry again
- right()
- right()
- local function mine3LayerColumn(digForward)
- if not tryDigUp() then return false end
- if digForward and not tryDigForward() then return false end
- if not tryDigDown() then return false end
- return true
- end
- local function getLayerZ(layer)
- return surfaceZ + (layer - 1) * 3
- end
- local function moveToZ(targetZ)
- while posZ < targetZ do
- if not down() then
- print("Cannot move down to next layer.")
- return false
- end
- end
- while posZ > targetZ do
- if not up() then
- print("Cannot move up to next layer.")
- return false
- end
- end
- return true
- end
- -- Initialize start position & surface chest height
- startX, startY, surfaceZ = posX, posY, posZ
- posZ = surfaceZ
- for layer = 1, depth do
- print("Starting layer "..layer..", posZ="..posZ)
- local goingForward = true
- for row = 1, length do
- if goingForward then
- turnTo(0)
- else
- turnTo(2)
- end
- for col = 1, width do
- local digForward = (col < width)
- if not mine3LayerColumn(digForward) then
- print("Unmineable block or bedrock reached. Stopping.")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- else
- depositItems()
- end
- return
- end
- if col == width then
- dropTrash()
- end
- if col < width then
- if not forward() then
- print("Failed to move forward. Stopping.")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- else
- depositItems()
- end
- return
- end
- end
- end
- if row < length then
- if goingForward then
- right()
- if not forward() then
- print("Failed to move right. Stopping.")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- else
- depositItems()
- end
- return
- end
- right()
- else
- left()
- if not forward() then
- print("Failed to move left. Stopping.")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- else
- depositItems()
- end
- return
- end
- left()
- end
- goingForward = not goingForward
- end
- end
- print("Completed layer "..layer)
- print("Returning to surface chest to deposit items...")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- return
- end
- depositItems()
- if layer < depth then
- local nextLayerZ = getLayerZ(layer + 1)
- if not moveToZ(nextLayerZ) then
- print("Failed to move down to next layer.")
- if not returnToChestSurface() then
- print("Failed returning to surface chest.")
- else
- depositItems()
- end
- return
- end
- print("Moved vertically to next layer "..(layer + 1).." at posZ "..posZ)
- end
- end
- print("Quarry complete, returning to surface chest.")
- if returnToChestSurface() then
- depositItems()
- end
- print("Done!")
Advertisement
Add Comment
Please, Sign In to add comment