diff --git a/mods/bg_api/init.lua b/mods/bg_api/init.lua index e254385..6ae59b2 100644 --- a/mods/bg_api/init.lua +++ b/mods/bg_api/init.lua @@ -17,5 +17,6 @@ load_file("util_node") load_file("wrappers") load_file("random_tick") +load_file("loose_nodes") load_file("cleanup") diff --git a/mods/bg_api/loose_nodes.lua b/mods/bg_api/loose_nodes.lua new file mode 100644 index 0000000..f514e55 --- /dev/null +++ b/mods/bg_api/loose_nodes.lua @@ -0,0 +1,63 @@ +-- TODO: collapse nodes when the node under them is removed. + +local function attempt_collapse_at (pos) + local below = pos + blockgame.vector.dirs.down + if minetest.get_node(below).name ~= "air" then return end + + minetest.spawn_falling_node(pos) +end + +local function place_loose_node (itemstack, placer, pointed) + local result = minetest.item_place(itemstack, placer, pointed) + attempt_collapse_at(pointed.above) + return result +end + +-- collapse nodes that somehow managed to stay in the air. +blockgame.register_abm({ + label = "collapse collapsible nodes", + nodenames = {"group:loose"}, + neighbors = {"air"}, + interval = 15, + chance = 1, + action = attempt_collapse_at, +}) + +local function attempt_settle_at (pos) + local below = pos + blockgame.vector.dirs.down + if minetest.get_node(below).name == "air" then return end + + local def = minetest.registered_nodes[minetest.get_node(pos).name] + minetest.set_node(pos, {name = def.stable_version}) +end + +-- settle nodes that are still (in the future, it will take some time for loose nodes that are still to settle). +blockgame.register_abm({ + label = "settle collapsible nodes", + nodenames = {"group:loose"}, + interval = 30, + chance = 10, + action = attempt_settle_at, +}) + + + +function blockgame.register_loose_version (name) + local def = minetest.registered_nodes[name] + if not def then return false end + + local groups = {} + for key, value in pairs(def.groups) do + groups[key] = value + end + groups.loose = 1 + + blockgame.register_node(name .. "_loose", { + description = "Loose " .. def.description, + tiles = def.tiles, -- temporary + groups = groups, + on_place = place_loose_node, + stable_version = name, + }) + return true +end