Big Pine Tree!!

Post Reply
milkymaidy
Member
Posts: 32
Joined: Sun Jul 12, 2015 06:27
In-game: Dave

Big Pine Tree!!

by milkymaidy » Post

Hi i have made a mod Big Tree! Pictures

Image

Image

Here:

Code: Select all

 -- Pinetree from mg mapgen mod, design by sfan5, pointy top added by paramat

local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles)
   if data[vi] == c_air or data[vi] == c_ignore or data[vi] == c_snow then
      data[vi] = c_pine_needles
   end
end

local function add_snow(data, vi, c_air, c_ignore, c_snow)
   if data[vi] == c_air or data[vi] == c_ignore then
      data[vi] = c_snow
   end
end

function default.grow_pine_tree(pos)
   local treetype = random(1, 3)
   
   if treetype <= 2 then
      default.grow_pine_tree_a(pos)
   else
      default.grow_pine_tree_b(pos)
   end
end
   
function default.grow_pine_tree_a(pos)
   local x, y, z = pos.x, pos.y, pos.z
   local maxy = y + random(9, 13) -- Trunk top

   local c_air = minetest.get_content_id("air")
   local c_ignore = minetest.get_content_id("ignore")
   local c_pinetree = minetest.get_content_id("default:pinetree")
   local c_pine_needles  = minetest.get_content_id("default:pine_needles")
   local c_snow = minetest.get_content_id("default:snow")
   local c_snowblock = minetest.get_content_id("default:snowblock")
   local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")

   local vm = minetest.get_voxel_manip()
   local minp, maxp = vm:read_from_map(
      {x = x - 3, y = y - 1, z = z - 3},
      {x = x + 3, y = maxy + 3, z = z + 3}
   )
   local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
   local data = vm:get_data()

   -- Scan for snow nodes near sapling
   local snow = false
   for yy = y - 1, y + 1 do
   for zz = z - 1, z + 1 do
      local vi  = a:index(x - 1, yy, zz)
      for xx = x - 1, x + 1 do
         local nodid = data[vi]
         if nodid == c_snow
         or nodid == c_snowblock
         or nodid == c_dirtsnow then
            snow = true
         end
         vi  = vi + 1
      end
   end
   end

   -- Upper branches layer
   local dev = 3
   for yy = maxy - 1, maxy + 1 do
      for zz = z - dev, z + dev do
         local vi = a:index(x - dev, yy, zz)
         local via = a:index(x - dev, yy + 1, zz)
         for xx = x - dev, x + dev do
            if random() < 0.95 - dev * 0.05 then
               add_pine_needles(data, vi, c_air, c_ignore, c_snow,
                     c_pine_needles)
               if snow then
                  add_snow(data, via, c_air, c_ignore, c_snow)
               end
            end
            vi  = vi + 1
            via = via + 1
         end
      end
      dev = dev - 1
   end

   -- Centre top nodes
   add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow,
         c_pine_needles)
   add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow,
         c_pine_needles) -- Paramat added a pointy top node
   if snow then
      add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow)
   end

   -- Lower branches layer
   local my = 0
   for i = 1, 20 do -- Random 2x2 squares of needles
      local xi = x + random(-3, 2)
      local yy = maxy + random(-6, -5)
      local zi = z + random(-3, 2)
      if yy > my then
         my = yy
      end
      for zz = zi, zi+1 do
         local vi = a:index(xi, yy, zz)
         local via = a:index(xi, yy + 1, zz)
         for xx = xi, xi + 1 do
            add_pine_needles(data, vi, c_air, c_ignore, c_snow,
                  c_pine_needles)
            if snow then
               add_snow(data, via, c_air, c_ignore, c_snow)
            end
            vi  = vi + 1
            via = via + 1
         end
      end
   end

   local dev = 2
   for yy = my + 1, my + 2 do
      for zz = z - dev, z + dev do
         local vi = a:index(x - dev, yy, zz)
         local via = a:index(x - dev, yy + 1, zz)
         for xx = x - dev, x + dev do
            if random() < 0.95 - dev * 0.05 then
               add_pine_needles(data, vi, c_air, c_ignore, c_snow,
                     c_pine_needles)
               if snow then
                  add_snow(data, via, c_air, c_ignore, c_snow)
               end
            end
            vi  = vi + 1
            via = via + 1
         end
      end
      dev = dev - 1
   end

   -- Trunk
   for yy = y, maxy do
      local vi = a:index(x, yy, z)
      data[vi] = c_pinetree
   end

   vm:set_data(data)
   vm:write_to_map()
   vm:update_map()
end

function default.grow_pine_tree_b(pos)
   local x, y, z = pos.x, pos.y, pos.z
   local height = random(7, 13)
   local c_pinetree = minetest.get_content_id("default:pinetree")
   local c_pine_needles = minetest.get_content_id("default:pine_needles")
   local c_pine_sapling = minetest.get_content_id("default:pine_sapling")
   local c_snow = minetest.get_content_id("default:snow")
   local c_snowblock = minetest.get_content_id("default:snowblock")
   local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")
   local c_air = minetest.get_content_id("air")
   local c_ignore = minetest.get_content_id("ignore")

   local vm = minetest.get_voxel_manip()
   local minp, maxp = vm:read_from_map(
      {x = pos.x - 2, y = pos.y, z = pos.z - 2},
      {x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2}
   )
   local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
   local data = vm:get_data()
   
   -- Scan for snow nodes near sapling
   local snow = false
   for yy = y - 1, y + 1 do
   for zz = z - 1, z + 1 do
      local vi  = a:index(x - 1, yy, zz)
      for xx = x - 1, x + 1 do
         local nodid = data[vi]
         if nodid == c_snow
         or nodid == c_snowblock
         or nodid == c_dirtsnow then
            snow = true
         end
         vi  = vi + 1
      end
   end
   end
   
   -- Trunk
   for yy = y, y + height do
      local vi = a:index(x, yy, z)
      if data[vi] == c_air or data[vi] == c_pine_sapling or data[vi] == c_ignore then
         data[vi] = c_pinetree
      end
   end
   
   -- Add the basic needles
   add_pine_needles(data, a:index(x, y + height + 2, z), c_air, c_ignore, c_snow, c_pine_needles)
   
   add_pine_needles(data, a:index(x, y + height + 1, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x - 1, y + height + 1, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x + 1, y + height + 1, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height + 1, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height + 1, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
   
   add_pine_needles(data, a:index(x - 1, y + height, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x + 1, y + height, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
   
   -- Add the basic snow
   if snow then
      add_snow(data, a:index(x, y + height + 3, z), c_air, c_ignore, c_snow)
      
      add_snow(data, a:index(x - 1, y + height + 2, z), c_air, c_ignore, c_snow)
      add_snow(data, a:index(x + 1, y + height + 2, z), c_air, c_ignore, c_snow)
      add_snow(data, a:index(x, y + height + 2, z - 1), c_air, c_ignore, c_snow)
      add_snow(data, a:index(x, y + height + 2, z + 1), c_air, c_ignore, c_snow)
   end
   
   -- Add more needles
   add_pine_needles(data, a:index(x - 1, y + height - 1, z), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height - 1, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x, y + height - 1, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
   add_pine_needles(data, a:index(x + 1, y + height - 1, z), c_air, c_ignore, c_snow, c_pine_needles)
   
   if random(1, 2) == 1 then
      -- Add more needles
      add_pine_needles(data, a:index(x - 1, y + height, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x - 1, y + height, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x + 1, y + height, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x + 1, y + height, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
      
      add_pine_needles(data, a:index(x - 2, y + height - 1, z), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x - 1, y + height - 1, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x - 1, y + height - 1, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x, y + height - 1, z + 2), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x, y + height - 1, z - 2), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x + 1, y + height - 1, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x + 1, y + height - 1, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
      add_pine_needles(data, a:index(x + 2, y + height - 1, z), c_air, c_ignore, c_snow, c_pine_needles)
      
      if random(1, 2) == 1 then
         add_pine_needles(data, a:index(x - 1, y + height - 2, z), c_air, c_ignore, c_snow, c_pine_needles)
      end
      if random(1, 2) == 1 then
         add_pine_needles(data, a:index(x, y + height - 2, z - 1), c_air, c_ignore, c_snow, c_pine_needles)
      end
      if random(1, 2) == 1 then
         add_pine_needles(data, a:index(x, y + height - 2, z + 1), c_air, c_ignore, c_snow, c_pine_needles)
      end
      if random(1, 2) == 1 then
         add_pine_needles(data, a:index(x + 1, y + height - 2, z), c_air, c_ignore, c_snow, c_pine_needles)
      end
      
      if snow then
         add_snow(data, a:index(x - 1, y + height + 1, z + 1), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x - 1, y + height + 1, z - 1), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x + 1, y + height + 1, z + 1), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x + 1, y + height + 1, z - 1), c_air, c_ignore, c_snow)
         
         add_snow(data, a:index(x - 2, y + height, z), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x, y + height, z - 2), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x, y + height, z + 2), c_air, c_ignore, c_snow)
         add_snow(data, a:index(x + 2, y + height, z), c_air, c_ignore, c_snow)
      end
   end
   
   vm:set_data(data)
   vm:write_to_map()
   vm:update_map()
end
Edited trees.lua

To download : viewtopic.php?f=5&t=12743 this is made into a mod download at the attachment in that forum.

Uruwi
New member
Posts: 7
Joined: Sat Jul 04, 2015 19:26
GitHub: bluebear94
IRC: bb94
In-game: Uruwi

Re: Big Pine Tree!!

by Uruwi » Post

You know you can just use L-systems, right?

chase programer
Member
Posts: 117
Joined: Thu Jan 03, 2013 16:56
Location: Everywhere.

Re: Big Pine Tree!!

by chase programer » Post

This is quite cool i like it i might message you later regarding mod development.

milkymaidy
Member
Posts: 32
Joined: Sun Jul 12, 2015 06:27
In-game: Dave

Re: Big Pine Tree!!

by milkymaidy » Post

Uruwi wrote:You know you can just use L-systems, right?
Yes i know i just did it his way...
chase programer wrote:This is quite cool i like it i might message you later regarding mod development.
Thanks!

milkymaidy
Member
Posts: 32
Joined: Sun Jul 12, 2015 06:27
In-game: Dave

Re: Big Pine Tree!!

by milkymaidy » Post

The Pine Needles are small because thats how it came out sorry folks.

Post Reply

Who is online

Users browsing this forum: Google [Bot] and 49 guests