Merge pull request 'Fix pistons moving powered rail' () from fix-piston-pushing-powered-rails into master

Reviewed-on: https://git.minetest.land/VoxeLibre/VoxeLibre/pulls/4892
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
This commit is contained in:
the-real-herowl 2025-01-25 14:19:51 +01:00
commit a27fbe80bd
5 changed files with 69 additions and 12 deletions
mods
ENTITIES/mcl_minecarts
ITEMS/REDSTONE/mesecons

View file

@ -239,10 +239,26 @@ local function make_mesecons(base_name, suffix, base_mesecons)
mesecons.conductor = table.copy(base_mesecons.conductor)
if mesecons.conductor.onstate then
mesecons.conductor.onstate = base_mesecons.conductor.onstate..suffix
if type(mesecons.conductor.onstate) == "function" then
local old_onstate = mesecons.conductor.onstate
mesecons.conductor.onstate = function(pos, node)
local res = old_onstate(pos, node)
return {res[1]..suffix, res[2]}
end
else
mesecons.conductor.onstate = base_mesecons.conductor.onstate..suffix
end
end
if base_mesecons.conductor.offstate then
mesecons.conductor.offstate = base_mesecons.conductor.offstate..suffix
if type(mesecons.conductor.offstate) == "function" then
local old_offstate = mesecons.conductor.offstate
mesecons.conductor.offstate = function(pos, node)
local res = old_offstate(pos, node)
return {res[1]..suffix, res[2]}
end
else
mesecons.conductor.offstate = base_mesecons.conductor.offstate..suffix
end
end
end

View file

@ -21,8 +21,12 @@ mod.register_curves_rail("mcl_minecarts:golden_rail_v2",{
mesecons = {
conductor = {
state = mesecon.state.off,
offstate = "mcl_minecarts:golden_rail_v2",
onstate = "mcl_minecarts:golden_rail_v2_on",
offstate = function(pos, node)
return {"mcl_minecarts:golden_rail_v2", node.param2}
end,
onstate = function(pos, node)
return {"mcl_minecarts:golden_rail_v2_on", node.param2}
end,
rules = mod.rail_rules_long,
},
},
@ -73,8 +77,12 @@ mod.register_curves_rail("mcl_minecarts:golden_rail_v2_on",{
mesecons = {
conductor = {
state = mesecon.state.on,
offstate = "mcl_minecarts:golden_rail_v2",
onstate = "mcl_minecarts:golden_rail_v2_on",
offstate = function(pos, node)
return {"mcl_minecarts:golden_rail_v2", node.param2}
end,
onstate = function(pos, node)
return {"mcl_minecarts:golden_rail_v2_on", node.param2}
end,
rules = mod.rail_rules_long,
},
},

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

@ -21,7 +21,13 @@ function mesecon.on_placenode(pos, node)
end
mesecon.receptor_on (pos, mesecon.conductor_get_rules(node))
elseif mesecon.is_conductor_on(node) then
minetest.swap_node(pos, {name = mesecon.get_conductor_off(node)})
local offstate = mesecon.get_conductor_off(node)
if type(offstate) == "function" then
local res = offstate(pos, node)
core.swap_node(pos, {name = res[1], param2 = res[2]})
else
core.swap_node(pos, {name = offstate})
end
end
end

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