forked from Mirrorlandia_minetest/mesecons
Bugfix for the luacontroller that occured when two events occur at the
same time (output connected to input). The behaviour of the controller can now be described this way: The luacontroller sets port A, then B, then C, then D; if it is interrupted by another event during that time it stops and let the second event do the job.
This commit is contained in:
parent
18da94006a
commit
2b30360da2
@ -63,7 +63,21 @@ local generate_name = function (ports, overwrite)
|
|||||||
return BASENAME..d..c..b..a
|
return BASENAME..d..c..b..a
|
||||||
end
|
end
|
||||||
|
|
||||||
local action = function (pos, ports)
|
local setport = function (pos, rule, ignore, state, ports)
|
||||||
|
local ignorename = generate_name(ports, ignore)
|
||||||
|
mesecon:swap_node(pos, ignorename)
|
||||||
|
if state then
|
||||||
|
mesecon:receptor_on(pos, {rule})
|
||||||
|
else
|
||||||
|
mesecon:receptor_off(pos, {rule})
|
||||||
|
end
|
||||||
|
if minetest.env:get_node(pos).name ~= ignorename then
|
||||||
|
return true -- overridden by second process
|
||||||
|
end
|
||||||
|
return false -- success
|
||||||
|
end
|
||||||
|
|
||||||
|
local action = function (pos, ports, forcereset)
|
||||||
local name = minetest.env:get_node(pos).name
|
local name = minetest.env:get_node(pos).name
|
||||||
local vports = minetest.registered_nodes[name].virtual_portstates
|
local vports = minetest.registered_nodes[name].virtual_portstates
|
||||||
local newname = generate_name(ports)
|
local newname = generate_name(ports)
|
||||||
@ -73,28 +87,18 @@ local action = function (pos, ports)
|
|||||||
local rules_off = {}
|
local rules_off = {}
|
||||||
local ignore = {}
|
local ignore = {}
|
||||||
|
|
||||||
if ports.a then table.insert(rules_on, rules.a)
|
local interrupted
|
||||||
else table.insert(rules_off, rules.a) end
|
if ports.a ~= vports.a then interrupted = setport(pos, rules.a, {a = 2}, ports.a, ports) end
|
||||||
if ports.b then table.insert(rules_on, rules.b)
|
if interrupted and not forcereset then return end
|
||||||
else table.insert(rules_off, rules.b) end
|
if ports.b ~= vports.b then interrupted = setport(pos, rules.b, {b = 2}, ports.b, ports) end
|
||||||
if ports.c then table.insert(rules_on, rules.c)
|
if interrupted and not forcereset then return end
|
||||||
else table.insert(rules_off, rules.c) end
|
if ports.c ~= vports.c then interrupted = setport(pos, rules.c, {c = 2}, ports.c, ports) end
|
||||||
if ports.d then table.insert(rules_on, rules.d)
|
if interrupted and not forcereset then return end
|
||||||
else table.insert(rules_off, rules.d) end
|
if ports.d ~= vports.d then interrupted = setport(pos, rules.d, {d = 2}, ports.d, ports) end
|
||||||
|
if interrupted and not forcereset then return end
|
||||||
|
|
||||||
if ports.a ~= vports.a then ignore.a = 2 end
|
|
||||||
if ports.b ~= vports.b then ignore.b = 2 end
|
|
||||||
if ports.c ~= vports.c then ignore.c = 2 end
|
|
||||||
if ports.d ~= vports.d then ignore.d = 2 end
|
|
||||||
|
|
||||||
mesecon:swap_node(pos, generate_name(ports, ignore))
|
|
||||||
mesecon:receptor_off(pos, rules_off)
|
|
||||||
if minetest.env:get_node(pos).name ~= generate_name(ports, ignore) then return end -- not interrupted by another event
|
|
||||||
mesecon:receptor_on (pos, rules_on )
|
|
||||||
if minetest.registered_nodes[minetest.env:get_node(pos).name].is_luacontroller then --didnt overheat
|
|
||||||
mesecon:swap_node(pos, newname)
|
mesecon:swap_node(pos, newname)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
@ -286,7 +290,7 @@ local reset_meta = function(pos, code, errmsg)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local reset = function (pos)
|
local reset = function (pos)
|
||||||
action(pos, {a=false, b=false, c=false, d=false})
|
action(pos, {a=false, b=false, c=false, d=false}, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- ______
|
-- ______
|
||||||
|
Loading…
Reference in New Issue
Block a user