|
|
|
local minetest
|
|
|
|
= minetest
|
|
|
|
|
|
|
|
-- Table of nodes that can be rotated by the mod.
|
|
|
|
local registered_rotatables = {}
|
|
|
|
|
|
|
|
|
|
|
|
local registry = {}
|
|
|
|
|
|
|
|
function registry.register_rotatable(name, def, facedir_lookup)
|
|
|
|
def = def or minetest.registered_nodes[name]
|
|
|
|
if not def then error("Unknown node '" .. name .. "'") end
|
|
|
|
if def.paramtype2 ~= "facedir" then error("Node '" .. name .. "' must be 'facedir'") end
|
|
|
|
registered_rotatables[name] = { lookup = facedir_lookup }
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Returns whether the specified `node` is rotatable by this mod.
|
|
|
|
function registry.is_rotatable(node)
|
|
|
|
return registered_rotatables[node.name] ~= nil
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Fixes facedir for the specified `node` when rotated to `facedir`.
|
|
|
|
-- * Returns `nil` if the node can't rotate this way.
|
|
|
|
-- * Returns `facedir` when the node can rotate this way.
|
|
|
|
-- * Returns another facedir when the node should rotate another equivalent way.
|
|
|
|
function registry.fix_rotatable_facedir(node, facedir)
|
|
|
|
local name = node and node.name or ""
|
|
|
|
local entry = registered_rotatables[name]
|
|
|
|
if not entry then return nil end
|
|
|
|
if not entry.lookup then return facedir end
|
|
|
|
return entry.lookup[facedir]
|
|
|
|
end
|
|
|
|
|
|
|
|
return registry
|