Compare commits

...

17 Commits

Author SHA1 Message Date
1d98c6a5cc Add Ukrainian localization (#36) 2025-03-14 20:54:09 -04:00
87d65439a1 Convert CR(LF)s to LFs (#32) 2024-09-06 19:04:15 -04:00
4309b3575a Fix placing certain signs (#29)
* Fix placing certain signs

This fixes https://github.com/mt-mods/signs_lib/issues/1 by removing node extensions before placing, just incase player got a hold of certain sign nodes they shouldnt have.

* fix typo

fix typo
2024-06-03 18:10:42 -04:00
bb13ba6d7c Add support for Ukrainian-specific Cyrillic letters (#30) 2024-05-29 18:21:33 -04:00
3d5ba32fa0 Fix out-of-bounds textures in [combine (#28) 2024-04-22 21:50:06 +10:00
0847176bdb Revert "Fix out-of-bounds textures in [combine (#27)"
This reverts commit 4fb53b67e8.
2024-04-19 17:52:33 +10:00
4fb53b67e8 Fix out-of-bounds textures in [combine (#27) 2024-04-19 13:44:16 +10:00
e5f73438ce make signs non ground content (#26) 2024-02-29 18:48:31 -05:00
e387808065 Fix warnings (mt 5.8+) due to disallowed filenames (#23)
* Fix warnings (mt 5.8+) due to disallowed filenames

* Don't ship blend files to cdb users
2023-10-15 12:34:26 -04:00
1c881d6f22 add initial_properties (#22)
* add initial_properties

Adds initial_properties update so that 5.7dev doesn't throw an error when entering text on signs.

* Remove newline

---------

Co-authored-by: Niklp <89982526+Niklp09@users.noreply.github.com>
2023-09-25 13:50:55 +02:00
cd6bf1eabe Complete Spanish translation (#21) 2023-07-09 20:08:59 -04:00
1dd01e3bc6 Make missing strings translatable, update locale files and German (#19)
* Make a bunch of strings translatable

* Update locale files

* Update German translation
2023-07-04 13:03:49 -04:00
ed3a679bca don't emit translation strings to the log (#17)
* don't emit translation strings to the log

* fix luacheck

* don't double-log signs_lib prefix
2022-12-10 14:36:58 -05:00
5ae111e1fa fix unconditional access to default global (#16)
Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
2022-11-25 21:33:34 +01:00
aff005e745 handle interactions w/ explosions (#14)
* prevent signs entities from being destroyed

* handle tnt destroying a sign

* remove redundant destructor call
2022-10-26 20:01:27 -04:00
3d0e8d47e6 add setting for custom edit priv (#15)
* add setting for custom edit priv

* fix indent

* hmm maybe now?
2022-10-26 20:00:43 -04:00
8aafe6608c update API.md 2022-07-21 11:47:07 +02:00
40 changed files with 197 additions and 177 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
util/blender export-ignore

4
API.md
View File

@ -236,7 +236,7 @@ signs_lib.register_sign("basic_signs:sign_wall_glass", {
allow_onpole = true, allow_onpole = true,
allow_onpole_horizontal = true, allow_onpole_horizontal = true,
allow_yard = true, allow_yard = true,
use_texture_alpha = true, use_texture_alpha = "blend",
}) })
``` ```
@ -250,7 +250,7 @@ signs_lib.register_sign("basic_signs:sign_wall_glass", {
* `signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)` * `signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)`
Open the default sign formspec, if the player has the `signslib_edit` privilege. Open the default sign formspec, if the player has the `signslib_edit` privilege. (privilege can be set by `signs_lib.edit_priv` setting)
* `signs_lib.destruct_sign(pos)` * `signs_lib.destruct_sign(pos)`

View File

@ -67,3 +67,4 @@ The list of loaded, sign-bearing blocks is created/populated by an LBM (and trim
* `signslib_edit` * `signslib_edit`
Allows to rotate signs and to open (and consequently edit) any default sign formspec. Allows to rotate signs and to open (and consequently edit) any default sign formspec.
(privilege can be set by `signs_lib.edit_priv` setting)

145
api.lua
View File

@ -1,6 +1,12 @@
-- signs_lib api, backported from street_signs -- signs_lib api, backported from street_signs
local S = signs_lib.S local S = signs_lib.S
local FS = function(...) return minetest.formspec_escape(S(...)) end
local has_default_mod = minetest.get_modpath("default")
local function log(level, messagefmt, ...)
minetest.log(level, "[signs_lib] " .. messagefmt:format(...))
end
local function get_sign_formspec() end local function get_sign_formspec() end
@ -21,14 +27,14 @@ signs_lib.standard_xoffs = 4
signs_lib.standard_yoffs = 0 signs_lib.standard_yoffs = 0
signs_lib.standard_cpl = 35 signs_lib.standard_cpl = 35
signs_lib.standard_wood_groups = table.copy(default and minetest.registered_items["default:sign_wall_wood"].groups or {}) signs_lib.standard_wood_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].groups or {})
signs_lib.standard_wood_groups.attached_node = nil signs_lib.standard_wood_groups.attached_node = nil
signs_lib.standard_steel_groups = table.copy(default and minetest.registered_items["default:sign_wall_steel"].groups or {}) signs_lib.standard_steel_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].groups or {})
signs_lib.standard_steel_groups.attached_node = nil signs_lib.standard_steel_groups.attached_node = nil
signs_lib.standard_wood_sign_sounds = table.copy(default and minetest.registered_items["default:sign_wall_wood"].sounds or {}) signs_lib.standard_wood_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].sounds or {})
signs_lib.standard_steel_sign_sounds = table.copy(default and minetest.registered_items["default:sign_wall_steel"].sounds or {}) signs_lib.standard_steel_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].sounds or {})
signs_lib.default_text_scale = {x=10, y=10} signs_lib.default_text_scale = {x=10, y=10}
@ -160,18 +166,23 @@ local ctexcache_wide = {}
-- entity handling -- entity handling
minetest.register_entity("signs_lib:text", { minetest.register_entity("signs_lib:text", {
collisionbox = { 0, 0, 0, 0, 0, 0 }, initial_properties = {
visual = "mesh", collisionbox = { 0, 0, 0, 0, 0, 0 },
mesh = "signs_lib_standard_sign_entity_wall.obj", visual = "mesh",
textures = {}, mesh = "signs_lib_standard_sign_entity_wall.obj",
static_save = true, textures = {},
backface_culling = false, static_save = true,
backface_culling = false,
},
on_activate = function(self) on_activate = function(self)
local node = minetest.get_node(self.object:get_pos()) local node = minetest.get_node(self.object:get_pos())
if minetest.get_item_group(node.name, "sign") == 0 then if minetest.get_item_group(node.name, "sign") == 0 then
self.object:remove() self.object:remove()
end end
end, end,
on_blast = function(self, damage)
return false, false, {}
end,
}) })
function signs_lib.delete_objects(pos) function signs_lib.delete_objects(pos)
@ -459,8 +470,8 @@ local math_max = math.max
local function fill_line(x, y, w, c, font_size, colorbgw) local function fill_line(x, y, w, c, font_size, colorbgw)
c = c or "0" c = c or "0"
local tex = { } local tex = { }
for xx = 0, math.max(0, w), colorbgw do for xx = x, w, colorbgw do
table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(x + xx, y, c)) table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(xx, y, c))
end end
return table.concat(tex) return table.concat(tex)
end end
@ -572,8 +583,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
end end
end end
if w then if w then
width = width + w + 1 width = width + w
if width >= (line_width - cwidth_tab[" "]) then if width > line_width then
width = 0 width = 0
else else
maxw = math_max(width, maxw) maxw = math_max(width, maxw)
@ -596,6 +607,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
off = ch_offs, off = ch_offs,
tex = tex, tex = tex,
col = ("%X"):format(cur_color), col = ("%X"):format(cur_color),
w = w,
}) })
end end
ch_offs = ch_offs + w ch_offs = ch_offs + w
@ -604,8 +616,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
else else
local w = cwidth_tab[c] local w = cwidth_tab[c]
if w then if w then
width = width + w + 1 width = width + w
if width >= (line_width - cwidth_tab[" "]) then if width > line_width then
width = 0 width = 0
else else
maxw = math_max(width, maxw) maxw = math_max(width, maxw)
@ -615,6 +627,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
off = ch_offs, off = ch_offs,
tex = char_tex(font_name, c), tex = char_tex(font_name, c),
col = ("%X"):format(cur_color), col = ("%X"):format(cur_color),
w = w,
}) })
end end
ch_offs = ch_offs + w ch_offs = ch_offs + w
@ -622,7 +635,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
end end
i = i + 1 i = i + 1
end end
width = width + cwidth_tab[" "] + 1 width = width + cwidth_tab[" "]
maxw = math_max(width, maxw) maxw = math_max(width, maxw)
table.insert(words, { chars=chars, w=ch_offs }) table.insert(words, { chars=chars, w=ch_offs })
end end
@ -631,7 +644,8 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
local texture = { } local texture = { }
local start_xpos = math.floor((line_width - maxw) / 2) + def.x_offset local start_xpos = math.max(0, math.floor((line_width - maxw) / 2)) + def.x_offset
local end_xpos = math.min(start_xpos + maxw, line_width)
local xpos = start_xpos local xpos = start_xpos
local ypos = (line_height + def.line_spacing)* lineno + def.y_offset local ypos = (line_height + def.line_spacing)* lineno + def.y_offset
@ -640,31 +654,33 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi
for word_i, word in ipairs(words) do for word_i, word in ipairs(words) do
local xoffs = (xpos - start_xpos) local xoffs = (xpos - start_xpos)
if (xoffs > 0) and ((xoffs + word.w) > maxw) then if (xoffs > 0) and ((xoffs + word.w) > end_xpos) then
table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw))
xpos = start_xpos xpos = start_xpos
ypos = ypos + line_height + def.line_spacing ypos = ypos + line_height + def.line_spacing
lineno = lineno + 1 lineno = lineno + 1
if lineno >= def.number_of_lines then break end if lineno >= def.number_of_lines then break end
table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw)) table.insert(texture, fill_line(xpos, ypos, end_xpos, cur_color, font_size, colorbgw))
end end
for ch_i, ch in ipairs(word.chars) do for ch_i, ch in ipairs(word.chars) do
if xpos + ch.off + ch.w > end_xpos then
table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, "n", font_size, colorbgw))
break
end
if ch.col ~= cur_color then if ch.col ~= cur_color then
cur_color = ch.col cur_color = ch.col
table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color, font_size, colorbgw)) table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, cur_color, font_size, colorbgw))
end end
table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex))
end end
table.insert( xpos = xpos + word.w
texture, if xpos < end_xpos then
(":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ") table.insert(texture, (":%d,%d="):format(xpos, ypos) .. char_tex(font_name, " "))
) xpos = xpos + cwidth_tab[" "]
xpos = xpos + word.w + cwidth_tab[" "] end
if xpos >= (line_width + cwidth_tab[" "]) then break end
end end
table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw))
table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw))
return table.concat(texture), lineno return table.concat(texture), lineno
end end
@ -742,6 +758,15 @@ function signs_lib.destruct_sign(pos)
signs_lib.delete_objects(pos) signs_lib.delete_objects(pos)
end end
function signs_lib.blast_sign(pos, intensity)
if signs_lib.can_modify(pos, "") then
local node = minetest.get_node(pos)
local drops = minetest.get_node_drops(node, "tnt:blast")
minetest.remove_node(pos)
return drops
end
end
local function make_infotext(text) local function make_infotext(text)
text = trim_input(text) text = trim_input(text)
local lines = signs_lib.split_lines_and_words(text) or {} local lines = signs_lib.split_lines_and_words(text) or {}
@ -793,6 +818,9 @@ function signs_lib.update_sign(pos, fields)
local ownstr = "" local ownstr = ""
if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end
-- Fix pasting from Windows: CR instead of LF
text = string.gsub(text, "\r\n?", "\n")
meta:set_string("text", text) meta:set_string("text", text)
meta:set_string("infotext", ownstr..make_infotext(text).." ") meta:set_string("infotext", ownstr..make_infotext(text).." ")
@ -803,7 +831,16 @@ end
function signs_lib.can_modify(pos, player) function signs_lib.can_modify(pos, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
local playername = player:get_player_name() local playername
if type(player) == "userdata" then
playername = player:get_player_name()
elseif type(player) == "string" then
playername = player
else
playername = ""
end
if minetest.is_protected(pos, playername) then if minetest.is_protected(pos, playername) then
minetest.record_protection_violation(pos, playername) minetest.record_protection_violation(pos, playername)
@ -812,7 +849,7 @@ function signs_lib.can_modify(pos, player)
if owner == "" if owner == ""
or playername == owner or playername == owner
or (minetest.check_player_privs(playername, {signslib_edit=true})) or minetest.get_player_privs(playername)[signs_lib.edit_priv]
or (playername == minetest.settings:get("name")) then or (playername == minetest.settings:get("name")) then
return true return true
end end
@ -909,7 +946,13 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke
local controls = placer:get_player_control() local controls = placer:get_player_control()
local signname = itemstack:get_name() local signname = itemstack:get_name()
-- in case player has sign nodes they shouldn't, remove extensions for normal sign
local no_wall_name = string.gsub(signname, "_wall", "") local no_wall_name = string.gsub(signname, "_wall", "")
no_wall_name = string.gsub(no_wall_name, "_yard", "")
no_wall_name = string.gsub(no_wall_name, "_hanging", "")
no_wall_name = string.gsub(no_wall_name, "_onpole_horiz", "")
no_wall_name = string.gsub(no_wall_name, "_onpole", "")
local def = minetest.registered_items[signname] local def = minetest.registered_items[signname]
@ -951,7 +994,7 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke
end end
function signs_lib.register_fence_with_sign() function signs_lib.register_fence_with_sign()
minetest.log("warning", "[signs_lib] ".."Attempt to call no longer used function signs_lib.register_fence_with_sign()") log("warning", "Attempt to call no longer used function signs_lib.register_fence_with_sign()")
end end
local use_glow = function(pos, node, puncher, pointed_thing) local use_glow = function(pos, node, puncher, pointed_thing)
@ -973,6 +1016,7 @@ end
function signs_lib.register_sign(name, raw_def) function signs_lib.register_sign(name, raw_def)
local def = table.copy(raw_def) local def = table.copy(raw_def)
def.is_ground_content = false
if raw_def.entity_info == "standard" then if raw_def.entity_info == "standard" then
def.entity_info = { def.entity_info = {
@ -984,6 +1028,7 @@ function signs_lib.register_sign(name, raw_def)
end end
def.after_place_node = raw_def.after_place_node or signs_lib.after_place_node def.after_place_node = raw_def.after_place_node or signs_lib.after_place_node
def.on_blast = raw_def.on_blast or signs_lib.blast_sign
if raw_def.entity_info then if raw_def.entity_info then
@ -1251,7 +1296,7 @@ minetest.register_lbm({
minetest.register_chatcommand("regen_signs", { minetest.register_chatcommand("regen_signs", {
params = "", params = "",
privs = {server = true}, privs = {server = true},
description = "Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.", description = S("Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any."),
func = function(player_name, params) func = function(player_name, params)
local allsigns = {} local allsigns = {}
local totalsigns = 0 local totalsigns = 0
@ -1270,13 +1315,13 @@ minetest.register_chatcommand("regen_signs", {
end end
if signs_lib.totalblocks < 0 then signs_lib.totalblocks = 0 end if signs_lib.totalblocks < 0 then signs_lib.totalblocks = 0 end
if totalsigns == 0 then if totalsigns == 0 then
minetest.chat_send_player(player_name, "There are no signs in the currently-loaded terrain.") minetest.chat_send_player(player_name, S("There are no signs in the currently-loaded terrain."))
signs_lib.block_list = {} signs_lib.block_list = {}
return return
end end
minetest.chat_send_player(player_name, "Found a total of "..totalsigns.." sign nodes across "..signs_lib.totalblocks.." blocks.") minetest.chat_send_player(player_name, S("Found a total of @1 sign nodes across @2 blocks.", totalsigns, signs_lib.totalblocks))
minetest.chat_send_player(player_name, "Regenerating sign entities...") minetest.chat_send_player(player_name, S("Regenerating sign entities ..."))
for _, b in pairs(allsigns) do for _, b in pairs(allsigns) do
for _, pos in ipairs(b) do for _, pos in ipairs(b) do
@ -1288,11 +1333,15 @@ minetest.register_chatcommand("regen_signs", {
end end
end end
end end
minetest.chat_send_player(player_name, "Finished.") minetest.chat_send_player(player_name, S("Finished."))
end end
}) })
minetest.register_privilege("signslib_edit", {}) minetest.register_on_mods_loaded(function()
if not minetest.registered_privileges[signs_lib.edit_priv] then
minetest.register_privilege("signslib_edit", {})
end
end)
@ -1312,14 +1361,14 @@ function get_sign_formspec(pos, nodename)
"image[0.1,2.4;7,1;signs_lib_sign_color_palette.png]", "image[0.1,2.4;7,1;signs_lib_sign_color_palette.png]",
"textarea[0.15,-0.2;6.3,2.8;text;;" .. minetest.formspec_escape(txt) .. "]", "textarea[0.15,-0.2;6.3,2.8;text;;" .. minetest.formspec_escape(txt) .. "]",
"button_exit[3.7,3.4;2,1;ok;" .. S("Write") .. "]", "button_exit[3.7,3.4;2,1;ok;" .. S("Write") .. "]",
"label[0.3,3.4;Unicode font]", "label[0.3,3.4;"..FS("Unicode font").."]",
"image_button[0.6,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;uni_" "image_button[0.6,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;uni_"
.. state .. ";;;false;signs_lib_switch_interm.png]", .. state .. ";;;false;signs_lib_switch_interm.png]",
} }
if minetest.registered_nodes[nodename].allow_widefont then if minetest.registered_nodes[nodename].allow_widefont then
state = meta:get_int("widefont") == 1 and "on" or "off" state = meta:get_int("widefont") == 1 and "on" or "off"
formspec[#formspec+1] = "label[2.1,3.4;Wide font]" formspec[#formspec+1] = "label[2.1,3.4;"..FS("Wide font").."]"
formspec[#formspec+1] = "image_button[2.3,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;wide_" formspec[#formspec+1] = "image_button[2.3,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;wide_"
.. state .. ";;;false;signs_lib_switch_interm.png]" .. state .. ";;;false;signs_lib_switch_interm.png]"
end end
@ -1337,11 +1386,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local playername = player:get_player_name() local playername = player:get_player_name()
if fields.text and fields.ok then if fields.text and fields.ok then
minetest.log("action", S("@1 wrote \"@2\" to sign at @3", log("action", "%s wrote %q to sign at %s",
(playername or ""), (playername or ""),
fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"), fields.text:gsub("\n", "\\n"),
pos_string pos_string
)) )
signs_lib.update_sign(pos, fields) signs_lib.update_sign(pos, fields)
elseif fields.wide_on or fields.wide_off or fields.uni_on or fields.uni_off then elseif fields.wide_on or fields.wide_off or fields.uni_on or fields.uni_off then
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
@ -1365,20 +1414,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
if change_wide then if change_wide then
minetest.log("action", S("@1 flipped the wide-font switch to \"@2\" at @3", log("action", "%s flipped the wide-font switch to %q at %s",
(playername or ""), (playername or ""),
(fields.wide_on and "off" or "on"), (fields.wide_on and "off" or "on"),
minetest.pos_to_string(pos) minetest.pos_to_string(pos)
)) )
signs_lib.update_sign(pos, fields) signs_lib.update_sign(pos, fields)
minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name))
end end
if change_uni then if change_uni then
minetest.log("action", S("@1 flipped the unicode-font switch to \"@2\" at @3", log("action", "%s flipped the unicode-font switch to %q at %s",
(playername or ""), (playername or ""),
(fields.uni_on and "off" or "on"), (fields.uni_on and "off" or "on"),
minetest.pos_to_string(pos) minetest.pos_to_string(pos)
)) )
signs_lib.update_sign(pos, fields) signs_lib.update_sign(pos, fields)
minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name))
end end

View File

@ -231,6 +231,7 @@ signs_lib.unicode_install({38,"26"})
dofile(signs_lib.path.."/nonascii-de.lua") dofile(signs_lib.path.."/nonascii-de.lua")
dofile(signs_lib.path.."/nonascii-fr.lua") dofile(signs_lib.path.."/nonascii-fr.lua")
dofile(signs_lib.path.."/nonascii-pl.lua") dofile(signs_lib.path.."/nonascii-pl.lua")
dofile(signs_lib.path.."/nonascii-ua.lua")
local nmdc = { local nmdc = {
[36] = "$", [36] = "$",

View File

@ -9,6 +9,8 @@ signs_lib.path = minetest.get_modpath(minetest.get_current_modname())
signs_lib.S = minetest.get_translator(minetest.get_current_modname()) signs_lib.S = minetest.get_translator(minetest.get_current_modname())
signs_lib.edit_priv = minetest.settings:get("signs_lib.edit_priv") or "signslib_edit"
dofile(signs_lib.path.."/encoding.lua") dofile(signs_lib.path.."/encoding.lua")
dofile(signs_lib.path.."/api.lua") dofile(signs_lib.path.."/api.lua")
dofile(signs_lib.path.."/standard_signs.lua") dofile(signs_lib.path.."/standard_signs.lua")

View File

@ -1,27 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n=gesperrter Schild, gehört @1@n Locked sign, owned by @1@n=Abgeschlossenes Schild, gehört @1@n
Write=schreiben Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Iteriert durch alle derzeit geladenen Kartenblöcke, die Schilder enthalten, löscht alle Entities innerhalb des Node-Raums eines jeden Schildes und erzeugt ihre Text-Entities, falls vorhanden, neu.
@1 wrote "@2" to sign at @3= There are no signs in the currently-loaded terrain.=Im derzeit geladenen Gelände befinden sich keine Schilder.
@1 flipped the wide-font switch to "@2" at @3= Found a total of @1 sign nodes across @2 blocks.=Insgesamt wurden @1 Schild-Nodes über @2 Kartenblöcke gefunden.
@1 flipped the unicode-font switch to "@2" at @3= Regenerating sign entities ...=Schild-Entities werden neu erzeugt ...
Finished.=Fertig.
Write=Schreiben
##### not used anymore ##### Unicode font=Unicode-Schrift
Wide font=Weite Schrift
locked =gesperrt Wooden Wall Sign=Holzwandschild
@1 wrote "@2" to @3sign at @4=@1 schrieb "@2" auf das @3Schild bei @4 Steel Wall Sign=Stahlwandschild
Sign=Schild
Can edit all locked signs=Kann alle gesperrte Schilder bearbeiten
Locked Sign=gesperrter Schild
green=grün
yellow=gelb
red=rot
white_red=weißrot
white_black=schwarzweiß
orange=orange
blue=blau
brown=braun
Sign (@1, metal)=Schild (@1, Metall)
Attempt to register unknown node as fence=Versuch ein unbekanntes Element als Zaun zu registrieren
Registered @1 and @2=Registrierte @1 und @2
[MOD] signs loaded=[MOD] Schilder-Mod geladen

View File

@ -1,25 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n= Locked sign, owned by @1@n=Cartel bloqueado, propiedad de @1
Write= Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Examina todos los bloques de mapas que contienen letreros cargados actualmente, elimina cualquier entidad dentro del espacio de nodo de cada cartel y regenera sus entidades de texto, si las hay.
@1 wrote "@2" to sign at @3= There are no signs in the currently-loaded terrain.=No hay carteles en el terreno actual cargado.
@1 flipped the wide-font switch to "@2" at @3= Found a total of @1 sign nodes across @2 blocks.=Se han encontrado un total de @1 cartel(es) a traves de @2 bloque(s).
@1 flipped the unicode-font switch to "@2" at @3= Regenerating sign entities ...=Regenerando entidades de los carteles...
Finished.=Terminado
Write=Escribir
##### not used anymore ##### Unicode font=Fuente unicode
Wide font=Fuente ancha
locked =bloqueada Wooden Wall Sign=Cartel de Madera
@1 wrote "@2" to @3sign at @4=@1 escribio "@2" en el cartel @3en @4 Steel Wall Sign=Cartel de Acero
Sign=Letrero
Locked Sign=Letrero bloqueada
green=verde
yellow=amarillo
red=rojo
white_red=rojo y blanco
white_black=negro y blanco
orange=naranja
blue=azul
brown=marrón
Sign (@1, metal)=Letrero (@1, metal)
Registered @1 and @2=Registrado @1 y @2
[MOD] signs loaded=[MOD] signs cargados

View File

@ -1,27 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n=Panneau verrouillé, appartient à @1@n Locked sign, owned by @1@n=Panneau verrouillé, appartient à @1@n
Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=
There are no signs in the currently-loaded terrain.=
Found a total of @1 sign nodes across @2 blocks.=
Regenerating sign entities ...=
Finished.=
Write= Write=
@1 wrote "@2" to sign at @3= Unicode font=
@1 flipped the wide-font switch to "@2" at @3= Wide font=
@1 flipped the unicode-font switch to "@2" at @3= Wooden Wall Sign=
Steel Wall Sign=
##### not used anymore #####
locked =verrouillé
@1 wrote "@2" to @3sign at @4=@1 a écrit "@2" sur le panneau @3en @4
Sign=Panneau
Can edit all locked signs=Peut modifier les panneaux verrouillés
Locked Sign=Panneau (verrouillé)
green=vert
yellow=jaune
red=rouge
white_red=rouge et blanc
white_black=noir et blanc
orange=orange
blue=bleu
brown=marron
Sign (@1, metal)=Panneau (@1, métal)
Attempt to register unknown node as fence=Tentative d'enregistrer un nœud inconnu comme barrière
Registered @1 and @2=Enregistrement de @1 et @
[MOD] signs loaded=[MOD] signs chargé

View File

@ -1,27 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n=Papan tanda berkunci, milik @1@n Locked sign, owned by @1@n=Papan tanda berkunci, milik @1@n
Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=
There are no signs in the currently-loaded terrain.=
Found a total of @1 sign nodes across @2 blocks.=
Regenerating sign entities ...=
Finished.=
Write= Write=
@1 wrote "@2" to sign at @3= Unicode font=
@1 flipped the wide-font switch to "@2" at @3= Wide font=
@1 flipped the unicode-font switch to "@2" at @3= Wooden Wall Sign=
Steel Wall Sign=
##### not used anymore #####
locked =berkunci
@1 wrote "@2" to @3sign at @4=@1 menulis "@2" atas papan tanda @3dekat @4
Sign=Papan Tanda
Can edit all locked signs=Boleh sunting semua papan tanda berkunci
Locked Sign=Papan Tanda Berkunci
green=hijau
yellow=kuning
red=merah
white_red=putih_merah
white_black=putih_hitam
orange=jingga
blue=biru
brown=perang
Sign (@1, metal)=Papan Tanda (@1, logam)
Attempt to register unknown node as fence=Cuba untuk mendaftar nod tidak diketahui sebagai pagar
Registered @1 and @2=Telah daftar @1 dan @2
[MOD] signs loaded=[MODS] signs telah dimuatkan

View File

@ -1,27 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n=защищенная табличка, пренадлежит @1@n Locked sign, owned by @1@n=защищенная табличка, пренадлежит @1@n
Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=
There are no signs in the currently-loaded terrain.=
Found a total of @1 sign nodes across @2 blocks.=
Regenerating sign entities ...=
Finished.=
Write=записать Write=записать
@1 wrote "@2" to sign at @3= Unicode font=
@1 flipped the wide-font switch to "@2" at @3= Wide font=
@1 flipped the unicode-font switch to "@2" at @3= Wooden Wall Sign=
Steel Wall Sign=
##### not used anymore #####
locked =защищенный
@1 wrote "@2" to @3sign at @4=@1 записал "@2" в @3sign на @4
Sign=табличка
Can edit all locked signs=Может редактировать все защищенные таблички
Locked Sign=защищенная табличка
green=зеленая
yellow=желтая
red=красная
white_red=краснобелая
white_black=чернобелая
orange=оранжевая
blue=синея
brown=коричневая
Sign (@1, metal)=Табличка (@1, металл)
Attempt to register unknown node as fence=Попытка зарегистрировать неизвестный узел как забор
Registered @1 and @2=Зарегистрировано @1 для @2
[MOD] signs loaded=[MOD] мод табличек загружен

14
locale/signs_lib.uk.tr Normal file
View File

@ -0,0 +1,14 @@
# textdomain: signs_lib
Signs Lib=Таблички Lib
Adds signs with readable text.=Додає таблички з читабельним текстом.
Locked sign, owned by @1@n=Захищена табличка (власник @1@n)
Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Перевіряє всі завантажені блоки з табличками, очищає їхній простір від об'єктів і відновлює текст, якщо потрібно.
There are no signs in the currently-loaded terrain.=Не знайдено табличок на поточній провантаженій території.
Found a total of @1 sign nodes across @2 blocks.=Загалом знайдено @1 табличок в @2 блоках.
Regenerating sign entities ...=Регенерація сутностей табличок...
Finished.=Завершено.
Write=Записати
Unicode font=Юнікод
Wide font=Широкий
Wooden Wall Sign=Дерев'яна табличка
Steel Wall Sign=Сталева табличка

View File

@ -1,6 +1,12 @@
# textdomain: signs_lib # textdomain: signs_lib
Locked sign, owned by @1@n= Locked sign, owned by @1@n=
Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=
There are no signs in the currently-loaded terrain.=
Found a total of @1 sign nodes across @2 blocks.=
Regenerating sign entities ...=
Finished.=
Write= Write=
@1 wrote "@2" to sign at @3= Unicode font=
@1 flipped the wide-font switch to "@2" at @3= Wide font=
@1 flipped the unicode-font switch to "@2" at @3= Wooden Wall Sign=
Steel Wall Sign=

8
nonascii-ua.lua Normal file
View File

@ -0,0 +1,8 @@
signs_lib.unicode_install({208,132,"0404"})
signs_lib.unicode_install({208,134,"0406"})
signs_lib.unicode_install({208,135,"0407"})
signs_lib.unicode_install({209,148,"0454"})
signs_lib.unicode_install({209,150,"0456"})
signs_lib.unicode_install({209,151,"0457"})
signs_lib.unicode_install({210,144,"0490"})
signs_lib.unicode_install({210,145,"0491"})

1
settingstypes.txt Normal file
View File

@ -0,0 +1 @@
signs_lib.edit_priv (Allows to rotate signs and to open (and consequently edit) any default sign formspec) string signslib_edit

View File

@ -1,8 +1,10 @@
-- Definitions for standard minetest_game wooden and steel wall signs -- Definitions for standard minetest_game wooden and steel wall signs
local S = signs_lib.S
if minetest.get_modpath("default") then if minetest.get_modpath("default") then
signs_lib.register_sign("default:sign_wall_wood", { signs_lib.register_sign("default:sign_wall_wood", {
description = "Wooden wall sign", description = S("Wooden Wall Sign"),
inventory_image = "signs_lib_sign_wall_wooden_inv.png", inventory_image = "signs_lib_sign_wall_wooden_inv.png",
tiles = { tiles = {
"signs_lib_sign_wall_wooden.png", "signs_lib_sign_wall_wooden.png",
@ -20,7 +22,7 @@ if minetest.get_modpath("default") then
}) })
signs_lib.register_sign("default:sign_wall_steel", { signs_lib.register_sign("default:sign_wall_steel", {
description = "Steel wall sign", description = S("Steel Wall Sign"),
inventory_image = "signs_lib_sign_wall_steel_inv.png", inventory_image = "signs_lib_sign_wall_steel_inv.png",
tiles = { tiles = {
"signs_lib_sign_wall_steel.png", "signs_lib_sign_wall_steel.png",

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B

8
util/nonascii-ua Normal file
View File

@ -0,0 +1,8 @@
ґ
і
ї
є
Ґ
І
Ї
Є