eaa1f34c3f
Peat should never ferment on its own, it should require face contact with some kind of soil. Unifying it with tree growth rate code caused it to ferment on its own because the assumption that tree roots contain their own soil and base moisture. Peat should only have its own moisture but not its own soil. This also allows peat to be used as an emergency "moist" node on its own in e.g. skyrealms for cultivating flora, as long as it's contained so that only its moisture can leak out but it cannot be exposed to fermenting microorganisms from nearby soil.
78 lines
2.0 KiB
Lua
78 lines
2.0 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local math, minetest, nodecore
|
|
= math, minetest, nodecore
|
|
local math_sqrt
|
|
= math.sqrt
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
nodecore.register_leaf_drops, nodecore.registered_leaf_drops
|
|
= nodecore.mkreg()
|
|
|
|
function nodecore.tree_soil_rate(pos, d, w)
|
|
d = d or 1
|
|
w = w or 1
|
|
nodecore.scan_flood(pos, 3, function(p, r)
|
|
if r < 1 then return end
|
|
local nn = minetest.get_node(p).name
|
|
local def = minetest.registered_items[nn] or {}
|
|
if not def.groups then
|
|
return false
|
|
end
|
|
if def.groups.soil then
|
|
d = d + def.groups.soil
|
|
w = w + 0.2
|
|
elseif def.groups.moist then
|
|
w = w + def.groups.moist
|
|
return false
|
|
else
|
|
return false
|
|
end
|
|
end)
|
|
return math_sqrt(d * w)
|
|
end
|
|
|
|
function nodecore.tree_growth_rate(pos)
|
|
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
|
|
if minetest.get_node(above).name ~= "air" then return end
|
|
local ll = nodecore.get_node_light(above)
|
|
if (not ll) or (ll < 8) then return end
|
|
for y = 2, 5 do
|
|
local p = {x = pos.x, y = pos.y + y, z = pos.z}
|
|
local nn = minetest.get_node(p).name
|
|
if nn ~= "air" and nn ~= modname .. ":leaves" then return end
|
|
end
|
|
return nodecore.tree_soil_rate(pos) * math_sqrt((ll - 7) / 8)
|
|
end
|
|
|
|
function nodecore.tree_trunk_growth_rate(pos, node)
|
|
if node and node.name == modname .. ":root" then
|
|
return nodecore.tree_soil_rate(pos)
|
|
end
|
|
local bpos = {x = pos.x, y = pos.y, z = pos.z}
|
|
for _ = 1, #nodecore.tree_params do
|
|
bpos.y = bpos.y - 1
|
|
node = minetest.get_node(bpos)
|
|
if node.name == "ignore" then
|
|
return
|
|
elseif node.name == modname .. ":root" then
|
|
return nodecore.tree_soil_rate(bpos)
|
|
elseif node.name ~= modname .. ":tree" then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function nodecore.calc_leaves(pos)
|
|
local leaflv = nodecore.scan_flood(pos, 2, function(p, d)
|
|
if minetest.get_node(p).name == modname .. ":tree" then
|
|
return 3 - d
|
|
end
|
|
end)
|
|
return {
|
|
name = modname .. ":leaves",
|
|
param2 = leaflv or 0
|
|
}
|
|
end
|