diff --git a/turtle/lumberjack/bin/lumberjack b/turtle/lumberjack/bin/lumberjack new file mode 100644 index 0000000..0fecf07 --- /dev/null +++ b/turtle/lumberjack/bin/lumberjack @@ -0,0 +1,116 @@ +starttime = os.epoch("local") + +function printf(data) + print(textutils.serialize(data)) +end + +function step() + turtle.digUp() + turtle.up() + turtle.dig() + turtle.turnRight() + turtle.dig() + turtle.turnRight() + turtle.dig() + turtle.turnRight() + turtle.dig() + turtle.turnRight() +end + +function chop() + turtle.dig() + turtle.forward() + while turtle.detectUp() do + step() + end +end + +function descend() + while not turtle.detectDown() do + turtle.down() + end +end + +function takeItemOutOfChestSlot(chestSlot,turtleSlot,chestDir) + local SLOT_TURTLE_EMPTY_CHEST = 16 + local chest = peripheral.wrap(chestDir) + turtle.select(SLOT_TURTLE_EMPTY_CHEST) + turtle.placeUp() + sleep(.2) + local topchest = peripheral.wrap("top"); + chest.pushItems(peripheral.getName(topchest),chestSlot) + turtle.select(turtleSlot) + turtle.suckUp() + turtle.select(SLOT_TURTLE_EMPTY_CHEST) + turtle.digUp() + turtle.select(turtleSlot) +end + +function dumpItems() + turtle.turnLeft();turtle.turnLeft() + for i=1,15 do + turtle.select(i) + turtle.drop() + end + turtle.turnLeft();turtle.turnLeft() +end + +function replant() + local chestDir = "back" + local chest = peripheral.wrap(chestDir) + local itemlist = chest.list() + local saplingIndex = 0 + for _ in pairs(itemlist) do + print(textutils.serialise(_)) + if itemlist[_].name == "minecraft:oak_sapling" then + saplingIndex = _ + end + end + if saplingIndex > 0 then + -- peripheral.call(chest, "pullitems", ) + printf(saplingIndex) + takeItemOutOfChestSlot(saplingIndex,15,"back") + end + turtle.select(15) + turtle.place() + turtle.turnLeft();turtle.turnLeft() + turtle.drop() + turtle.turnLeft();turtle.turnLeft() + turtle.select(1) + -- peripheral.getMethods() +end + +function chestTest(chestSlot) + local chest = peripheral.wrap("back"); + turtle.select(17) + turtle.placeUp() + local topchest = peripheral.wrap("top"); + chest.pushItems(peripheral.getName(topchest),chestSlot) +end + +function waitForTree() + while true do + turtle.suck() + has_block, data = turtle.inspect() + if has_block then + if(data) then + if data.tags["minecraft:mineable/axe"] == true then + print((os.epoch("local")-starttime)/1000,"choppable") + if(data.name ~= "minecraft:oak_sapling") then + chop() + descend() + turtle.back() + dumpItems() + replant() + end + print(data.name) + else + print((os.epoch("local")-starttime)/1000,"not choppable") + end + end + end + sleep(1) + end +end + +waitForTree() \ No newline at end of file diff --git a/turtle/lumberjack/packageinfo.ccpt b/turtle/lumberjack/packageinfo.ccpt new file mode 100644 index 0000000..0be8bdc --- /dev/null +++ b/turtle/lumberjack/packageinfo.ccpt @@ -0,0 +1,12 @@ +{ + name = "LumberJack", + comment = "Turtle Tree ChippyChoppy Program", + author = "Hion-V", + website = "https://git.subsonics.nl/pootercraft/programs/turtle/lumberjack/", + newestversion = "1.0", + install = { + scripturl = "https://git.subsonics.nl/pootercraft/programs/raw/branch/master/turtle/lumberjack/packageinstall.lua", + type = "script", + }, + dependencies = {}, +} \ No newline at end of file diff --git a/turtle/lumberjack/packageinstall.lua b/turtle/lumberjack/packageinstall.lua new file mode 100644 index 0000000..f1f6306 --- /dev/null +++ b/turtle/lumberjack/packageinstall.lua @@ -0,0 +1,143 @@ +--[[ + LumberJack Program Installer + Author: Hion-V + Version: 1.0 + Lines of Code: 161; Characters: 5541 +]] + +-- INSTALL PACKAGE INFO +packageName = "LumberJack" +packageURL = "https://git.subsonics.nl/pootercraft/programs/raw/branch/master/turtle/lumberjack/bin/lumberjack" +packageBinPath = "/bin/" +packageFilename = "lumberjack" + +-- Read arguments +args = {...} + +-- FILE MANIPULATION FUNCTIONS -- +--[[ Checks if file exists + @param String filepath: Filepath to check + @return boolean: Does the file exist? +--]] +function file_exists(filepath) + local f=io.open(filepath,"r") + if f~=nil then + io.close(f) + return true + else + return false + end +end + +--[[ Stores a file in a desired location + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param String content: Content to store in file +--]] +function storeFile(filepath,content) + writefile = fs.open(filepath,"w") + writefile.write(content) + writefile.close() +end + +--[[ Reads a file from a desired location + @param String filepath: Filepath to the file to read + @param String createnew: (Optional) Content to store in new file and return if file does not exist. Can be nil. + @return String|boolean content|error: Content of the file; If createnew is nil and file doesn't exist boolean false is returned +--]] +function readFile(filepath,createnew) + readfile = fs.open(filepath,"r") + if readfile == nil then + if not (createnew==nil) then + storeFile(filepath,createnew) + return createnew + else + return false + end + end + content = readfile.readAll() + readfile.close() + return content +end + +--[[ Stores a table in a file + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param Table data: Table to store in file +--]] +function storeData(filepath,data) + storeFile(filepath,textutils.serialize(data):gsub("\n","")) +end + +--[[ Reads a table from a file in a desired location + @param String filepath: Filepath to the file to read + @param boolean createnew: If true, an empty table is stored in new file and returned if file does not exist. + @return Table|boolean content|error: Table thats stored in the file; If createnew is false and file doesn't exist boolean false is returned +--]] +function readData(filepath,createnew) + if createnew then + return textutils.unserialize(readFile(filepath,textutils.serialize({}):gsub("\n",""))) + else + return textutils.unserialize(readFile(filepath,nil)) + end +end + +-- HTTP FETCH FUNCTIONS -- +--[[ Gets result of HTTP URL + @param String url: The desired URL + @return Table|boolean result|error: The result of the request; If the URL is not reachable, an error is printed in the terminal and boolean false is returned +--]] +function gethttpresult(url) + if not http.checkURL(url) then + print("ERROR: Url '" .. url .. "' is blocked in config. Unable to fetch data.") + return false + end + result = http.get(url) + if result == nil then + print("ERROR: Unable to reach '" .. url .. "'") + return false + end + return result +end + +--[[ Download file HTTP URL + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param String url: The desired URL + @return nil|boolean nil|error: nil; If the URL is not reachable, an error is printed in the terminal and boolean false is returned +--]] +function downloadfile(filepath,url) + result = gethttpresult(url) + if result == false then + return false + end + storeFile(filepath,result.readAll()) +end + +-- MISC HELPER FUNCTIONS -- +--[[ Checks wether a String starts with another one + @param String haystack: String to check wether is starts with another one + @param String needle: String to check wether another one starts with it + @return boolean result: Wether the firest String starts with the second one +]]-- +function startsWith(haystack,needle) + return string.sub(haystack,1,string.len(needle))==needle +end + +-- MAIN PROGRAMM -- +if (args[1]=="install") or (args[1]==nil) then + print("[Installer] Installing",packageName) + if downloadfile(packageBinPath..packageFilename,packageURL)==false then + return false + end + print("[Installer] Successfully installed '"..packageName.."'!") +elseif args[1]=="update" then + print("[Installer] Updating "..packageName.."...") + if downloadfile("bin/dig",packageURL)==false then + fs.move() + return false + end +elseif args[1]=="remove" then + print("[Installer] Uninstalling '"..packageName.."'...") + fs.delete("/bin/dig") + print("[Installer] So long, and thanks for all the fish!") +else + print("[Installer] Invalid argument: " .. args[1]) +end \ No newline at end of file