make decomposing leaves have layers.

decomposing leaves now stack in layers, each one 1/4 of a node in
height.

currently this doesn't affect their behaviour, beyond making them stack
when placed or landing.
This commit is contained in:
trans_soup 2023-10-19 12:54:09 +02:00
parent 8d94fb9c70
commit 4b408d9943
2 changed files with 74 additions and 14 deletions

View File

@ -41,8 +41,8 @@ local average_leaves_per_dirt = 4
blockgame.register_increasing_abm({
id = modname .. ":decompose",
label = "decompose leaves",
nodenames = {leaves_decomposing},
neighbors = {"group:dirty", leaves_decomposing},
nodenames = {"group:leaves_decomposing"},
neighbors = {"group:dirty", "group:leaves_decomposing"},
interval = 30,
chance = 10,
rate = function (pos, node, data)

View File

@ -1,13 +1,18 @@
local modname = minetest.get_current_modname()
local function reg_leaves (name, def)
def.description = def.description or name
def.texture = def.texture or name
def.tiles = {modname .. "_" .. def.texture .. ".png"}
local texture = def.texture or name
def.drawtype = "glasslike"
def.paramtype = "light"
def.sunlight_propagates = true
def = blockgame.underride(def, {
description = name,
texture = texture,
tiles = {modname .. "_" .. texture .. ".png"},
drawtype = "allfaces_optional",
paramtype = "light",
sunlight_propagates = true,
})
def.groups = blockgame.underride(def.groups, {
planty = 1,
@ -55,9 +60,64 @@ reg_leaves("leaves_alive", {
falling_node = 0,
},
})
reg_leaves("leaves_decomposing", {
description = "Decomposing Leaves",
groups = {
supports_leaves = 0,
},
})
-- TODO: generalize stacking node registration and put into API.
local decomposing_leaves_layers = 4
local after_place_stack = function (pos)
local node = minetest.get_node(pos)
local below = pos + blockgame.vector.dirs.down
local below_node = minetest.get_node(below)
if not blockgame.starts_with(below_node.name, modname .. ":leaves_decomposing") then return end
local def = minetest.registered_nodes[node.name]
local below_def = minetest.registered_nodes[below_node.name]
if below_def.level == decomposing_leaves_layers then return end
local max_diff = decomposing_leaves_layers - below_def.level
local diff = math.min(max_diff, def.level)
minetest.swap_node(below, {name = modname .. ":leaves_decomposing_" .. (below_def.level + diff)})
if diff == def.level then
minetest.remove_node(pos)
else
minetest.swap_node(pos, {name = modname .. ":leaves_decomposing_" .. (def.level - diff)})
end
end
local function reg_decomposing (level)
local height = level / decomposing_leaves_layers
local description = "Decomposing Leaves (" .. level .. "/" .. decomposing_leaves_layers .. ")"
if level == decomposing_leaves_layers then description = "Decomposing Leaves" end
local drawtype = "nodebox"
local node_box = {
["type"] = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, -0.5 + height, 0.5 },
}
if level == decomposing_leaves_layers then
drawtype = "allfaces_optional"
node_box = nil
end
reg_leaves("leaves_decomposing_" .. level, {
description = description,
level = level,
level_max = decomposing_leaves_layers,
texture = "leaves_decomposing",
drawtype = drawtype,
node_box = node_box,
after_place_node = after_place_stack,
after_land = after_place_stack,
drop = modname .. ":leaves_decomposing_1 " .. level,
groups = {
leaves_decomposing = level,
},
})
end
for level=1, decomposing_leaves_layers do
reg_decomposing(level)
end
minetest.register_alias(modname .. ":leaves_decomposing", modname .. ":leaves_decomposing_" .. decomposing_leaves_layers)