Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Config & Args
- local tArgs = { ... }
- local returnToStart = false
- for _, arg in ipairs(tArgs) do
- if arg == "-startPosition" then
- returnToStart = true
- end
- end
- -- Optional startup delay
- local waitTime = 30
- for i = 1, waitTime do
- if i == 10 then
- -- After 10 seconds, proceed unless interrupted
- break
- end
- os.sleep(1)
- end
- -- State
- local pos = {x = 0, y = 0}
- local dir = 0 -- 0=N, 1=E, 2=S, 3=W
- local startPos = {x = 0, y = 0}
- local startDir = 0
- local depth = 0
- local maxDepth = 1
- -- Helpers
- local function turnRight() turtle.turnRight() dir = (dir + 1) % 4 end
- local function turnLeft() turtle.turnLeft() dir = (dir + 3) % 4 end
- local function moveForward()
- if turtle.forward() then
- if dir == 0 then pos.y = pos.y + 1
- elseif dir == 1 then pos.x = pos.x + 1
- elseif dir == 2 then pos.y = pos.y - 1
- elseif dir == 3 then pos.x = pos.x - 1 end
- return true
- end
- return false
- end
- local function digIfKelp()
- local success, data = turtle.inspect()
- if success and data.name and data.name:lower():find("kelp") then
- turtle.dig()
- return true
- end
- return false
- end
- local function tryMove()
- digIfKelp()
- if not turtle.detect() then
- return moveForward()
- end
- return false
- end
- local function dropKelp()
- for i = 1, 16 do
- turtle.select(i)
- local item = turtle.getItemDetail()
- if item and item.name:lower():find("kelp") then
- turtle.drop()
- end
- end
- end
- local function refuelFromInventory()
- turtle.select(1)
- while turtle.getItemCount(1) > 0 do
- if not turtle.refuel(1) then
- return false -- Not a valid fuel item
- end
- if turtle.getFuelLevel() == "unlimited" then
- return true
- end
- end
- return turtle.getFuelLevel() > 0
- end
- local function waitForFuel(timeout)
- if turtle.getFuelLevel() == 0 and refuelFromInventory() then
- return true
- end
- local waited = 0
- while turtle.getFuelLevel() == 0 and waited < timeout do
- os.sleep(1)
- waited = waited + 1
- refuelFromInventory()
- end
- return turtle.getFuelLevel() > 0
- end
- local function stepOutward()
- turnRight()
- tryMove()
- turnLeft()
- end
- local function returnHome()
- -- Step back in from current depth
- while depth > 0 do
- turnLeft()
- tryMove()
- turnRight()
- depth = depth - 1
- end
- -- Return to original starting pos
- while pos.x ~= startPos.x or pos.y ~= startPos.y do
- if pos.x < startPos.x then while dir ~= 1 do turnRight() end
- elseif pos.x > startPos.x then while dir ~= 3 do turnRight() end
- elseif pos.y < startPos.y then while dir ~= 0 do turnRight() end
- elseif pos.y > startPos.y then while dir ~= 2 do turnRight() end
- end
- moveForward()
- end
- -- Face original start direction
- while dir ~= startDir do turnRight() end
- end
- -- MAIN LOOP
- while true do
- if not waitForFuel(30) then return end
- local stepsTaken = 0
- local loopStart = {x = pos.x, y = pos.y}
- local loopDir = dir
- repeat
- turnRight()
- if not tryMove() then
- turnLeft()
- if not tryMove() then
- turnLeft()
- if not tryMove() then
- turnLeft()
- end
- end
- else
- stepsTaken = stepsTaken + 1
- if not returnToStart then
- dropKelp()
- end
- end
- if turtle.getFuelLevel() == 0 then
- if not waitForFuel(30) then return end
- end
- until stepsTaken > 0 and pos.x == loopStart.x and pos.y == loopStart.y and dir == loopDir
- if depth < maxDepth then
- depth = depth + 1
- stepOutward()
- else
- if returnToStart then
- returnHome()
- dropKelp()
- end
- depth = 0
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement