Skip to content
Snippets Groups Projects
tree.lua 2.33 KiB
Newer Older
codecraft's avatar
codecraft committed
-- NUR DURCH 4 TEILBARE ZAHLEN > 20 VERWENDEN!!!
local leds = {
codecraft's avatar
codecraft committed
    40,
codecraft's avatar
codecraft committed
    36,
codecraft's avatar
codecraft committed
    32,
codecraft's avatar
codecraft committed
    28,
codecraft's avatar
codecraft committed
    24,
codecraft's avatar
codecraft committed
    20,
codecraft's avatar
codecraft committed
for i = 1, #leds do
    if leds[i] % 4 ~= 0 then
        error("[ledtree] led count per layer must be divisible by 4. Error location: 'leds' table, item "..i..": "..leds[i])
    end
end

Tuxilio's avatar
Tuxilio committed
local height_increment = 3

Tuxilio's avatar
Tuxilio committed
local function breite(n)
    return n / 4
end

local function is_led(center, breite, pos)
    if math.abs(center.x - pos.x) >= (breite - 1) / 2 and math.abs(center.z - pos.z) >= (breite - 1) / 2 then
        return false
    end
    if math.abs(center.x - pos.x) == (breite - 1) / 2 then
        return math.abs(center.z - pos.z) % 2 == 0
    end
    if math.abs(center.z - pos.z) == (breite - 1) / 2 then
        return math.abs(center.x - pos.x) % 2 == 0
    end
end

local function place_layer(center, breite)
    breite = breite * 2 + 1
    local needles = {}
    local leds = {}
    local max_offset = (breite - 1) / 2
codecraft's avatar
codecraft committed
    for y = math.ceil(-height_increment / 2), math.floor(height_increment / 2) do
Tuxilio's avatar
Tuxilio committed
        for x = -max_offset, max_offset do
            for z = -max_offset, max_offset do
                local pos = vector.new({x = center.x + x, y = center.y + y, z = center.z + z})
                table.insert(needles, pos)
codecraft's avatar
codecraft committed
                if y == 0 and is_led(center, breite, pos) then
Tuxilio's avatar
Tuxilio committed
                    table.insert(leds, pos)
Tuxilio's avatar
Tuxilio committed
                end
            end
        end
    end
Tuxilio's avatar
Tuxilio committed
    core.bulk_set_node(needles, {name = "ledtree:pine_needles"})
    return leds
end
Tuxilio's avatar
Tuxilio committed
local function place_leds(led_index, leds)
    for i = 1, #leds do
        core.set_node(leds[i], {name = "ledtree:led"..led_index.."_red"})
        led_index = led_index + 1
    end
    return led_index
end
Tuxilio's avatar
Tuxilio committed
local function place_tree(pos)
codecraft's avatar
codecraft committed
    local led_index = 300 - 220
Tuxilio's avatar
Tuxilio committed
    for index = 1, #leds do
        local l = leds[index]
        local layer_center = vector.new(pos.x, pos.y + index * height_increment - height_increment / 2, pos.z)
        local leds = place_layer(layer_center, breite(l))
        led_index = place_leds(led_index, leds)
Tuxilio's avatar
Tuxilio committed
end

core.register_node("ledtree:ledtree", {
    description = "Place LED tree",
    on_construct = function(pos)
        place_tree(pos)
    end,
})

core.register_node("ledtree:pine_needles", {
    description = "Pine Needles",
    paramtype = "light",
    tiles = {"pine_needles.png"},
})