minetest.register_node(":default:dirt", {
	description = "Dirt",
	tiles = {"default_dirt.png"},
	is_ground_content = true,
	groups = {crumbly=3, soil=1},
	drop = {
		max_items = 1,
		items = {
			{
				items = {'bone:bone', 'default:dirt'},
				rarity = 50,
			},
			{
				items = {'default:dirt'},
			}
		}
	},
	sounds = default.node_sound_dirt_defaults(),
})


minetest.register_node(":default:dirt_with_grass", {
	description = "Dirt with Grass",
	tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
	is_ground_content = true,
	groups = {crumbly=3, soil=1},
	drop = {
		max_items = 1,
		items = {
			{
				items = {'bone:bone', 'default:dirt'},
				rarity = 50,
			},
			{
				items = {'default:dirt'},
			}
		}
	},
	sounds = default.node_sound_dirt_defaults({
		footstep = {name="default_grass_footstep", gain=0.4},
	}),
})


minetest.register_craftitem("bone:bone", {
	description = "Bone",
	inventory_image = "bone_bone.png",
})


minetest.register_craft({
	output = 'bone:bonemeal 5',
	recipe = {{'bone:bone'}}
})

local n
local n2
local pos

function apple_leave()
	if math.random(0, 10) == 3 then
		return {name = "default:apple"}
	else
		return {name = "default:leaves"}
	end
end

function air_leave()
	if math.random(0, 50) == 3 then
		return {name = "air"}
	else
		return {name = "default:leaves"}
	end
end

function generate_tree(pos, trunk, leaves)
	pos.y = pos.y-1
	local nodename = minetest.get_node(pos).name

	pos.y = pos.y+1
	if not minetest.get_node_light(pos) then
		return
	end

	node = {name = ""}
	for dy=1,4 do
		pos.y = pos.y+dy
		if minetest.get_node(pos).name ~= "air" then
			return
		end
		pos.y = pos.y-dy
	end
	node = {name = "default:tree"}
	for dy=0,4 do
		pos.y = pos.y+dy
		minetest.set_node(pos, node)
		pos.y = pos.y-dy
	end

	node = {name = "default:leaves"}
	pos.y = pos.y+3
	local rarity = 0
	if math.random(0, 10) == 3 then
		rarity = 1
	end
	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.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
						minetest.set_node(pos, node)
						if rarity == 1 then
							minetest.set_node(pos, apple_leave())
						else
							minetest.set_node(pos, air_leave())
						end
					end
				elseif dx == 0 and dz == 0 and dy==4 then
					if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
						minetest.set_node(pos, node)
						if rarity == 1 then
							minetest.set_node(pos, apple_leave())
						else
							minetest.set_node(pos, air_leave())
						end
					end
				elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
					if minetest.get_node(pos).name == "air" then
						minetest.set_node(pos, node)
						if rarity == 1 then
							minetest.set_node(pos, apple_leave())
						else
							minetest.set_node(pos, air_leave())
						end
					end
				else
					if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
						if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
							minetest.set_node(pos, node)
						if rarity == 1 then
							minetest.set_node(pos, apple_leave())
						else
							minetest.set_node(pos, air_leave())
						end
						end
					end
				end
				pos.x = pos.x-dx
				pos.y = pos.y-dy
				pos.z = pos.z-dz
			end
		end
	end
end

local plant_tab = {}
local rnd_max = 5
minetest.after(0.5, function()
	plant_tab[0] = "air"
	plant_tab[1] = "default:grass_1"
	plant_tab[2] = "default:grass_2"
	plant_tab[3] = "default:grass_3"
	plant_tab[4] = "default:grass_4"
	plant_tab[5] = "default:grass_5"

if minetest.get_modpath("flowers") ~= nil then
	rnd_max = 11
	plant_tab[6] = "flowers:dandelion_white"
	plant_tab[7] = "flowers:dandelion_yellow"
	plant_tab[8] = "flowers:geranium"
	plant_tab[9] = "flowers:rose"
	plant_tab[10] = "flowers:tulip"
	plant_tab[11] = "flowers:viola"
end

end)

local function duengen(pointed_thing)
pos = pointed_thing.under
n = minetest.get_node(pos)
if n.name == "" then return end
local stage = ""
if n.name == "default:sapling" then
	minetest.set_node(pos, {name="air"})
	generate_tree(pos, "default:tree", "default:leaves")
elseif string.find(n.name, "farming:wheat_") ~= nil then
	stage = string.sub(n.name, 15)
	if stage == "3" then
		minetest.set_node(pos, {name="farming:wheat"})
	elseif math.random(1,5) < 3 then
		minetest.set_node(pos, {name="farming:wheat"})
	else
		minetest.set_node(pos, {name="farming:wheat_"..math.random(2,3)})
	end
elseif string.find(n.name, "farming:cotton_") ~= nil then
	stage = tonumber(string.sub(n.name, 16))
	if stage == 1 then
		minetest.set_node(pos, {name="farming:cotton_"..math.random(stage,2)})
	else
		minetest.set_node(pos, {name="farming:cotton"})
	end
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
	stage = tonumber(string.sub(n.name, 17))
	if stage == 1 then
		minetest.set_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
	else
		minetest.set_node(pos, {name="farming:pumpkin"})
	end

elseif n.name == "default:dirt_with_grass" then
	for i = -2, 3, 1 do
		for j = -3, 2, 1 do
			pos = pointed_thing.above
			pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
			n = minetest.get_node(pos)
			n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})

			if n.name ~= ""  and n.name == "air" and n2.name == "default:dirt_with_grass" then
				if math.random(0,5) > 3 then
					minetest.set_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
				else
					minetest.set_node(pos, {name=plant_tab[math.random(0, 5)]})
				end


			end
		end
	end
end
end


minetest.register_craftitem("bone:bonemeal", {
	description = "Bone Meal",
	inventory_image = "bone_bonemeal.png",
	liquids_pointable = false,
	stack_max = 99,
	on_use = function(itemstack, user, pointed_thing)
		if pointed_thing.type == "node" then
			duengen(pointed_thing)
			itemstack:take_item()
			return itemstack
		end
	end,

})