- Replace on_rightclick of registered node - Replace on_place of empty hand item to handle sneak-rightclicking to invert rotation - Move registry related things to registry.lua - Fix off-by-one error in nodecore_filtered_lookup - Detect corner interactions, not just edges - Corner interactions rotate by 120° - Add rotate_node function to mimic NodeCore spinmain
							parent
							
								
									b379937511
								
							
						
					
					
						commit
						dcf12fcdf4
					
				
				 6 changed files with 172 additions and 138 deletions
			
			
		| @ -0,0 +1,73 @@ | |||||||
|  | local minetest, nodecore | ||||||
|  |     = minetest, nodecore | ||||||
|  | 
 | ||||||
|  | local registry = {} | ||||||
|  | local registered_rotatables = {} | ||||||
|  | 
 | ||||||
|  | -- Registered rotatable nodes will call this function when their `on_rightclick` | ||||||
|  | -- is triggered instead of their default implementation. Can be overwritten. | ||||||
|  | registry.custom_on_rightclick = function(pos, node, clicker, item_stack, pointed_thing) end | ||||||
|  | 
 | ||||||
|  | local function register_rotatable(name, facedir_lookup) | ||||||
|  |     local def = 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 | ||||||
|  |     def.on_rightclick = function(...) registry.custom_on_rightclick(...) end | ||||||
|  |     registered_rotatables[name] = { lookup = facedir_lookup } | ||||||
|  | end | ||||||
|  | registry.register_rotatable = register_rotatable | ||||||
|  | 
 | ||||||
|  | -- Returns whether the specified `node` is rotatable by this mod. | ||||||
|  | local function is_rotatable(node) | ||||||
|  |     local name = node and node.name or "" | ||||||
|  |     return not not registered_rotatables[name] | ||||||
|  | end | ||||||
|  | registry.is_rotatable = is_rotatable | ||||||
|  | 
 | ||||||
|  | -- 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. | ||||||
|  | local function 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 | ||||||
|  | registry.fix_rotatable_facedir = fix_rotatable_facedir | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | -------------------------------------------- | ||||||
|  | -- Register rotatable nodes from NodeCore -- | ||||||
|  | -------------------------------------------- | ||||||
|  | 
 | ||||||
|  | local function nodecore_filtered_lookup(eq_func) | ||||||
|  |     local lookup = {} | ||||||
|  |     for i = 0, 23 do | ||||||
|  |         local facedir = nodecore.facedirs[i] | ||||||
|  |         for j = 0, #lookup - 1 do | ||||||
|  |             local other = nodecore.facedirs[lookup[j]] | ||||||
|  |             if eq_func(facedir, other) then lookup[i] = j; break end | ||||||
|  |         end | ||||||
|  |         lookup[i] = lookup[i] or i | ||||||
|  |     end | ||||||
|  |     return lookup | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local LENS_FILTERED_LOOKUP = nodecore_filtered_lookup( | ||||||
|  |     function(a, b) return vector.equals(a.f, b.f) end) | ||||||
|  | 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) | ||||||
|  | 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) | ||||||
|  | 
 | ||||||
|  | for _, lens_state in ipairs({ "", "_on", "_glow", "_glow_start" }) do | ||||||
|  |     register_rotatable("nc_optics:lens" .. lens_state, LENS_FILTERED_LOOKUP) end | ||||||
|  | for _, prism_state in ipairs({ "", "_on", "_gated" }) do | ||||||
|  |     register_rotatable("nc_optics:prism" .. prism_state, PRISM_FILTERED_LOOKUP) end | ||||||
|  | 
 | ||||||
|  | register_rotatable("nc_doors:panel_plank" , PANEL_FILTERED_LOOKUP) | ||||||
|  | register_rotatable("nc_doors:panel_cobble", PANEL_FILTERED_LOOKUP) | ||||||
|  | 
 | ||||||
|  | return registry | ||||||
					Loading…
					
					
				
		Reference in new issue