Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modem = peripheral.find("modem")
- local channel = 42
- function printMessage(msg)
- print(msg)
- if modem then
- modem.transmit(channel, 0, msg)
- end
- end
- function printFuelInfo()
- local level = turtle.getFuelLevel()
- local limit = turtle.getFuelLimit()
- local percent = (type(level) == "number" and type(limit) == "number" and limit > 0)
- and math.floor(level / limit * 100)
- or "?"
- local msg = string.format("Fuel: %s / %s (%s%%)", level, limit, percent)
- printMessage(msg)
- end
- local position = { x = 0, y = 0, z = 0 }
- local facing = 0
- local moveHistory = {}
- function forwardTrack()
- if turtle.forward() then
- if facing == 0 then position.z = position.z - 1
- elseif facing == 1 then position.x = position.x + 1
- elseif facing == 2 then position.z = position.z + 1
- elseif facing == 3 then position.x = position.x - 1 end
- table.insert(moveHistory, "forward")
- return true
- end
- return false
- end
- function backTrack()
- if turtle.back() then
- if facing == 0 then position.z = position.z + 1
- elseif facing == 1 then position.x = position.x - 1
- elseif facing == 2 then position.z = position.z - 1
- elseif facing == 3 then position.x = position.x + 1 end
- table.insert(moveHistory, "back")
- return true
- end
- return false
- end
- function upTrack()
- if turtle.up() then
- position.y = position.y + 1
- table.insert(moveHistory, "up")
- return true
- end
- return false
- end
- function downTrack()
- if turtle.down() then
- position.y = position.y - 1
- table.insert(moveHistory, "down")
- return true
- end
- return false
- end
- function turnLeftTrack()
- turtle.turnLeft()
- facing = (facing - 1) % 4
- table.insert(moveHistory, "left")
- end
- function turnRightTrack()
- turtle.turnRight()
- facing = (facing + 1) % 4
- table.insert(moveHistory, "right")
- end
- function returnHome()
- for i = #moveHistory, 1, -1 do
- local move = moveHistory[i]
- if move == "forward" then
- turtle.back()
- -- update position ...
- elseif move == "back" then
- turtle.forward()
- -- update position ...
- elseif move == "up" then
- turtle.down()
- position.y = position.y - 1
- elseif move == "down" then
- turtle.up()
- position.y = position.y + 1
- elseif move == "left" then
- turtle.turnRight()
- facing = (facing + 1) % 4
- elseif move == "right" then
- turtle.turnLeft()
- facing = (facing - 1) % 4
- end
- end
- moveHistory = {}
- print("Returned to home at:", position.x, position.y, position.z)
- return true
- end
- function refuelToTarget()
- local targetRatio = 0.97
- local fuelLimit = turtle.getFuelLimit()
- local targetFuel = math.floor(fuelLimit * targetRatio)
- if turtle.getFuelLevel() == "unlimited" or turtle.getFuelLevel() >= targetFuel then
- return true
- end
- turtle.turnRight()
- turtle.select(1)
- while turtle.getFuelLevel() < targetFuel do
- if not turtle.suck() then
- turtle.turnLeft()
- return false
- end
- turtle.refuel()
- end
- if turtle.getItemCount(1) > 0 then
- turtle.drop()
- end
- turtle.turnLeft()
- return true
- end
- function unloadAfterMining()
- turtle.turnLeft()
- for i = 1, 16 do
- turtle.select(i)
- turtle.drop()
- end
- turtle.select(1)
- turtle.turnRight()
- end
- function hasFreeSlot()
- for slot = 1, 16 do
- if turtle.getItemCount(slot) == 0 then return true end
- end
- return false
- end
- function shouldReturn()
- local level = turtle.getFuelLevel()
- local limit = turtle.getFuelLimit()
- return (type(level) == "number" and level < (limit * 0.4)) or not hasFreeSlot()
- end
- function mineLayer(width, depth)
- local evenRow = true
- for row = 1, depth do
- for col = 1, width - 1 do
- if turtle.detect() then turtle.dig() end
- forwardTrack()
- turtle.digUp()
- turtle.digDown()
- if shouldReturn() then
- printMessage("Fuel low or inventory full, returning to base.")
- return false -- interrupt layer, let main handle return
- end
- printFuelInfo()
- end
- if row < depth then
- if evenRow then
- turnRightTrack()
- if turtle.detect() then turtle.dig() end
- forwardTrack()
- turnRightTrack()
- else
- turnLeftTrack()
- if turtle.detect() then turtle.dig() end
- forwardTrack()
- turnLeftTrack()
- end
- evenRow = not evenRow
- end
- end
- return true
- end
- function descendToStart(depth)
- forwardTrack()
- for i = 1, depth do
- if turtle.detectDown() then turtle.digDown() end
- if not downTrack() then break end
- end
- turnRightTrack()
- end
- function mineChunkArea(width, depth, layers)
- for layer = 1, layers do
- local ok = mineLayer(width, depth)
- if not ok then
- -- Aborted mid-layer: stop mining and signal interruption
- return false, layer
- end
- -- Finished layer: descend 3 blocks
- if layer < layers then
- for i = 1, 3 do
- if turtle.detectDown() then turtle.digDown() end
- downTrack()
- end
- end
- end
- return true
- end
- while true do
- if not refuelToTarget() then
- printMessage("Refuel failed — aborting.")
- break
- end
- printMessage("Turtle starting mining task...")
- descendToStart(30)
- local success, stoppedAtLayer = mineChunkArea(50, 50, 60)
- if not success then
- printMessage("Mining stopped early at layer: " .. stoppedAtLayer)
- else
- printMessage("Finished mining all layers.")
- end
- returnHome()
- unloadAfterMining()
- end
- printMessage("Turtle script ended.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement