2024-10-29 19:41:33 +01:00
|
|
|
local get_node = core.get_node
|
|
|
|
local swap_node = core.swap_node
|
|
|
|
|
2024-08-23 10:55:30 +02:00
|
|
|
--- fairly strict: air, ignore, or no_paths marker
|
|
|
|
-- @param node string or Node: node or node name
|
|
|
|
-- @return true for air and ignore nodes
|
|
|
|
function vl_terraforming._is_air(node)
|
|
|
|
local name = node.name or node
|
|
|
|
return name == "air" or name == "ignore" or name == "mcl_villages:no_paths"
|
|
|
|
end
|
|
|
|
|
|
|
|
--- check if a node is walkable (solid), but not tree/leaves/fungi/bamboo/vines/etc.
|
|
|
|
-- @param node LUA node or node name
|
|
|
|
-- @return truthy when solid but not tree/decoration/fungi
|
|
|
|
function vl_terraforming._is_solid_not_tree(node)
|
|
|
|
local name = node.name or node
|
|
|
|
if name == "air" or name == "ignore" or name == "mcl_villages:no_paths" or name == "mcl_core:bedrock" then return false end
|
|
|
|
if name == "mcl_nether:soul_sand" then return true end -- not "solid". Other exceptions we need?
|
|
|
|
if name == "mcl_nether:nether_wart_block" then return false end -- crimson forest, treat as tree
|
|
|
|
-- is deco_block if name == "mcl_crimson:warped_wart_block" then return false end -- warped forest, treat as tree
|
|
|
|
-- is deco_block if name == "mcl_crimson:shroomlight" then return false end -- crimson forest, treat as tree
|
|
|
|
-- is deco_block if name == "mcl_core:snow" then return false end
|
|
|
|
-- is walkable if name == "mcl_core:snowblock" then return true end
|
|
|
|
local meta = minetest.registered_items[name]
|
|
|
|
local groups = meta and meta.groups
|
2024-10-29 19:41:33 +01:00
|
|
|
return meta and meta.walkable and not (groups and ((groups.deco_block or 0) > 0 or (groups.tree or 0) > 0 or (groups.leaves or 0) > 0 or (groups.plant or 0) > 0))
|
2024-08-23 10:55:30 +02:00
|
|
|
end
|
|
|
|
local is_solid_not_tree = vl_terraforming._is_solid_not_tree
|
|
|
|
|
|
|
|
--- check if a node is tree
|
|
|
|
-- @param node string or Node: node or node name
|
|
|
|
-- @return true for tree, leaves
|
|
|
|
function vl_terraforming._is_tree_not_leaves(node)
|
|
|
|
local name = node.name or node
|
|
|
|
if name == "air" or name == "ignore" or name == "mcl_villages:no_paths" then return false end
|
|
|
|
-- if name == "mcl_nether:nether_wart_block" then return true end -- crimson forest, treat as tree
|
|
|
|
-- if name == "mcl_crimson:warped_wart_block" then return true end -- warped forest, treat as tree
|
|
|
|
-- if name == "mcl_crimson:shroomlight" then return true end -- crimson forest, treat as tree
|
|
|
|
local meta = minetest.registered_items[name]
|
2024-10-29 19:41:33 +01:00
|
|
|
return meta and meta.groups and (meta.groups.tree or 0) > 0
|
2024-08-23 10:55:30 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
--- check if a node is liquid
|
|
|
|
-- @param node string or Node: node or node name
|
|
|
|
-- @return true for water, lava
|
|
|
|
function vl_terraforming._is_liquid(node)
|
|
|
|
local name = node.name or node
|
|
|
|
if name == "air" or name == "ignore" or name == "mcl_villages:no_paths" then return false end
|
|
|
|
local meta = minetest.registered_items[name]
|
|
|
|
local groups = meta and meta.groups
|
2024-10-29 19:41:33 +01:00
|
|
|
return groups and (groups.liquid or 0) > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
--- replace a non-solid node, optionally also "additional"
|
|
|
|
-- @param pos position
|
|
|
|
-- @param with replacement Lua node (not just name)
|
|
|
|
-- @param always additional node to awlays replace even when solid
|
|
|
|
function vl_terraforming._make_solid(pos, with, always)
|
|
|
|
local cur = get_node(pos)
|
|
|
|
if cur.name == "ignore" or cur.name == "mcl_core:bedrock" then return end
|
|
|
|
if cur.name == always or not is_solid_not_tree(cur) then
|
|
|
|
swap_node(pos, with)
|
|
|
|
return true
|
|
|
|
end
|
2024-08-23 10:55:30 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
--- replace a non-solid node, optionally also "additional"
|
|
|
|
-- @param vm voxelmanip
|
|
|
|
-- @param pos position
|
|
|
|
-- @param with replacement Lua node (not just name)
|
|
|
|
-- @param always additional node to awlays replace even when solid
|
|
|
|
function vl_terraforming._make_solid_vm(vm, pos, with, always)
|
|
|
|
local cur = vm:get_node_at(pos)
|
|
|
|
if cur.name == "ignore" or cur.name == "mcl_core:bedrock" then return end
|
|
|
|
if cur.name == always or not is_solid_not_tree(cur) then
|
|
|
|
vm:set_node_at(pos, with)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|