-- punch configuration utility helper -- playername -> punchDef local punch_handler = {} --[[ Registers a punch-configuration callback: epic.punchnode_callback({ nodes = {"default:dirt"}, timeout = 300, check_protection = true, callback = function(pos, node) end }) --]] function epic.punchnode_callback(player, punchDef) local playername = player:get_player_name() punch_handler[playername] = punchDef end minetest.register_on_punchnode(function(pos, node, puncher) local playername = puncher:get_player_name() local punchDef = punch_handler[playername] -- abort if no callback waiting if not punchDef then return end -- TODO: check timeout -- clear callback punch_handler[playername] = nil if punchDef.check_protection then if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {epic_admin=true}) then minetest.chat_send_player(playername, "[epic] target is protected! aborting selection.") return end end -- check valid nodes local valid_node = false if punchDef.nodes then -- go through list for _, nodename in ipairs(punchDef.nodes) do if node.name == nodename then valid_node = true break end end else -- all nodes valid valid_node = true end if not valid_node then minetest.chat_send_player(playername, "[epic] target node invalid! valid types: " .. dump(punchDef.nodes)) return end punchDef.callback(pos, node) end) -- cleanup minetest.register_on_leaveplayer(function(player) local playername = player:get_player_name() punch_handler[playername] = nil end)