From 96086f6627ab5d188671f0b05cfa038f0def43b7 Mon Sep 17 00:00:00 2001 From: Oversword Date: Mon, 11 Apr 2022 20:03:24 +0100 Subject: [PATCH 1/2] Allow specifying a port for digilines messages to be sent from the lua_controller --- mesecons_luacontroller/init.lua | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index 1c411dd..5140823 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -37,6 +37,14 @@ local rules = { d = {x = 0, y = 0, z = -1, name="D"}, } +local digiline_port_rules = {} +for port, rule in pairs(rules) do + digiline_port_rules[port] = { + rule, + vector.add(rule, {x=0,y=1,z=0}), + vector.add(rule, {x=0,y=-1,z=0}) + } +end ------------------ -- Action stuff -- @@ -429,7 +437,7 @@ local function get_digiline_send(pos, itbl, send_warning) if not minetest.global_exists("digilines") then return end local chan_maxlen = mesecon.setting("luacontroller_digiline_channel_maxlen", 256) local maxlen = mesecon.setting("luacontroller_digiline_maxlen", 50000) - return function(channel, msg) + return function(channel, msg, port) -- NOTE: This runs within string metatable sandbox, so don't *rely* on anything of the form (""):y -- or via anything that could. -- Make sure channel is string, number or boolean @@ -453,7 +461,7 @@ local function get_digiline_send(pos, itbl, send_warning) table.insert(itbl, function () -- Runs outside of string metatable sandbox local luac_id = minetest.get_meta(pos):get_int("luac_id") - mesecon.queue:add_action(pos, "lc_digiline_relay", {channel, luac_id, msg}) + mesecon.queue:add_action(pos, "lc_digiline_relay", {channel, luac_id, msg, port }) end) return true end @@ -715,13 +723,14 @@ mesecon.queue:add_function("lc_interrupt", function (pos, luac_id, iid) run(pos, {type="interrupt", iid = iid}) end) -mesecon.queue:add_function("lc_digiline_relay", function (pos, channel, luac_id, msg) +mesecon.queue:add_function("lc_digiline_relay", function (pos, channel, luac_id, msg, port) if not digiline then return end -- This check is only really necessary because in case of server crash, old actions can be thrown into the future if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end -- The actual work - digiline:receptor_send(pos, digiline.rules.default, channel, msg) + local send_rules = (port and digiline_port_rules[string.lower(port)]) or digilines.rules.default + digiline:receptor_send(pos, send_rules, channel, msg) end) ----------------------- From 4f2e9fd4f6743bd724ee2f79bc70dafe451383cb Mon Sep 17 00:00:00 2001 From: Oversword Date: Mon, 11 Apr 2022 20:05:15 +0100 Subject: [PATCH 2/2] Type check the port --- mesecons_luacontroller/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index 5140823..618b2b2 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -729,7 +729,7 @@ mesecon.queue:add_function("lc_digiline_relay", function (pos, channel, luac_id, if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end -- The actual work - local send_rules = (port and digiline_port_rules[string.lower(port)]) or digilines.rules.default + local send_rules = (port and type(port) == 'string' and digiline_port_rules[string.lower(port)]) or digilines.rules.default digiline:receptor_send(pos, send_rules, channel, msg) end)