function main() refuelAnyTo(200) print("Fuel Level: " .. turtle.getFuelLevel()) cube(2,2,10) undoAll() end function row(n,l,r) addGroup() l() for i = 1,n do dig() waitfor(forward) end r() dig() waitfor(forward) r() for i = 1,n do dig() waitfor(forward) end l() replaceGroup({turtle.forward}) end function rectangle(x_max,y_max) addGroup() for x = 1,x_max-1 do row(y_max,left,right) dig() waitfor(forward) end row(y_max,left,right) digDown() waitfor(down) left() left() for x = 1,x_max-1 do row(y_max,right,left) dig() waitfor(forward) end row(y_max,right,left) digDown() waitfor(down) left() left() replaceGroup({turtle.down,turtle.down}) end function cube(x_max,y_max,z_max) for z = 1,z_max-1 do rectangle(x_max,y_max) end end careful = {1,2,3} path = {} index = 0 undo_mapping = {} function track(original) return function() while #path > index do table.remove(path) end if original() then index = index + 1 table.insert(path,original) return true end return false end end function inverse(func_a, func_b) undo_mapping[func_a] = func_b undo_mapping[func_b] = func_a return track(func_a), track(func_b) end down,up = inverse(turtle.down,turtle.up) left,right = inverse(turtle.turnLeft,turtle.turnRight) forward,back = inverse(turtle.forward,turtle.back) function digDown() if careful and not compare(careful, turtle.compareDown) then return false end turtle.digDown() return true end function dig() if careful and not compare(careful, turtle.compare) then return false end turtle.dig() return true end function checkFull() if turtle.getItemCount(9) > 0 then undoAll() dropMaterials() redoAll() end end function dropMaterials() --Done Manually now pause() end function undoAll() while undoGroup() do end end function undoGroup() while index > 0 do f = undo_mapping[path[index]] index = index - 1 if not f then --print('Group undo '..index) return true end while not f() do pause() end end return false end function replaceGroup(replacement) while index > 0 do f = undo_mapping[path[index]] index = index - 1 table.remove(path) if not f then for i,v in ipairs(replacement) do table.insert(path,v) index = index + 1 end return true end end return false end function redoAll() while index < #path do index = index + 1 f = path[index] while type(f) == 'function' and not f() do pause() end end end function addGroup() while #path > index do table.remove(path) end table.insert(path,0) index = index + 1 --print('New group at '..index) end function pause() print("Press Enter when done") read() end function waitfor(f) while not f() do pause() end end function resetHistory() path = {} index = 0 end function refuelAnyTo(fuelLevel) for i = 1,16 do turtle.select(i) if refuelTo(fuelLevel) then return true end end return false end function refuelTo(fuelLevel) while turtle.getFuelLevel() < fuelLevel do if not turtle.refuel(1) then return false end print(turtle.getFuelLevel()) end return true end function digToBottom() repeat digDown() until not down() end function directControl() print('Entering Direct Control Mode') local mapping={ [17]=forward, [31]=back, [30]=turnLeft, [32]=turnRight, [16]=up, [18]=down } while true do e,v=os.pullEvent('key') if v == 28 then break end f = mapping[v] if f then f() end end print('Leaving Direct Control Mode') end function compare(slots, compare_function) for i,v in ipairs(slots) do turtle.select(v) if compare_function() then return true end end return false end status,msg = pcall(main) if not status then print(msg) undoAll() end