mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2025-04-22 23:25:15 +02:00
Modify mesecons to allow functions in conductor.state, conductor.on and conductor.off
This commit is contained in:
parent
d297a90d3f
commit
15fbaedd9a
2 changed files with 32 additions and 5 deletions
mods/ITEMS/REDSTONE/mesecons
|
@ -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,
|
||||
|
|
|
@ -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 node’s 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 node’s 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
|
||||
|
|
Loading…
Add table
Reference in a new issue