]> git.lizzy.rs Git - signs_lib.git/blobdiff - init.lua
updated intllib method (po/pot files)
[signs_lib.git] / init.lua
index 11082964762feed193f0ee1f34398e4845bdfc45..5f3acfc0b06ffbe292c214136ba520c6a891e211 100644 (file)
--- a/init.lua
+++ b/init.lua
@@ -9,9 +9,11 @@
 --             { delta = {entity position for 270° yaw}, exact yaw expression }
 --             { delta = {entity position for 90° yaw}, exact yaw expression }
 -- }
+-- Made colored metal signs optionals
+local enable_colored_metal_signs = true
 
 -- CWz's keyword interact mod uses this setting.
-local current_keyword = minetest.setting_get("interact_keyword") or "iaccept"
+local current_keyword = minetest.settings:get("interact_keyword") or "iaccept"
 
 signs_lib = {}
 screwdriver = screwdriver or {}
@@ -31,6 +33,8 @@ end
 
 signs_lib.modpath = minetest.get_modpath("signs_lib")
 
+local DEFAULT_TEXT_SCALE = {x=0.8, y=0.5}
+
 signs_lib.regular_wall_sign_model = {
        nodebox = {
                type = "wallmounted",
@@ -109,25 +113,27 @@ signs_lib.sign_post_model = {
        }
 }
 
--- Boilerplate to support localized strings if intllib mod is installed.
-local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
+-- Load support for intllib.
+local MP = minetest.get_modpath(minetest.get_current_modname())
+local S, NS = dofile(MP.."/intllib.lua")
 signs_lib.gettext = S
 
 -- the list of standard sign nodes
 
 signs_lib.sign_node_list = {
-               "default:sign_wall_wood",
-               "signs:sign_yard",
-               "signs:sign_hanging",
-               "signs:sign_wall_green",
-               "signs:sign_wall_yellow",
-               "signs:sign_wall_red",
-               "signs:sign_wall_white_red",
-               "signs:sign_wall_white_black",
-               "signs:sign_wall_orange",
-               "signs:sign_wall_blue",
-               "signs:sign_wall_brown",
-               "locked_sign:sign_wall_locked"
+       "default:sign_wall_wood",
+       "default:sign_wall_steel",
+       "signs:sign_yard",
+       "signs:sign_hanging",
+       "signs:sign_wall_green",
+       "signs:sign_wall_yellow",
+       "signs:sign_wall_red",
+       "signs:sign_wall_white_red",
+       "signs:sign_wall_white_black",
+       "signs:sign_wall_orange",
+       "signs:sign_wall_blue",
+       "signs:sign_wall_brown",
+       "locked_sign:sign_wall_locked"
 }
 
 local default_sign, default_sign_image
@@ -160,7 +166,7 @@ end
 
 -- infinite stacks
 
-if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then
+if not minetest.settings:get_bool("creative_mode") then
        signs_lib.expect_infinite_stacks = false
 else
        signs_lib.expect_infinite_stacks = true
@@ -179,8 +185,6 @@ local FONT_FMT_SIMPLE = "hdf_%02x.png"
 -- Path to the textures.
 local TP = MP.."/textures"
 
-local TEXT_SCALE = {x=0.8, y=0.5}
-
 -- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza
 
 local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A)
@@ -304,14 +308,16 @@ local function fill_line(x, y, w, c)
        return table.concat(tex)
 end
 
-local function make_line_texture(line, lineno)
+local function make_line_texture(line, lineno, pos)
 
        local width = 0
        local maxw = 0
 
        local words = { }
+       local n = minetest.registered_nodes[minetest.get_node(pos).name]
+       local default_color = n.default_color or 0
 
-       local cur_color = 0
+       local cur_color = tonumber(default_color, 16)
 
        -- We check which chars are available here.
        for word_i, word in ipairs(line) do
@@ -392,12 +398,12 @@ local function make_line_texture(line, lineno)
        return table.concat(texture), lineno
 end
 
-local function make_sign_texture(lines)
+local function make_sign_texture(lines, pos)
        local texture = { ("[combine:%dx%d"):format(SIGN_WIDTH, LINE_HEIGHT * NUMBER_OF_LINES) }
        local lineno = 0
        for i = 1, #lines do
                if lineno >= NUMBER_OF_LINES then break end
-               local linetex, ln = make_line_texture(lines[i], lineno)
+               local linetex, ln = make_line_texture(lines[i], lineno, pos)
                table.insert(texture, linetex)
                lineno = ln + 1
        end
@@ -405,11 +411,13 @@ local function make_sign_texture(lines)
        return table.concat(texture, "")
 end
 
-local function set_obj_text(obj, text, new)
+local function set_obj_text(obj, text, new, pos)
        local split = new and split_lines_and_words or split_lines_and_words_old
+       local n = minetest.registered_nodes[minetest.get_node(pos).name]
+       local text_scale = (n and n.text_scale) or DEFAULT_TEXT_SCALE
        obj:set_properties({
-               textures={make_sign_texture(split(text))},
-               visual_size = TEXT_SCALE,
+               textures={make_sign_texture(split(text), pos)},
+               visual_size = text_scale,
        })
 end
 
@@ -466,7 +474,7 @@ signs_lib.update_sign = function(pos, fields, owner)
                        signs_lib.destruct_sign(pos)
                        meta:set_string("keyword", current_keyword)
                        local ownstr = ""
-                       if owner then ownstr = "Locked sign, owned by "..owner.."\n" end
+                       if owner then ownstr = S("Locked sign, owned by @1\n", owner) end
                        meta:set_string("infotext", ownstr..string.gsub(make_infotext(stored_text), "@KEYWORD", current_keyword).." ")
                end
        end
@@ -478,7 +486,7 @@ signs_lib.update_sign = function(pos, fields, owner)
                fields.text = trim_input(fields.text)
 
                local ownstr = ""
-               if owner then ownstr = "Locked sign, owned by "..owner.."\n" end
+               if owner then ownstr = S("Locked sign, owned by @1\n", owner) end
 
                meta:set_string("infotext", ownstr..string.gsub(make_infotext(fields.text), "@KEYWORD", current_keyword).." ")
                meta:set_string("text", fields.text)
@@ -498,7 +506,7 @@ signs_lib.update_sign = function(pos, fields, owner)
                        if found then
                                v:remove()
                        else
-                               set_obj_text(v, text, new)
+                               set_obj_text(v, text, new, pos)
                                found = true
                        end
                end
@@ -510,7 +518,11 @@ signs_lib.update_sign = function(pos, fields, owner)
        -- if there is no entity
        local sign_info
        local signnode = minetest.get_node(pos)
-       if signnode.name == "signs:sign_yard" then
+       local signname = signnode.name
+       local textpos = minetest.registered_nodes[signname].textpos
+       if textpos then
+               sign_info = textpos[minetest.get_node(pos).param2 + 1]
+       elseif signnode.name == "signs:sign_yard" then
                sign_info = signs_lib.yard_sign_model.textpos[minetest.get_node(pos).param2 + 1]
        elseif signnode.name == "signs:sign_hanging" then
                sign_info = signs_lib.hanging_sign_model.textpos[minetest.get_node(pos).param2 + 1]
@@ -560,8 +572,10 @@ function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked)
 
        local node=minetest.get_node(pointed_thing.under)
 
-       if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
-               return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack)
+       if minetest.registered_nodes[node.name] and
+          minetest.registered_nodes[node.name].on_rightclick and
+          not placer:get_player_control().sneak then
+               return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing)
        else
                local above = pointed_thing.above
                local under = pointed_thing.under
@@ -618,11 +632,12 @@ function signs_lib.receive_fields(pos, formname, fields, sender, lock)
                        sender:get_player_name())
                return
        end
-       local lockstr = lock and "locked " or ""
+       local lockstr = lock and S("locked ") or ""
        if fields and fields.text and fields.ok then
-               minetest.log("action", S("%s wrote \"%s\" to "..lockstr.."sign at %s"):format(
+               minetest.log("action", S("@1 wrote \"@2\" to @3sign at @4",
                        (sender:get_player_name() or ""),
                        fields.text,
+                       lockstr,
                        minetest.pos_to_string(pos)
                ))
                if lock then
@@ -753,10 +768,10 @@ minetest.register_node(":signs:sign_post", {
 
 -- Locked wall sign
 
-minetest.register_privilege("sign_editor", "Can edit all locked signs")
+minetest.register_privilege("sign_editor", S("Can edit all locked signs"))
 
 minetest.register_node(":locked_sign:sign_wall_locked", {
-       description = S("Sign"),
+       description = S("Locked Sign"),
        inventory_image = "signs_locked_inv.png",
        wield_image = "signs_locked_inv.png",
        node_placement_prediction = "",
@@ -780,7 +795,7 @@ minetest.register_node(":locked_sign:sign_wall_locked", {
                local meta = minetest.get_meta(pos)
                local owner = meta:get_string("owner")
                local pname = sender:get_player_name() or ""
-               if pname ~= owner and pname ~= minetest.setting_get("name")
+               if pname ~= owner and pname ~= minetest.settings:get("name")
                  and not minetest.check_player_privs(pname, {sign_editor=true}) then
                        return
                end
@@ -793,7 +808,7 @@ minetest.register_node(":locked_sign:sign_wall_locked", {
                local meta = minetest.get_meta(pos)
                local owner = meta:get_string("owner")
                local pname = player:get_player_name()
-               return pname == owner or pname == minetest.setting_get("name")
+               return pname == owner or pname == minetest.settings:get("name")
                        or minetest.check_player_privs(pname, {sign_editor=true})
        end,
        on_rotate = signs_lib.wallmounted_rotate
@@ -835,56 +850,69 @@ if minetest.registered_nodes["default:sign_wall_steel"] then
 end
 
 -- metal, colored signs
+if enable_colored_metal_signs then
+       -- array : color, translated color, default text color
+       local sign_colors = {
+               {"green",        S("green"),       "f"},
+               {"yellow",       S("yellow"),      "0"},
+               {"red",          S("red"),         "f"},
+               {"white_red",    S("white_red"),   "4"},
+               {"white_black",  S("white_black"), "0"},
+               {"orange",       S("orange"),      "0"},
+               {"blue",         S("blue"),        "f"},
+               {"brown",        S("brown"),       "f"},
+       }
 
-local sign_colors = { "green", "yellow", "red", "white_red", "white_black", "orange", "blue", "brown" }
-
-for _, color in ipairs(sign_colors) do
-       minetest.register_node(":signs:sign_wall_"..color, {
-               description = S("Sign ("..color..", metal)"),
-               inventory_image = "signs_"..color.."_inv.png",
-               wield_image = "signs_"..color.."_inv.png",
-               node_placement_prediction = "",
-               paramtype = "light",
-               sunlight_propagates = true,
-               paramtype2 = "facedir",
-               drawtype = "nodebox",
-               node_box = signs_lib.metal_wall_sign_model.nodebox,
-               tiles = {
-                       "signs_metal_tb.png",
-                       "signs_metal_tb.png",
-                       "signs_metal_sides.png",
-                       "signs_metal_sides.png",
-                       "signs_metal_back.png",
-                       "signs_"..color.."_front.png"
-               },
-               groups = sign_groups,
-               on_place = function(itemstack, placer, pointed_thing)
-                       return signs_lib.determine_sign_type(itemstack, placer, pointed_thing)
-               end,
-               on_construct = function(pos)
-                       signs_lib.construct_sign(pos)
-               end,
-               on_destruct = function(pos)
-                       signs_lib.destruct_sign(pos)
-               end,
-               on_receive_fields = function(pos, formname, fields, sender)
-                       signs_lib.receive_fields(pos, formname, fields, sender)
-               end,
-               on_punch = function(pos, node, puncher)
-                       signs_lib.update_sign(pos)
-               end,
-       })
+       for i, color in ipairs(sign_colors) do
+               minetest.register_node(":signs:sign_wall_"..color[1], {
+                       description = S("Sign (@1, metal)", color[2]),
+                       inventory_image = "signs_"..color[1].."_inv.png",
+                       wield_image = "signs_"..color[1].."_inv.png",
+                       node_placement_prediction = "",
+                       paramtype = "light",
+                       sunlight_propagates = true,
+                       paramtype2 = "facedir",
+                       drawtype = "nodebox",
+                       node_box = signs_lib.metal_wall_sign_model.nodebox,
+                       tiles = {
+                               "signs_metal_tb.png",
+                               "signs_metal_tb.png",
+                               "signs_metal_sides.png",
+                               "signs_metal_sides.png",
+                               "signs_metal_back.png",
+                               "signs_"..color[1].."_front.png"
+                       },
+                       default_color = color[3],
+                       groups = sign_groups,
+                       on_place = function(itemstack, placer, pointed_thing)
+                               return signs_lib.determine_sign_type(itemstack, placer, pointed_thing)
+                       end,
+                       on_construct = function(pos)
+                               signs_lib.construct_sign(pos)
+                       end,
+                       on_destruct = function(pos)
+                               signs_lib.destruct_sign(pos)
+                       end,
+                       on_receive_fields = function(pos, formname, fields, sender)
+                               signs_lib.receive_fields(pos, formname, fields, sender)
+                       end,
+                       on_punch = function(pos, node, puncher)
+                               signs_lib.update_sign(pos)
+                       end,
+               })
+       end
 end
 
 local signs_text_on_activate
 
 signs_text_on_activate = function(self)
-       local meta = minetest.get_meta(self.object:getpos())
+       local pos = self.object:getpos()
+       local meta = minetest.get_meta(pos)
        local text = meta:get_string("text")
        local new = (meta:get_int("__signslib_new_format") ~= 0)
        if text then
                text = trim_input(text)
-               set_obj_text(self.object, text, new)
+               set_obj_text(self.object, text, new, pos)
        end
 end
 
@@ -902,7 +930,7 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname)
     local def = minetest.registered_nodes[fencename]
     local def_sign = minetest.registered_nodes[fencewithsignname]
     if not (def and def_sign) then
-        minetest.log("warning", "[signs_lib] Attempt to register unknown node as fence")
+        minetest.log("warning", "[signs_lib] "..S("Attempt to register unknown node as fence"))
         return
     end
     def = signs_lib.table_copy(def)
@@ -928,7 +956,7 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname)
                end
 
                if def_under and def_under.on_rightclick then
-                       return def_under.on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack
+                       return def_under.on_rightclick(pointed_thing.under, node_under, placer, itemstack, pointed_thing) or itemstack
                elseif def_under and def_under.buildable_to then
                        minetest.add_node(pointed_thing.under, {name = fencename, param2 = fdir})
                        if not signs_lib.expect_infinite_stacks then
@@ -965,7 +993,7 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname)
        minetest.register_node(":"..fencename, def)
        minetest.register_node(":"..fencewithsignname, def_sign)
        table.insert(signs_lib.sign_node_list, fencewithsignname)
-       minetest.log("verbose", S("Registered %s and %s"):format(fencename, fencewithsignname))
+       minetest.log("verbose", S("Registered @1 and @2", fencename, fencewithsignname))
 end
 
 build_char_db()
@@ -999,7 +1027,7 @@ minetest.register_craft({
        }
 })
 
---Alternate recipes.
+--Alternate recipe
 
 minetest.register_craft({
        output = "locked_sign:sign_wall_locked",
@@ -1009,144 +1037,138 @@ minetest.register_craft({
     },
 })
 
-minetest.register_craft({
-       output = "locked_sign:sign_wall_locked",
-       recipe = {
-               {default_sign_metal},
-               {"default:steel_ingot"},
-    },
-})
-
 -- craft recipes for the metal signs
+if enable_colored_metal_signs then
 
-minetest.register_craft( {
-        output = "signs:sign_wall_green",
-        recipe = {
-                       { "dye:dark_green", "dye:white", "dye:dark_green" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_green",
+               recipe = {
+                               { "dye:dark_green", "dye:white", "dye:dark_green" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_green 2",
-        recipe = {
-                       { "dye:dark_green", "dye:white", "dye:dark_green" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_green 2",
+               recipe = {
+                               { "dye:dark_green", "dye:white", "dye:dark_green" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_yellow",
-        recipe = {
-                       { "dye:yellow", "dye:black", "dye:yellow" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_yellow",
+               recipe = {
+                               { "dye:yellow", "dye:black", "dye:yellow" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_yellow 2",
-        recipe = {
-                       { "dye:yellow", "dye:black", "dye:yellow" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_yellow 2",
+               recipe = {
+                               { "dye:yellow", "dye:black", "dye:yellow" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_red",
-        recipe = {
-                       { "dye:red", "dye:white", "dye:red" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_red",
+               recipe = {
+                               { "dye:red", "dye:white", "dye:red" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_red 2",
-        recipe = {
-                       { "dye:red", "dye:white", "dye:red" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_red 2",
+               recipe = {
+                               { "dye:red", "dye:white", "dye:red" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_white_red",
-        recipe = {
-                       { "dye:white", "dye:red", "dye:white" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_white_red",
+               recipe = {
+                               { "dye:white", "dye:red", "dye:white" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_white_red 2",
-        recipe = {
-                       { "dye:white", "dye:red", "dye:white" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_white_red 2",
+               recipe = {
+                               { "dye:white", "dye:red", "dye:white" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_white_black",
-        recipe = {
-                       { "dye:white", "dye:black", "dye:white" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_white_black",
+               recipe = {
+                               { "dye:white", "dye:black", "dye:white" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_white_black 2",
-        recipe = {
-                       { "dye:white", "dye:black", "dye:white" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_white_black 2",
+               recipe = {
+                               { "dye:white", "dye:black", "dye:white" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_orange",
-        recipe = {
-                       { "dye:orange", "dye:black", "dye:orange" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_orange",
+               recipe = {
+                               { "dye:orange", "dye:black", "dye:orange" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_orange 2",
-        recipe = {
-                       { "dye:orange", "dye:black", "dye:orange" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_orange 2",
+               recipe = {
+                               { "dye:orange", "dye:black", "dye:orange" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_blue",
-        recipe = {
-                       { "dye:blue", "dye:white", "dye:blue" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_blue",
+               recipe = {
+                               { "dye:blue", "dye:white", "dye:blue" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_blue 2",
-        recipe = {
-                       { "dye:blue", "dye:white", "dye:blue" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_blue 2",
+               recipe = {
+                               { "dye:blue", "dye:white", "dye:blue" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_brown",
-        recipe = {
-                       { "dye:brown", "dye:white", "dye:brown" },
-                       { "", default_sign_metal, "" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_brown",
+               recipe = {
+                               { "dye:brown", "dye:white", "dye:brown" },
+                               { "", default_sign_metal, "" }
+               },
+       })
 
-minetest.register_craft( {
-        output = "signs:sign_wall_brown 2",
-        recipe = {
-                       { "dye:brown", "dye:white", "dye:brown" },
-                       { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
-        },
-})
+       minetest.register_craft( {
+               output = "signs:sign_wall_brown 2",
+               recipe = {
+                               { "dye:brown", "dye:white", "dye:brown" },
+                               { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
+               },
+       })
+end
 
-if minetest.setting_get("log_mods") then
-       minetest.log("action", S("signs loaded"))
+if minetest.settings:get("log_mods") then
+       minetest.log("action", S("[MOD] signs loaded"))
 end