summaryrefslogtreecommitdiff
path: root/mesecons_luacontroller
diff options
context:
space:
mode:
authorJeija <jeija@mesecons.net>2013-01-22 18:26:27 +0100
committerJeija <jeija@mesecons.net>2013-01-22 18:26:27 +0100
commit2b30360da23cedecdd45f2a8060d87a9e3038ac8 (patch)
tree5abbb78f96a2e87bcd96d28e2ce212f285a07fc7 /mesecons_luacontroller
parent18da94006af36bf200fc88f0dbd9aaa2270982db (diff)
downloadmesecons-2b30360da23cedecdd45f2a8060d87a9e3038ac8.tar
mesecons-2b30360da23cedecdd45f2a8060d87a9e3038ac8.tar.gz
mesecons-2b30360da23cedecdd45f2a8060d87a9e3038ac8.tar.bz2
mesecons-2b30360da23cedecdd45f2a8060d87a9e3038ac8.tar.xz
mesecons-2b30360da23cedecdd45f2a8060d87a9e3038ac8.zip
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.
Diffstat (limited to 'mesecons_luacontroller')
-rw-r--r--mesecons_luacontroller/init.lua50
1 files changed, 27 insertions, 23 deletions
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index 1967888..76e08bd 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -63,7 +63,21 @@ local generate_name = function (ports, overwrite)
return BASENAME..d..c..b..a
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 vports = minetest.registered_nodes[name].virtual_portstates
local newname = generate_name(ports)
@@ -73,27 +87,17 @@ local action = function (pos, ports)
local rules_off = {}
local ignore = {}
- if ports.a then table.insert(rules_on, rules.a)
- else table.insert(rules_off, rules.a) end
- if ports.b then table.insert(rules_on, rules.b)
- else table.insert(rules_off, rules.b) end
- if ports.c then table.insert(rules_on, rules.c)
- else table.insert(rules_off, rules.c) end
- if ports.d then table.insert(rules_on, rules.d)
- else table.insert(rules_off, rules.d) 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)
- end
+ local interrupted
+ if ports.a ~= vports.a then interrupted = setport(pos, rules.a, {a = 2}, ports.a, ports) end
+ if interrupted and not forcereset then return end
+ if ports.b ~= vports.b then interrupted = setport(pos, rules.b, {b = 2}, ports.b, ports) end
+ if interrupted and not forcereset then return end
+ if ports.c ~= vports.c then interrupted = setport(pos, rules.c, {c = 2}, ports.c, ports) end
+ if interrupted and not forcereset then return 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
+
+ mesecon:swap_node(pos, newname)
end
end
@@ -286,7 +290,7 @@ local reset_meta = function(pos, code, errmsg)
end
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
-- ______