Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
-- signs_lib api, backported from street_signs
|
|
|
|
|
|
|
|
local S = signs_lib.S
|
|
|
|
local has_default_mod = minetest.get_modpath("default")
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
local function log(level, messagefmt, ...)
|
|
|
|
minetest.log(level, "[signs_lib] " .. messagefmt:format(...))
|
|
|
|
end
|
|
|
|
|
|
|
|
local function get_sign_formspec() end
|
|
|
|
|
|
|
|
signs_lib.glow_item = "basic_materials:energy_crystal_simple"
|
|
|
|
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
signs_lib.lbm_restore_nodes = {}
|
|
|
|
signs_lib.old_fenceposts = {}
|
|
|
|
signs_lib.old_fenceposts_replacement_signs = {}
|
|
|
|
signs_lib.old_fenceposts_with_signs = {}
|
|
|
|
|
|
|
|
-- Settings used for a standard wood or steel wall sign
|
|
|
|
signs_lib.standard_lines = 6
|
|
|
|
signs_lib.standard_hscale = 1
|
|
|
|
signs_lib.standard_vscale = 1
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
signs_lib.standard_lspace = 1
|
|
|
|
signs_lib.standard_fsize = 16
|
|
|
|
signs_lib.standard_xoffs = 4
|
|
|
|
signs_lib.standard_yoffs = 0
|
|
|
|
signs_lib.standard_cpl = 35
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
signs_lib.standard_wood_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].groups or {})
|
|
|
|
signs_lib.standard_wood_groups.attached_node = nil
|
|
|
|
|
|
|
|
signs_lib.standard_steel_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].groups or {})
|
|
|
|
signs_lib.standard_steel_groups.attached_node = nil
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
signs_lib.standard_wood_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].sounds or {})
|
|
|
|
signs_lib.standard_steel_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].sounds or {})
|
|
|
|
|
|
|
|
signs_lib.default_text_scale = {x=10, y=10}
|
|
|
|
|
|
|
|
signs_lib.old_widefont_signs = {}
|
|
|
|
|
|
|
|
signs_lib.block_list = {}
|
|
|
|
signs_lib.totalblocks = 0
|
|
|
|
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
signs_lib.standard_yaw = {
|
|
|
|
0,
|
|
|
|
math.pi / -2,
|
|
|
|
math.pi,
|
|
|
|
math.pi / 2,
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.wallmounted_yaw = {
|
|
|
|
nil,
|
|
|
|
nil,
|
|
|
|
math.pi / -2,
|
|
|
|
math.pi / 2,
|
|
|
|
0,
|
|
|
|
math.pi,
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.fdir_to_back = {
|
|
|
|
{ 0, -1 },
|
|
|
|
{ -1, 0 },
|
|
|
|
{ 0, 1 },
|
|
|
|
{ 1, 0 },
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.wall_fdir_to_back = {
|
|
|
|
nil,
|
|
|
|
nil,
|
|
|
|
{ 0, 1 },
|
|
|
|
{ 0, -1 },
|
|
|
|
{ -1, 0 },
|
|
|
|
{ 1, 0 },
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.fdir_flip_to_back = {
|
|
|
|
[0] = { 0, 2 },
|
|
|
|
[1] = { 2, 0 },
|
|
|
|
[2] = { 0, -2 },
|
|
|
|
[3] = { -2, 0 }
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.wall_fdir_flip_to_back = {
|
|
|
|
[2] = { 2, 0 },
|
|
|
|
[3] = { -2, 0 },
|
|
|
|
[4] = { 0, 2 },
|
|
|
|
[5] = { 0, -2 },
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.fdir_to_back_left = {
|
|
|
|
[0] = { -1, 1 },
|
|
|
|
[1] = { 1, 1 },
|
|
|
|
[2] = { 1, -1 },
|
|
|
|
[3] = { -1, -1 }
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.wall_fdir_to_back_left = {
|
|
|
|
[2] = { 1, 1 },
|
|
|
|
[3] = { -1, -1 },
|
|
|
|
[4] = { -1, 1 },
|
|
|
|
[5] = { 1, -1 }
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.rotate_walldir = {
|
|
|
|
[0] = 4,
|
|
|
|
[1] = 0,
|
|
|
|
[2] = 5,
|
|
|
|
[3] = 1,
|
|
|
|
[4] = 2,
|
|
|
|
[5] = 3
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.rotate_walldir_simple = {
|
|
|
|
[0] = 4,
|
|
|
|
[1] = 4,
|
|
|
|
[2] = 5,
|
|
|
|
[3] = 4,
|
|
|
|
[4] = 2,
|
|
|
|
[5] = 3
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.rotate_facedir = {
|
|
|
|
[0] = 1,
|
|
|
|
[1] = 2,
|
|
|
|
[2] = 3,
|
|
|
|
[3] = 4,
|
|
|
|
[4] = 6,
|
|
|
|
[5] = 6,
|
|
|
|
[6] = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.rotate_facedir_simple = {
|
|
|
|
[0] = 1,
|
|
|
|
[1] = 2,
|
|
|
|
[2] = 3,
|
|
|
|
[3] = 0,
|
|
|
|
[4] = 0,
|
|
|
|
[5] = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.flip_facedir = {
|
|
|
|
[0] = 2,
|
|
|
|
[1] = 3,
|
|
|
|
[2] = 0,
|
|
|
|
[3] = 1,
|
|
|
|
[4] = 6,
|
|
|
|
[5] = 4,
|
|
|
|
[6] = 4
|
|
|
|
}
|
|
|
|
|
|
|
|
signs_lib.flip_walldir = {
|
|
|
|
[0] = 1,
|
|
|
|
[1] = 0,
|
|
|
|
[2] = 3,
|
|
|
|
[3] = 2,
|
|
|
|
[4] = 5,
|
|
|
|
[5] = 4
|
|
|
|
}
|
|
|
|
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
-- Initialize character texture cache
|
|
|
|
local ctexcache = {}
|
|
|
|
local ctexcache_wide = {}
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
-- entity handling
|
|
|
|
|
|
|
|
minetest.register_entity("signs_lib:text", {
|
|
|
|
collisionbox = { 0, 0, 0, 0, 0, 0 },
|
|
|
|
visual = "mesh",
|
|
|
|
mesh = "signs_lib_standard_sign_entity_wall.obj",
|
|
|
|
textures = {},
|
|
|
|
static_save = true,
|
|
|
|
backface_culling = false,
|
|
|
|
on_activate = function(self)
|
|
|
|
local node = minetest.get_node(self.object:get_pos())
|
|
|
|
if minetest.get_item_group(node.name, "sign") == 0 then
|
|
|
|
self.object:remove()
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
on_blast = function(self, damage)
|
|
|
|
return false, false, {}
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
|
|
|
|
function signs_lib.delete_objects(pos)
|
|
|
|
local objects = minetest.get_objects_inside_radius(pos, 0.5)
|
|
|
|
for _, v in ipairs(objects) do
|
|
|
|
if v then
|
|
|
|
local e = v:get_luaentity()
|
|
|
|
if e and string.match(e.name, "sign.*text") then
|
|
|
|
v:remove()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.spawn_entity(pos, texture, glow)
|
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local def = minetest.registered_items[node.name]
|
|
|
|
if not def or not def.entity_info then return end
|
|
|
|
|
|
|
|
local text_scale = (node and node.text_scale) or signs_lib.default_text_scale
|
|
|
|
local objects = minetest.get_objects_inside_radius(pos, 0.5)
|
|
|
|
local obj
|
|
|
|
|
|
|
|
if #objects > 0 then
|
|
|
|
for _, v in ipairs(objects) do
|
|
|
|
if v then
|
|
|
|
local e = v:get_luaentity()
|
|
|
|
if e and e.name == "signs_lib:text" then
|
|
|
|
obj = v
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if not obj then
|
|
|
|
obj = minetest.add_entity(pos, "signs_lib:text")
|
|
|
|
end
|
|
|
|
|
|
|
|
local yaw = def.entity_info.yaw[node.param2 + 1]
|
|
|
|
local pitch = 0
|
|
|
|
|
|
|
|
if not string.find(node.name, "onpole") and not string.find(node.name, "hanging") then
|
|
|
|
local rot90 = math.pi/2
|
|
|
|
|
|
|
|
if def.paramtype2 == "wallmounted" then
|
|
|
|
if node.param2 == 1 then -- on floor
|
|
|
|
pitch = -rot90
|
|
|
|
yaw = 0
|
|
|
|
elseif node.param2 == 0 then -- on ceiling
|
|
|
|
pitch = rot90
|
|
|
|
yaw = math.pi
|
|
|
|
end
|
|
|
|
elseif def.paramtype2 == "facedir" then
|
|
|
|
if node.param2 == 4 then
|
|
|
|
pitch = -rot90
|
|
|
|
yaw = 0
|
|
|
|
elseif node.param2 == 6 then
|
|
|
|
pitch = rot90
|
|
|
|
yaw = math.pi
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if glow ~= "" then
|
|
|
|
obj:set_properties( {glow = tonumber(glow * 5)} )
|
|
|
|
end
|
|
|
|
|
|
|
|
if yaw then
|
|
|
|
obj:set_rotation({x = pitch, y = yaw, z=0})
|
|
|
|
|
|
|
|
if not texture then
|
|
|
|
obj:set_properties({
|
|
|
|
mesh = def.entity_info.mesh,
|
|
|
|
visual_size = text_scale,
|
|
|
|
})
|
|
|
|
else
|
|
|
|
obj:set_properties({
|
|
|
|
mesh = def.entity_info.mesh,
|
|
|
|
visual_size = text_scale,
|
|
|
|
textures={texture},
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.set_obj_text(pos, text, glow)
|
|
|
|
local split = signs_lib.split_lines_and_words
|
|
|
|
local text_ansi = signs_lib.Utf8ToAnsi(text)
|
|
|
|
signs_lib.delete_objects(pos)
|
|
|
|
-- only create sign entity for actual text
|
|
|
|
if text_ansi and text_ansi ~= "" then
|
|
|
|
signs_lib.spawn_entity(pos,
|
|
|
|
signs_lib.make_sign_texture(split(text_ansi), pos), glow)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- rotation
|
|
|
|
|
|
|
|
function signs_lib.handle_rotation(pos, node, user, mode)
|
|
|
|
if not signs_lib.can_modify(pos, user)
|
|
|
|
or mode ~= screwdriver.ROTATE_FACE then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
local newparam2
|
|
|
|
local tpos = pos
|
|
|
|
local def = minetest.registered_items[node.name]
|
|
|
|
|
|
|
|
if string.match(node.name, "_onpole") then
|
|
|
|
if not string.match(node.name, "_horiz") then
|
|
|
|
newparam2 = signs_lib.rotate_walldir_simple[node.param2] or 4
|
|
|
|
local t = signs_lib.wall_fdir_to_back_left
|
|
|
|
|
|
|
|
if def.paramtype2 ~= "wallmounted" then
|
|
|
|
newparam2 = signs_lib.rotate_facedir_simple[node.param2] or 0
|
|
|
|
t = signs_lib.fdir_to_back_left
|
|
|
|
end
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
tpos = {
|
|
|
|
x = pos.x + t[node.param2][1],
|
|
|
|
y = pos.y,
|
|
|
|
z = pos.z + t[node.param2][2]
|
|
|
|
}
|
|
|
|
else
|
|
|
|
-- flip the sign to the other side of the horizontal pole
|
|
|
|
newparam2 = signs_lib.flip_walldir[node.param2] or 4
|
|
|
|
local t = signs_lib.wall_fdir_flip_to_back
|
|
|
|
|
|
|
|
if def.paramtype2 ~= "wallmounted" then
|
|
|
|
newparam2 = signs_lib.flip_facedir[node.param2] or 0
|
|
|
|
t = signs_lib.fdir_flip_to_back
|
|
|
|
end
|
|
|
|
|
|
|
|
tpos = {
|
|
|
|
x = pos.x + t[node.param2][1],
|
|
|
|
y = pos.y,
|
|
|
|
z = pos.z + t[node.param2][2]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
local node2 = minetest.get_node(tpos)
|
|
|
|
local def2 = minetest.registered_items[node2.name]
|
|
|
|
if not def2 or not def2.buildable_to then return true end -- undefined, or not buildable_to.
|
|
|
|
|
|
|
|
minetest.set_node(tpos, {name = node.name, param2 = newparam2})
|
|
|
|
minetest.get_meta(tpos):from_table(minetest.get_meta(pos):to_table())
|
|
|
|
minetest.remove_node(pos)
|
|
|
|
signs_lib.delete_objects(pos)
|
|
|
|
elseif string.match(node.name, "_hanging") or string.match(node.name, "yard") then
|
|
|
|
minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir_simple[node.param2] or 0 })
|
|
|
|
elseif minetest.registered_items[node.name].paramtype2 == "wallmounted" then
|
|
|
|
minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_walldir[node.param2] or 0 })
|
|
|
|
else
|
|
|
|
minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir[node.param2] or 0 })
|
|
|
|
end
|
|
|
|
|
|
|
|
signs_lib.update_sign(tpos)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
return true
|
|
|
|
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"
|
|
|
|
local CHAR_FILE_WIDE = "%s_%s.png"
|
|
|
|
local UNIFONT_TEX = "signs_lib_uni%02x.png\\^[sheet\\:16x16\\:%d,%d"
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
-- Fonts path
|
|
|
|
local CHAR_PATH = TP .. "/" .. CHAR_FILE
|
|
|
|
local CHAR_PATH_WIDE = TP .. "/" .. CHAR_FILE_WIDE
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
-- 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
|
|
|
|
local 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
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Read the image size from a PNG file.
|
|
|
|
-- Returns image_w, image_h.
|
|
|
|
-- Only the LSB is read from each field!
|
|
|
|
function signs_lib.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
|
|
|
|
|
|
|
|
-- 4 rows, max 80 chars per, plus a bit of fudge to
|
|
|
|
-- avoid excess trimming (e.g. due to color codes)
|
|
|
|
|
|
|
|
local MAX_INPUT_CHARS = 400
|
|
|
|
|
|
|
|
-- 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(font_size)
|
|
|
|
|
|
|
|
local cw = {}
|
|
|
|
local cw_wide = {}
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
-- To calculate average char width.
|
|
|
|
local total_width = 0
|
|
|
|
local char_count = 0
|
|
|
|
|
|
|
|
for c = 32, 255 do
|
|
|
|
local w, h = signs_lib.read_image_size(CHAR_PATH:format("signs_lib_font_"..font_size.."px", c))
|
|
|
|
if w and h then
|
|
|
|
local ch = string.char(c)
|
|
|
|
cw[ch] = w
|
|
|
|
total_width = total_width + w
|
|
|
|
char_count = char_count + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
for i = 1, #signs_lib.wide_character_codes do
|
|
|
|
local ch = signs_lib.wide_character_codes[i]
|
|
|
|
local w, h = signs_lib.read_image_size(CHAR_PATH_WIDE:format("signs_lib_font_"..font_size.."px", ch))
|
|
|
|
if w and h then
|
|
|
|
cw_wide[ch] = w
|
|
|
|
total_width = total_width + w
|
|
|
|
char_count = char_count + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
local cbw, cbh = signs_lib.read_image_size(TP.."/signs_lib_color_"..font_size.."px_n.png")
|
|
|
|
assert(cbw and cbh, "error reading bg dimensions")
|
|
|
|
return cw, cbw, cbh, (total_width / char_count), cw_wide
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
end
|
|
|
|
|
|
|
|
signs_lib.charwidth16,
|
|
|
|
signs_lib.colorbgw16,
|
|
|
|
signs_lib.lineheight16,
|
|
|
|
signs_lib.avgwidth16,
|
|
|
|
signs_lib.charwidth_wide16 = build_char_db(16)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
signs_lib.charwidth32,
|
|
|
|
signs_lib.colorbgw32,
|
|
|
|
signs_lib.lineheight32,
|
|
|
|
signs_lib.avgwidth32,
|
|
|
|
signs_lib.charwidth_wide32 = build_char_db(32)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
|
|
|
|
-- some local helper functions
|
|
|
|
|
|
|
|
local math_max = math.max
|
|
|
|
|
|
|
|
local function fill_line(x, y, w, c, font_size, colorbgw)
|
|
|
|
c = c or "0"
|
|
|
|
local tex = { }
|
|
|
|
for xx = 0, math.max(0, w), colorbgw do
|
|
|
|
table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%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)
|
|
|
|
if ctexcache[font_name..ch] then
|
|
|
|
return ctexcache[font_name..ch], true
|
|
|
|
else
|
|
|
|
local c = ch:byte()
|
|
|
|
local exists = file_exists(CHAR_PATH:format(font_name, c))
|
|
|
|
local tex
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
if exists and c ~= 14 then
|
|
|
|
tex = CHAR_FILE:format(font_name, c)
|
|
|
|
else
|
|
|
|
tex = CHAR_FILE:format(font_name, 0x0)
|
|
|
|
end
|
|
|
|
ctexcache[font_name..ch] = tex
|
|
|
|
return tex, exists
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function char_tex_wide(font_name, ch)
|
|
|
|
if ctexcache_wide[font_name..ch] then
|
|
|
|
return ctexcache_wide[font_name..ch], true
|
|
|
|
else
|
|
|
|
local exists = file_exists(CHAR_PATH_WIDE:format(font_name, ch))
|
|
|
|
local tex
|
|
|
|
if exists then
|
|
|
|
tex = CHAR_FILE_WIDE:format(font_name, ch)
|
|
|
|
else
|
|
|
|
tex = CHAR_FILE:format(font_name, 0x5f)
|
|
|
|
end
|
|
|
|
ctexcache_wide[font_name..ch] = tex
|
|
|
|
return tex, exists
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function make_line_texture(line, lineno, pos, line_width, line_height, cwidth_tab, font_size, colorbgw, cwidth_tab_wide, force_unicode_font)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
local width = 0
|
|
|
|
local maxw = 0
|
|
|
|
local font_name = "signs_lib_font_"..font_size.."px"
|
|
|
|
|
|
|
|
local words = { }
|
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local def = minetest.registered_items[node.name]
|
|
|
|
local default_color = def.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
|
|
|
|
local escape = 0
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
while i <= word_l do
|
|
|
|
local wide_type, wide_c = string.match(word:sub(i), "^&#([xu])(%x+);")
|
|
|
|
local c = word:sub(i, i)
|
|
|
|
local c2 = word:sub(i+1, i+1)
|
|
|
|
|
|
|
|
if escape > 0 then escape = escape - 1 end
|
|
|
|
if c == "^" and escape == 0 and c2:find("[1-8a-h]") then
|
|
|
|
c = string.char(tonumber(c2,18)+0x80)
|
|
|
|
i = i + 1
|
|
|
|
end
|
|
|
|
|
|
|
|
local wide_skip = 0
|
|
|
|
if force_unicode_font then
|
|
|
|
if wide_c then
|
|
|
|
wide_skip = #wide_c + 3
|
|
|
|
wide_type = "u"
|
|
|
|
elseif c:byte() < 0x80 or c:byte() >= 0xa0 then
|
|
|
|
wide_type = "u"
|
|
|
|
local uchar = signs_lib.AnsiToUtf8(c)
|
|
|
|
local code
|
|
|
|
if #uchar == 1 then
|
|
|
|
code = uchar:byte()
|
|
|
|
else
|
|
|
|
code = uchar:byte() % (2 ^ (7 - #uchar))
|
|
|
|
for j = 1, #uchar do
|
|
|
|
code = code * (2 ^ 6) + uchar:byte(j) - 0x80
|
|
|
|
end
|
|
|
|
end
|
|
|
|
wide_c = string.format("%04x", code)
|
|
|
|
end
|
|
|
|
elseif wide_c then
|
|
|
|
wide_skip = #wide_c + 3
|
|
|
|
end
|
|
|
|
|
|
|
|
if c == "#" and escape == 0 and c2:find("[0-9A-Fa-f#^]") then
|
|
|
|
if c2 == "#" or c2 == "^" then
|
|
|
|
escape = 2
|
|
|
|
else
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
i = i + 1
|
|
|
|
cur_color = tonumber(c2, 16)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
end
|
|
|
|
elseif wide_c then
|
|
|
|
local w, code
|
|
|
|
if wide_type == "x" then
|
|
|
|
w = cwidth_tab_wide[wide_c]
|
|
|
|
elseif wide_type == "u" and #wide_c <= 4 then
|
|
|
|
w = font_size
|
|
|
|
code = tonumber(wide_c, 16)
|
|
|
|
if signs_lib.unifont_halfwidth[code] then
|
|
|
|
w = math.floor(w / 2)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if w then
|
|
|
|
width = width + w + 1
|
|
|
|
if width >= (line_width - cwidth_tab[" "]) then
|
|
|
|
width = 0
|
|
|
|
else
|
|
|
|
maxw = math_max(width, maxw)
|
|
|
|
end
|
|
|
|
if #chars < MAX_INPUT_CHARS then
|
|
|
|
local tex
|
|
|
|
if wide_type == "u" then
|
|
|
|
local page = math.floor(code / 256)
|
|
|
|
local idx = code % 256
|
|
|
|
local x = idx % 16
|
|
|
|
local y = math.floor(idx / 16)
|
|
|
|
tex = UNIFONT_TEX:format(page, x, y)
|
|
|
|
if font_size == 32 then
|
|
|
|
tex = tex .. "\\^[resize\\:32x32"
|
|
|
|
end
|
|
|
|
else
|
|
|
|
tex = char_tex_wide(font_name, wide_c)
|
|
|
|
end
|
|
|
|
table.insert(chars, {
|
|
|
|
off = ch_offs,
|
|
|
|
tex = tex,
|
|
|
|
col = ("%X"):format(cur_color),
|
|
|
|
})
|
|
|
|
end
|
|
|
|
ch_offs = ch_offs + w
|
|
|
|
end
|
|
|
|
i = i + wide_skip
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
else
|
|
|
|
local w = cwidth_tab[c]
|
|
|
|
if w then
|
|
|
|
width = width + w + 1
|
|
|
|
if width >= (line_width - cwidth_tab[" "]) 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 + cwidth_tab[" "] + 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((line_width - maxw) / 2) + def.x_offset
|
|
|
|
|
|
|
|
local xpos = start_xpos
|
|
|
|
local ypos = (line_height + def.line_spacing)* lineno + def.y_offset
|
|
|
|
|
|
|
|
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", font_size, colorbgw))
|
|
|
|
xpos = start_xpos
|
|
|
|
ypos = ypos + line_height + def.line_spacing
|
|
|
|
lineno = lineno + 1
|
|
|
|
if lineno >= def.number_of_lines then break end
|
|
|
|
table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw))
|
|
|
|
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, font_size, colorbgw))
|
|
|
|
end
|
|
|
|
table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex))
|
|
|
|
end
|
|
|
|
table.insert(
|
|
|
|
texture,
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
(":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ")
|
|
|
|
)
|
|
|
|
xpos = xpos + word.w + cwidth_tab[" "]
|
|
|
|
if xpos >= (line_width + cwidth_tab[" "]) then break end
|
|
|
|
end
|
|
|
|
|
|
|
|
table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw))
|
|
|
|
table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw))
|
|
|
|
|
|
|
|
return table.concat(texture), lineno
|
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.make_sign_texture(lines, pos)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
local def = minetest.registered_items[node.name]
|
|
|
|
if not def or not def.entity_info then return end
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
|
|
|
|
local font_size
|
|
|
|
local line_width
|
|
|
|
local line_height
|
|
|
|
local char_width
|
|
|
|
local char_width_wide
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
local colorbgw
|
|
|
|
local widemult = meta:get_int("widefont") == 1 and 0.5 or 1
|
|
|
|
local force_unicode_font = meta:get_int("unifont") == 1
|
|
|
|
|
|
|
|
if def.font_size and (def.font_size == 32 or def.font_size == 31) then
|
|
|
|
font_size = 32
|
|
|
|
line_width = math.floor(signs_lib.avgwidth32 * def.chars_per_line) * (def.horiz_scaling * widemult)
|
|
|
|
line_height = signs_lib.lineheight32
|
|
|
|
char_width = signs_lib.charwidth32
|
|
|
|
char_width_wide = signs_lib.charwidth_wide32
|
|
|
|
colorbgw = signs_lib.colorbgw32
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
else
|
|
|
|
font_size = 16
|
|
|
|
line_width = math.floor(signs_lib.avgwidth16 * def.chars_per_line) * (def.horiz_scaling * widemult)
|
|
|
|
line_height = signs_lib.lineheight16
|
|
|
|
char_width = signs_lib.charwidth16
|
|
|
|
char_width_wide = signs_lib.charwidth_wide16
|
|
|
|
colorbgw = signs_lib.colorbgw16
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
end
|
|
|
|
|
|
|
|
local texture = { ("[combine:%dx%d"):format(line_width, (line_height + def.line_spacing) * def.number_of_lines * def.vert_scaling) }
|
|
|
|
|
|
|
|
local lineno = 0
|
|
|
|
for i = 1, #lines do
|
|
|
|
if lineno >= def.number_of_lines then break end
|
|
|
|
local linetex, ln = make_line_texture(lines[i], lineno, pos, line_width, line_height, char_width, font_size, colorbgw, char_width_wide, force_unicode_font)
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
table.insert(texture, linetex)
|
|
|
|
lineno = ln + 1
|
|
|
|
end
|
|
|
|
table.insert(texture, "^[makealpha:0,0,0")
|
|
|
|
return table.concat(texture, "")
|
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.split_lines_and_words(text)
|
|
|
|
if not text then return end
|
|
|
|
local lines = { }
|
|
|
|
for _, line in ipairs(text:split("\n", true)) do
|
|
|
|
table.insert(lines, line:split(" "))
|
|
|
|
end
|
|
|
|
return lines
|
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)
|
|
|
|
|
|
|
|
if not player or not signs_lib.can_modify(pos, player) then return end
|
|
|
|
if not player.get_meta then return end
|
|
|
|
|
|
|
|
player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos))
|
|
|
|
minetest.show_formspec(player:get_player_name(), "signs_lib:sign", get_sign_formspec(pos, node.name))
|
Re-built onto the new API formerly part of my street_signs mod
Any sign can now use a 15 or 31 px font, at any reasonable visual scale,
line width, number of lines, etc.
Split most signs off into a separate mod, basic_signs, which depends on
this one. Only the default minetest_game wood and steel signs remain in
signs_lib, completely redefined. The wall/yard/ceiling function for
wooden signs has been rewitten and moved to basic_signs, too.
signs_lib can now put almost any wall sign onto almost any kind of
posts/fence, as with most signs in my street_signs mod. Mods can add
their fences/posts to its "allowed" list, if needed (signs_lib 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.
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.
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.
4 years ago
|
|
|
end
|
|
|
|
|
|
|
|
function signs_lib.destruct_sign(pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local glow = meta:get_string("glow")
|
|
|
|
if glow ~= "" and not minetest.is_creative_enabled("") then
|
|
|
|
local num = tonumber(glow)
|
|
|
|
minetest.add_item(pos, ItemStack(signs_lib.glow_item .. " " .. num))
|
|
|
|
end
|
|
|
|
signs_lib.delete_objects(pos)
|
|