Use NodeCore's new spindata property

- Remove nodecore_filtered_lookup
  NodeCore now exposes this information,
  and turns out there was a bug in it, anyway.
- Move fix_rotatable_facedir to utility.lua
- Add sanity check to ensure spindata exists
- Depends on NodeCore `966ed012`
main
copygirl 7 months ago
parent 8bf8c64841
commit dfe88b4aec
  1. 4
      README.md
  2. 27
      init.lua
  3. 15
      registry.lua
  4. 2
      state.lua
  5. 19
      utility.lua

@ -15,10 +15,6 @@ Rotating a node can be done in three ways:
Sneaking while empty-handed inverts the direction of the rotation. Sneaking while empty-handed inverts the direction of the rotation.
At this time, nodes that can be rotated are hardcoded into the mod, since
their valid orientations can't be determined just by their node definition.
A function mimicking NodeCore's `node_spin_filtered` has to be provided.
[Minetest]: https://www.minetest.net/ [Minetest]: https://www.minetest.net/
[NodeCore]: https://content.minetest.net/packages/Warr1024/nodecore/ [NodeCore]: https://content.minetest.net/packages/Warr1024/nodecore/
[Extended Placement]: https://content.minetest.net/packages/gamefreq0/extended_placement/ [Extended Placement]: https://content.minetest.net/packages/gamefreq0/extended_placement/

@ -1,5 +1,5 @@
local ipairs, ItemStack, vector, include, nodecore local ipairs, ItemStack, nodecore, include
= ipairs, ItemStack, vector, include, nodecore = ipairs, ItemStack, nodecore, include
rawset(_G, "nc_extended_rotating", {}) rawset(_G, "nc_extended_rotating", {})
nc_extended_rotating.hud = include("hud") nc_extended_rotating.hud = include("hud")
@ -9,6 +9,12 @@ nc_extended_rotating.entity = include("entity") -- Depends on `utility`.
nc_extended_rotating.registry = include("registry") -- Depends on `rotate` and `state` (late). nc_extended_rotating.registry = include("registry") -- Depends on `rotate` and `state` (late).
nc_extended_rotating.state = include("state") -- Depends on `registry`, `rotate` and `utility`. nc_extended_rotating.state = include("state") -- Depends on `registry`, `rotate` and `utility`.
do
-- Do a quick check if we're using a compatible version of NodeCore.
local lens_def = minetest.registered_nodes["nc_optics:lens"]
if not lens_def.spindata then error("Requires NodeCore 966ed012 or later") end
end
------------------------------------- -------------------------------------
-- Register Player Update Function -- -- Register Player Update Function --
------------------------------------- -------------------------------------
@ -30,24 +36,17 @@ nodecore.register_playerstep({
-- Register Rotatable NodeCore Nodes -- -- Register Rotatable NodeCore Nodes --
--------------------------------------- ---------------------------------------
local nodecore_filtered_lookup = nc_extended_rotating.utility.nodecore_filtered_lookup local register_rotatable = nc_extended_rotating.registry.register_rotatable;
local register_rotatable = nc_extended_rotating.registry.register_rotatable;
-- Register lenses. -- Register lenses.
local LENS_FILTERED_LOOKUP = nodecore_filtered_lookup(function(a, b)
return vector.equals(a.f, b.f) end)
for _, lens_state in ipairs({ "", "_on", "_glow", "_glow_start" }) do for _, lens_state in ipairs({ "", "_on", "_glow", "_glow_start" }) do
register_rotatable("nc_optics:lens" .. lens_state, nil, LENS_FILTERED_LOOKUP) end register_rotatable("nc_optics:lens" .. lens_state) end
-- Register prisms. -- Register prisms.
local PRISM_FILTERED_LOOKUP = nodecore_filtered_lookup(function(a, b)
return vector.equals(a.f, b.r) and vector.equals(a.r, b.f) end)
for _, prism_state in ipairs({ "", "_on", "_gated" }) do for _, prism_state in ipairs({ "", "_on", "_gated" }) do
register_rotatable("nc_optics:prism" .. prism_state, nil, PRISM_FILTERED_LOOKUP) end register_rotatable("nc_optics:prism" .. prism_state) end
-- Register all existing and to-be-registered door panels. -- Register all existing and to-be-registered door panels.
local PANEL_FILTERED_LOOKUP = nodecore_filtered_lookup(function(a, b)
return vector.equals(a.f, b.r) and vector.equals(a.r, b.f) end)
nodecore.register_on_register_item({ nodecore.register_on_register_item({
retroactive = true, retroactive = true,
func = function(name, def) func = function(name, def)
@ -57,8 +56,8 @@ nodecore.register_on_register_item({
if def.groups and def.groups.door then if def.groups and def.groups.door then
local panel = def.drop_in_place.name -- The panel version of the door. local panel = def.drop_in_place.name -- The panel version of the door.
local pin = def.drop_non_silktouch or def.drop -- Dropped item is the door's pin. local pin = def.drop_non_silktouch or def.drop -- Dropped item is the door's pin.
register_rotatable(panel, nil, PANEL_FILTERED_LOOKUP, register_rotatable(panel, nil, function(_, _, _, item_stack)
function(_, _, _, item_stack) return ItemStack(item_stack):get_name() == pin end) return ItemStack(item_stack):get_name() == pin end)
end end
end, end,
}) })

@ -29,7 +29,7 @@ end
local rotate_node = nc_extended_rotating.rotate.rotate_node local rotate_node = nc_extended_rotating.rotate.rotate_node
-- local get_rotating_state = nc_extended_rotating.state.get_rotating_state -- local get_rotating_state = nc_extended_rotating.state.get_rotating_state
function registry.register_rotatable(name, def, facedir_lookup, rightclick_filter_func) function registry.register_rotatable(name, def, rightclick_filter_func)
def = def or minetest.registered_nodes[name] or error("Unknown node '" .. name .. "'") def = def or minetest.registered_nodes[name] or error("Unknown node '" .. name .. "'")
if def.paramtype2 ~= "facedir" then error("Node '" .. name .. "' must be 'facedir'") end if def.paramtype2 ~= "facedir" then error("Node '" .. name .. "' must be 'facedir'") end
@ -49,7 +49,6 @@ function registry.register_rotatable(name, def, facedir_lookup, rightclick_filte
end end
registered_rotatables[name] = { registered_rotatables[name] = {
facedir_lookup = facedir_lookup,
rightclick_filter_func = rightclick_filter_func, rightclick_filter_func = rightclick_filter_func,
} }
end end
@ -67,16 +66,4 @@ function registry.is_rightclick_filtered(pos, node, player, item_stack, pointed_
and entry.rightclick_filter_func(pos, node, player, item_stack, pointed_thing) and entry.rightclick_filter_func(pos, node, player, item_stack, pointed_thing)
end 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.facedir_lookup then return facedir end
return entry.facedir_lookup[facedir]
end
return registry return registry

@ -1,10 +1,10 @@
local math_round, minetest, vector local math_round, minetest, vector
= math.round, minetest, vector = math.round, minetest, vector
local fix_rotatable_facedir = nc_extended_rotating.registry.fix_rotatable_facedir;
local is_rightclick_filtered = nc_extended_rotating.registry.is_rightclick_filtered; local is_rightclick_filtered = nc_extended_rotating.registry.is_rightclick_filtered;
local is_rotatable = nc_extended_rotating.registry.is_rotatable; local is_rotatable = nc_extended_rotating.registry.is_rotatable;
local rotate_facedir = nc_extended_rotating.rotate.rotate_facedir; local rotate_facedir = nc_extended_rotating.rotate.rotate_facedir;
local fix_rotatable_facedir = nc_extended_rotating.utility.fix_rotatable_facedir;
local rotation_vector_from_lookat = nc_extended_rotating.utility.rotation_vector_from_lookat; local rotation_vector_from_lookat = nc_extended_rotating.utility.rotation_vector_from_lookat;
-- Distance at which we want to rotate by "pushing" on an edge. -- Distance at which we want to rotate by "pushing" on an edge.

@ -44,17 +44,14 @@ function utility.rotation_vector_from_lookat(node, pointed_thing, edge_distance)
return b - math_abs(p) <= edge_distance and math_sign(p) or 0 end) return b - math_abs(p) <= edge_distance and math_sign(p) or 0 end)
end end
function utility.nodecore_filtered_lookup(eq_func) -- NodeCore only has a couple of "canonical" orientations for its nodes.
local lookup = {} -- This returns a canonical facedir equivalent to the one passed in.
for i = 0, 23 do function utility.fix_rotatable_facedir(node, facedir)
local facedir = nodecore.facedirs[i] local name = node and node.name or ""
for j = 0, #lookup - 1 do local def = minetest.registered_nodes[name]
local other = nodecore.facedirs[lookup[j]] if not def then return nil end
if eq_func(facedir, other) then lookup[i] = j; break end if not def.spindata then return facedir end
end return def.spindata.equiv[facedir]
lookup[i] = lookup[i] or i
end
return lookup
end end
return utility return utility

Loading…
Cancel
Save