-- === CHUNK MINER TURTLE (PERSISTENT) === -- Place on SOUTH edge, EAST corner of chunk, facing NORTH. -- Fuel chest on EAST (right), drop chest on WEST (left). -- CONFIG local CHUNK_SIZE = 16 local WALL_SIZE = 18 local FUEL_SLOT = 1 local COBBLE_SLOT = 2 local MIN_FUEL = 500 local KEEP_COAL = 64 local KEEP_COBBLE = 64 local STATE_FILE = "chunkminer.state" -- === UTILITY === local function saveState(state) local f = fs.open(STATE_FILE, "w") f.write(textutils.serialize(state)) f.close() end local function loadState() if fs.exists(STATE_FILE) then local f = fs.open(STATE_FILE, "r") local data = textutils.unserialize(f.readAll()) f.close() return data else return { layer = 0, row = 1, col = 1, phase = "init" } end end local function selectSlot(slot) turtle.select(slot) end local function forward() while not turtle.forward() do if turtle.detect() then turtle.dig() end sleep(0.2) end end local function down() while not turtle.down() do if turtle.detectDown() then turtle.digDown() end sleep(0.2) end end local function up() while not turtle.up() do if turtle.detectUp() then turtle.digUp() end sleep(0.2) end end local function turnAround() turtle.turnLeft() turtle.turnLeft() end -- === INVENTORY & FUEL === local function refuelIfNeeded() if turtle.getFuelLevel() < MIN_FUEL then print("Refueling...") turtle.turnRight() -- east selectSlot(FUEL_SLOT) turtle.suck(KEEP_COAL) turtle.refuel() turtle.drop() turtle.turnLeft() end end local function dumpInventory() print("Dumping inventory...") turtle.turnLeft() -- west for i = 3, 16 do turtle.select(i) turtle.drop() end turtle.turnRight() end local function restock() print("Restocking...") turtle.turnRight() -- east -- Ensure 64 coal local coalCount = 0 for i = 1, 16 do local d = turtle.getItemDetail(i) if d and d.name:find("coal") then coalCount = coalCount + d.count end end if coalCount < KEEP_COAL then turtle.suck(KEEP_COAL - coalCount) end -- Ensure 64 cobble local cobbleCount = 0 for i = 1, 16 do local d = turtle.getItemDetail(i) if d and d.name:find("cobblestone") then cobbleCount = cobbleCount + d.count end end if cobbleCount < KEEP_COBBLE then turtle.suck(KEEP_COBBLE - cobbleCount) end turtle.turnLeft() end -- === WALL BUILDER === local function placeWall() print("Building 18x18 wall...") selectSlot(COBBLE_SLOT) for i = 1, WALL_SIZE do for j = 1, WALL_SIZE do if i == 1 or i == WALL_SIZE or j == 1 or j == WALL_SIZE then if not turtle.detectDown() then turtle.placeDown() end end if j < WALL_SIZE then forward() end end if i < WALL_SIZE then if i % 2 == 1 then turtle.turnRight() forward() turtle.turnRight() else turtle.turnLeft() forward() turtle.turnLeft() end end end print("Wall complete.") end -- === MINING === local function mineBlock() if turtle.detect() then turtle.dig() end if turtle.detectDown() then turtle.digDown() end end local function mineLayer(state) print("Mining layer "..state.layer) for r = state.row, CHUNK_SIZE do for c = state.col, CHUNK_SIZE do mineBlock() if not (r == CHUNK_SIZE and c == CHUNK_SIZE) then if c < CHUNK_SIZE then forward() end end -- Save position state.row, state.col = r, c saveState(state) if turtle.getItemCount(16) > 0 or turtle.getFuelLevel() < MIN_FUEL then print("Low fuel or full inv; pausing layer...") return false end end -- move to next row if r < CHUNK_SIZE then if r % 2 == 1 then turtle.turnRight() forward() turtle.turnRight() else turtle.turnLeft() forward() turtle.turnLeft() end end state.col = 1 end -- Return to start orientation if CHUNK_SIZE % 2 == 1 then turnAround() for i = 1, CHUNK_SIZE - 1 do forward() end turtle.turnLeft() for i = 1, CHUNK_SIZE - 1 do forward() end turtle.turnLeft() else turtle.turnRight() for i = 1, CHUNK_SIZE - 1 do forward() end turtle.turnRight() end state.row = 1 state.col = 1 state.layer = state.layer + 1 saveState(state) print("Layer complete!") return true end -- === MAIN === print("=== Chunk Miner Persistent ===") local state = loadState() if state.phase == "init" then refuelIfNeeded() restock() placeWall() state.phase = "mining" state.layer = 0 saveState(state) end while true do refuelIfNeeded() local done = mineLayer(state) if not done then dumpInventory() restock() else dumpInventory() restock() down() end end