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
To download : viewtopic.php?f=5&t=12743 this is made into a mod download at the attachment in that forum.