Modify mesecons to allow functions in conductor.state, conductor.on and conductor.off

This commit is contained in:
teknomunk 2025-01-23 06:33:45 -06:00 committed by the-real-herowl
parent d297a90d3f
commit 15fbaedd9a
2 changed files with 32 additions and 5 deletions
mods/ITEMS/REDSTONE/mesecons

View file

@ -272,6 +272,9 @@ function mesecon.is_conductor_on(node, rulename)
local conductor = mesecon.get_conductor(node.name)
if conductor then
if conductor.state then
if type(conductor.state) == "function" then
return conductor.state(node) == mesecon.state.on
end
return conductor.state == mesecon.state.on
end
if conductor.states then
@ -293,6 +296,9 @@ function mesecon.is_conductor_off(node, rulename)
local conductor = mesecon.get_conductor(node.name)
if conductor then
if conductor.state then
if type(conductor.state) == "function" then
return conductor.state(node) == mesecon.state.off
end
return conductor.state == mesecon.state.off
end
if conductor.states then
@ -402,7 +408,15 @@ function mesecon.turnon(pos, link)
end
end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link))
local conductor_on_state = mesecon.get_conductor_on(node, f.link)
if type(conductor_on_state) == "function" then
conductor_on_state = conductor_on_state(f.pos, node)
end
if type(conductor_on_state) == "table" then
mesecon.swap_node_force(f.pos, conductor_on_state[1], conductor_on_state[2])
else
mesecon.swap_node_force(f.pos, conductor_on_state)
end
elseif mesecon.is_effector(node.name) then
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
if mesecon.is_effector_off(node.name) then
@ -471,7 +485,15 @@ function mesecon.turnoff(pos, link)
end
end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link))
local conductor_off_state = mesecon.get_conductor_off(node, f.link)
if type(conductor_off_state) == "function" then
conductor_off_state = conductor_off_state(f.pos, node)
end
if type(conductor_off_state) == "table" then
mesecon.swap_node_force(f.pos, conductor_off_state[1], conductor_off_state[2])
else
mesecon.swap_node_force(f.pos, conductor_off_state)
end
elseif mesecon.is_effector(node.name) then
insert(signals, {
pos = f.pos,

View file

@ -342,6 +342,7 @@ function mesecon.vm_commit()
if tbl.dirty then
local vm = tbl.vm
vm:set_data(tbl.data)
vm:set_param2_data(tbl.param2)
vm:write_to_map()
vm:update_map()
end
@ -387,10 +388,13 @@ end
-- Sets a nodes name during a VoxelManipulator-based transaction.
--
-- Existing param1, param2, and metadata are left alone.
function mesecon.vm_swap_node(pos, name)
function mesecon.vm_swap_node(pos, name, param2)
local tbl = vm_get_or_create_entry(pos)
local index = tbl.va:indexp(pos)
tbl.data[index] = minetest.get_content_id(name)
if param2 then
tbl.param2[index] = param2
end
tbl.dirty = true
end
@ -426,14 +430,15 @@ end
--
-- This function can only be used to change the nodes name, not its parameters
-- or metadata.
function mesecon.swap_node_force(pos, name)
function mesecon.swap_node_force(pos, name, param2)
if vm_cache then
return mesecon.vm_swap_node(pos, name)
return mesecon.vm_swap_node(pos, name, param2)
else
-- This serves to both ensure the mapblock is loaded and also hand us
-- the old node table so we can preserve param2.
local node = mesecon.get_node_force(pos)
node.name = name
node.param2 = param2 or node.param2
minetest.swap_node(pos, node)
end
end