diff --git a/quantum-beacon.lua b/command-center/quantum-beacon.lua similarity index 100% rename from quantum-beacon.lua rename to command-center/quantum-beacon.lua diff --git a/rooted-dirt-farm.lua b/rooted-dirt-farm.lua new file mode 100644 index 0000000..2bc0f3c --- /dev/null +++ b/rooted-dirt-farm.lua @@ -0,0 +1,82 @@ +--[[ + Rooted Dirt Farm which uses a saw to clear trees. + +- The turtle starts facing the location where moss will be placed. +- The turtle will drop rooted dirt below it after each cycle. +- The turtle will replenish its resources (bonemeal, moss, azaleas) via inventories: + bonemeal: left + moss: behind + azaleas: right +]] + +local is = require("itemscript") +local ms = require("movescript") + +-- Runs one complete cycle of the farm; that is, plant moss, plant the azalea, bonemeal it, activate the saw, then harvest the dirt. +local function doCycle() + -- Place the moss and azalea. + is.select("minecraft:moss_block") + ms.run("PU") + is.select("minecraft:azalea") + ms.run("P") + -- Bonemeal the azalea until we have a tree. + local blockData = nil + repeat + is.select("minecraft:bone_meal") + ms.run("P") + _, blockData = turtle.inspect() + until blockData ~= nil and blockData.name == "minecraft:oak_log" + -- Activate the saw until the tree is removed. + redstone.setOutput("right", true) + while turtle.detect() do + os.sleep(0.25) + end + redstone.setOutput("right", false) + ms.run("DDg") + is.dropAllDown("minecraft:rooted_dirt") +end + +-- Ensures that we've got enough items for a farm cycle, and if not, tries to fetch the items or wait for user intervention. +local function ensureItemsForCycle() + local requiredItems = { + ["minecraft:moss_block"] = 1, + ["minecraft:azalea"] = 1, + ["minecraft:bone_meal"] = 10 + } + local replenishThreshold = 48 + for name, requiredCount in pairs(requiredItems) do + local actualCount = is.totalCount(name) + if actualCount <= requiredCount then + local action1, action2 = nil, nil + if name == "minecraft:bone_meal" then + action1 = "L" + action2 = "R" + elseif name == "minecraft:moss_block" then + action1 = "LL" + action2 = "RR" + elseif name == "minecraft:azalea" then + action1 = "R" + action2 = "L" + end + ms.run(action1) + is.select(name) + local attempts = 0 + while actualCount < replenishThreshold do + turtle.suck(64 - actualCount) + actualCount = is.totalCount(name) + attempts = attempts + 1 + if attempts > 10 then + print("Error: Not enough " .. name .. " available. Please add more and press enter.") + io.read() + attempts = 0 + end + end + ms.run(action2) + end + end +end + +while true do + ensureItemsForCycle() + doCycle() +end \ No newline at end of file