diff --git a/smartline/display.lua b/smartline/display.lua index 6ae1f93..61fb9d5 100644 --- a/smartline/display.lua +++ b/smartline/display.lua @@ -27,6 +27,11 @@ function display_update(pos, objref) visual_size = {x=0.94, y=0.94} }) end +local function on_timer(pos) + local meta = minetest.get_meta(pos) + display_lib.update_entities(pos) + return false +end local lcd_box = { type = "wallmounted", @@ -59,6 +64,7 @@ minetest.register_node("smartline:display", { display_lib.update_entities(pos) end, + on_timer = on_timer, on_place = display_lib.on_place, on_construct = display_lib.on_construct, on_destruct = display_lib.on_destruct, @@ -121,18 +127,25 @@ end tubelib.register_node("smartline:display", {}, { on_recv_message = function(pos, topic, payload) local node = minetest.get_node(pos) + local timer = minetest.get_node_timer(pos) if topic == "text" then -- add one line and scroll if necessary local meta = minetest.get_meta(pos) add_line(meta, payload) - display_lib.update_entities(pos) + if not timer:is_started() then + timer:start(2) + end elseif topic == "row" then -- overwrite the given row local meta = minetest.get_meta(pos) write_row(meta, payload) - display_lib.update_entities(pos) + if not timer:is_started() then + timer:start(2) + end elseif topic == "clear" then -- clear the screen local meta = minetest.get_meta(pos) meta:set_string("text", "") - display_lib.update_entities(pos) + if not timer:is_started() then + timer:start(2) + end end end, }) diff --git a/tubelib/command.lua b/tubelib/command.lua index 933281b..5415ebe 100644 --- a/tubelib/command.lua +++ b/tubelib/command.lua @@ -94,6 +94,20 @@ local function generate_Key2Number() end end +local function not_protected(pos, placer_name, clicker_name) + local meta = minetest.get_meta(pos) + if meta then + local cached_name = meta:get_string("tubelib_cached_name") + if placer_name and (placer_name == cached_name or not minetest.is_protected(pos, placer_name)) then + meta:set_string("tubelib_cached_name", placer_name) + if clicker_name == nil or not minetest.is_protected(pos, clicker_name) then + return true + end + end + end + return false +end + ------------------------------------------------------------------- -- API helper functions ------------------------------------------------------------------- @@ -224,11 +238,9 @@ function tubelib.send_message(numbers, placer_name, clicker_name, topic, payload for _,num in ipairs(string_split(numbers, " ")) do if Number2Pos[num] and Number2Pos[num].name then local data = Number2Pos[num] - if placer_name and not minetest.is_protected(data.pos, placer_name) then - if clicker_name == nil or not minetest.is_protected(data.pos, clicker_name) then - if tubelib_NodeDef[data.name] and tubelib_NodeDef[data.name].on_recv_message then - tubelib_NodeDef[data.name].on_recv_message(data.pos, topic, payload) - end + if not_protected(data.pos, placer_name, clicker_name) then + if tubelib_NodeDef[data.name] and tubelib_NodeDef[data.name].on_recv_message then + tubelib_NodeDef[data.name].on_recv_message(data.pos, topic, payload) end end end