CCCPaste

Tree Farming Auto

local FUEL_SLOT = 16
local SAPLING_SLOT = 15
local BONEMEAL_SLOT = 14
local TOP_LIMIT = 15
local GRID_SIZE = 6

local function turn_around()
    turtle.turnLeft()
    turtle.turnLeft()
end

local function forward(times)
    for i = 1, times do
        turtle.forward()
    end
end

function find_top()
    local distance_up = 0
    local success_up, block_data_up = turtle.inspectUp()
    turtle.turnRight()
    while not success_up and distance_up < TOP_LIMIT do
        turtle.dig()
        turtle.up()
        distance_up = distance_up + 1
        success_up, block_data_up = turtle.inspectUp()
    end
    success_up, block_data_up = turtle.inspectUp()
    while success_up and block_data_up and distance_up < TOP_LIMIT do
        turtle.digUp()
        turtle.dig()
        turtle.up()
        distance_up = distance_up + 1
        success_up, block_data_up = turtle.inspectUp()
    end
    turtle.dig()
    return distance_up
end


function return_ground_fell(ground_distance)
    turn_around()
    for travel = 1, ground_distance do
        turtle.dig()
        turtle.down()
    end
    turn_around()
end

function return_ground(ground_distance)
    for travel = 1, ground_distance do
        turtle.down()
    end
end

function wrap_around()
    turtle.forward()
    turtle.turnLeft()
    turtle.forward()
    turtle.forward()
    turtle.turnLeft()
end

function remove_wood(top_distance)
    turtle.dig()
    turtle.forward()
    for y = 1, top_distance do
        turtle.digUp()
        turtle.dig()
        turtle.turnLeft()
        turtle.dig()
        turtle.turnRight()
        turtle.up()
    end

    turtle.dig()
    turtle.forward()
    turtle.turnLeft()
    turtle.dig()
    turtle.forward()

    for y = 1, top_distance do
        turtle.digDown()
        turtle.down()
    end

    turn_around()
    turtle.forward()
    turtle.forward()
end

function fell_tree()
    for i = 1, 3 do
        local top_distance = find_top()
        return_ground_fell(top_distance)
        wrap_around()
    end

    local top_distance = find_top()
    return_ground_fell(top_distance)

    turtle.turnLeft()
    remove_wood(top_distance)
end

function grid_turn(isEvenRow)
    if isEvenRow then
        turtle.turnRight()
    else
        turtle.turnLeft()
    end
end

function check_grid()
    local isEvenRow = false

	turtle.forward()
    turtle.turnLeft()
    forward(2)
    turtle.turnLeft()
    for y = 1, GRID_SIZE do
        for x = 1, GRID_SIZE do
            turtle.suck()
            turtle.forward()
            turtle.suck()
        end
        if y < 6 then
            grid_turn(isEvenRow)
            turtle.suck()
            turtle.forward()
            turtle.suck()
            grid_turn(isEvenRow)
        end
        isEvenRow = not isEvenRow
    end
    turtle.turnLeft()
    forward(3)
    turtle.turnRight()
end

function operate_check()
    local insp_true, block_data = turtle.inspect()
    local foward_amount = 0
    if insp_true and block_data and block_data.name == "minecraft:dark_oak_sapling" then
        turn_around()
        foward_amount = 12
    else
        fell_tree()
        check_grid()
        foward_amount = 11
    end
    return foward_amount
end

function check_trees()
    local foward_amount = 0
    forward(6)
    turtle.turnLeft()
    forward(6)

    -- First tree row
    foward_amount = operate_check()
    forward(foward_amount)
    foward_amount = operate_check()
    forward(foward_amount)

    turtle.turnRight()
    forward(6)
    turtle.turnLeft()
    forward(6)
    
    -- Second tree row
    foward_amount = operate_check()
    forward(foward_amount)
    foward_amount = operate_check()
    forward(foward_amount)

    -- Return home
    forward(12)
end


function main()
    check_trees()
end

main()