[mod] kaeza's/VanessaE's signs library [signs_lib][git]
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
.
Last edited by amadin on Wed Dec 18, 2019 19:55, edited 1 time in total.
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
It's better that you should fix your textures as needed. I won't be adding anything like that to this mod. If the textures don't fit, they're just too big. :-)
EDIT: amadin was talking about aligning and sizing the text entity itself, so that it fits better with his custom sign background textures.
EDIT: amadin was talking about aligning and sizing the text entity itself, so that it fits better with his custom sign background textures.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Another update: Inspired by what amadin was asking about, I've added an API feature to let you change the entity's size on a per-node-type basis. Just add text_size = {x=foo, y=bar}, to your node definition. The defaults are x=0.8 and y=0.5.
I've started to document signs_lib's API. Most of what signs_lib does is hard-coded and not really publicly accessible (or at least, not really intended to be used by other mods), but a basic description of it can be found here: http://daconcepts.com/vanessa/hobbies/minetest/signs_usage_guide/signs-usage.html#api
Also a minor API change: in a node definition, defaultcolor is now default_color (to fit better with the other options, not that anyone uses it yet. :-) )
I've started to document signs_lib's API. Most of what signs_lib does is hard-coded and not really publicly accessible (or at least, not really intended to be used by other mods), but a basic description of it can be found here: http://daconcepts.com/vanessa/hobbies/minetest/signs_usage_guide/signs-usage.html#api
Also a minor API change: in a node definition, defaultcolor is now default_color (to fit better with the other options, not that anyone uses it yet. :-) )
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
- ManElevation
- Member
- Posts: 896
- Joined: Tue Aug 02, 2016 22:04
- GitHub: ManElevation
- IRC: ManElevation
- In-game: ManElevation
- Location: Madrid,Spain
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
nice!
My Public Mods! Discord: Rottweiler Games#3368
- mnh48
- Member
- Posts: 310
- Joined: Wed Nov 16, 2016 22:55
- GitHub: mnh48
- IRC: MNH48
- In-game: mnh48
- Location: Kuala Lumpur, Malaysia
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Is it possible for us to make a supplement mod for signs_lib, where when installed, could help to support certain non-ASCII characters??
This means that, the main signs_lib will only contain what it already contains now, but another mod could act as plugin and add support for those non-ASCII characters like ñ, ä, å, é, þ, ü, ú, í, ó, ö, ø, ð, ß, á, æ, µ, ç, ¿ (the examples I wrote are inside International English (US) keyboard) and others??? Is this thing possible??
Or it is already documented but I missed it??
This means that, the main signs_lib will only contain what it already contains now, but another mod could act as plugin and add support for those non-ASCII characters like ñ, ä, å, é, þ, ü, ú, í, ó, ö, ø, ð, ß, á, æ, µ, ç, ¿ (the examples I wrote are inside International English (US) keyboard) and others??? Is this thing possible??
Or it is already documented but I missed it??
-
- Member
- Posts: 21
- Joined: Fri May 20, 2016 02:58
- GitHub: vaggrippino
- IRC: Vince
- In-game: Vince
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
The text of my signs is suddenly sideways:
I have signs placed on the front of a bunch of autocrafters, but the text seems to be facing at a 90 degree angle perpendicular to its sign. If I dig the sign and replace it the problem goes away, but only until I log out and back in again.
The problem only seems to affect signs that face east or west. Signs facing north or south are fine.
This initially happened after I installed the Storage Drawers mod, but it wasn't corrected after disabling the mod, so I think that was just a coincidence. The problem also affects the "icon" on the front of the drawers from this mod.
It seems likely that it's something I did. Could Drawers have made a change that persisted even after disabling the mod?
This is happening on a personal single player server. I have the following mods installed and enabled:
How do I troubleshoot this problem?
I have signs placed on the front of a bunch of autocrafters, but the text seems to be facing at a 90 degree angle perpendicular to its sign. If I dig the sign and replace it the problem goes away, but only until I log out and back in again.
The problem only seems to affect signs that face east or west. Signs facing north or south are fine.
This initially happened after I installed the Storage Drawers mod, but it wasn't corrected after disabling the mod, so I think that was just a coincidence. The problem also affects the "icon" on the front of the drawers from this mod.
It seems likely that it's something I did. Could Drawers have made a change that persisted even after disabling the mod?
This is happening on a personal single player server. I have the following mods installed and enabled:
Spoiler
- awards
- bonemeal
- boost_cart
- builtin_item
- caches
- caverealms
- cblocks
- coloredwood
- colormachine
- cutepie
- darkage
- datastorage
- digtron
- dmobs
- doc
- drawers
- ethereal
- homedecor_modpack
- hudbars
- infinite_chest
- item_drop
- large_hotbar
- mesecons
- minetest-3d_armor
- Minetest-WorldEdit
- minetest_doc_minetest_game-a9383c9
- minetest_hbarmor-bfc5f8c
- minetest_hbhunger-da70eba
- minetest_tsm_chests_dungeon-b1e4889
- mining_plus
- mobs_animal
- mobs_monster
- mobs_redo
- moreblocks
- MoreMesecons
- moreores
- mybricks
- mymeshnodes
- no_drowning
- pipeworks
- plasticbox
- signs_lib
- stained_glass
- technic
- throwing
- torches
- travelnet
- treasurer
- trmp_Pack
- unifiedbricks
- unifieddyes
- unified_inventory
- unified_inventory_plus
- shiva
- Member
- Posts: 121
- Joined: Tue Sep 16, 2014 22:00
- In-game: shiva35
- Location: En Bretagne :-)
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Same problem for me. My server : 0.4.16
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Is not this bug was fixed some time ago?
- shiva
- Member
- Posts: 121
- Joined: Tue Sep 16, 2014 22:00
- In-game: shiva35
- Location: En Bretagne :-)
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
I do not know. I have the last version of this mod...
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
This project has been moved to Gitlab.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Update: I've added arrow symbols to the font. You can get them by writing a caret and 1 to 8 for narrow arrows, or caret plus "a" to "g" for wide ones. ^1 and ^a point up, ^2/^b point up and right, ^3/^c point right, and so on, going clockwise. Should work on all sign types, and colors work, too.
There's no escape char for ^, but used in any manner other than the above will print it (and whatever follows it) directly, so one isn't really needed.
This feature has been added to both fonts in my street signs mod, also.
There's no escape char for ^, but used in any manner other than the above will print it (and whatever follows it) directly, so one isn't really needed.
This feature has been added to both fonts in my street signs mod, also.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Big update!
I finally got around to rebuilding this mod onto the new API in street_signs, which itself started out as a fork of signs_lib from some time back, wherein I stripped-down the code into just some basic features, then built some new stuff on top of it.
Any sign can now use a 15 or 31 px font (set in the node def), at any reasonable visual scale, height/width, number of lines, etc.
You will most likely NEED basic_signs if you're upgrading an existing setup, otherwise you'll end up with lots of undefined nodes. That's because I've split most signs off into that mod, which of course depends on this one; only the default minetest_game wood and steel signs remain in this mod. The wall/yard/ceiling function for wooden signs has been rewritten and moved there, too.
One of the effects of the rewrite is that this mod can now put almost any wall sign onto almost any kind of posts/fences (even mese lampposts), as with most signs in my street_signs mod (it's an idea I got from the Streets modpack), without there needing to be one unique node for every possible combination of sign and post. Mods can add their fences/posts to its "allowed" list, if needed (the code tries to detect most kinds of suitable fences, poles, posts, etc).
All signs affected by these changes are similar to what they've always been, for continuity. The main difference is that they all use a 15px font now, with a slightly larger scale, and the positions of some have changed slightly.
In the update process, I dropped the old @KEYWORD feature (but it could be re-added if it turns out to be needed), and most of the old cruft like | for line breaks.
I also created new wood and steel sign textures, derived from HDX.
See standard_signs.lua for examples of how the new API is used.
The "standard" text sizing/position/etc. variables are all at the top of api.lua.
As a result of these rewrites/updates, you may find some mods that used signs_lib will no longer work unless they too have been updated (the needed changes are minimal). Of my mods, only Home Decor, Coloredwood, Gloopblocks, and of course Street Signs were affected (I've already made the required changes, users need only update their mods).
Minor caveats to the upgrade:
1. You may find lots of undefined outdated text entities (because they were renamed). Just do /regen_signs to clean up the mess. This command removes all entities within a sign's node space, then regenerates the one text entity each needs. This command should also be useful for situations where the engine incorrectly sets an entity's rotation on reload. Requires server privilege, and only affects nodes in group:sign (and which even need an entity at all, of course).
2. When opening the formspec of an old sign, you may get a "dummy" image warning which you can ignore. This is a harmless, one-time artifact that happens as the sign's formspec is updated (to reference the new background image filename).
(and a few more bugfixes in signs_lib, basic_signs, and street_signs were made over the day or so since this message was posted)
I finally got around to rebuilding this mod onto the new API in street_signs, which itself started out as a fork of signs_lib from some time back, wherein I stripped-down the code into just some basic features, then built some new stuff on top of it.
Any sign can now use a 15 or 31 px font (set in the node def), at any reasonable visual scale, height/width, number of lines, etc.
You will most likely NEED basic_signs if you're upgrading an existing setup, otherwise you'll end up with lots of undefined nodes. That's because I've split most signs off into that mod, which of course depends on this one; only the default minetest_game wood and steel signs remain in this mod. The wall/yard/ceiling function for wooden signs has been rewritten and moved there, too.
One of the effects of the rewrite is that this mod can now put almost any wall sign onto almost any kind of posts/fences (even mese lampposts), as with most signs in my street_signs mod (it's an idea I got from the Streets modpack), without there needing to be one unique node for every possible combination of sign and post. Mods can add their fences/posts to its "allowed" list, if needed (the code tries to detect most kinds of suitable fences, poles, posts, etc).
All signs affected by these changes are similar to what they've always been, for continuity. The main difference is that they all use a 15px font now, with a slightly larger scale, and the positions of some have changed slightly.
In the update process, I dropped the old @KEYWORD feature (but it could be re-added if it turns out to be needed), and most of the old cruft like | for line breaks.
I also created new wood and steel sign textures, derived from HDX.
See standard_signs.lua for examples of how the new API is used.
The "standard" text sizing/position/etc. variables are all at the top of api.lua.
As a result of these rewrites/updates, you may find some mods that used signs_lib will no longer work unless they too have been updated (the needed changes are minimal). Of my mods, only Home Decor, Coloredwood, Gloopblocks, and of course Street Signs were affected (I've already made the required changes, users need only update their mods).
Minor caveats to the upgrade:
1. You may find lots of undefined outdated text entities (because they were renamed). Just do /regen_signs to clean up the mess. This command removes all entities within a sign's node space, then regenerates the one text entity each needs. This command should also be useful for situations where the engine incorrectly sets an entity's rotation on reload. Requires server privilege, and only affects nodes in group:sign (and which even need an entity at all, of course).
2. When opening the formspec of an old sign, you may get a "dummy" image warning which you can ignore. This is a harmless, one-time artifact that happens as the sign's formspec is updated (to reference the new background image filename).
(and a few more bugfixes in signs_lib, basic_signs, and street_signs were made over the day or so since this message was posted)
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
- Drachenbauer32
- Member
- Posts: 105
- Joined: Wed Aug 28, 2019 18:11
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
is there any way to set the text-color without having colored rectangles in the textures folder?
I found amodifyed version of this in the blockcolors game.
Now i´m modifying it to make the colors of the game bright.
So i want the default color of the text a darker color variant of the sign background color.
Actually i turned those rectangles to the colors i want.
Also i´m trying to delete all stuff in the code, that´s not needed for the metal wall sign, because the game does not use the other variants.
If i now place a sign and try to write on it, no text appears and if i try to go back to main menu after this, the game freezes on the logout screen...
the actual code of my modifyed one:
I found amodifyed version of this in the blockcolors game.
Now i´m modifying it to make the colors of the game bright.
So i want the default color of the text a darker color variant of the sign background color.
Actually i turned those rectangles to the colors i want.
Also i´m trying to delete all stuff in the code, that´s not needed for the metal wall sign, because the game does not use the other variants.
If i now place a sign and try to write on it, no text appears and if i try to go back to main menu after this, the game freezes on the logout screen...
the actual code of my modifyed one:
Code: Select all
-- This mod provides the visible text on signs library used by Home Decor
-- and perhaps other mods at some point in the future. Forked from thexyz's/
-- PilzAdam's original text-on-signs mod and rewritten by Vanessa Ezekowitz
-- and Diego Martinez
-- textpos = {
-- { delta = {entity position for 0° yaw}, exact yaw expression }
-- { delta = {entity position for 180° yaw}, exact yaw expression }
-- { delta = {entity position for 270° yaw}, exact yaw expression }
-- { delta = {entity position for 90° yaw}, exact yaw expression }
-- }
-- CWz's keyword interact mod uses this setting.
local current_keyword = minetest.settings:get("interact_keyword") or "iaccept"
signs_lib = {}
signs_lib.path = minetest.get_modpath(minetest.get_current_modname())
screwdriver = screwdriver or {}
-- Load support for intllib.
local S, NS = dofile(signs_lib.path .. "/intllib.lua")
signs_lib.gettext = S
-- text encoding
dofile(signs_lib.path .. "/encoding.lua");
signs_lib.wallmounted_rotate = function(pos, node, user, mode, new_param2)
if mode ~= screwdriver.ROTATE_AXIS then return false end
minetest.swap_node(pos, {name = node.name, param2 = (node.param2 + 1) % 6})
for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
local e = v:get_luaentity()
if e and e.name == "signs:text" then
v:remove()
end
end
signs_lib.update_sign(pos)
return true
end
signs_lib.modpath = minetest.get_modpath("signs_lib")
local DEFAULT_TEXT_SCALE = {x=0.8, y=0.5}
signs_lib.wall_sign_model = {
nodebox = {
type = "fixed",
fixed = {-0.5, -0.3125, 0.4375, 0.5, 0.4375, 0.5}
},
textpos = {
{delta = { x = 0, y = 0.07, z = 0.41 }, yaw = 0},
{delta = { x = 0.41, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = { x = 0, y = 0.07, z = -0.41 }, yaw = math.pi},
{delta = { x = -0.41, y = 0.07, z = 0 }, yaw = math.pi / 2},
}
}
-- the list of standard sign nodes
signs_lib.sign_node_list = {
"signs:sign_wall_white",
"signs:sign_wall_black",
"signs:sign_wall_red",
"signs:sign_wall_yellow",
"signs:sign_wall_orange",
"signs:sign_wall_green",
"signs:sign_wall_blue",
"signs:sign_wall_purple",
}
--table copy
function signs_lib.table_copy(t)
local nt = { };
for k, v in pairs(t) do
if type(v) == "table" then
nt[k] = signs_lib.table_copy(v)
else
nt[k] = v
end
end
return nt
end
-- infinite stacks
if not minetest.settings:get_bool("creative_mode") then
signs_lib.expect_infinite_stacks = false
else
signs_lib.expect_infinite_stacks = true
end
-- CONSTANTS
-- Path to the textures.
local TP = signs_lib.path .. "/textures"
-- Font file formatter
local CHAR_FILE = "%s_%02x.png"
-- Fonts path
local CHAR_PATH = TP .. "/" .. CHAR_FILE
-- Font name.
local font_name = "hdf"
-- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza
local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A)
-- check if a file does exist
-- to avoid reopening file after checking again
-- pass TRUE as second argument
function file_exists(name, return_handle, mode)
mode = mode or "r";
local f = io.open(name, mode)
if f ~= nil then
if (return_handle) then
return f
end
io.close(f)
return true
else
return false
end
end
-- Read the image size from a PNG file.
-- Returns image_w, image_h.
-- Only the LSB is read from each field!
local function read_image_size(filename)
local f = file_exists(filename, true, "rb")
-- file might not exist (don't crash the game)
if (not f) then
return 0, 0
end
f:seek("set", 0x0)
local hdr = f:read(string.len(PNG_HDR))
if hdr ~= PNG_HDR then
f:close()
return
end
f:seek("set", 0x13)
local ws = f:read(1)
f:seek("set", 0x17)
local hs = f:read(1)
f:close()
return ws:byte(), hs:byte()
end
-- Set by build_char_db()
local LINE_HEIGHT
local SIGN_WIDTH
local COLORBGW, COLORBGH
-- Size of the canvas, in characters.
-- Please note that CHARS_PER_LINE is multiplied by the average character
-- width to get the total width of the canvas, so for proportional fonts,
-- either more or fewer characters may fit on a line.
local CHARS_PER_LINE = 20
local NUMBER_OF_LINES = 6
-- 6 rows, max 80 chars per, plus a bit of fudge to
-- avoid excess trimming (e.g. due to color codes)
local MAX_INPUT_CHARS = 600
-- This holds the individual character widths.
-- Indexed by the actual character (e.g. charwidth["A"])
local charwidth
-- helper functions to trim sign text input/output
local function trim_input(text)
return text:sub(1, math.min(MAX_INPUT_CHARS, text:len()))
end
local function build_char_db()
charwidth = { }
-- To calculate average char width.
local total_width = 0
local char_count = 0
for c = 32, 255 do
local w, h = read_image_size(CHAR_PATH:format(font_name, c))
if w and h then
local ch = string.char(c)
charwidth[ch] = w
total_width = total_width + w
char_count = char_count + 1
end
end
COLORBGW, COLORBGH = read_image_size(TP.."/slc_n.png")
assert(COLORBGW and COLORBGH, "error reading bg dimensions")
LINE_HEIGHT = COLORBGH
-- XXX: Is there a better way to calc this?
SIGN_WIDTH = math.floor((total_width / char_count) * CHARS_PER_LINE)
end
local sign_groups = {choppy=2, dig_immediate=2}
local fences_with_sign = { }
-- some local helper functions
local function split_lines_and_words_old(text)
local lines = { }
local line = { }
if not text then return end
for word in text:gmatch("%S+") do
if word == "|" then
table.insert(lines, line)
if #lines >= NUMBER_OF_LINES then break end
line = { }
elseif word == "\\|" then
table.insert(line, "|")
else
table.insert(line, word)
end
end
table.insert(lines, line)
return lines
end
local function split_lines_and_words(text)
if not text then return end
text = string.gsub(text, "@KEYWORD", current_keyword)
local lines = { }
for _, line in ipairs(text:split("\n")) do
table.insert(lines, line:split(" "))
end
return lines
end
local math_max = math.max
local function fill_line(x, y, w, c)
c = c or "0"
local tex = { }
for xx = 0, math.max(0, w), COLORBGW do
table.insert(tex, (":%d,%d=slc_%s.png"):format(x + xx, y, c))
end
return table.concat(tex)
end
-- make char texture file name
-- if texture file does not exist use fallback texture instead
local function char_tex(font_name, ch)
local c = ch:byte()
local exists, tex = file_exists(CHAR_PATH:format(font_name, c))
if exists and c ~= 14 then
tex = CHAR_FILE:format(font_name, c)
else
tex = CHAR_FILE:format(font_name, 0x0)
end
return tex, exists
end
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 = tonumber(default_color, 16)
-- We check which chars are available here.
for word_i, word in ipairs(line) do
local chars = { }
local ch_offs = 0
local word_l = #word
local i = 1
while i <= word_l do
local c = word:sub(i, i)
if c == "#" then
local cc = tonumber(word:sub(i+1, i+1), 16)
if cc then
i = i + 1
cur_color = cc
end
else
local w = charwidth[c]
if w then
width = width + w + 1
if width >= (SIGN_WIDTH - charwidth[" "]) then
width = 0
else
maxw = math_max(width, maxw)
end
if #chars < MAX_INPUT_CHARS then
table.insert(chars, {
off = ch_offs,
tex = char_tex(font_name, c),
col = ("%X"):format(cur_color),
})
end
ch_offs = ch_offs + w
end
end
i = i + 1
end
width = width + charwidth[" "] + 1
maxw = math_max(width, maxw)
table.insert(words, { chars=chars, w=ch_offs })
end
-- Okay, we actually build the "line texture" here.
local texture = { }
local start_xpos = math.floor((SIGN_WIDTH - maxw) / 2)
local xpos = start_xpos
local ypos = (LINE_HEIGHT * lineno)
cur_color = nil
for word_i, word in ipairs(words) do
local xoffs = (xpos - start_xpos)
if (xoffs > 0) and ((xoffs + word.w) > maxw) then
table.insert(texture, fill_line(xpos, ypos, maxw, "n"))
xpos = start_xpos
ypos = ypos + LINE_HEIGHT
lineno = lineno + 1
if lineno >= NUMBER_OF_LINES then break end
table.insert(texture, fill_line(xpos, ypos, maxw, cur_color))
end
for ch_i, ch in ipairs(word.chars) do
if ch.col ~= cur_color then
cur_color = ch.col
table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color))
end
table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex))
end
table.insert(
texture,
(":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ")
)
xpos = xpos + word.w + charwidth[" "]
if xpos >= (SIGN_WIDTH + charwidth[" "]) then break end
end
table.insert(texture, fill_line(xpos, ypos, maxw, "n"))
table.insert(texture, fill_line(start_xpos, ypos + LINE_HEIGHT, maxw, "n"))
return table.concat(texture), lineno
end
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, pos)
table.insert(texture, linetex)
lineno = ln + 1
end
table.insert(texture, "^[makealpha:0,0,0")
return table.concat(texture, "")
end
local function set_obj_text(obj, text, new, pos)
local split = new and split_lines_and_words or split_lines_and_words_old
local text_ansi = Utf8ToAnsi(text)
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_ansi), pos)},
visual_size = text_scale,
})
end
signs_lib.construct_sign = function(pos, locked)
local meta = minetest.get_meta(pos)
meta:set_string(
"formspec",
"size[6,4]"..
"textarea[0,-0.3;6.5,3;text;;${text}]"..
"button_exit[2,3.4;2,1;ok;"..S("Write").."]"..
"")
meta:set_string("infotext", "")
end
signs_lib.destruct_sign = function(pos)
local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do
local e = v:get_luaentity()
if e and e.name == "signs:text" then
v:remove()
end
end
end
local function make_infotext(text)
text = trim_input(text)
local lines = split_lines_and_words(text) or {}
local lines2 = { }
for _, line in ipairs(lines) do
table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F]", ""):gsub("##", "#")))
end
return table.concat(lines2, "\n")
end
signs_lib.update_sign = function(pos, fields, owner)
-- First, check if the interact keyword from CWz's mod is being set,
-- or has been changed since the last restart...
local meta = minetest.get_meta(pos)
local stored_text = meta:get_string("text") or ""
current_keyword = rawget(_G, "mki_interact_keyword") or current_keyword
if fields then -- ...we're editing the sign.
if fields.text and string.find(dump(fields.text), "@KEYWORD") then
meta:set_string("keyword", current_keyword)
else
meta:set_string("keyword", nil)
end
elseif string.find(dump(stored_text), "@KEYWORD") then -- we need to check if the password is being set/changed
local stored_keyword = meta:get_string("keyword")
if stored_keyword and stored_keyword ~= "" and stored_keyword ~= current_keyword then
signs_lib.destruct_sign(pos)
meta:set_string("keyword", current_keyword)
local ownstr = ""
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
local new
if fields then
fields.text = trim_input(fields.text)
local ownstr = ""
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)
meta:set_int("__signslib_new_format", 1)
new = true
else
new = (meta:get_int("__signslib_new_format") ~= 0)
end
local text = meta:get_string("text")
if text == nil then return end
local objects = minetest.get_objects_inside_radius(pos, 0.5)
local found
for _, v in ipairs(objects) do
local e = v:get_luaentity()
if e and e.name == "signs:text" then
if found then
v:remove()
else
set_obj_text(v, text, new, pos)
found = true
end
end
end
if found then
return
end
-- if there is no entity
local sign_info
local signnode = minetest.get_node(pos)
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]
elseif string.find(signnode.name, "sign_wall") then
if signnode.name == default_sign
or signnode.name == default_sign_metal
or signnode.name == "locked_sign:sign_wall_locked" then
sign_info = signs_lib.regular_wall_sign_model.textpos[minetest.get_node(pos).param2 + 1]
else
sign_info = signs_lib.wall_sign_model.textpos[minetest.get_node(pos).param2 + 1]
end
else -- ...it must be a sign on a fence post.
sign_info = signs_lib.sign_post_model.textpos[minetest.get_node(pos).param2 + 1]
end
if sign_info == nil then
return
end
local text = minetest.add_entity({x = pos.x + sign_info.delta.x,
y = pos.y + sign_info.delta.y,
z = pos.z + sign_info.delta.z}, "signs:text")
text:setyaw(sign_info.yaw)
end
-- What kind of sign do we need to place, anyway?
function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked)
local name
name = minetest.get_node(pointed_thing.under).name
if fences_with_sign[name] then
if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
minetest.record_protection_violation(pointed_thing.under,
placer:get_player_name())
return itemstack
end
else
name = minetest.get_node(pointed_thing.above).name
local def = minetest.registered_nodes[name]
if not def.buildable_to then
return itemstack
end
if minetest.is_protected(pointed_thing.above, placer:get_player_name()) then
minetest.record_protection_violation(pointed_thing.above,
placer:get_player_name())
return itemstack
end
end
local node=minetest.get_node(pointed_thing.under)
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
local dir = {x = under.x - above.x,
y = under.y - above.y,
z = under.z - above.z}
local wdir = minetest.dir_to_wallmounted(dir)
local placer_pos = placer:getpos()
if placer_pos then
dir = {
x = above.x - placer_pos.x,
y = above.y - placer_pos.y,
z = above.z - placer_pos.z
}
end
local fdir = minetest.dir_to_facedir(dir)
local pt_name = minetest.get_node(under).name
local signname = itemstack:get_name()
if wdir == 0 and signname == default_sign then
minetest.add_node(above, {name = "signs:sign_hanging", param2 = fdir})
elseif wdir == 1 and signname == default_sign then
minetest.add_node(above, {name = "signs:sign_yard", param2 = fdir})
elseif signname == default_sign_metal then
minetest.add_node(above, {name = signname, param2 = wdir })
elseif signname ~= default_sign
and signname ~= default_sign_metal
and signname ~= "locked_sign:sign_wall_locked" then -- it's a signs_lib colored metal wall sign.
minetest.add_node(above, {name = signname, param2 = fdir})
else -- it must be a default or locked wooden wall sign
minetest.add_node(above, {name = signname, param2 = wdir }) -- note it's wallmounted here!
if locked then
local meta = minetest.get_meta(above)
local owner = placer:get_player_name()
meta:set_string("owner", owner)
end
end
if not signs_lib.expect_infinite_stacks then
itemstack:take_item()
end
return itemstack
end
end
function signs_lib.receive_fields(pos, formname, fields, sender, lock)
if minetest.is_protected(pos, sender:get_player_name()) then
minetest.record_protection_violation(pos,
sender:get_player_name())
return
end
local lockstr = lock and S("locked ") or ""
if fields and fields.text and fields.ok then
minetest.log("action", S("@1 wrote \"@2\" to @3sign at @4",
(sender:get_player_name() or ""),
fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"),
lockstr,
minetest.pos_to_string(pos)
))
if lock then
signs_lib.update_sign(pos, fields, sender:get_player_name())
else
signs_lib.update_sign(pos, fields)
end
end
end
local source_list = {
{ "white", "White", { a = 255, r = 255, g = 255, b = 255 }, "ff7f7f7f" },
{ "black", "Black", { a = 255, r = 95, g = 95, b = 95 }, "ff2f2f2f" },
{ "red", "Red", { a = 255, r = 255, g = 0, b = 0 }, "ff7f0000" },
{ "orange", "Orange", { a = 255, r = 255, g = 127, b = 0 }, "ff7f3f00" },
{ "yellow", "Yellow", { a = 255, r = 255, g = 255, b = 0 }, "ff7f7f00" },
{ "green", "Green", { a = 255, r = 0, g = 255, b = 0 }, "ff007f00" },
{ "blue", "Blue", { a = 255, r = 0, g = 0, b = 255 }, "ff0000ff" },
{ "purple", "Purple", { a = 255, r = 159, g = 0, b = 255 }, "ff4f007f" },
}
for i = 1, #source_list do
local name, description, dye, dye2 = unpack(source_list[i])
minetest.register_node(":signs:sign_wall_" .. name, {
description = description .. " Wall Sign",
color = dye,
tiles = {
"signs_tb.png",
"signs_tb.png",
"signs_sides.png",
"signs_sides.png",
"signs_back.png",
"signs_front.png"
},
inventory_image = "signs.png",
wield_image = "color_handwhite.png",
wield_overlay = "color_hand_overlay.png",
wield_scale = { x = 1, y = 1, z = 0.5 },
node_placement_prediction = "",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = signs_lib.wall_sign_model.nodebox,
default_color = dye2,
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
local signs_text_on_activate
signs_text_on_activate = function(self)
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 and minetest.registered_nodes[minetest.get_node(pos).name] then
text = trim_input(text)
set_obj_text(self.object, text, new, pos)
end
end
minetest.register_entity(":signs:text", {
collisionbox = { 0, 0, 0, 0, 0, 0 },
visual = "upright_sprite",
textures = {},
on_activate = signs_text_on_activate,
})
build_char_db()
-- restore signs' text after /clearobjects and the like, the next time
-- a block is reloaded by the server.
minetest.register_lbm({
nodenames = signs_lib.sign_node_list,
name = "signs_lib:restore_sign_text",
label = "Restore sign text",
run_at_every_load = true,
action = function(pos, node)
signs_lib.update_sign(pos)
end
})
-- locked sign
if minetest.settings:get("log_mods") then
minetest.log("action", S("[MOD] signs loaded"))
end
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
You're using outdated code. Please update signs_lib, and get basic_signs while you're at it (you'll need it, as most of the signs have been moved to that mod).
As for the colors, it may be possible to use just one white color block, with appropriate [colorize commands. I may give that a try some time later.
As for the colors, it may be possible to use just one white color block, with appropriate [colorize commands. I may give that a try some time later.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
I've just updated the server and all mods and I get "LuaEntity name "signs:text" not defined" now, and purple entity squares in each sign. Seems the entities were renamed, but I can't find a way to delete old ones except from /clearobjects which can damage other mods' entities...
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Indeed, they changed. Just run /regen_signs to fix them up.
It was added for just that reason (plus for situations where the engine just plain screwed up, like it used to with those positioning errors). It'll scan through all currently-loaded mapblocks, looking for signs, kill their entities, and re-render them.
It was added for just that reason (plus for situations where the engine just plain screwed up, like it used to with those positioning errors). It'll scan through all currently-loaded mapblocks, looking for signs, kill their entities, and re-render them.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
This command does nothing for me. Does it go over "old" sign entities too?VanessaE wrote:Indeed, they changed. Just run /regen_signs to fix them up.
It was added for just that reason (plus for situations where the engine just plain screwed up, like it used to with those positioning errors). It'll scan through all currently-loaded mapblocks, looking for signs, kill their entities, and re-render them.
I see the signs text over the signs, but also the purple squares covering them over in most angles.
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
It's supposed to -- I'm certain I had that working properly.
Well, you can still just punch the unknown entities to get rid of them.
Well, you can still just punch the unknown entities to get rid of them.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Okay, didn't know punching could work.VanessaE wrote:It's supposed to -- I'm certain I had that working properly.
Well, you can still just punch the unknown entities to get rid of them.
There is also a weird error of "Could not load image "bg_signs_lib.jpg" while building texture" which adds a half-second glitch when opening a sign edit form, but I don't know the cause.
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
You can ignore that "error", it's the result of renaming the signs' background texture (to something more in keeping with the way mods' textures are supposed to be named). The brief glitch is just the mod updating the formspec accordingly.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
-
- Member
- Posts: 316
- Joined: Sun Feb 15, 2015 07:14
- IRC: redneonglow redblade7
- In-game: redblade7 redblade7_owner
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
After recent updates, there are a handful of signs which are editable with right-click, but appear as unknown node blocks.
debug.txt reports them as "default:sign_wall_steel_onpole"
debug.txt reports them as "default:sign_wall_steel_onpole"
-redblade7, admin of: THE CREATIVE GARDENS (creative), THE VALLEYS (sandbox), and THE DIGITAL FARMS (farming/hunger/shops)
- VanessaE
- Moderator
- Posts: 4655
- Joined: Sun Apr 01, 2012 12:38
- GitHub: VanessaE
- IRC: VanessaE
- In-game: VanessaE
- Location: Western NC
- Contact:
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Try updating, see if the commit I just pushed fixes it.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)
-
- Member
- Posts: 316
- Joined: Sun Feb 15, 2015 07:14
- IRC: redneonglow redblade7
- In-game: redblade7 redblade7_owner
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Unfortunately I can't test it for you as I just gave the user who found them replacement signs. But I'll update the mod at some point and let you know if I run into any problems.VanessaE wrote:Try updating, see if the commit I just pushed fixes it.
-redblade7, admin of: THE CREATIVE GARDENS (creative), THE VALLEYS (sandbox), and THE DIGITAL FARMS (farming/hunger/shops)
- Drachenbauer32
- Member
- Posts: 105
- Joined: Wed Aug 28, 2019 18:11
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
I´ll try it,VanessaE wrote:You're using outdated code. Please update signs_lib, and get basic_signs while you're at it (you'll need it, as most of the signs have been moved to that mod).
As for the colors, it may be possible to use just one white color block, with appropriate [colorize commands. I may give that a try some time later.
and for the colors, i´ll better use [multiply this is, what i use to color in white and greyscaled stuff
So i can use a dark gray texture and use the existing color-hexcodes on it.
Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]
Thanks for this great mod. I only use the simple wooden variant with default textcolor in wide mode. The signs fit everywhere, on post, on wall, hanging down...
And usecases are countless. Showing directions on small paths through the jungle, naming the content of chests, horse names in the stable...
I can even use umlaute, but mostly I use latin (having fun with it in medieval like settings).
Great work!
And usecases are countless. Showing directions on small paths through the jungle, naming the content of chests, horse names in the stable...
I can even use umlaute, but mostly I use latin (having fun with it in medieval like settings).
Great work!
CFS - still widely unknown
Who is online
Users browsing this forum: No registered users and 34 guests