RealBadAngel
2013-01-02 23e1d8e0ca7cfc44fed877d733bcfebe7fb32694
technic/technic/rubber.lua
@@ -51,7 +51,7 @@
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 @@
   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 @@
   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 @@
   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