From 5515baae66050ff61fc5a32bb0445120aa48db6d Mon Sep 17 00:00:00 2001 From: David Hurka Date: Sat, 19 Dec 2020 16:54:42 +0100 Subject: [PATCH 1/4] Cherry-pick: Try using node timers --- api.lua | 11 +++++++++-- init.lua | 6 ++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/api.lua b/api.lua index dfeedab..e7ecc22 100644 --- a/api.lua +++ b/api.lua @@ -16,8 +16,15 @@ light_tool.light_beam = function(pos, dir, range) local lightable = light_tool.check(light_tool.lightable_nodes, node.name) local lightable_index = light_tool.check_index(light_tool.lightable_nodes, node.name) local lit = light_tool.check(light_tool.lit_nodes, node.name) - if node.name == "air" or node.name == "light_tool:light" then - minetest.set_node(new_pos, {name = "light_tool:light"}) + + if node.name == "air" then + -- Place temporary light nodes in air: + minetest.set_node(new_pos, {name = "light_tool:light"}) + minetest.get_node_timer(new_pos):start(0.2) + light_positions[i] = new_pos + elseif node.name == "light_tool:light" then + -- Reset destruction timer for this light node: + minetest.get_node_timer(new_pos):start(0.2) elseif lightable or node.name == lit then local index = light_tool.check_index(light_tool.lightable_nodes, node.name) diff --git a/init.lua b/init.lua index cf8ee1f..08d6061 100644 --- a/init.lua +++ b/init.lua @@ -18,10 +18,8 @@ minetest.register_node("light_tool:light", { light_source = 8, pointable = false, buildable_to = true, - on_construct = function(pos) - minetest.after(0.1, function() - minetest.set_node(pos, {name = "air"}) - end) + on_timer = function(pos) + minetest.set_node(pos, {name = "air"}) end, }) From dd8fdb443cb44de53494ebc0e09928a8f1b04549 Mon Sep 17 00:00:00 2001 From: David Hurka Date: Sat, 19 Dec 2020 18:48:20 +0100 Subject: [PATCH 2/4] Document new behavior of light_tool:light --- api.lua | 1 - init.lua | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/api.lua b/api.lua index e7ecc22..e6b5ef7 100644 --- a/api.lua +++ b/api.lua @@ -21,7 +21,6 @@ light_tool.light_beam = function(pos, dir, range) -- Place temporary light nodes in air: minetest.set_node(new_pos, {name = "light_tool:light"}) minetest.get_node_timer(new_pos):start(0.2) - light_positions[i] = new_pos elseif node.name == "light_tool:light" then -- Reset destruction timer for this light node: minetest.get_node_timer(new_pos):start(0.2) diff --git a/init.lua b/init.lua index 08d6061..dc5f91a 100644 --- a/init.lua +++ b/init.lua @@ -9,6 +9,9 @@ minetest.register_tool("light_tool:light_tool", { }) light_tool.add_tool("light_tool:light_tool", 20) +-- This is a temporary light source which forms the light beam of a flashlight. +-- When you constructed it, call minetest.get_node_timer(pos):start(lifetime) to make it delete itself. +-- Call start() again to extend the lifetime. minetest.register_node("light_tool:light", { drawtype = "airlike", tiles = {"blank.png"}, From 4cd641c7a57b2be6a812beeb07b5f2154307adf0 Mon Sep 17 00:00:00 2001 From: David Hurka Date: Sat, 19 Dec 2020 19:21:10 +0100 Subject: [PATCH 3/4] Same for glow nodes. I observe a bit weird behavior on flowing water. --- api.lua | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/api.lua b/api.lua index e6b5ef7..f26654d 100644 --- a/api.lua +++ b/api.lua @@ -14,7 +14,6 @@ light_tool.light_beam = function(pos, dir, range) local lightable = light_tool.check(light_tool.lightable_nodes, node.name) - local lightable_index = light_tool.check_index(light_tool.lightable_nodes, node.name) local lit = light_tool.check(light_tool.lit_nodes, node.name) if node.name == "air" then @@ -22,13 +21,16 @@ light_tool.light_beam = function(pos, dir, range) minetest.set_node(new_pos, {name = "light_tool:light"}) minetest.get_node_timer(new_pos):start(0.2) elseif node.name == "light_tool:light" then - -- Reset destruction timer for this light node: + -- Extend lifetime for this light node: + minetest.get_node_timer(new_pos):start(0.2) + elseif lightable then + -- Place temporary glow node in lightable node: + local index = light_tool.check_index(light_tool.lightable_nodes, node.name) + minetest.set_node(new_pos, {name = light_tool.lightable_nodes[index].."_glowing"}) + minetest.get_node_timer(new_pos):start(0.2) + elseif node.name == lit then + -- Extend lifetime for this glow node: minetest.get_node_timer(new_pos):start(0.2) - elseif lightable or node.name == lit then - - local index = light_tool.check_index(light_tool.lightable_nodes, node.name) - minetest.set_node(new_pos, {name = light_tool.lightable_nodes[index].."_glowing"}) - elseif node.name and minetest.registered_nodes[node.name].sunlight_propagates == false and not lightable and not lit then break end @@ -49,17 +51,22 @@ light_tool.register_glow_node = function(name) return end + -- The following creates a temporary light source definition, which forms the light beam of a flashlight. + -- When you constructed such nodes, call minetest.get_node_timer(pos):start(lifetime) to make it delete itself. + -- Call start() again to extend the lifetime. local node = minetest.registered_nodes[name] local def = table.copy(node) def.paramtype = "light" def.light_source = 4 - def.on_construct = function(pos) - minetest.after(0.1, function() - minetest.set_node(pos, {name = name}) - end) - end - + def.on_timer = function(pos) + minetest.set_node(pos, {name = name}) + end + + minetest.register_node(":"..name.."_glowing", def) + table.insert(light_tool.lightable_nodes, name) + table.insert(light_tool.lit_nodes, name.."_glowing") + minetest.register_lbm({ name = ":"..name.."_glowing_removal", nodenames = {name.."_glowing"}, @@ -68,9 +75,6 @@ light_tool.register_glow_node = function(name) minetest.set_node(pos, {name = name}) end, }) - minetest.register_node(":"..name.."_glowing", def) - table.insert(light_tool.lightable_nodes, name) - table.insert(light_tool.lit_nodes, name.."_glowing") end light_tool.directional_pos = function(pos, direction, multiplier, addition) if addition == nil then From 45f79770a019954196f71ba0462a713263927407 Mon Sep 17 00:00:00 2001 From: David Hurka Date: Sat, 19 Dec 2020 22:13:02 +0100 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"Same=20for=20glow=20nodes."=20Jus?= =?UTF-8?q?t=20doesn=E2=80=99t=20work.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4cd641c7a57b2be6a812beeb07b5f2154307adf0. --- api.lua | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/api.lua b/api.lua index f26654d..e6b5ef7 100644 --- a/api.lua +++ b/api.lua @@ -14,6 +14,7 @@ light_tool.light_beam = function(pos, dir, range) local lightable = light_tool.check(light_tool.lightable_nodes, node.name) + local lightable_index = light_tool.check_index(light_tool.lightable_nodes, node.name) local lit = light_tool.check(light_tool.lit_nodes, node.name) if node.name == "air" then @@ -21,16 +22,13 @@ light_tool.light_beam = function(pos, dir, range) minetest.set_node(new_pos, {name = "light_tool:light"}) minetest.get_node_timer(new_pos):start(0.2) elseif node.name == "light_tool:light" then - -- Extend lifetime for this light node: - minetest.get_node_timer(new_pos):start(0.2) - elseif lightable then - -- Place temporary glow node in lightable node: - local index = light_tool.check_index(light_tool.lightable_nodes, node.name) - minetest.set_node(new_pos, {name = light_tool.lightable_nodes[index].."_glowing"}) - minetest.get_node_timer(new_pos):start(0.2) - elseif node.name == lit then - -- Extend lifetime for this glow node: + -- Reset destruction timer for this light node: minetest.get_node_timer(new_pos):start(0.2) + elseif lightable or node.name == lit then + + local index = light_tool.check_index(light_tool.lightable_nodes, node.name) + minetest.set_node(new_pos, {name = light_tool.lightable_nodes[index].."_glowing"}) + elseif node.name and minetest.registered_nodes[node.name].sunlight_propagates == false and not lightable and not lit then break end @@ -51,22 +49,17 @@ light_tool.register_glow_node = function(name) return end - -- The following creates a temporary light source definition, which forms the light beam of a flashlight. - -- When you constructed such nodes, call minetest.get_node_timer(pos):start(lifetime) to make it delete itself. - -- Call start() again to extend the lifetime. local node = minetest.registered_nodes[name] local def = table.copy(node) def.paramtype = "light" def.light_source = 4 - def.on_timer = function(pos) - minetest.set_node(pos, {name = name}) - end - - minetest.register_node(":"..name.."_glowing", def) - table.insert(light_tool.lightable_nodes, name) - table.insert(light_tool.lit_nodes, name.."_glowing") - + def.on_construct = function(pos) + minetest.after(0.1, function() + minetest.set_node(pos, {name = name}) + end) + end + minetest.register_lbm({ name = ":"..name.."_glowing_removal", nodenames = {name.."_glowing"}, @@ -75,6 +68,9 @@ light_tool.register_glow_node = function(name) minetest.set_node(pos, {name = name}) end, }) + minetest.register_node(":"..name.."_glowing", def) + table.insert(light_tool.lightable_nodes, name) + table.insert(light_tool.lit_nodes, name.."_glowing") end light_tool.directional_pos = function(pos, direction, multiplier, addition) if addition == nil then