Files
minetest-mesecons-clock/init.lua
2025-11-23 22:07:15 +01:00

152 lines
5.2 KiB
Lua

local S = minetest.get_translator(minetest.get_current_modname())
local default_on_interval = minetest.settings:get("mesecons_clock.default_on_interval", 1) or 1
local default_off_interval = minetest.settings:get("mesecons_clock.default_off_interval", 1) or 1
local meseclock_toggle_timer = function (pos)
local timer = minetest.get_node_timer(pos)
if timer:is_started() then
timer:stop()
else
local node = minetest.get_node(pos)
local nodedef = minetest.registered_nodes[node.name]
local meta = minetest.get_meta(pos)
local meta_on_interval = meta:get_int("on_time") or default_on_interval
local meta_off_interval = meta:get_int("off_time") or default_off_interval
if (nodedef.__mesecon_state == "on") then
timer:start(meta_on_interval)
else
timer:start(meta_off_interval)
end
end
end
local meseclock_on_timer = function (pos)
local node = minetest.get_node(pos)
if (mesecon.flipstate(pos, node) == "on") then
mesecon.receptor_on(pos)
else
mesecon.receptor_off(pos)
end
meseclock_toggle_timer(pos)
end
local meseclock_make_formspec = function (pos)
local meta = minetest.get_meta(pos)
if meta:get_string("on_time") == "" then meta:set_string("on_time", "1") end
if meta:get_string("off_time") == "" then meta:set_string("off_time", "1") end
meta:set_string(
"formspec", "size[6,2.5]" ..
"field[0.3, 0;3,2;on_time;" .. S("On time (seconds)") .. ":;${on_time}]" ..
"field[3.3, 0;3,2;off_time;" .. S("Off time (seconds)") .. ":;${off_time}]" ..
"button_exit[0.3,0.5;2,3;;" .. S("Save") .. "]"
)
end
local meseclock_on_construct = function (pos)
meseclock_make_formspec(pos)
meseclock_toggle_timer(pos)
end
local meseclock_on_receive_fields = function (pos, _, fields, sender)
if not fields.on_time then return end
if minetest.is_protected(pos, sender:get_player_name()) then return end
local meta = minetest.get_meta(pos)
meta:set_string("on_time", fields.on_time or to_string(default_on_time))
meta:set_string("off_time", fields.off_time or to_string(default_off_time))
meseclock_make_formspec(pos)
end
local node_defaults = {
description = S("Mesecons Clock"),
drawtype = "nodebox",
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil,
walkable = true,
selection_box = {
type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
},
node_box = {
type = "fixed",
fixed = {
{ -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
{ -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 },
},
},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
is_ground_content = false,
sounds = mesecon.node_sound.stone,
on_blast = mesecon.on_blastnode,
drop = "mesecons_clock:clock_off",
on_construct = meseclock_on_construct,
on_receive_fields = meseclock_on_receive_fields,
on_punch = function (pos, _, clicker)
if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then
return
end
meseclock_toggle_timer(pos)
end,
on_timer = meseclock_on_timer,
}
local off_state = {
inventory_image = "jeija_gate_off.png^meseclock.png",
wield_image = "jeija_gate_off.png^meseclock.png",
tiles = {
"jeija_microcontroller_bottom.png^meseclock_output_off.png^jeija_gate_off.png^meseclock.png",
"jeija_microcontroller_bottom.png^meseclock_output_off.png",
"jeija_gate_side.png^jeija_gate_side_output_off.png",
"jeija_gate_side.png^jeija_gate_side_output_off.png",
"jeija_gate_side.png^jeija_gate_side_output_off.png",
"jeija_gate_side.png^jeija_gate_side_output_off.png",
},
groups = { bendy = 2, snappy = 1, dig_immediate = 2 },
mesecons = {
receptor = { state = mesecon.state.off },
},
}
local on_state = {
inventory_image = "jeija_gate_on.png^meseclock.png",
wield_image = "jeija_gate_on.png^meseclock.png",
tiles = {
"jeija_microcontroller_bottom.png^meseclock_output_on.png^jeija_gate_on.png^meseclock.png",
"jeija_microcontroller_bottom.png^meseclock_output_on.png",
"jeija_gate_side.png^jeija_gate_side_output_on.png",
"jeija_gate_side.png^jeija_gate_side_output_on.png",
"jeija_gate_side.png^jeija_gate_side_output_on.png",
"jeija_gate_side.png^jeija_gate_side_output_on.png",
},
groups = { bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1 },
mesecons = {
receptor = { state = mesecon.state.on },
},
}
mesecon.register_node("mesecons_clock:clock", node_defaults, off_state, on_state)
if (minetest.get_modpath("mesecons_blinkyplant")) then
minetest.register_craft({
type = "shapeless",
output = "mesecons_clock:clock_off",
recipe = {"mesecons_blinkyplant:blinky_plant_off", "mesecons_delayer:delayer_off_1"},
})
end
minetest.register_craft({
type = "shaped",
output = "mesecons_clock:clock_off",
recipe = {
{"group:mesecon_conductor_craftable", "mesecons_delayer:delayer_off_1", "group:mesecon_conductor_craftable"},
{"group:mesecon_conductor_craftable", "mesecons_delayer:delayer_off_1", "group:mesecon_conductor_craftable"},
},
})