From 16b925151127d2d38deb7d62ae2bceaebf271d23 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 27 May 2021 17:33:20 +0000 Subject: [PATCH] Add glow feature to signs, with three brightness levels --- api.lua | 41 +++++++++++++++++++++++++++++++++++++---- standard_signs.lua | 4 ++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/api.lua b/api.lua index e3a6df1..38af7b2 100644 --- a/api.lua +++ b/api.lua @@ -4,6 +4,8 @@ local S = signs_lib.gettext local function get_sign_formspec() end +signs_lib.glow_item = "basic_materials:energy_crystal_simple" + signs_lib.lbm_restore_nodes = {} signs_lib.old_fenceposts = {} signs_lib.old_fenceposts_replacement_signs = {} @@ -180,7 +182,7 @@ function signs_lib.delete_objects(pos) end end -function signs_lib.spawn_entity(pos, texture) +function signs_lib.spawn_entity(pos, texture, glow) local node = minetest.get_node(pos) local def = minetest.registered_items[node.name] if not def or not def.entity_info then return end @@ -229,6 +231,10 @@ function signs_lib.spawn_entity(pos, texture) end end + if glow ~= "" then + obj:set_properties({glow = tonumber(glow * 5)) + end + if yaw then obj:set_rotation({x = pitch, y = yaw, z=0}) @@ -247,14 +253,15 @@ function signs_lib.spawn_entity(pos, texture) end end -function signs_lib.set_obj_text(pos, text) +function signs_lib.set_obj_text(pos, text, glow) local split = signs_lib.split_lines_and_words local text_ansi = Utf8ToAnsi(text) local n = minetest.registered_nodes[minetest.get_node(pos).name] signs_lib.delete_objects(pos) -- only create sign entity for actual text if text_ansi and text_ansi ~= "" then - signs_lib.spawn_entity(pos, signs_lib.make_sign_texture(split(text_ansi), pos) ) + signs_lib.spawn_entity(pos, + signs_lib.make_sign_texture(split(text_ansi), pos), glow) end end @@ -707,6 +714,12 @@ function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing) end function signs_lib.destruct_sign(pos) + local meta = minetest.get_meta(pos) + local glow = meta:get_string("glow") + if glow ~= "" then + local num = tonumber(glow) + minetest.add_item(pos, ItemStack(signs_lib.glow_item .. " " .. num)) + end signs_lib.delete_objects(pos) end @@ -720,6 +733,24 @@ local function make_infotext(text) return table.concat(lines2, "\n") end +function signs_lib.glow(pos, node, puncher) + local tool = puncher:get_wielded_item() + if tool:get_name() == signs_lib.glow_item then + local meta = minetest.get_meta(pos) + local glow = tonumber(meta:get_string("glow")) + if not glow then + glow = 1 + elseif glow < 3 then + glow = glow + 1 + else + return -- already at brightest level + end + tool:take_item() + puncher:set_wielded_item(tool) + meta:set_string("glow", glow) + end +end + function signs_lib.update_sign(pos, fields) local meta = minetest.get_meta(pos) @@ -737,7 +768,9 @@ function signs_lib.update_sign(pos, fields) meta:set_string("text", text) meta:set_string("infotext", ownstr..make_infotext(text).." ") - signs_lib.set_obj_text(pos, text) + + local glow = meta:get_string("glow") + signs_lib.set_obj_text(pos, text, glow) end function signs_lib.can_modify(pos, player) diff --git a/standard_signs.lua b/standard_signs.lua index 8d7a9e7..ebc3f25 100644 --- a/standard_signs.lua +++ b/standard_signs.lua @@ -16,6 +16,10 @@ signs_lib.register_sign("default:sign_wall_wood", { allow_onpole_horizontal = true, allow_yard = true, use_texture_alpha = "clip", + on_punch = function(pos, node, puncher, pointed_thing) + signs_lib.glow(pos, node, puncher) + return signs_lib.update_sign + end }) signs_lib.register_sign("default:sign_wall_steel", {