local MIN_DELAY = moremesecons.setting("timegate", "min_delay", 0.5) local timegate_get_output_rules = function(node) local rules = {{x = 0, y = 0, z = 1}} for _ = 0, node.param2 do rules = mesecon.rotate_rules_left(rules) end return rules end local timegate_get_input_rules = function(node) local rules = {{x = 0, y = 0, z = -1}} for _ = 0, node.param2 do rules = mesecon.rotate_rules_left(rules) end return rules end local function turnoff(pos, _, node) if mesecon.is_receptor_on(node.name) then node.name = "moremesecons_timegate:timegate_off" minetest.swap_node(pos, node) mesecon.receptor_off(pos) end end local function turnon(pos, node) -- using a meta string allows writing the time in hexadecimals local time = tonumber(minetest.get_meta(pos):get_string("time")) if not (time and time >= MIN_DELAY) then return end -- restart the timer when the input was turned off and on again minetest.get_node_timer(pos):start(time) if mesecon.is_receptor_off(node.name) then node.name = "moremesecons_timegate:timegate_on" minetest.swap_node(pos, node) mesecon.receptor_on(pos) end end local boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab { -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator { -3/16, -7/16, -3/16, 3/16, -26/64, -2/16 }, { -4/16, -7/16, -2/16, 4/16, -26/64, 2/16 }, { -3/16, -7/16, 2/16, 3/16, -26/64, 3/16 }, { -2/16, -7/16, 3/16, 2/16, -26/64, 4/16 }, { -6/16, -7/16, -6/16, -4/16, -27/64, -4/16 }, -- the timer indicator { -8/16, -8/16, -1/16, -6/16, -7/16, 1/16 }, -- the two wire stubs { 6/16, -8/16, -1/16, 8/16, -7/16, 1/16 }} local use_texture_alpha if minetest.features.use_texture_alpha_string_modes then use_texture_alpha = "opaque" end mesecon.register_node("moremesecons_timegate:timegate", { description = "Time Gate", drawtype = "nodebox", inventory_image = "moremesecons_timegate_off.png", wield_image = "moremesecons_timegate_off.png", walkable = true, selection_box = { type = "fixed", fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, }, node_box = { type = "fixed", fixed = boxes }, paramtype = "light", paramtype2 = "4dir", sunlight_propagates = true, is_ground_content = true, sounds = default.node_sound_stone_defaults(), on_construct = function(pos) minetest.get_meta(pos):set_string("formspec", "field[time;time;${time}]") end, on_receive_fields = function(pos, _, fields, player) if fields.time and not minetest.is_protected(pos, player:get_player_name()) then minetest.get_meta(pos):set_string("time", fields.time) end end, on_timer = turnoff, on_rotate = mesecon.on_rotate },{ tiles = { "moremesecons_timegate_off.png", "moremesecons_timegate_bottom.png", "moremesecons_timegate_ends_off.png", "moremesecons_timegate_ends_off.png", "moremesecons_timegate_sides_off.png", "moremesecons_timegate_sides_off.png" }, use_texture_alpha = use_texture_alpha, groups = {bendy=2,snappy=1,dig_immediate=2}, mesecons = { receptor = { state = mesecon.state.off, rules = timegate_get_output_rules }, effector = { rules = timegate_get_input_rules, action_on = turnon } }, },{ tiles = { "moremesecons_timegate_on.png", "moremesecons_timegate_bottom.png", "moremesecons_timegate_ends_on.png", "moremesecons_timegate_ends_on.png", "moremesecons_timegate_sides_on.png", "moremesecons_timegate_sides_on.png" }, use_texture_alpha = use_texture_alpha, groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1}, mesecons = { receptor = { state = mesecon.state.on, rules = timegate_get_output_rules }, effector = { rules = timegate_get_input_rules, action_on = turnon } }, }) minetest.register_craft({ output = "moremesecons_timegate:timegate_off 2", recipe = { {"group:mesecon_conductor_craftable", "mesecons_delayer:delayer_off_1", "group:mesecon_conductor_craftable"}, {"default:wood","default:wood", "default:wood"}, } }) minetest.register_alias("moremesecons_temporarygate:temporarygate_off", "moremesecons_timegate:timegate_off") minetest.register_alias("moremesecons_temporarygate:temporarygate_on", "moremesecons_timegate:timegate_on")