67d210cbf4
The grassable group means "grass can grow here" but the API means "grass can grow under here"; make the name clarify the difference.
78 lines
2.0 KiB
Lua
78 lines
2.0 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local minetest, nodecore, pairs
|
|
= minetest, nodecore, pairs
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
local dirt = modname .. ":dirt"
|
|
local grass = modname .. ":dirt_with_grass"
|
|
|
|
local grass_under_nodes = {}
|
|
do
|
|
local breathable = {
|
|
airlike = true,
|
|
allfaces = true,
|
|
allfaces_optional = true,
|
|
torchlike = true,
|
|
signlike = true,
|
|
plantlike = true,
|
|
firelike = true,
|
|
raillike = true,
|
|
nodebox = true,
|
|
mesh = true,
|
|
plantlike_rooted = true
|
|
}
|
|
minetest.after(0, function()
|
|
for name, def in pairs(minetest.registered_nodes) do
|
|
if def.drawtype and breathable[def.drawtype]
|
|
and (not (def.groups and def.groups.moist))
|
|
and (def.damage_per_second or 0) <= 0 then
|
|
grass_under_nodes[name] = true
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- nil = stay, false = die, true = grow
|
|
local function can_grass_grow_under(above)
|
|
local nodename = minetest.get_node(above).name
|
|
if nodename == "ignore" then return end
|
|
if (not grass_under_nodes[nodename]) then return false end
|
|
local ln = nodecore.get_node_light(above)
|
|
if not ln then return end
|
|
return ln >= 10
|
|
end
|
|
nodecore.can_grass_grow_under = can_grass_grow_under
|
|
|
|
nodecore.grassable = function(...)
|
|
nodecore.log("warning", "deprecated nodecore.grassable(pos)")
|
|
return nodecore.can_grass_grow_under(...)
|
|
end
|
|
|
|
minetest.register_abm({
|
|
label = "grass spread",
|
|
nodenames = {"group:grassable"},
|
|
neighbors = {grass},
|
|
neighbors_invert = true,
|
|
interval = 6,
|
|
chance = 50,
|
|
action = function(pos)
|
|
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
|
|
if not can_grass_grow_under(above) then return end
|
|
return minetest.set_node(pos, {name = grass})
|
|
end
|
|
})
|
|
|
|
minetest.register_abm({
|
|
label = "grass decay",
|
|
nodenames = {grass},
|
|
interval = 8,
|
|
chance = 50,
|
|
action = function(pos)
|
|
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
|
|
if can_grass_grow_under(above) ~= false then return end
|
|
return minetest.set_node(pos, {name = dirt})
|
|
end
|
|
})
|