CCCPaste

simple mineing

-- Quick Simple Quarry Script

-- Track coordinates relative to start (after 4-block offset)
local x, y, z = 0, 0, 0
local dir = 0 -- 0=forward, 1=right, 2=back, 3=left
local targetX, targetY, targetZ = 0, 0, 0

-- Prompt for dimensions
print("Enter Width (X - Right):")
targetX = tonumber(read()) or 32
print("Enter Length (Z - Forward):")
targetZ = tonumber(read()) or 32
print("Enter Height (Y - Down):")
targetY = tonumber(read()) or 32

-- Fuel and inventory config
local FUEL_SLOT = 1
local MIN_FUEL = 200

-- Navigation helpers
local function turnRight()
    turtle.turnRight()
    dir = (dir + 1) % 4
end

local function turnLeft()
    turtle.turnLeft()
    dir = (dir - 1) % 4
end

local function checkFuel()
    if turtle.getFuelLevel() == "unlimited" then return true end
    
    -- Try auto-refueling from inventory slot 1
    if turtle.getFuelLevel() < MIN_FUEL then
        local currentSlot = turtle.getSelectedSlot()
        turtle.select(FUEL_SLOT)
        turtle.refuel(16)
        turtle.select(currentSlot)
    end
    
    -- Return total distance back to home estimate
    local distHome = math.abs(x) + math.abs(y) + math.abs(z) + 4
    return turtle.getFuelLevel() > (distHome + 50)
end

local function isInventoryFull()
    for i = 1, 16 do
        if turtle.getItemCount(i) == 0 then return false end
    end
    return true
end

-- Return to home to empty items/refuel, then resume position
local function returnHomeAndResume()
    print("Returning home...")
    -- Remember current state
    local savedX, savedY, savedZ, savedDir = x, y, z, dir
    
    -- Move up to surface
    while y < 0 do
        turtle.up()
        y = y + 1
    end
    
    -- Turn to face home (backwards from original start)
    while dir ~= 2 do turnRight() end
    
    -- Move back Z lines
    while z > 0 do
        turtle.forward()
        z = z - 1
    end
    
    -- Turn left to face X line home
    turnLeft()
    while x > 0 do
        turtle.forward()
        x = x - 1
    end
    
    -- Move back the initial 4 offset blocks
    for i = 1, 4 do turtle.forward() end
    
    -- Empty inventory into rear chest
    for i = 2, 16 do
        turtle.select(i)
        turtle.drop()
    end
    turtle.select(1)
    
    -- Pull fuel from bottom chest if empty
    if turtle.getFuelLevel() < MIN_FUEL then
        turtle.suckDown()
        turtle.refuel()
    end
    
    print("Resuming mining...")
    -- Go back out 4 offset blocks
    for i = 1, 4 do turtle.back() end
    
    -- Path back to saved X
    while x < savedX do
        turtle.back()
        x = x + 1
    end
    turnRight() -- Face original forward again
    
    -- Path back to saved Z
    while z < savedZ do
        turtle.forward()
        z = z + 1
    end
    
    -- Path back down to saved Y
    while y > savedY do
        turtle.down()
        y = y - 1
    end
    
    -- Restore original direction
    while dir ~= savedDir do turnRight() end
end

local function moveForward()
    if not checkFuel() or isInventoryFull() then
        returnHomeAndResume()
    end
    
    while turtle.detect() do
        turtle.dig()
        os.sleep(0.5)
    end
    
    if turtle.forward() then
        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
        return true
    end
    return false
end

-- Main Program Execution

-- 1. Initial 4 block home offset
print("Moving 4 blocks out...")
for i = 1, 4 do
    while turtle.detect() do turtle.dig() end
    turtle.forward()
end

-- 2. Mining Logic loop
for layer = 1, targetY do
    for row = 1, targetX do
        for col = 1, targetZ - 1 do
            moveForward()
        end
        
        -- Turn to next row logic
        if row < targetX then
            if row % 2 == 1 then
                if layer % 2 == 1 then turnRight() moveForward() turnRight()
                else turnLeft() moveForward() turnLeft() end
            else
                if layer % 2 == 1 then turnLeft() moveForward() turnLeft()
                else turnRight() moveForward() turnRight() end
            end
        end
    end
    
    -- Move down to next layer if not finished
    if layer < targetY then
        while turtle.detectDown() do turtle.digDown() end
        turtle.down()
        y = y - 1
        -- Turn around to reverse pattern for next layer efficiency
        turnRight()
        turnRight()
    end
end

-- Return Home permanently when complete
print("Mining complete! Returning home.")
while y < 0 do turtle.up() y = y + 1 end
while dir ~= 2 do turnRight() end
while z > 0 do turtle.forward() z = z - 1 end
turnLeft()
while x > 0 do turtle.forward() x = x - 1 end
for i = 1, 4 do turtle.forward() end
print("Done!")