jille_Jr icon

CC: Treefarm - working

jille_Jr | PRO | 11/16/13 02:04:41 PM UTC | 0 ⭐ | 355 👁️ | Never ⏰ | []
Lua |

6.23 KB

|

None

|

0 👍

/

0 👎

local x,y,z = 0,0,0 -- starting position
-- ^ dont change unless you know what you're doing ^
local dir = "n" -- starting direction, example: n for north
local dirs = {"w","n","e","s"}
local saplingslot = 1
local dirtslot = 2
 
local trees = {
    -- positions are relative to the starting position.
    -- does not use gps
    -- example:
    -- {x=-2,y=-1,z=-4,dir="n",real={x=-2,y=-1,z=-5}},
    -- x,y,z is where to stand when chopping it
    -- dir is direction the tree is in realtion to the position ^
    -- real x,y,z is the position of the sapling
}
 
local function checkfuel()
    local fuel = turtle.getFuelLevel()
    if fuel >= 5 then return end
    print("looking for fuel")
    while fuel < 5 do
        for slot = 1,16 do
            if turtle.getItemCount(slot) > 0 then
                turtle.select(slot)
                turtle.refuel(1)
            end
        end
        fuel = turtle.getFuelLevel()
    end
    turtle.select(1)
    print("refueled")
end
 
local function forcemove(func,dig)
    local state = false
    repeat
        checkfuel()
        if turtle[func] == nil then error("Cant find function \""..func.."\"") end
        state = turtle[func]()
        if dig then
            if func=="up" or func=="down"
            or func=="forward" then
                local face = func
                if face=="forward" then face="" end
                face=func:gsub("^%l", string.upper)
                local tmpfunc=func:gsub("^%l", string.upper)
                if turtle["detect"..face] == true then
                    forcemove("dig"..tmpfunc)
                end
            end
        end
    until state
end
 
local function forward()
    if dir=="n" then
        z=z-1
    elseif dir=="e" then
        x=x+1
    elseif dir=="s" then
        z=z+1
    elseif dir=="w" then
        x=x-1
    end
end
 
local function back()
    if dir=="n" then
        z=z-1
    elseif dir=="e" then
        x=x-1
    elseif dir=="s" then
        z=z+1
    elseif dir=="w" then
        x=x+1
    end
end
 
local function turnclockwise()
    local dirid = 0
    for id,face in ipairs(dirs) do
        if face==dir then dirid=id break end
    end
    dirid=dirid+1
    if dirid > #dirs then dirid = 1 end
    dir=dirs[dirid] or error("Unable to calculate direction")
end
 
local function turncounterclockwise()
    local dirid = 0
    for id,face in ipairs(dirs) do
        if face==dir then dirid=id break end
    end
    dirid = dirid - 1
    if dirid < 1 then dirid = #dirs end
    dir=dirs[dirid] or error("Unable to calculate direction")
end
 
local go = {}
go.u=function(dig)
    forcemove("up",dig)
    y=y+1
end
go.d=function(dig)
    forcemove("down",dig)
    y=y-1
end
go.f=function(dig)
    forcemove("forward",dig)
    forward()
end
go.b=function()
    forcemove("back")
    back()
end
go.rt=function()
    turtle.turnRight()
    turnclockwise()
end
go.lt=function()
    turtle.turnLeft()
    turncounterclockwise()
end
go.turn=function(face)
    local dirid = 0
    for id,face in ipairs(dirs) do
        if face==dir then dirid=id break end
    end
    local faceid = 0
    for id,vface in ipairs(dirs) do
        if vface==face then faceid=id break end
    end
    
    dirid = dirid - 1
    if dirid < 1 then dirid = #dirs end
    if dirid == faceid then go.lt() end
    
    while face ~= dir do
        go.rt()
    end
end
 
local function init()
    print("expecting saplings in slot "..saplingslot)
    print("and dirt in slot "..dirtslot)
    print("press any button to continue")
    repeat
        os.pullEvent("key")
    until turtle.getItemCount(saplingslot) >= tset.xcount*tset.zcount
    and turtle.getItemCount(dirtslot) >= tset.xcount*tset.zcount
end
 
local function chop()
    if not turtle.detect() then
        go.f()
        if turtle.detectDown() then
            repeat until turtle.digDown()
        end
        return
    end
    turtle.select(saplingslot)
    if turtle.compare() then
        forcemove("dig")
        go.f()
        forcemove("digDown")
        return
    elseif turtle.detect() then
        forcemove("dig")
        go.f()
        local height = 0
        while turtle.detectUp() do
            forcemove("digUp")
            go.u()
            height = height + 1
        end
        for count = 1,height do
            go.d()
        end
    end
    if turtle.detectDown() then
        forcemove("digDown")
    end
end
 
local function goto(xpos,ypos,zpos,newdir)
    while xpos~=x
    or ypos~=y
    or zpos~=z do
        -- vertical
        for count=1,y-ypos do
            if turtle.detectDown() then break end
            go.d(true)
        end
        for count=1,ypos-y do
            if turtle.detectUp() then break end
            go.u(true)
        end
        
        -- x
        for count=1,x-xpos do
            go.turn("w")
            if turtle.detect() then 
                go.rt() go.f() go.lt()
            else
                go.f()
            end
        end
        for count=1,xpos-x do
            go.turn("e")
            if turtle.detect() then
                go.lt() go.f() go.rt()
            else
                go.f()
            end
        end
        
        -- z
        for count=1,z-zpos do
            go.turn("n")
            if turtle.detect() then
                go.rt() go.f() go.lt()
            else
                go.f()
            end
        end
        for count=1,zpos-z do
            go.turn("s")
            if turtle.detect() then 
                go.lt() go.f() go.rt()
            else
                go.f()
            end
        end
    end
    if newdir then
    go.turn(newdir)
    end
end
 
local function gohome()
    goto(0,0,0,"n")
end
 
local function collect()
    goto(-4,-5,-3,"e")
    repeat until not turtle.suckDown()
    for count=1,tset.xcount*tset.xspace do
        go.f()
        repeat until not turtle.suckDown()
    end
    gohome()
end
 
local function replant()
    print("replanting")
    for id,tree in pairs(trees) do
        local real = tree.real
        goto(tree.x,tree.y,tree.z,tree.dir)
        if not turtle.detect() then
            goto(real.x,real.y,real.z)
            if not turtle.detectDown() then
                repeat
                    turtle.select(dirtslot)
                until turtle.placeDown()
            end
            go.u()
            repeat
                turtle.select(saplingslot)
            until turtle.placeDown()
        end
    end
end
 
local function harvest()
    for id,tree in ipairs(trees) do
        print("moving to x"..tree.x.." y"..tree.y.." z"..tree.z)
        goto(tree.x,tree.y,tree.z,tree.dir)
        print("chopping tree")
        chop()
    end
    gohome()
end
 
local function usage()
    print("Usage: "..shell.getRunningProgram().." <task>")
    print("Tasks avavible: harvest, replant, collect, cycle")
end
 
local args = {...}
local task = args[1]
 
if task == nil then
    usage()
elseif task == "harvest" then
    harvest()
    gohome()
    print("all done.")
elseif task == "replant" then
    init()
    replant()
    gohome()
    print("all done.")
elseif task == "collect" then
    collect()
    print("all done.")
elseif task == "cycle" then
    init()
    harvest()
    for i=1,3 do
        collect()
        print("waiting 1min for leaves to despawn")
        sleep(60)
        print("collecting drops")
        collect()
    end
    replant()
    gohome()
    print("all done.")
end

Comments