Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Function to get user input safely
- local function getNumber(prompt)
- print(prompt)
- local n = tonumber(read())
- while not n or n < 1 do
- print("Please enter a positive number.")
- n = tonumber(read())
- end
- return math.floor(n)
- end
- -- Prompt for dimensions and options
- local length = getNumber("Enter length:")
- local width = getNumber("Enter width:")
- local height = getNumber("Enter height:")
- print("Start at TOP or BOTTOM? (type 'top' or 'bottom')")
- local startPos = read():lower()
- while startPos ~= "top" and startPos ~= "bottom" do
- print("Please type 'top' or 'bottom'")
- startPos = read():lower()
- end
- -- Save orientation and position tracking
- local pos = {x = 0, y = 0, z = 0}
- local dir = 0 -- 0=+X, 1=+Z, 2=-X, 3=-Z
- local function turnLeft()
- turtle.turnLeft()
- dir = (dir - 1) % 4
- end
- local function turnRight()
- turtle.turnRight()
- dir = (dir + 1) % 4
- end
- local function face(d)
- while dir ~= d do turnRight() end
- end
- -- Movement wrappers to track position
- local function tryDig() while turtle.detect() do turtle.dig(); sleep(0.2) end end
- local function tryDigDown() while turtle.detectDown() do turtle.digDown(); sleep(0.2) end end
- local function tryDigUp() while turtle.detectUp() do turtle.digUp(); sleep(0.2) end end
- local function forward()
- tryDig()
- while not turtle.forward() do sleep(0.2) end
- if dir == 0 then pos.x = pos.x + 1
- elseif dir == 1 then pos.z = pos.z + 1
- elseif dir == 2 then pos.x = pos.x - 1
- elseif dir == 3 then pos.z = pos.z - 1 end
- end
- local function up()
- tryDigUp()
- while not turtle.up() do sleep(0.2) end
- pos.y = pos.y + 1
- end
- local function down()
- tryDigDown()
- while not turtle.down() do sleep(0.2) end
- pos.y = pos.y - 1
- end
- local function back()
- while not turtle.back() do turtle.turnLeft(); turtle.turnLeft(); tryDig(); turtle.turnLeft(); turtle.turnLeft(); sleep(0.2) end
- if dir == 0 then pos.x = pos.x - 1
- elseif dir == 1 then pos.z = pos.z - 1
- elseif dir == 2 then pos.x = pos.x + 1
- elseif dir == 3 then pos.z = pos.z + 1 end
- end
- -- Estimate fuel usage
- local volume = length * width * height
- local estimatedFuel = volume * 3 + (length + width + height) * 2
- if turtle.getFuelLevel() < estimatedFuel then
- print("Not enough fuel! Required: " .. estimatedFuel)
- return
- end
- -- Dig one horizontal layer
- local function digLayer()
- for w = 1, width do
- for l = 1, length - 1 do forward() end
- if w < width then
- if w % 2 == 1 then
- turnRight(); forward(); turnRight()
- else
- turnLeft(); forward(); turnLeft()
- end
- end
- end
- -- Return to starting row
- if width % 2 == 1 then
- face(2) -- Turn around
- for i = 1, length - 1 do forward() end
- face(3) -- Back to default facing
- else
- face(3)
- for i = 1, width - 1 do forward() end
- face(0)
- end
- end
- -- Move to correct start level
- if startPos == "top" then
- for i = 1, height - 1 do down() end
- end
- -- Main dig loop
- for h = 1, height do
- digLayer()
- if h < height then
- if startPos == "bottom" then up() else down() end
- end
- end
- -- Return to Y level
- if startPos == "bottom" then
- for i = 1, height - 1 do down() end
- else
- for i = 1, height - 1 do up() end
- end
- -- Return to (0,0,0)
- if pos.z > 0 then face(3) for i = 1, pos.z do forward() end
- elseif pos.z < 0 then face(1) for i = 1, -pos.z do forward() end end
- if pos.x > 0 then face(2) for i = 1, pos.x do forward() end
- elseif pos.x < 0 then face(0) for i = 1, -pos.x do forward() end end
- -- Return to original height
- while pos.y > 0 do down() end
- while pos.y < 0 do up() end
- -- Face original direction
- face(0)
- print("Excavation complete. Returned to start.")
Advertisement
Add Comment
Please, Sign In to add comment