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

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

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

by amadin » Thu Sep 15, 2016 05:22

I mean text in signs does not fit in borders with my new textures and i don't know how to fix this. If you like you can add my textures in this mod.
Attachments
signs_lib-addon.7z
(6 KiB) Downloaded 36 times
 

User avatar
VanessaE
Moderator
 
Posts: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Thu Sep 15, 2016 06:08

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Thu Sep 15, 2016 11:04

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
Location: Madrid,Spain
GitHub: ManElevation
IRC: ManElevation
In-game: ManElevation
 

User avatar
muhdnurhidayat
Member
 
Posts: 295
Joined: Wed Nov 16, 2016 22:55
Location: Shah Alam, Selangor, Malaysia
GitHub: MuhdNurHidayat
IRC: muhdnurhidayat
In-game: muhdnurhidayat

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

by muhdnurhidayat » Sat Mar 11, 2017 12:34

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, contributing to Minetest Wiki. I'm muhdnurhidayat in IFS (mod), HOMETOWN & others. / Twitter / MT Offtopic ✂️- - - - - -

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 » Sun May 07, 2017 15:22

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: 108
Joined: Tue Sep 16, 2014 22:00
Location: En Bretagne :-)
In-game: shiva35
 

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

User avatar
shiva
Member
 
Posts: 108
Joined: Tue Sep 16, 2014 22:00
Location: En Bretagne :-)
In-game: shiva35
 

User avatar
VanessaE
Moderator
 
Posts: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE
 

User avatar
VanessaE
Moderator
 
Posts: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Tue Oct 09, 2018 12:51

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Wed Sep 11, 2019 17:18

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: 63
Joined: Wed Aug 28, 2019 18:11

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

by Drachenbauer32 » Mon Sep 30, 2019 17:10

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Thu Oct 03, 2019 19:38

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: 804
Joined: Sun Jun 19, 2011 06:51

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

by neko259 » Sat Oct 12, 2019 17:41

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Sat Oct 12, 2019 19:40

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: 804
Joined: Sun Jun 19, 2011 06:51

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

by neko259 » Sun Oct 13, 2019 09:33

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Sun Oct 13, 2019 09:38

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: 804
Joined: Sun Jun 19, 2011 06:51

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

by neko259 » Sun Oct 13, 2019 09:47

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: 4461
Joined: Sun Apr 01, 2012 12:38
Location: Waynesville, NC
GitHub: VanessaE
IRC: VanessaE
In-game: VanessaE

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

by VanessaE » Sun Oct 13, 2019 19:23

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)
 

Previous

Return to Mod Releases



Who is online

Users browsing this forum: No registered users and 3 guests