177 lines
5.4 KiB
Lua

local S = minetest.get_translator("sf_foliage")
local SCHEM_PATH = minetest.get_modpath("sf_foliage").."/schems"
sf_foliage = {}
sf_foliage.trees = {
--[[
-- Fir
{ name = "fir_baby", level = 1, leaftype = "conifer" },
{ name = "fir_youngling", level = 2, leaftype = "conifer" },
{ name = "fir_growing", level = 3, leaftype = "conifer" },
{ name = "fir_growing_2", level = 3, leaftype = "conifer" },
{ name = "fir_adult_1", level = 4, leaftype = "conifer" },
{ name = "fir_adult_2", level = 4, leaftype = "conifer" },
{ name = "fir_elder", level = 5, leaftype = "conifer" },
]]
-- Startree
{ name = "startree_young", level = 4 },
{ name = "startree_2_story_1", level = 5 },
{ name = "startree_2_story_2", level = 5 },
-- Asymmetrical tree
{ name = "tree_asymmetrical_1", level = 3 },
{ name = "tree_asymmetrical_2", level = 3 },
{ name = "tree_asymmetrical_3", level = 3 },
-- Bushlike tree
{ name = "tree_bushlike_big", level = 3 },
{ name = "tree_bushlike_small", level = 2 },
-- Minitree
{ name = "minitree1", level = 2 },
{ name = "minitree2", level = 2 },
{ name = "minitree3", level = 2 },
-- Young tree
{ name = "tree_baby_1", level = 1 },
{ name = "tree_youngling", level = 2},
--- Broad-leafed
{ name = "broad_leafed_tree_1", level = 3 },
-- Ball
{ name = "tree_ball_medium", level = 3 },
{ name = "tree_ball_small", level = 2 },
-- Poplar
{ name = "poplar", level = 3 },
}
sf_foliage.bushes = {
{ name = "bush_baby", level = 1 },
{ name = "bush_medium_1", level = 2 },
{ name = "bush_big", level = 3 },
}
for t=1, #sf_foliage.trees do
local hue = (t-1)*(360/#sf_foliage.trees)
local tree = sf_foliage.trees[t]
local id = tree.name
local tiles
if tree.level >= 5 then
trunksize = 2
else
trunksize = 1
end
minetest.register_node("sf_foliage:tree_spawner_"..id, {
description = S("Tree Spawner: @1", id),
tiles = {
"sf_foliage_tree_spawner_"..trunksize.."_top.png^[hsl:"..hue..":0:0",
"sf_foliage_tree_spawner_"..trunksize.."_top.png^[hsl:"..hue..":0:0",
"sf_foliage_tree_spawner_"..trunksize..".png^[hsl:"..hue..":0:0",
},
groups = { editor_breakable = 1, tree_spawner = 1 },
sounds = sf_sounds.node_sound_tree_defaults(),
})
end
for b=1, #sf_foliage.bushes do
local hue = (b-1)*(360/#sf_foliage.bushes)
local bush = sf_foliage.bushes[b]
local id = bush.name
minetest.register_node("sf_foliage:bush_spawner_"..id, {
description = S("Bush Spawner: @1", id),
tiles = {
"sf_foliage_bush_spawner_top.png^[hsl:"..hue..":0:0",
"sf_foliage_bush_spawner_top.png^[hsl:"..hue..":0:0",
"sf_foliage_bush_spawner.png^[hsl:"..hue..":0:0",
},
groups = { editor_breakable = 1, bush_spawner = 1 },
sounds = sf_sounds.node_sound_leaves_defaults(),
})
end
local function get_schematic_name_from_node(nodename)
if string.sub(nodename, 1, 24) == "sf_foliage:bush_spawner_" then
return SCHEM_PATH.."/sf_foliage_"..string.sub(nodename, 25)..".mts"
elseif string.sub(nodename, 1, 24) == "sf_foliage:tree_spawner_" then
return SCHEM_PATH.."/sf_foliage_"..string.sub(nodename, 25)..".mts"
else
return nil
end
end
-- Get a pseudorandom orientation for a given pos.
local function get_orientation(pos)
local hash = minetest.hash_node_position(pos)
local rnd = PcgRandom(hash)
local r = rnd:next(0,3)
return tostring(r * 90)
end
local function extend_trunk_after_place(pos)
local below = vector.offset(pos, 0, -1, 0)
local trunk = minetest.get_node(pos)
local floor = minetest.get_node(below)
if minetest.get_item_group(floor.name, "leveled_node") == 0 then
return
end
if minetest.get_item_group(trunk.name, "tree_small") >= 1 and minetest.get_item_group(trunk.name, "tree_small_extension") == 0 then
trunk.name = trunk.name .. "x"
minetest.set_node(pos, trunk)
elseif minetest.get_item_group(trunk.name, "tree") >= 1 then
minetest.set_node(below, trunk)
local offsets = {
vector.new(1,1,0),
vector.new(1,1,1),
vector.new(0,1,1),
}
for o=1, #offsets do
local offpos = vector.add(below, offsets[o])
local offnode = minetest.get_node(offpos)
if minetest.get_item_group(offnode.name, "tree") >= 1 then
offpos.y = offpos.y - 1
minetest.set_node(offpos, offnode)
end
end
end
end
sf_foliage.grow_spawner = function(pos)
local node = minetest.get_node(pos)
if minetest.get_item_group(node.name, "tree_spawner") == 0 and minetest.get_item_group(node.name, "bush_spawner") == 0 then
return false
end
local schematic_name = get_schematic_name_from_node(node.name)
if not schematic_name then
return false
end
local orientation = get_orientation(pos)
minetest.remove_node(pos)
minetest.place_schematic(pos, schematic_name, orientation, {}, true, {place_center_x=true, place_center_z=true})
extend_trunk_after_place(pos)
return true
end
local function select_random_tree(pos)
local node = minetest.get_node(pos)
local r = math.random(1, #sf_foliage.trees)
local tree = sf_foliage.trees[r]
return tree
end
sf_foliage.place_random_tree = function(pos)
local tree = select_random_tree(pos)
local schematic_name = SCHEM_PATH.."/sf_foliage_"..tree.name..".mts"
local orientation = get_orientation(pos)
minetest.place_schematic(pos, schematic_name, orientation, {}, true, {place_center_x=true, place_center_z=true})
extend_trunk_after_place(pos)
end
sf_foliage.place_random_tree_spawner = function(pos)
local tree = select_random_tree(pos)
local spawner = "sf_foliage:tree_spawner_"..tree.name
minetest.set_node(pos, {name=spawner})
end