c7a322941e
- No day/night cycle, no sun/moon. - Get rid of clouds too. - Skybox is now 100% texture-packable. - Natural light diminishes with depth. Night-time no longer disrupts gameplay topside, but skylights are no longer useful to an infinite depth and artificial light is necessary for all deep mining.
92 lines
2.5 KiB
Lua
92 lines
2.5 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local ipairs, math, minetest, nodecore
|
|
= ipairs, 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.leaf_decay(pos, node)
|
|
node = node or minetest.get_node(pos)
|
|
local t = {}
|
|
for _, v in ipairs(nodecore.registered_leaf_drops) do
|
|
t = v(pos, node, t) or t
|
|
end
|
|
local p = nodecore.pickrand(t, function(x) return x.prob end)
|
|
if not p then return end
|
|
minetest.set_node(pos, p)
|
|
if p.item then nodecore.item_eject(pos, p.item) end
|
|
return nodecore.fallcheck(pos)
|
|
end
|
|
|
|
function nodecore.tree_soil_rate(pos)
|
|
local d = 1
|
|
local w = 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, 0.5)
|
|
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
|
|
minetest.set_node(pos, {name = modname .. ":tree"})
|
|
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
|