mirror of
https://github.com/minetest-mods/MoreMesecons.git
synced 2025-11-17 15:55:34 +01:00
rewrite timegate to make use of nodetimers
- fixes a crash with timer=NaN - fixes 1-tick circels with timer=0 - fixes timegates getting stuck when unloaded in on-state
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
local MIN_DELAY = moremesecons.setting("timegate", "min_delay", 0.5)
|
||||||
|
|
||||||
local timegate_get_output_rules = function(node)
|
local timegate_get_output_rules = function(node)
|
||||||
local rules = {{x = 0, y = 0, z = 1}}
|
local rules = {{x = 0, y = 0, z = 1}}
|
||||||
for _ = 0, node.param2 do
|
for _ = 0, node.param2 do
|
||||||
@@ -14,25 +16,28 @@ local timegate_get_input_rules = function(node)
|
|||||||
return rules
|
return rules
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Functions that are called after the delay time
|
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 timegate_activate(pos, node)
|
local function turnon(pos, node)
|
||||||
-- using a meta string allows writing the time in hexadecimals
|
-- using a meta string allows writing the time in hexadecimals
|
||||||
local time = tonumber(minetest.get_meta(pos):get_string("time"))
|
local time = tonumber(minetest.get_meta(pos):get_string("time"))
|
||||||
if not time then
|
if not (time and time >= MIN_DELAY) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
node.name = "moremesecons_timegate:timegate_on"
|
-- restart the timer when the input was turned off and on again
|
||||||
minetest.swap_node(pos, node)
|
minetest.get_node_timer(pos):start(time)
|
||||||
mesecon.receptor_on(pos)
|
|
||||||
minetest.after(time, function()
|
if mesecon.is_receptor_off(node.name) then
|
||||||
local node = minetest.get_node(pos)
|
node.name = "moremesecons_timegate:timegate_on"
|
||||||
if node.name == "moremesecons_timegate:timegate_on" then
|
minetest.swap_node(pos, node)
|
||||||
mesecon.receptor_off(pos)
|
mesecon.receptor_on(pos)
|
||||||
node.name = "moremesecons_timegate:timegate_off"
|
end
|
||||||
minetest.swap_node(pos, node)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
|
local boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
|
||||||
@@ -78,7 +83,8 @@ mesecon.register_node("moremesecons_timegate:timegate", {
|
|||||||
and not minetest.is_protected(pos, player:get_player_name()) then
|
and not minetest.is_protected(pos, player:get_player_name()) then
|
||||||
minetest.get_meta(pos):set_string("time", fields.time)
|
minetest.get_meta(pos):set_string("time", fields.time)
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
|
on_timer = turnoff
|
||||||
},{
|
},{
|
||||||
tiles = {
|
tiles = {
|
||||||
"moremesecons_timegate_off.png",
|
"moremesecons_timegate_off.png",
|
||||||
@@ -99,7 +105,7 @@ mesecon.register_node("moremesecons_timegate:timegate", {
|
|||||||
effector =
|
effector =
|
||||||
{
|
{
|
||||||
rules = timegate_get_input_rules,
|
rules = timegate_get_input_rules,
|
||||||
action_on = timegate_activate
|
action_on = turnon
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},{
|
},{
|
||||||
@@ -120,6 +126,7 @@ mesecon.register_node("moremesecons_timegate:timegate", {
|
|||||||
},
|
},
|
||||||
effector = {
|
effector = {
|
||||||
rules = timegate_get_input_rules,
|
rules = timegate_get_input_rules,
|
||||||
|
action_on = turnon
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -69,6 +69,11 @@ moremesecons_teleporter.max_p2t_distance (Maximum Player To Teleporter distance)
|
|||||||
# from an older version which did not use it.
|
# from an older version which did not use it.
|
||||||
moremesecons_teleporter.enable_lbm (Enable Registration LBM) bool false
|
moremesecons_teleporter.enable_lbm (Enable Registration LBM) bool false
|
||||||
|
|
||||||
|
[Timegate]
|
||||||
|
|
||||||
|
# Minimum authorized length for the timegate signal. Timegates with a shorter time will not respond.
|
||||||
|
moremesecons_timegate.min_delay (Minimum timegate delay) float 0.5
|
||||||
|
|
||||||
[Wireless]
|
[Wireless]
|
||||||
|
|
||||||
# Whether to enable the wireless jammer node
|
# Whether to enable the wireless jammer node
|
||||||
|
|||||||
Reference in New Issue
Block a user