local function induction_transmitter_get_input_rules(node) -- All horizontal rules, except the output local rules = { {x=-1,y=0,z=0}, {x=1,y=0,z=0}, {x=0,y=0,z=-1}, {x=0,y=0,z=1} } for i, r in ipairs(rules) do if vector.equals(r, minetest.facedir_to_dir(node.param2)) then table.remove(rules, i) end end return rules end local function induction_transmitter_get_output_rules(node) return {vector.multiply(minetest.facedir_to_dir(node.param2), 2)} end local function induction_transmitter_get_virtual_output_rules(node) return {minetest.facedir_to_dir(node.param2)} end local function act(pos, node, state) minetest.swap_node(pos, {name = "moremesecons_induction_transmitter:induction_transmitter_"..state, param2 = node.param2}) local dir = minetest.facedir_to_dir(node.param2) local target_pos = vector.add(pos, vector.multiply(dir, 2)) local target_node = minetest.get_node(target_pos) if mesecon.is_effector(target_node.name) then -- Switch on an aside node, so it sends a signal to the target node local aside_rule = mesecon.effector_get_rules(target_node)[1] if not aside_rule then return end mesecon["receptor_"..state](vector.add(target_pos, aside_rule), {vector.multiply(aside_rule, -1)}) elseif mesecon.is_conductor(target_node.name) then -- Switch on the conductor itself mesecon["receptor_"..state](target_pos, mesecon.conductor_get_rules(target_node)) end end mesecon.register_node("moremesecons_induction_transmitter:induction_transmitter", { description = "Induction Transmitter", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", node_box = { type = "fixed", fixed = { {-0.5, -0.5, 0.125, 0.5, 0.5, 0.5}, {-0.375, -0.375, -0.1875, 0.375, 0.375, 0.125}, {-0.25, -0.25, -0.5, 0.25, 0.25, -0.1875}, } }, selection_box = { type = "fixed", fixed = { {-0.5, -0.5, 0.125, 0.5, 0.5, 0.5}, {-0.375, -0.375, -0.1875, 0.375, 0.375, 0.125}, {-0.25, -0.25, -0.5, 0.25, 0.25, -0.1875}, }, }, }, { tiles = {"default_mese_block.png"}, groups = {cracky = 3}, mesecons = { receptor = { state = mesecon.state.off, rules = induction_transmitter_get_output_rules }, effector = { rules = induction_transmitter_get_input_rules, action_on = function(pos, node) act(pos, node, "on") end } } }, { light_source = 5, tiles = {"default_mese_block.png^[brighten"}, groups = {cracky = 3, not_in_creative_inventory = 1}, mesecons = { receptor = { state = mesecon.state.on, rules = induction_transmitter_get_output_rules }, effector = { rules = induction_transmitter_get_input_rules, action_off = function(pos, node) act(pos, node, "off") end } } }) minetest.register_craft({ output = "moremesecons_induction_transmitter:induction_transmitter_off", recipe = { {"default:mese_crystal_fragment", "mesecons_torch:mesecon_torch_on", "default:mese_crystal_fragment"}, {"", "default:mese_crystal_fragment", ""} } })