[mod] kaeza's/VanessaE's signs library [signs_lib][git]

amadin
Member
Posts: 548
Joined: Tue Jun 16, 2015 16:23

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by amadin » Post

.
Last edited by amadin on Wed Dec 18, 2019 19:55, edited 1 time in total.

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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. :-) )
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
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]

by ManElevation » Post

nice!
My Public Mods! Discord: Rottweiler Games#3368

muhdnurhidayat
Member
Posts: 302
Joined: Wed Nov 16, 2016 22:55
GitHub: mnh48
IRC: muhdnurhidayat
In-game: muhdnurhidayat
Location: Wangsa Maju, Kuala Lumpur, Malaysia
Contact:

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by muhdnurhidayat » Post

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??
[ Full signature ] - UTC+8 here, I'm muhdnurhidayat in most Minetest servers. / Twitter ✂️- - - - -

Contributes to Minetest Wiki.
Also uses MT Offtopic forum.
You just read my profile, right?
Because these few texts of signature only appear on profile page as the texts are cut in signature. xD

Vince
Member
Posts: 12
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]

by Vince » Post

The text of my signs is suddenly sideways:

Image

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
How do I troubleshoot this problem?

User avatar
shiva
Member
Posts: 111
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]

by shiva » Post

Same problem for me. My server : 0.4.16
Image

User avatar
Fixer
Member
Posts: 898
Joined: Sun Jul 31, 2011 11:23
IRC: Fixer
In-game: Fixer
Location: Ukraine

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by Fixer » Post

Is not this bug was fixed some time ago?

User avatar
shiva
Member
Posts: 111
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]

by shiva » Post

I do not know. I have the last version of this mod...

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

This project has been moved to Gitlab.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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)
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
Drachenbauer32
Member
Posts: 105
Joined: Wed Aug 28, 2019 18:11

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by Drachenbauer32 » Post

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:

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

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
neko259
Member
Posts: 805
Joined: Sun Jun 19, 2011 06:51

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by neko259 » Post

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...

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
neko259
Member
Posts: 805
Joined: Sun Jun 19, 2011 06:51

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by neko259 » Post

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.
This command does nothing for me. Does it go over "old" sign entities too?
I see the signs text over the signs, but also the purple squares covering them over in most angles.

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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.
You might like some of my stuff: Plantlife ~ More Trees ~ Home Decor ~ Pipeworks ~ HDX Textures (64-512px)

User avatar
neko259
Member
Posts: 805
Joined: Sun Jun 19, 2011 06:51

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by neko259 » Post

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.
Okay, didn't know punching could work.
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.

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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)

redblade7
Member
Posts: 312
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]

by redblade7 » Post

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"
-redblade7, admin of: THE CREATIVE GARDENS (creative), THE VALLEYS (sandbox), and THE DIGITAL FARMS (farming/hunger/shops)

User avatar
VanessaE
Moderator
Posts: 4549
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]

by VanessaE » Post

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)

redblade7
Member
Posts: 312
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]

by redblade7 » Post

VanessaE wrote:Try updating, see if the commit I just pushed fixes it.
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.
-redblade7, admin of: THE CREATIVE GARDENS (creative), THE VALLEYS (sandbox), and THE DIGITAL FARMS (farming/hunger/shops)

User avatar
Drachenbauer32
Member
Posts: 105
Joined: Wed Aug 28, 2019 18:11

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by Drachenbauer32 » Post

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.
I´ll try it,

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.

Nordal
Member
Posts: 119
Joined: Mon Jul 30, 2018 15:46
GitHub: Nordall
Location: Germany

Re: [mod] kaeza's/VanessaE's signs library [signs_lib][git]

by Nordal » Post

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!

Post Reply

Who is online

Users browsing this forum: Google [Bot] and 7 guests