local S = minetest.get_translator("moretrees")

moretrees.avoidnodes = {}

local jungle_sapling_texture = minetest.get_modpath("default") and "default_junglesapling.png"
	or "moretrees_cedar_sapling.png"

moretrees.treelist = {
	{"beech",        S("Beech Tree")},
	{"apple_tree",   S("Apple Tree")},
	{"oak",          S("Oak Tree"),       "acorn",                S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
	{"sequoia",      S("Giant Sequoia")},
	{"birch",        S("Birch Tree")},
	{"palm",         S("Palm Tree"),      "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 },
	{"date_palm",    S("Date Palm Tree"), "date_palm_fruit_trunk",S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 },
	{"spruce",       S("Spruce Tree"),    "spruce_cone",          S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
	{"cedar",        S("Cedar Tree"),     "cedar_cone",           S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
	{"poplar",       S("Poplar Tree")},
	{"poplar_small", S("Poplar Tree")},
	{"willow",       S("Willow Tree")},
	{"rubber_tree",  S("Rubber Tree")},
	{"fir",          S("Douglas Fir"),    "fir_cone",             S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
	{"jungletree",   S("Jungle Tree"),     nil,                   nil, nil, nil, jungle_sapling_texture  },
}

moretrees.treedesc = {
	beech = {
		trunk = S("Beech Tree Trunk"),
		planks = S("Beech Tree Planks"),
		sapling = S("Beech Tree Sapling"),
		leaves = S("Beech Tree Leaves"),
		trunk_stair = S("Beech Tree Trunk Stair"),
		trunk_slab = S("Beech Tree Trunk Slab"),
		planks_stair = S("Beech Tree Planks Stair"),
		planks_slab = S("Beech Tree Planks Slab"),
		fence = S("Beech Tree Fence"),
		fence_rail = S("Beech Tree Fence Rail"),
		fence_gate = S("Beech Tree Fence Gate"),
	},
	apple_tree = {
		trunk = S("Apple Tree Trunk"),
		planks = S("Apple Tree Planks"),
		sapling = S("Apple Tree Sapling"),
		leaves = S("Apple Tree Leaves"),
		trunk_stair = S("Apple Tree Trunk Stair"),
		trunk_slab = S("Apple Tree Trunk Slab"),
		planks_stair = S("Apple Tree Planks Stair"),
		planks_slab = S("Apple Tree Planks Slab"),
		fence = S("Apple Tree Fence"),
		fence_rail = S("Apple Tree Fence Rail"),
		fence_gate = S("Apple Tree Fence Gate"),
	},
	oak = {
		trunk = S("Oak Tree Trunk"),
		planks = S("Oak Tree Planks"),
		sapling = S("Oak Tree Sapling"),
		leaves = S("Oak Tree Leaves"),
		trunk_stair = S("Oak Tree Trunk Stair"),
		trunk_slab = S("Oak Tree Trunk Slab"),
		planks_stair = S("Oak Tree Planks Stair"),
		planks_slab = S("Oak Tree Planks Slab"),
		fence = S("Oak Tree Fence"),
		fence_rail = S("Oak Tree Fence Rail"),
		fence_gate = S("Oak Tree Fence Gate"),
	},
	sequoia = {
		trunk = S("Giant Sequoia Trunk"),
		planks = S("Giant Sequoia Planks"),
		sapling = S("Giant Sequoia Sapling"),
		leaves = S("Giant Sequoia Leaves"),
		trunk_stair = S("Giant Sequoia Trunk Stair"),
		trunk_slab = S("Giant Sequoia Trunk Slab"),
		planks_stair = S("Giant Sequoia Planks Stair"),
		planks_slab = S("Giant Sequoia Planks Slab"),
		fence = S("Giant Sequoia Fence"),
		fence_rail = S("Giant Sequoia Fence Rail"),
		fence_gate = S("Giant Sequoia Fence Gate"),
	},
	birch = {
		trunk = S("Birch Tree Trunk"),
		planks = S("Birch Tree Planks"),
		sapling = S("Birch Tree Sapling"),
		leaves = S("Birch Tree Leaves"),
		trunk_stair = S("Birch Tree Trunk Stair"),
		trunk_slab = S("Birch Tree Trunk Slab"),
		planks_stair = S("Birch Tree Planks Stair"),
		planks_slab = S("Birch Tree Planks Slab"),
		fence = S("Birch Tree Fence"),
		fence_rail = S("Birch Tree Fence Rail"),
		fence_gate = S("Birch Tree Fence Gate"),
	},
	palm = {
		trunk = S("Palm Tree Trunk"),
		planks = S("Palm Tree Planks"),
		sapling = S("Palm Tree Sapling"),
		leaves = S("Palm Tree Leaves"),
		trunk_stair = S("Palm Tree Trunk Stair"),
		trunk_slab = S("Palm Tree Trunk Slab"),
		planks_stair = S("Palm Tree Planks Stair"),
		planks_slab = S("Palm Tree Planks Slab"),
		fence = S("Palm Tree Fence"),
		fence_rail = S("Palm Tree Fence Rail"),
		fence_gate = S("Palm Tree Fence Gate"),
	},
	date_palm = {
		trunk = S("Date Palm Tree Trunk"),
		planks = S("Date Palm Tree Planks"),
		sapling = S("Date Palm Tree Sapling"),
		leaves = S("Date Palm Tree Leaves"),
		trunk_stair = S("Date Palm Tree Trunk Stair"),
		trunk_slab = S("Date Palm Tree Trunk Slab"),
		planks_stair = S("Date Palm Tree Planks Stair"),
		planks_slab = S("Date Palm Tree Planks Slab"),
		fence = S("Date Palm Tree Fence"),
		fence_rail = S("Date Palm Tree Fence Rail"),
		fence_gate = S("Date Palm Tree Fence Gate"),
	},
	spruce = {
		trunk = S("Spruce Tree Trunk"),
		planks = S("Spruce Tree Planks"),
		sapling = S("Spruce Tree Sapling"),
		leaves = S("Spruce Tree Leaves"),
		trunk_stair = S("Spruce Tree Trunk Stair"),
		trunk_slab = S("Spruce Tree Trunk Slab"),
		planks_stair = S("Spruce Tree Planks Stair"),
		planks_slab = S("Spruce Tree Planks Slab"),
		fence = S("Spruce Tree Fence"),
		fence_rail = S("Spruce Tree Fence Rail"),
		fence_gate = S("Spruce Tree Fence Gate"),
	},
	cedar =  {
		trunk = S("Cedar Tree Trunk"),
		planks = S("Cedar Tree Planks"),
		sapling = S("Cedar Tree Sapling"),
		leaves = S("Cedar Tree Leaves"),
		trunk_stair = S("Cedar Tree Trunk Stair"),
		trunk_slab = S("Cedar Tree Trunk Slab"),
		planks_stair = S("Cedar Tree Planks Stair"),
		planks_slab = S("Cedar Tree Planks Slab"),
		fence = S("Cedar Tree Fence"),
		fence_rail = S("Cedar Tree Fence Rail"),
		fence_gate = S("Cedar Tree Fence Gate"),
	},
	poplar = {
		trunk = S("Poplar Tree Trunk"),
		planks = S("Poplar Tree Planks"),
		sapling = S("Poplar Tree Sapling"),
		leaves = S("Poplar Tree Leaves"),
		trunk_stair = S("Poplar Tree Trunk Stair"),
		trunk_slab = S("Poplar Tree Trunk Slab"),
		planks_stair = S("Poplar Tree Planks Stair"),
		planks_slab = S("Poplar Tree Planks Slab"),
		fence = S("Poplar Tree Fence"),
		fence_rail = S("Poplar Tree Fence Rail"),
		fence_gate = S("Poplar Tree Fence Gate"),
	},
	poplar_small = {
		sapling = S("Small poplar Tree Sapling"),
	},
	willow = {
		trunk = S("Willow Tree Trunk"),
		planks = S("Willow Tree Planks"),
		sapling = S("Willow Tree Sapling"),
		leaves = S("Willow Tree Leaves"),
		trunk_stair = S("Willow Tree Trunk Stair"),
		trunk_slab = S("Willow Tree Trunk Slab"),
		planks_stair = S("Willow Tree Planks Stair"),
		planks_slab = S("Willow Tree Planks Slab"),
		fence = S("Willow Tree Fence"),
		fence_rail = S("Willow Tree Fence Rail"),
		fence_gate = S("Willow Tree Fence Gate"),
	},
	rubber_tree = {
		trunk = S("Rubber Tree Trunk"),
		planks = S("Rubber Tree Planks"),
		sapling = S("Rubber Tree Sapling"),
		leaves = S("Rubber Tree Leaves"),
		trunk_stair = S("Rubber Tree Trunk Stair"),
		trunk_slab = S("Rubber Tree Trunk Slab"),
		planks_stair = S("Rubber Tree Planks Stair"),
		planks_slab = S("Rubber Tree Planks Slab"),
		fence = S("Rubber Tree Fence"),
		fence_rail = S("Rubber Tree Fence Rail"),
		fence_gate = S("Rubber Tree Fence Gate"),
	},
	fir = {
		trunk = S("Douglas Fir Trunk"),
		planks = S("Douglas Fir Planks"),
		sapling = S("Douglas Fir Sapling"),
		leaves = S("Douglas Fir Leaves"),
		trunk_stair = S("Douglas Fir Trunk Stair"),
		trunk_slab = S("Douglas Fir Trunk Slab"),
		planks_stair = S("Douglas Fir Planks Stair"),
		planks_slab = S("Douglas Fir Planks Slab"),
		fence = S("Douglas Fir Fence"),
		fence_rail = S("Douglas Fir Fence Rail"),
		fence_gate = S("Douglas Fir Fence Gate"),
	},
	jungletree = {
		trunk = S("Jungle Tree Trunk"),
		planks = S("Jungle Tree Planks"),
		sapling = S("Jungle Tree Sapling"),
		leaves = S("Jungle Tree Leaves"),
		trunk_stair = S("Jungle Tree Trunk Stair"),
		trunk_slab = S("Jungle Tree Trunk Slab"),
		planks_stair = S("Jungle Tree Planks Stair"),
		planks_slab = S("Jungle Tree Planks Slab"),
		fence = S("Jungle Tree Fence"),
		fence_rail = S("Jungle Tree Fence Rail"),
		fence_gate = S("Jungle Tree Fence Gate"),
	},
}


-- local dirs1 = { 21, 20, 23, 22, 21 }
local dirs2 = { 12, 9, 18, 7, 12 }
-- local dirs3 = { 14, 11, 16, 5, 14 }

local moretrees_new_leaves_drawtype = "allfaces_optional"
local moretrees_plantlike_leaves_visual_scale = 1

if moretrees.plantlike_leaves then
	moretrees_new_leaves_drawtype = "plantlike"
	moretrees_plantlike_leaves_visual_scale = math.sqrt(2)
end

-- redefine default leaves to handle plantlike and/or leaf decay options

if minetest.get_modpath("default") and moretrees.plantlike_leaves then
	minetest.override_item(xcompat.materials.apple_leaves, {
		inventory_image = minetest.inventorycube("default_leaves.png"),
		drawtype = "plantlike",
		visual_scale = math.sqrt(2)
	})
end

-- redefine default jungle leaves for same

if minetest.get_modpath("default") and moretrees.plantlike_leaves then
	minetest.override_item(xcompat.materials.jungle_leaves, {
		inventory_image = minetest.inventorycube("default_jungleleaves.png"),
		drawtype = "plantlike",
		visual_scale = math.sqrt(2)
	})
end

for i in ipairs(moretrees.treelist) do
	local treename = moretrees.treelist[i][1]
	local fruit = moretrees.treelist[i][3]
	local fruitdesc = moretrees.treelist[i][4]
	local selbox = moretrees.treelist[i][5]
	local vscale = moretrees.treelist[i][6]

	local saptex = moretrees.treelist[i][7]

	-- player will get a sapling with 1/100 chance
	-- player will get leaves only if he/she gets no saplings,
	-- this is because max_items is 1

	local droprarity = 100
	local decay = moretrees.leafdecay_radius

	if treename == "palm" then
		droprarity = 20
		decay = moretrees.palm_leafdecay_radius
	elseif treename == "date_palm" then
		decay = moretrees.date_palm_leafdecay_radius
	end

	-- dont register planks/nodes for trees from default and small varients for trees
	local split_tn = treename:split("_")
	if treename ~= "jungletree" and treename ~= "pine" and split_tn[2]~="small" then

		saptex = "moretrees_"..treename.."_sapling.png"

		minetest.register_node("moretrees:"..treename.."_trunk", {
			description = moretrees.treedesc[treename].trunk,
			tiles = {
				"moretrees_"..treename.."_trunk_top.png",
				"moretrees_"..treename.."_trunk_top.png",
				"moretrees_"..treename.."_trunk.png"
			},
			paramtype2 = "facedir",
			is_ground_content = false,
			groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
			sounds = xcompat.sounds.node_sound_wood_defaults(),
			on_place = minetest.rotate_node,
		})

		if moretrees.enable_planks then
			minetest.register_node("moretrees:"..treename.."_planks", {
				description = moretrees.treedesc[treename].planks,
				tiles = {"moretrees_"..treename.."_wood.png"},
				is_ground_content = false,
				groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
				sounds = xcompat.sounds.node_sound_wood_defaults(),
			})
		end

		local moretrees_leaves_inventory_image = nil
		local moretrees_new_leaves_waving = nil

		if moretrees.plantlike_leaves then
			moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png")
		else
			moretrees_new_leaves_waving = 1
		end

		minetest.register_node("moretrees:"..treename.."_leaves", {
			description = moretrees.treedesc[treename].leaves,
			drawtype = moretrees_new_leaves_drawtype,
			waving = moretrees_new_leaves_waving,
			visual_scale = moretrees_plantlike_leaves_visual_scale,
			tiles = { "moretrees_"..treename.."_leaves.png" },
			inventory_image = moretrees_leaves_inventory_image,
			paramtype = "light",
			is_ground_content = false,
			groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 1},
			sounds = xcompat.sounds.node_sound_leaves_defaults(),

			drop = {
				max_items = 1,
				items = {
					{items = {"moretrees:"..treename.."_sapling"}, rarity = droprarity },
					{items = {"moretrees:"..treename.."_leaves"} }
				}
			},
		})

		if minetest.get_modpath("moreblocks") then

			stairsplus:register_all(
				"moretrees",
				treename.."_trunk",
				"moretrees:"..treename.."_trunk",
				{
					groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 },
					tiles =	{
						"moretrees_"..treename.."_trunk_top.png",
						"moretrees_"..treename.."_trunk_top.png",
						"moretrees_"..treename.."_trunk.png"
					},
					description = moretrees.treedesc[treename].trunk,
					drop = treename.."_trunk",
				}
			)

			if moretrees.enable_planks then
				stairsplus:register_all(
					"moretrees",
					treename.."_planks",
					"moretrees:"..treename.."_planks",
					{
						groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 },
						tiles = { "moretrees_"..treename.."_wood.png" },
						description = moretrees.treedesc[treename].planks,
						drop = treename.."_planks",
					}
				)
			end
		elseif minetest.get_modpath("stairs") then
			stairs.register_stair_and_slab(
				"moretrees_"..treename.."_trunk",
				"moretrees:"..treename.."_trunk",
				{ snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 },
				{	"moretrees_"..treename.."_trunk_top.png",
					"moretrees_"..treename.."_trunk_top.png",
					"moretrees_"..treename.."_trunk.png"
				},
				moretrees.treedesc[treename].trunk_stair,
				moretrees.treedesc[treename].trunk_slab,
				xcompat.sounds.node_sound_wood_defaults()
			)

			if moretrees.enable_planks then
				stairs.register_stair_and_slab(
					"moretrees_"..treename.."_planks",
					"moretrees:"..treename.."_planks",
					{ snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 },
					{ "moretrees_"..treename.."_wood.png" },
					moretrees.treedesc[treename].planks_stair,
					moretrees.treedesc[treename].planks_slab,
					xcompat.sounds.node_sound_wood_defaults()
				)
			end

		end

		if minetest.get_modpath("default") and moretrees.enable_planks then
			local planks_name = "moretrees:" .. treename .. "_planks"
			local planks_tile = "moretrees_" .. treename .. "_wood.png"
			default.register_fence("moretrees:" .. treename .. "_fence", {
				description = moretrees.treedesc[treename].fence,
				texture = planks_tile,
				inventory_image = "default_fence_overlay.png^" .. planks_tile ..
										"^default_fence_overlay.png^[makealpha:255,126,126",
				wield_image = "default_fence_overlay.png^" .. planks_tile ..
										"^default_fence_overlay.png^[makealpha:255,126,126",
				material = planks_name,
				groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
				sounds = xcompat.sounds.node_sound_wood_defaults()
			})
			default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", {
				description = moretrees.treedesc[treename].fence_rail,
				texture = planks_tile,
				inventory_image = "default_fence_rail_overlay.png^" .. planks_tile ..
										"^default_fence_rail_overlay.png^[makealpha:255,126,126",
				wield_image = "default_fence_rail_overlay.png^" .. planks_tile ..
										"^default_fence_rail_overlay.png^[makealpha:255,126,126",
				material = planks_name,
				groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
				sounds = xcompat.sounds.node_sound_wood_defaults()
			})
			if minetest.global_exists("doors") then
				doors.register_fencegate("moretrees:" .. treename .. "_gate", {
					description = moretrees.treedesc[treename].fence_gate,
					texture = planks_tile,
					material = planks_name,
					groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
				})
			end
		end
	end

	-- the default game provides jungle tree and pine saplings.
	if treename~="jungletree" and treename ~= "pine" then
		local regular_groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}
		if minetest.settings:get_bool("creative_mode", false) then
			regular_groups["not_in_creative_inventory"]=1
		end

		minetest.register_node("moretrees:"..treename.."_sapling", {
			description = moretrees.treedesc[treename].sapling,
			drawtype = "plantlike",
			tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex},
			inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex,
			paramtype = "light",
			walkable = false,
			is_ground_content = true,
			selection_box = {
				type = "fixed",
				fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
			},
			groups = regular_groups,
			sounds = xcompat.sounds.node_sound_default(),
			on_place = function(itemstack, placer, pointed_thing)
				itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing,
					"moretrees:" ..treename.. "_sapling",
					-- minp, maxp to be checked, relative to sapling pos
					-- minp_relative.y = 1 because sapling pos has been checked
					{x = -3, y = 1, z = -3},
					{x = 3, y = 6, z = 3},
					-- maximum interval of interior volume check
					4)

				return itemstack
			end,
			on_construct = function(pos)
				minetest.get_node_timer(pos):start(300)
			end,
			on_timer = function(pos, elapsed)
				if moretrees.can_grow(pos, treename) then
					--moretrees["grow_" .. treename](pos)
					minetest.set_node(pos, {name="air"})
					if type(moretrees["spawn_" .. treename .. "_object"])=="string" then
						local split = moretrees["spawn_" .. treename .. "_object"]:split(".")
						moretrees[split[2]](pos)
					else
						minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"])
					end
				else
					minetest.get_node_timer(pos):start(300)
				end
			end,
		})
	end

	local ongen_groups = {
		snappy = 2,
		dig_immediate = 3,
		flammable = 2,
		attached_node = 1,
		sapling = 1,
		moretrees_ongen = 1,
		not_in_creative_inventory = 1
	}
	if minetest.settings:get_bool("creative_mode", false) then
		ongen_groups["not_in_creative_inventory"]=nil
	end
	minetest.register_node("moretrees:"..treename.."_sapling_ongen", {
		description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling),
		drawtype = "plantlike",
		tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex,},
		inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex,
		paramtype = "light",
		walkable = false,
		is_ground_content = true,
		selection_box = {
			type = "fixed",
			fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
		},
		groups = ongen_groups,
		sounds = xcompat.sounds.node_sound_default(),
		drop = "moretrees:"..treename.."_sapling",
		on_place = function(itemstack, placer, pointed_thing)
			itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing,
				"moretrees:" ..treename.. "_sapling_ongen",
				-- minp, maxp to be checked, relative to sapling pos
				-- minp_relative.y = 1 because sapling pos has been checked
				{x = -3, y = 1, z = -3},
				{x = 3, y = 6, z = 3},
				-- maximum interval of interior volume check
				4)

			return itemstack
		end,
		on_construct = function(pos)
			minetest.get_node_timer(pos):start(2)
		end,
		on_timer = function(pos, elapsed)
			if moretrees.can_grow(pos, treename) then
				--moretrees["grow_" .. treename](pos)
				minetest.set_node(pos, {name="air"})
				if type(moretrees["spawn_" .. treename .. "_object"])=="string" then
					local split = moretrees["spawn_" .. treename .. "_object"]:split(".")
					moretrees[split[2]](pos)
				else
					minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"])
				end
			else
				minetest.get_node_timer(pos):start(300)
			end
		end,
	})

	local fruitname = nil
	if fruit then
		fruitname = "moretrees:"..fruit
		minetest.register_node(fruitname, {
			description = fruitdesc,
			drawtype = "plantlike",
			tiles = { "moretrees_"..fruit..".png" },
			inventory_image = "moretrees_"..fruit..".png^[transformR180",
			wield_image = "moretrees_"..fruit..".png^[transformR180",
			visual_scale = vscale,
			paramtype = "light",
			sunlight_propagates = true,
			is_ground_content = false,
			walkable = false,
			selection_box = {
				type = "fixed",
					fixed = selbox
				},
			groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 1},
			sounds = xcompat.sounds.node_sound_default(),
			after_place_node = function(pos, placer)
				if placer:is_player() then
					minetest.set_node(pos, {name = "moretrees:"..fruit, param2 = 1})
				end
			end
		})
	end

	if treename ~= "jungletree"
		and treename ~= "poplar_small"
		and treename ~= "pine"
		and minetest.get_modpath("default") then
			default.register_leafdecay({
				trunks = { "moretrees:"..treename.."_trunk" },
				leaves = { "moretrees:"..treename.."_leaves", fruitname },
				radius = decay,
			})
	end

	minetest.register_abm({
		nodenames = { "moretrees:"..treename.."_trunk_sideways" },
		interval = 1,
		chance = 1,
		action = function(pos, node, active_object_count, active_object_count_wider)
			local fdir = node.param2 or 0
				local nfdir = dirs2[fdir+1]
			minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir})
		end,
	})

	table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk")

	if moretrees.spawn_saplings then
			table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling")
			table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen")
	end
end

-- poplar saplings leaves
local poplar_leaves_drop = minetest.registered_nodes["moretrees:poplar_leaves"].drop
minetest.override_item("moretrees:poplar_leaves", {
	drop = {
		max_items = poplar_leaves_drop.max_items,
		items = {
			{items = {"moretrees:poplar_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity },
			{items = {"moretrees:poplar_small_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity },
			{items = {"moretrees:poplar_leaves"} }
		}
	}
})

-- Extra nodes for jungle trees:

local jungleleaves = {"yellow","red"}
local jungleleavesnames = {S("Yellow"), S("Red")}
for color = 1, #jungleleaves do
	local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color]

	local moretrees_leaves_inventory_image = nil

	if moretrees.plantlike_leaves then
		moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png")
	else
		moretrees_new_leaves_waving = 1
	end

	minetest.register_node(leave_name, {
		description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]),
		drawtype = moretrees_new_leaves_drawtype,
		waving = moretrees_new_leaves_waving,
		visual_scale = moretrees_plantlike_leaves_visual_scale,
		tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"},
		inventory_image = moretrees_leaves_inventory_image,
		paramtype = "light",
		is_ground_content = false,
		groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 },
		drop = minetest.get_modpath("default") and {
			max_items = 1,
			items = {
				{items = {"default:junglesapling"}, rarity = 100 },
				{items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} }
			}
		} or nil,
		sounds = xcompat.sounds.node_sound_leaves_defaults(),
	})
end

-- To get Moretrees to generate its own jungle trees among the default mapgen
-- we need our own copy of that node, which moretrees will match against.

if minetest.get_modpath("default") then
	local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"])
	jungle_tree.drop = "default:jungletree"
	minetest.register_node("moretrees:jungletree_trunk", jungle_tree)

	default.register_leafdecay({
		trunks = { "default:jungletree", "moretrees:jungletree_trunk" },
		leaves = { xcompat.materials.jungle_leaves, "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" },
		radius = moretrees.leafdecay_radius,
	})
end

-- Extra needles for firs

local moretrees_leaves_inventory_image = nil

if moretrees.plantlike_leaves then
	moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_fir_leaves_bright.png")
end

minetest.register_node("moretrees:fir_leaves_bright", {
	drawtype = moretrees_new_leaves_drawtype,
	waving = moretrees_new_leaves_waving,
	visual_scale = moretrees_plantlike_leaves_visual_scale,
	description = S("Douglas Fir Leaves (Bright)"),
	tiles = { "moretrees_fir_leaves_bright.png" },
	inventory_image = moretrees_leaves_inventory_image,
	paramtype = "light",
	is_ground_content = false,
	groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 },
	drop = {
		max_items = 1,
		items = {
			{items = {'moretrees:fir_sapling'}, rarity = 100 },
			{items = {'moretrees:fir_leaves_bright'} }
		}
	},
	sounds = xcompat.sounds.node_sound_leaves_defaults()
})

if minetest.get_modpath("default") then
	default.register_leafdecay({
		trunks = { "moretrees:fir_trunk" },
		leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" },
		radius = moretrees.leafdecay_radius,
	})
end


if minetest.get_modpath("default") and moretrees.enable_redefine_apple then
	local appledef = table.copy(minetest.registered_nodes["default:apple"])
	appledef.groups.attached_node = 1
	minetest.register_node(":default:apple", appledef)
end

table.insert(moretrees.avoidnodes, "default:jungletree")
table.insert(moretrees.avoidnodes, "default:pine_tree")
table.insert(moretrees.avoidnodes, "default:acacia_tree")
table.insert(moretrees.avoidnodes, "moretrees:fir_trunk")
table.insert(moretrees.avoidnodes, "default:tree")

if moretrees.spawn_saplings then
	table.insert(moretrees.avoidnodes, "snow:sapling_pine")
	table.insert(moretrees.avoidnodes, "default:junglesapling")
	table.insert(moretrees.avoidnodes, "default:pine_sapling")
end

-- "empty" (tapped) rubber tree nodes

minetest.register_node("moretrees:rubber_tree_trunk_empty", {
	description = S("Rubber Tree Trunk (Empty)"),
	tiles = {
		"moretrees_rubber_tree_trunk_top.png",
		"moretrees_rubber_tree_trunk_top.png",
		"moretrees_rubber_tree_trunk_empty.png"
	},
	groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
	sounds = xcompat.sounds.node_sound_wood_defaults(),
	paramtype2 = "facedir",
	is_ground_content = false,
	on_place = minetest.rotate_node,
})

minetest.register_abm({
	nodenames = { "moretrees:rubber_tree_trunk_empty_sideways" },
	interval = 1,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local fdir = node.param2 or 0
			local nfdir = dirs2[fdir+1]
		minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir})
	end,
})

-- For compatibility with old nodes, recently-changed nodes, and default nodes

minetest.register_alias("technic:rubber_tree_full",				"moretrees:rubber_tree_trunk")
minetest.register_alias("farming_plus:rubber_tree_full",		"moretrees:rubber_tree_trunk")
minetest.register_alias("farming:rubber_tree_full",				"moretrees:rubber_tree_trunk")

minetest.register_alias("technic:rubber_leaves",				"moretrees:rubber_tree_leaves")
minetest.register_alias("farming_plus:rubber_leaves",			"moretrees:rubber_tree_leaves")
minetest.register_alias("farming:rubber_leaves",				"moretrees:rubber_tree_leaves")

minetest.register_alias("technic:rubber_tree_sapling",			"moretrees:rubber_tree_sapling")
minetest.register_alias("farming_plus:rubber_sapling",			"moretrees:rubber_tree_sapling")
minetest.register_alias("farming:rubber_sapling",				"moretrees:rubber_tree_sapling")

minetest.register_alias("moretrees:conifer_trunk",				"moretrees:fir_trunk")
minetest.register_alias("moretrees:conifer_trunk_sideways",		"moretrees:fir_trunk_sideways")
minetest.register_alias("moretrees:conifer_leaves",				"moretrees:fir_leaves")
minetest.register_alias("moretrees:conifer_leaves_bright",		"moretrees:fir_leaves_bright")
minetest.register_alias("moretrees:conifer_sapling",			"moretrees:fir_sapling")

minetest.register_alias("conifers:trunk",						"moretrees:fir_trunk")
minetest.register_alias("conifers:trunk_reversed",				"moretrees:fir_trunk_sideways")
minetest.register_alias("conifers:leaves",						"moretrees:fir_leaves")
minetest.register_alias("conifers:leaves_special",				"moretrees:fir_leaves_bright")
minetest.register_alias("conifers:sapling",						"moretrees:fir_sapling")

minetest.register_alias("moretrees:jungletree_sapling",			"default:junglesapling")
minetest.register_alias("moretrees:jungletree_trunk_sideways",	"moreblocks:horizontal_jungle_tree")
minetest.register_alias("moretrees:jungletree_planks",			"default:junglewood")
minetest.register_alias("moretrees:jungletree_leaves_green",	xcompat.materials.jungle_leaves)

minetest.register_alias("moretrees:acacia_trunk",				"default:acacia_tree")
minetest.register_alias("moretrees:acacia_planks",				"default:acacia_wood")
minetest.register_alias("moretrees:acacia_sapling",				"default:acacia_sapling")
minetest.register_alias("moretrees:acacia_leaves",				"default:acacia_leaves")

minetest.register_alias("moretrees:pine_trunk",					"moretrees:cedar_trunk")
minetest.register_alias("moretrees:pine_planks",				"moretrees:cedar_planks")
minetest.register_alias("moretrees:pine_sapling",				"moretrees:cedar_sapling")
minetest.register_alias("moretrees:pine_leaves",				"moretrees:cedar_leaves")
minetest.register_alias("moretrees:pine_cone",					"moretrees:cedar_cone")
minetest.register_alias("moretrees:pine_nuts",					"moretrees:cedar_nuts")
minetest.register_alias("moretrees:pine_sapling_ongen",			"moretrees:cedar_sapling_ongen")

minetest.register_alias("moretrees:dates",					"moretrees:dates_f4")
