152 lines
5.2 KiB
Lua
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"},
|
|
},
|
|
})
|