X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=init.lua;h=5f3acfc0b06ffbe292c214136ba520c6a891e211;hb=96161c18dcaa5706f1235ee69f34da6466e3eee6;hp=11082964762feed193f0ee1f34398e4845bdfc45;hpb=5bbaa4f294dd31d1f14da9e2e3ee9ade7f346d41;p=signs_lib.git diff --git a/init.lua b/init.lua index 1108296..5f3acfc 100644 --- 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