Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- 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
- local bucketSlot = 1 -- The slot for the bucket
- local stateFile = "state.txt" -- File to store the turtle's state
- -- STATE
- local x, y, z = 0, 0, 0 -- relative coordinates
- local dir = 0 -- 0=N, 1=E, 2=S, 3=W
- local currentDepth = 0
- local isMining = true
- -- === MOVEMENT HELPERS ===
- function refuel()
- if turtle.getFuelLevel() < 20 then
- -- First check if we have lava in the bucket
- turtle.select(bucketSlot)
- if turtle.getItemCount(bucketSlot) > 0 then
- turtle.place() -- Place lava and fuel from it
- if turtle.refuel(1) then
- print("Refueled using lava.")
- else
- print("Failed to refuel using lava.")
- end
- else
- turtle.select(fuelSlot)
- if not turtle.refuel(1) then
- print("Out of fuel, please add more!")
- else
- print("Refueled successfully.")
- end
- end
- 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)
- 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
- 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
- -- === SAVE STATE ===
- function saveState()
- local file = fs.open(stateFile, "w")
- file.writeLine(x)
- file.writeLine(y)
- file.writeLine(z)
- file.writeLine(dir)
- file.writeLine(currentDepth)
- file.writeLine(isMining and "true" or "false")
- file.close()
- end
- -- === LOAD STATE ===
- function loadState()
- if fs.exists(stateFile) then
- local file = fs.open(stateFile, "r")
- x = tonumber(file.readLine())
- y = tonumber(file.readLine())
- z = tonumber(file.readLine())
- dir = tonumber(file.readLine())
- currentDepth = tonumber(file.readLine())
- isMining = file.readLine() == "true"
- file.close()
- print("Loaded saved state.")
- else
- print("No saved state found.")
- end
- end
- -- === MAIN EXECUTION ===
- loadState()
- print("Starting mining...")
- if y == 0 then
- turtle.digDown()
- down()
- end
- for d = currentDepth, depth do
- mineLayer()
- if d < depth then down() end
- currentDepth = d
- saveState() -- Save state after each layer
- 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.")
Advertisement
Add Comment
Please, Sign In to add comment