diff --git a/tree.lua b/tree.lua
index 2a55086737bec7bae95a961c51f0c73cd9132158..77850487b68a0c766c4240d595e6795cb0ccbd25 100644
--- a/tree.lua
+++ b/tree.lua
@@ -1,69 +1,64 @@
 local leds = {
-    30,
-    20,
-    10,
-    5,
-    2,
+    32,
+    28,
+    16,
+    8,
+    4,
 }
 
 local height_increment = 3
-local size = (#leds + 1) * 2
 
-local function place_tree(pos)
-    local set = {}
-    local iled = 0
-    local blocks_per_layer = {}
-    for iy = 0, size - 1 do
-        blocks_per_layer[iy] = 0
-        for ix = iy, size - 1 - iy do
-            for iz = iy, size - 1 - iy do
-                for h = 0, height_increment - 1 do
-                    table.insert(set, {x = pos.x + ix, y = pos.y + iy * height_increment + h, z = pos.z + iz})
-                    iled = iled + 1
-                    blocks_per_layer[iy] = blocks_per_layer[iy] + 1
+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 = math.ceil(breite / 2)
+    for y = -height_increment / 2, height_increment / 2 do
+        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)
+                if is_led(center, breite, pos) then
+                    table.insert(leds, pos)
                 end
             end
         end
-        blocks_per_layer[iy] = blocks_per_layer[iy] / height_increment
-        blocks_per_layer[iy] = math.sqrt(blocks_per_layer[iy]) * 4 - 4
     end
-    minetest.bulk_set_node(set, {name = "ledtree:pine_needles"})
-
-    local loop_run = 0
-    local id = 0
-    for iy = 0, size - 1 do
-        loop_run = loop_run + 1
-
-        if loop_run <= #leds then
-            local led_count = leds[iy + 1]
-            local led_per_side = math.ceil(led_count / 4)
-
-            local layer_size = size - 2 * iy
-            local led_index = 1
-
-            for ix = iy, iy + layer_size - 1 do
-                for iz = iy, iy + layer_size - 1 do
-                    if led_index <= led_count then
-                        local led_pos = {}
-
-                        if (ix == iy or ix == iy + layer_size - 1 or iz == iy or iz == iy + layer_size - 1) then
-                            if not ((ix == iy and iz == iy) or (ix == iy and iz == iy + layer_size - 1) or
-                                    (ix == iy + layer_size - 1 and iz == iy) or (ix == iy + layer_size - 1 and iz == iy + layer_size - 1)) then
-                                led_pos.x = pos.x + ix
-                                led_pos.z = pos.z + iz
-
-                                led_pos.y = pos.y + iy * height_increment + math.floor(height_increment / 2)
+    core.bulk_set_node(needles, {name = "ledtree:pine_needles"})
+    return leds
+end
 
-                                core.set_node({x = led_pos.x, y = led_pos.y, z = led_pos.z}, {name = "ledtree:led"..id.."_red"})
-                                id = id + 1
+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
 
-                                led_index = led_index + 1
-                            end
-                        end
-                    end
-                end
-            end
-        end
+local function place_tree(pos)
+    local led_index = 0
+    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)
     end
 end