--[[
If you want to run PlantLife and mods that depend on it, i.e. MoreTrees, Disable the mapgen by 
commenting-out the lines starting with "local mgname = " through "end" (I left a note were to start
and stop) Disabling "Snow's" mapgen allows MoreTrees and PlantLife to do their thing until the 
issue is figured out. However, the pine and xmas tree code is still needed for when those 
saplings grow into trees.

The *starting* comment looks like this:  --[[
The *closing* comment looks like this:  --]]

-- ~ LazyJ, 2014_05_13


-- Part 1: To disable the mapgen, add the *starting* comment under this line.


local mgname = ""

--Identify the mapgen.
minetest.register_on_mapgen_init(function(MapgenParams)
	if MapgenParams.mgname then
		mgname = MapgenParams.mgname
	else
		io.write("[MOD] Snow Biomes: WARNING! mapgen could not be identifyed!\n")
	end
	if mgname == "v7" then
		--Load mapgen_v7 compatibility.
		dofile(minetest.get_modpath("snow").."/mapgen_v7.lua")
	else
		--Load mapgen_v6 compatibility.
		dofile(minetest.get_modpath("snow").."/mapgen_v6.lua")
	end
end)

-- To complete the commenting-out add the *closing* comment under this line.




local pine_tree = {
	axiom="TABff",
	rules_a="[&T+f+ff+ff+ff+f]GA",
	rules_b="[&T+f+Gf+Gf+Gf]GB",
	trunk="default:tree",
	leaves="snow:needles",
	angle=90,
	iterations=1,
	random_level=0,
	trunk_type="single",
	thin_branches=true,
}



local xmas_tree = {
	axiom="TABff",
	rules_a="[&T+f+ff+ff+ff+f]GA",
	rules_b="[&T+f+Gf+Gf+Gf]GB",
	trunk="default:tree",
	leaves="snow:needles_decorated",
	angle=90,
	iterations=1,
	random_level=0,
	trunk_type="single",
	thin_branches=true,
}



--Makes pine tree
function snow.make_pine(pos,snow,xmas)
        local env = minetest.env
        local perlin1 = env:get_perlin(112,3, 0.5, 150)
        local try_node = function(pos, node)
                local n = env:get_node(pos).name
                if n == "air" or n == "ignore" then
                        env:add_node(pos,node)
                end
        end
        --Clear ground.
        for x=-1,1 do
        for z=-1,1 do
                if env:get_node({x=pos.x+x,y=pos.y,z=pos.z+z}).name == "default:snow" then
                        env:remove_node({x=pos.x+x,y=pos.y,z=pos.z+z})
                end
                if env:get_node({x=pos.x+x,y=pos.y,z=pos.z+z}).name == "default:snowblock" then
                        env:remove_node({x=pos.x+x,y=pos.y,z=pos.z+z})
                end
        end
        end
        if xmas then
                env:remove_node(pos)
                minetest.env:spawn_tree(pos, xmas_tree)
        else
                minetest.env:spawn_tree(pos, pine_tree)
        end
        if snow then
                local x,z = pos.x,pos.z
                try_node({x=x+1,y=pos.y+3,z=z+1},{name="default:snow"})
                try_node({x=x-1,y=pos.y+3,z=z-1},{name="default:snow"})
                try_node({x=x-1,y=pos.y+3,z=z+1},{name="default:snow"})
                try_node({x=x+1,y=pos.y+3,z=z-1},{name="default:snow"})
                
                try_node({x=x+1,y=pos.y+5,z=z},{name="default:snow"})
                try_node({x=x-1,y=pos.y+5,z=z},{name="default:snow"})
                try_node({x=x,y=pos.y+5,z=z+1},{name="default:snow"})
                try_node({x=x,y=pos.y+5,z=z-1},{name="default:snow"})
        end
        if xmas then
                try_node({x=pos.x,y=pos.y+7,z=pos.z},{name="snow:star_lit"}) -- Added lit star. ~ LazyJ
        elseif snow and perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then
                try_node({x=pos.x,y=pos.y+7,z=pos.z},{name="default:snow"})
        end
end



--Makes pine tree
function snow.voxelmanip_pine(pos,a,data)
    local c_snow = minetest.get_content_id("default:snow")
    local c_pine_needles = minetest.get_content_id("snow:needles")
    local c_tree = minetest.get_content_id("default:tree")
    local c_air = minetest.get_content_id("air")
    
	local perlin1 = minetest.get_perlin(112,3, 0.5, 150) 
	--Clear ground.
	for x=-1,1 do
	for z=-1,1 do
		local node = a:index(pos.x+x,pos.y,pos.z+z)
		if data[node] == c_snow then
			data[node] = c_air
		end
	end
	end
	--Make tree.
	for i=0, 4 do
		if i==1 or i==2 then
			for x=-1,1 do
			for z=-1,1 do
				local x = pos.x + x
				local z = pos.z + z
				local node = a:index(x,pos.y+i,z)
				data[node] = c_pine_needles
				if snow and x ~= 0 and z ~= 0 and perlin1:get2d({x=x,y=z}) > 0.53 then
					local abovenode = a:index(x,pos.y+i+1,z)
					data[abovenode] = c_snow
				end
			end
			end
		end
		if i==3 or i==4 then
			local x = pos.x
			local y = pos.y+i
			local z = pos.z
			data[a:index(x+1,y,z)] = c_pine_needles
			data[a:index(x-1,y,z)] = c_pine_needles
			data[a:index(x,y,z+1)] = c_pine_needles
			data[a:index(x,y,z-1)] = c_pine_needles
			if snow then
				if perlin1:get2d({x=x+1,y=z}) > 0.53 then
					data[a:index(x+1,y+1,z)] = c_snow
				end
				if perlin1:get2d({x=x+1,y=z}) > 0.53 then
					data[a:index(x-1,y+1,z)] = c_snow
				end
				if perlin1:get2d({x=x,y=z+1}) > 0.53 then
					data[a:index(x,y+1,z+1)] = c_snow
				end
				if perlin1:get2d({x=x,y=z-1}) > 0.53 then
					data[a:index(x,y+1,z-1)] = c_snow
				end
			end
		end
		data[a:index(pos.x,pos.y+i,pos.z)] = c_tree
	end
	data[a:index(pos.x,pos.y+5,pos.z)] = c_pine_needles
	data[a:index(pos.x,pos.y+6,pos.z)] = c_pine_needles
	if snow and perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then
		data[a:index(pos.x,pos.y+7,pos.z)] = c_snow
	end
end
