Make Rubber tree using L-Systems
authorRealBadAngel <mk@realbadangel.pl>
Wed, 2 Jan 2013 03:49:03 +0000 (04:49 +0100)
committerRealBadAngel <mk@realbadangel.pl>
Wed, 2 Jan 2013 03:49:03 +0000 (04:49 +0100)
technic/technic/rubber.lua
technic/technic/textures/technic_rubber_leaves.png [new file with mode: 0644]

index 311f3af8ae8ddec4e9a66121f9f1af90453ec559..0e530ffd7c1b892574e0392841f6437995824036 100644 (file)
@@ -51,7 +51,7 @@ minetest.register_abm({
 minetest.register_node("technic:rubber_leaves", {
        drawtype = "allfaces_optional",
        visual_scale = 1.3,
-       tiles = {"default_leaves.png"},
+       tiles = {"technic_rubber_leaves.png"},
        paramtype = "light",
        groups = {snappy=3, leafdecay=3, flammable=2, not_in_creative_inventory=1},
        drop = {
@@ -71,7 +71,20 @@ minetest.register_abm({
        interval = 60,
        chance = 20,
        action = function(pos, node)
-               generate_tree(pos, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
+               rubber_tree={
+                       axiom="FFFFA",
+                       rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
+                       rules_b="[&FFA]////[&FFA]////[&FFA]",
+                       trunk="technic:rubber_tree_full",
+                       leaves="technic:rubber_leaves",
+                       angle=35,
+                       iterations=3,
+                       random_level=1,
+                       thin_trunks=false;
+                       fruit_tree=false,
+                       fruit=""
+                       }
+                       minetest.env:spawn_tree(pos,rubber_tree)
        end
 })
 
@@ -82,7 +95,20 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
        local tmp = {x=(maxp.x-minp.x)/2+minp.x, y=(maxp.y-minp.y)/2+minp.y, z=(maxp.z-minp.z)/2+minp.z}
        local pos = minetest.env:find_node_near(tmp, maxp.x-minp.x, {"default:dirt_with_grass"})
        if pos ~= nil then
-               generate_tree({x=pos.x, y=pos.y+1, z=pos.z}, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
+                       rubber_tree={
+                       axiom="FFFFA",
+                       rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
+                       rules_b="[&FFA]////[&FFA]////[&FFA]",
+                       trunk="technic:rubber_tree_full",
+                       leaves="technic:rubber_leaves",
+                       angle=35,
+                       iterations=3,
+                       random_level=1,
+                       thin_trunks=false;
+                       fruit_tree=false,
+                       fruit=""
+                       }
+                       minetest.env:spawn_tree({x=pos.x, y=pos.y+1, z=pos.z},rubber_tree)
        end
 end)
 
@@ -93,94 +119,3 @@ minetest.register_craft({
        recipe = "technic:rubber_sapling",
        burntime = 10
 })
-
-function generate_tree(pos, trunk, leaves, underground, replacements)
-       pos.y = pos.y-1
-       local nodename = minetest.env:get_node(pos).name
-       local ret = true
-       for _,name in ipairs(underground) do
-               if nodename == name then
-                       ret = false
-                       break
-               end
-       end
-       pos.y = pos.y+1
-       if ret or minetest.env:get_node_light(pos) < 8 then
-               return
-       end
-       
-       node = {name = ""}
-       for dy=1,4 do
-               pos.y = pos.y+dy
-               if minetest.env:get_node(pos).name ~= "air" then
-                       return
-               end
-               pos.y = pos.y-dy
-       end
-       node.name = trunk
-       for dy=0,4 do
-               pos.y = pos.y+dy
-               minetest.env:set_node(pos, node)
-               pos.y = pos.y-dy
-       end
-       
-       if not replacements then
-               replacements = {}
-       end
-       
-       node.name = leaves
-       pos.y = pos.y+3
-       for dx=-2,2 do
-               for dz=-2,2 do
-                       for dy=0,3 do
-                               pos.x = pos.x+dx
-                               pos.y = pos.y+dy
-                               pos.z = pos.z+dz
-                               
-                               if dx == 0 and dz == 0 and dy==3 then
-                                       if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
-                                               minetest.env:set_node(pos, node)
-                                               for name,rarity in pairs(replacements) do
-                                                       if math.random(1, rarity) == 1 then
-                                                               minetest.env:set_node(pos, {name=name})
-                                                       end
-                                               end
-                                       end
-                               elseif dx == 0 and dz == 0 and dy==4 then
-                                       if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
-                                               minetest.env:set_node(pos, node)
-                                               for name,rarity in pairs(replacements) do
-                                                       if math.random(1, rarity) == 1 then
-                                                               minetest.env:set_node(pos, {name=name})
-                                                       end
-                                               end
-                                       end
-                               elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
-                                       if minetest.env:get_node(pos).name == "air" then
-                                               minetest.env:set_node(pos, node)
-                                               for name,rarity in pairs(replacements) do
-                                                       if math.random(1, rarity) == 1 then
-                                                               minetest.env:set_node(pos, {name=name})
-                                                       end
-                                               end
-                                       end
-                               else
-                                       if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
-                                               if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
-                                                       minetest.env:set_node(pos, node)
-                                                       for name,rarity in pairs(replacements) do
-                                                               if math.random(1, rarity) == 1 then
-                                                               minetest.env:set_node(pos, {name=name})
-                                                               end
-                                                       end
-                                               end
-                                       end
-                               end
-                               
-                               pos.x = pos.x-dx
-                               pos.y = pos.y-dy
-                               pos.z = pos.z-dz
-                       end
-               end
-       end
-end
diff --git a/technic/technic/textures/technic_rubber_leaves.png b/technic/technic/textures/technic_rubber_leaves.png
new file mode 100644 (file)
index 0000000..ae013e0
Binary files /dev/null and b/technic/technic/textures/technic_rubber_leaves.png differ