add LBM to re-place tops of missing multiblocks

This commit is contained in:
flux 2020-08-22 18:07:18 +00:00
parent 008c1a466d
commit 0c929b2278

@ -1,36 +1,67 @@
local bottoms_by_node = { local bottoms_by_top = {
["tubelib_addons1:fermenter_top"] = {"tubelib_addons1:fermenter", "tubelib_addons1:fermenter_defect"}, ["tubelib_addons1:fermenter_top"] = {"tubelib_addons1:fermenter", "tubelib_addons1:fermenter_defect"},
["tubelib_addons1:reformer_top"] = {"tubelib_addons1:reformer", "tubelib_addons1:reformer_defect"}, ["tubelib_addons1:reformer_top"] = {"tubelib_addons1:reformer", "tubelib_addons1:reformer_defect"},
}
local top_by_bottom = {
["tubelib_addons1:fermenter"] = "tubelib_addons1:fermenter_top",
["tubelib_addons1:fermenter_defect"] = "tubelib_addons1:fermenter_top",
["tubelib_addons1:reformer"] = "tubelib_addons1:reformer_top",
["tubelib_addons1:reformer_defect"] = "tubelib_addons1:reformer_top",
} }
-- remove tops of multiblocks which aren't over the bottom; happens due to bugs or worldedit -- remove tops of multiblocks which aren't over the bottom; happens due to bugs or worldedit
minetest.register_lbm({ minetest.register_lbm({
label = "Remove detached tops of multiblocks", label = "Remove detached tops of multiblocks",
name = "tubelib_addons1:remove_detached_tops", name = "tubelib_addons1:remove_detached_tops",
nodenames = { nodenames = {
"tubelib_addons1:fermenter_top", "tubelib_addons1:fermenter_top",
"tubelib_addons1:reformer_top", "tubelib_addons1:reformer_top",
}, },
run_at_every_load = true, run_at_every_load = true,
action = function(pos, node) action = function(pos, node)
local bottoms = bottoms_by_node[node.name] local bottoms = bottoms_by_top[node.name]
local pos_under = vector.subtract(pos, vector.new(0, 1, 0)) local pos_under = vector.subtract(pos, vector.new(0, 1, 0))
local node_under = minetest.get_node_or_nil(pos_under) local node_under = minetest.get_node_or_nil(pos_under)
if not node_under then if not node_under then
-- not loaded -- not loaded
return return
end end
local node_under_name = node_under.name local node_under_name = node_under.name
for _, bottom in ipairs(bottoms) do for _, bottom in ipairs(bottoms) do
if node_under_name == bottom then if node_under_name == bottom then
-- has an acceptable bottom -- has an acceptable bottom
return return
end end
end end
minetest.remove_node(pos) minetest.remove_node(pos)
end end
})
-- fix multiblocks with missing tops; happens due to bugs or worldedit
minetest.register_lbm({
label = "Fix missing tops of multiblocks",
name = "tubelib_addons1:fix_missing_tops",
nodenames = {
"tubelib_addons1:fermenter",
"tubelib_addons1:fermenter_defect",
"tubelib_addons1:reformer",
"tubelib_addons1:reformer_defect",
},
run_at_every_load = true,
action = function(pos, node)
local pos_above = vector.add(pos, vector.new(0, 1, 0))
local node_above = minetest.get_node(pos_above)
if node_above.name ~= "air" then
return
end
local top = top_by_bottom[node.name]
minetest.add_node(pos_above, {name=top, param2=node.param2})
end
}) })