1
0
mirror of https://github.com/mt-mods/signs_lib.git synced 2025-06-28 13:56:06 +02:00

Compare commits

...

17 Commits

Author SHA1 Message Date
bbd580acb1 remove debug prints 2019-09-18 13:57:57 -04:00
2d29a539f8 fix minor global warning 2019-09-18 13:55:19 -04:00
4b2abfadce centralize entity handling
minor re-factor as needed for that
don't store entities statically, let the LBM generate them.

this works around Minetest's reload-positioning inaccuracy at very large
positive or negative X/Z coords (tested -18000/+18000 at all four corners,
both new signs and after reboot)
2019-09-18 13:51:53 -04:00
ee2dc495c3 treat streets:streetlamp_basic_top_* as a type of post
as far as sign placement is concerned.
2019-09-16 22:46:26 -04:00
f944337b1c fix non-writable signs not fitting onto a pole/fence 2019-09-15 18:37:03 -04:00
a5e711d354 Use sign formspec to switch between wide/narrow font
if available on a given sign.  The sign must have a
"foo:bar_widefont" variant, with the horizontal scaling set
appropriately (about half of the normal value for the
narrow-font sign)

Add new corresponding API to anto-generate those signs where
desired; use this feature in default wood and steel signs
2019-09-15 16:10:11 -04:00
bcb6a3aa39 add "wide font" overlay image 2019-09-15 03:18:52 -04:00
b021b9666f Allow mod to specify custom selbox for on-pole variants 2019-09-15 02:00:05 -04:00
c765d3b316 allow locked and all steel signs to hang from ceiling 2019-09-15 01:47:43 -04:00
78418de9c9 create a generic hanging sign feature and
move basic_signs' hanging wooden sign back to here, use it.
2019-09-15 01:23:40 -04:00
f6673dc0f1 added a proper register-sign API call
(see api.lua and standard_signs.lua for examples)

make selectionbox call now ignores the old onpole flag (it's automatic now)
removed debug print()'s
moved the signs-on-fences lbm settings to here, from basic_signs.
some misc cleanups

added reference models for standard wooden sign ("wallmounted" on wall,
"facedir" on wall, and pole-mount variants, using standard-size pole
mount), and a separate .blend with street_signs' OM3 sign on slim pole
mount.
2019-09-14 22:45:01 -04:00
fe57c23132 Add standard wood and steel signs sound defs
use them in standard signs.
2019-09-14 17:59:21 -04:00
94745e123e get standard sign groups directly from the original default node defs
(instead of hard-coding them)
2019-09-14 17:45:42 -04:00
5131eac4bb Move text entity out a bit further from sign surface
was ~7.81 mm (2/256), now ~11.72 mm (3/256)
2019-09-14 17:31:38 -04:00
de69b246ec fix wrong priv 2019-09-13 17:12:40 -04:00
e2d522373d add chat command to sweep-away
and regenerate all sign entities in loaded map
(uses LBM to log all loaded blocks,
but only those with nodes in "group:sign").
2019-09-13 16:51:51 -04:00
d262f95744 fix bad material order in facedir-onpole model 2019-09-12 12:01:51 -04:00
15 changed files with 621 additions and 344 deletions

549
api.lua
View File

@ -15,11 +15,21 @@ signs_lib.standard_vscale = 1
signs_lib.standard_lspace = 1
signs_lib.standard_fsize = 15
signs_lib.standard_xoffs = 4
signs_lib.standard_yoffs = 2
signs_lib.standard_yoffs = 0
signs_lib.standard_cpl = 35
signs_lib.standard_wood_groups = {choppy = 2, flammable = 2, oddly_breakable_by_hand = 3}
signs_lib.standard_steel_groups = {cracky = 2, oddly_breakable_by_hand = 3}
signs_lib.standard_wood_groups = table.copy(minetest.registered_items["default:sign_wall_wood"].groups)
signs_lib.standard_wood_groups.sign = 1
signs_lib.standard_wood_groups.attached_node = nil
signs_lib.standard_steel_groups = table.copy(minetest.registered_items["default:sign_wall_steel"].groups)
signs_lib.standard_steel_groups.sign = 1
signs_lib.standard_steel_groups.attached_node = nil
signs_lib.standard_wood_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_wood"].sounds)
signs_lib.standard_steel_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_steel"].sounds)
signs_lib.default_text_scale = {x=10, y=10}
signs_lib.standard_yaw = {
0,
@ -75,7 +85,57 @@ signs_lib.rotate_walldir = {
-- Initialize character texture cache
local ctexcache = {}
signs_lib.wallmounted_rotate = function(pos, node, user, mode)
-- entity handling
minetest.register_entity("signs_lib:text", {
collisionbox = { 0, 0, 0, 0, 0, 0 },
visual = "mesh",
mesh = "signs_lib_standard_wall_sign_entity.obj",
textures = {},
static_save = false
})
function signs_lib.delete_objects(pos)
local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do
v:remove()
end
end
function signs_lib.spawn_entity(pos, texture)
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
if not def or not def.entity_info or not def.entity_info.yaw[node.param2 + 1] 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
obj = objects[1]
else
obj = minetest.add_entity(pos, "signs_lib:text")
end
obj:setyaw(def.entity_info.yaw[node.param2 + 1])
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
-- rotation
function signs_lib.wallmounted_rotate(pos, node, user, mode)
if not signs_lib.can_modify(pos, user) then return false end
if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then
@ -85,17 +145,12 @@ signs_lib.wallmounted_rotate = function(pos, node, user, mode)
local newparam2 = signs_lib.rotate_walldir[node.param2] or 0
minetest.swap_node(pos, { name = node.name, param2 = newparam2 })
for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
local e = v:get_luaentity()
if e and e.name == "signs_lib:text" then
v:remove()
end
end
signs_lib.delete_objects(pos)
signs_lib.update_sign(pos)
return true
end
signs_lib.facedir_rotate = function(pos, node, user, mode)
function signs_lib.facedir_rotate(pos, node, user, mode)
if not signs_lib.can_modify(pos, user) then return false end
if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then
@ -105,18 +160,11 @@ signs_lib.facedir_rotate = function(pos, node, user, mode)
local newparam2 = signs_lib.rotate_facedir[node.param2] or 0
minetest.swap_node(pos, { name = node.name, param2 = newparam2 })
for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
local e = v:get_luaentity()
if e and e.name == "signs_lib:text" then
v:remove()
end
end
signs_lib.delete_objects(pos)
signs_lib.update_sign(pos)
return true
end
local DEFAULT_TEXT_SCALE = {x=10, y=10}
-- infinite stacks
if not minetest.settings:get_bool("creative_mode") then
@ -227,15 +275,6 @@ local fences_with_sign = { }
-- some local helper functions
local function split_lines_and_words(text)
if not text then return end
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, font_size, colorbgw)
@ -414,26 +453,55 @@ local function make_sign_texture(lines, pos)
return table.concat(texture, "")
end
local function set_obj_text(obj, text, x, pos)
local split = split_lines_and_words
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
local texture = make_sign_texture(split(text_ansi), pos)
obj:set_properties({
textures={texture},
visual_size = text_scale,
})
function signs_lib.split_lines_and_words(text)
if not text then return end
local lines = { }
for _, line in ipairs(text:split("\n")) do
table.insert(lines, line:split(" "))
end
return lines
end
signs_lib.construct_sign = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string(
"formspec",
"size[6,4]"..
function signs_lib.set_obj_text(pos, text)
local split = signs_lib.split_lines_and_words
local text_ansi = Utf8ToAnsi(text)
local n = minetest.registered_nodes[minetest.get_node(pos).name]
signs_lib.delete_objects(pos)
signs_lib.spawn_entity(pos, make_sign_texture(split(text_ansi), pos))
end
local function make_widefont_nodename(name)
if string.find(name, "_widefont") then return name end
if string.find(name, "_onpole") then
return string.gsub(name, "_onpole", "_widefont_onpole")
elseif string.find(name, "_hanging") then
return string.gsub(name, "_hanging", "_widefont_hanging")
else
return name.."_widefont"
end
end
function signs_lib.construct_sign(pos)
local form = "size[6,4]"..
"textarea[0,-0.3;6.5,3;text;;${text}]"..
"button_exit[2,3.4;2,1;ok;"..S("Write").."]"..
"background[-0.5,-0.5;7,5;signs_lib_sign_bg.jpg]")
"background[-0.5,-0.5;7,5;signs_lib_sign_bg.jpg]"
local node = minetest.get_node(pos)
local wname = make_widefont_nodename(node.name)
if minetest.registered_items[wname] then
local state = "off"
if string.find(node.name, "widefont") then state = "on" end
form = form.."label[1,3.4;Use wide font]"..
"image_button[1.1,3.7;1,0.6;signs_lib_switch_"..
state..".png;"..
state..";;;false;signs_lib_switch_interm.png]"..
"button_exit[3,3.4;2,1;ok;"..S("Write").."]"
else
form = form.."button_exit[2,3.4;2,1;ok;"..S("Write").."]"
end
local meta = minetest.get_meta(pos)
meta:set_string("formspec", form)
local i = meta:get_string("infotext")
if i == "" then -- it wasn't even set, so set it.
meta:set_string("infotext", "")
@ -441,18 +509,12 @@ signs_lib.construct_sign = function(pos)
end
function signs_lib.destruct_sign(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_lib:text" then
v:remove()
end
end
signs_lib.delete_objects(pos)
end
local function make_infotext(text)
text = trim_input(text)
local lines = split_lines_and_words(text) or {}
local lines = signs_lib.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("##", "#")))
@ -467,50 +529,45 @@ function signs_lib.update_sign(pos, fields)
text = trim_input(text)
local owner = meta:get_string("owner")
ownstr = ""
local ownstr = ""
if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end
meta:set_string("text", text)
meta:set_string("infotext", ownstr..make_infotext(text).." ")
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_lib:text" then
if found then
v:remove()
else
set_obj_text(v, text, nil, pos)
found = true
end
end
end
if found then
return
end
-- if there is no entity
local signnode = minetest.get_node(pos)
local signname = signnode.name
local def = minetest.registered_items[signname]
if not def.entity_info or not def.entity_info.yaw[signnode.param2 + 1] then return end
local obj = minetest.add_entity(pos, "signs_lib:text")
obj:setyaw(def.entity_info.yaw[signnode.param2 + 1])
obj:set_properties({
mesh = def.entity_info.mesh,
})
signs_lib.set_obj_text(pos, text)
end
function signs_lib.receive_fields(pos, formname, fields, sender)
if fields and fields.text and fields.ok and signs_lib.can_modify(pos, sender) then
if not fields or not signs_lib.can_modify(pos, sender) then return end
if fields.text and fields.ok then
minetest.log("action", S("@1 wrote \"@2\" to sign at @3",
(sender:get_player_name() or ""),
fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"),
minetest.pos_to_string(pos)
))
signs_lib.update_sign(pos, fields)
elseif fields.on or fields.off then
local node = minetest.get_node(pos)
local newname
if fields.on and string.find(node.name, "widefont") then
newname = string.gsub(node.name, "_widefont", "")
elseif fields.off and not string.find(node.name, "widefont") then
newname = make_widefont_nodename(node.name)
end
if newname then
minetest.log("action", S("@1 flipped the wide-font switch to \"@2\" at @3",
(sender:get_player_name() or ""),
(fields.on and "off" or "on"),
minetest.pos_to_string(pos)
))
minetest.swap_node(pos, {name = newname, param2 = node.param2})
signs_lib.construct_sign(pos)
signs_lib.update_sign(pos, fields)
end
end
end
@ -534,34 +591,10 @@ function signs_lib.can_modify(pos, player)
return false
end
local signs_text_on_activate = function(self)
local pos = self.object:getpos()
local meta = minetest.get_meta(pos)
local signnode = minetest.get_node(pos)
local signname = signnode.name
local def = minetest.registered_items[signname]
local text = meta:get_string("text")
if text and def and def.entity_info then
text = trim_input(text)
set_obj_text(self.object, text, nil, pos)
self.object:set_properties({
mesh = def.entity_info.mesh,
})
end
end
minetest.register_entity("signs_lib:text", {
collisionbox = { 0, 0, 0, 0, 0, 0 },
visual = "mesh",
mesh = "signs_lib_standard_wall_sign_entity.obj",
textures = {},
on_activate = signs_text_on_activate,
})
-- make selection boxes
-- sizex/sizey specified in inches because that's what MUTCD uses.
function signs_lib.make_selection_boxes(sizex, sizey, onpole, xoffs, yoffs, zoffs, fdir)
function signs_lib.make_selection_boxes(sizex, sizey, foo, xoffs, yoffs, zoffs, is_facedir)
local tx = (sizex * 0.0254 ) / 2
local ty = (sizey * 0.0254 ) / 2
@ -569,22 +602,7 @@ function signs_lib.make_selection_boxes(sizex, sizey, onpole, xoffs, yoffs, zoff
local yo = yoffs and yoffs * 0.0254 or 0
local zo = zoffs and zoffs * 0.0254 or 0
if onpole == "_onpole" then
if not fdir then
return {
type = "wallmounted",
wall_side = { -0.5 - 0.3125 + zo, -ty + yo, -tx + xo, -0.4375 - 0.3125 + zo, ty + yo , tx + xo },
wall_top = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
wall_bottom = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
}
else
return {
type = "fixed",
fixed = { -tx + xo, -ty + yo, 0.5 + 0.3125 + zo, tx + xo, ty + yo, 0.4375 + 0.3125 + zo }
}
end
else
if not fdir then
if not is_facedir then
return {
type = "wallmounted",
wall_side = { -0.5 + zo, -ty + yo, -tx + xo, -0.4375 + zo, ty + yo, tx + xo },
@ -598,40 +616,50 @@ function signs_lib.make_selection_boxes(sizex, sizey, onpole, xoffs, yoffs, zoff
}
end
end
end
function signs_lib.check_for_pole(pos, pointed_thing)
local ppos = minetest.get_pointed_thing_position(pointed_thing)
local pnode = minetest.get_node(ppos)
local pdef = minetest.registered_items[pnode.name]
print(dump(pos))
print(dump(ppos))
if (signs_lib.allowed_poles[pnode.name]
or (pdef and pdef.drawtype == "fencelike")
or string.find(pnode.name, "default:fence_")
or string.find(pnode.name, "_post")
or string.find(pnode.name, "fencepost")
or string.find(pnode.name, "streets:streetlamp_basic_top")
or (pnode.name == "streets:bigpole" and pnode.param2 < 4)
or (pnode.name == "streets:bigpole" and pnode.param2 > 19 and pnode.param2 < 24)
)
and
(pos.x ~= ppos.x or pos.z ~= ppos.z) then
print("signs_lib.check_for_pole returned true")
return true
end
end
function signs_lib.check_for_ceiling(pointed_thing)
if pointed_thing.above.x == pointed_thing.under.x
and pointed_thing.above.z == pointed_thing.under.z
and pointed_thing.above.y < pointed_thing.under.y then
return true
end
end
function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locked)
local playername = placer:get_player_name()
local def = minetest.registered_items[itemstack:get_name()]
local ppos = minetest.get_pointed_thing_position(pointed_thing)
local pnode = minetest.get_node(ppos)
local pdef = minetest.registered_items[pnode.name]
local playername = placer:get_player_name()
if signs_lib.check_for_pole(pos, pointed_thing) then
if (def.allow_onpole ~= false) and signs_lib.check_for_pole(pos, pointed_thing) then
local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = itemstack:get_name().."_onpole", param2 = node.param2})
elseif def.allow_hanging and signs_lib.check_for_ceiling(pointed_thing) then
local newparam2 = minetest.dir_to_facedir(placer:get_look_dir())
local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = itemstack:get_name().."_hanging", param2 = newparam2})
end
if locked then
local meta = minetest.get_meta(pos)
@ -644,6 +672,193 @@ function signs_lib.register_fence_with_sign()
minetest.log("warning", "[signs_lib] ".."Attempt to call no longer used function signs_lib.register_fence_with_sign()")
end
local function register_sign(name, rdef)
local def = table.copy(rdef)
if rdef.entity_info == "standard" then
def.entity_info = {
mesh = "signs_lib_standard_wall_sign_entity.obj",
yaw = signs_lib.wallmounted_yaw
}
elseif rdef.entity_info then
def.entity_info = rdef.entity_info
end
def.after_place_node = rdef.after_place_node or signs_lib.after_place_node
if rdef.entity_info then
def.on_rightclick = rdef.on_rightclick or signs_lib.construct_sign
def.on_construct = rdef.on_construct or signs_lib.construct_sign
def.on_destruct = rdef.on_destruct or signs_lib.destruct_sign
def.on_receive_fields = rdef.on_receive_fields or signs_lib.receive_fields
def.on_punch = rdef.on_punch or signs_lib.update_sign
def.number_of_lines = rdef.number_of_lines or signs_lib.standard_lines
def.horiz_scaling = rdef.horiz_scaling or signs_lib.standard_hscale
def.vert_scaling = rdef.vert_scaling or signs_lib.standard_vscale
def.line_spacing = rdef.line_spacing or signs_lib.standard_lspace
def.font_size = rdef.font_size or signs_lib.standard_fsize
def.x_offset = rdef.x_offset or signs_lib.standard_xoffs
def.y_offset = rdef.y_offset or signs_lib.standard_yoffs
def.chars_per_line = rdef.chars_per_line or signs_lib.standard_cpl
def.default_color = rdef.default_color or "0"
if rdef.locked and not rdef.after_place_node then
def.after_place_node = function(pos, placer, itemstack, pointed_thing)
signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, true)
end
end
end
def.paramtype = rdef.paramtype or "light"
def.drawtype = rdef.drawtype or "mesh"
def.mesh = rdef.mesh or "signs_lib_standard_wall_sign.obj"
def.wield_image = rdef.wield_image or def.inventory_image
def.drop = rdef.drop or name
def.sounds = rdef.sounds or signs_lib.standard_wood_sign_sounds
def.on_rotate = rdef.on_rotate or signs_lib.wallmounted_rotate
def.paramtype2 = rdef.paramtype2 or "wallmounted"
if rdef.on_rotate then
def.on_rotate = rdef.on_rotate
elseif rdef.drawtype == "wallmounted" then
def.on_rotate = signs_lib.wallmounted_rotate
else
def.on_rotate = signs_lib.facedir_rotate
end
if rdef.groups then
def.groups = rdef.groups
else
def.groups = signs_lib.standard_wood_groups
end
local cbox = signs_lib.make_selection_boxes(35, 25, allow_onpole)
def.selection_box = rdef.selection_box or cbox
def.node_box = table.copy(rdef.node_box or rdef.selection_box or cbox)
if def.sunlight_propagates ~= false then
def.sunlight_propagates = true
end
minetest.register_node(":"..name, def)
table.insert(signs_lib.lbm_restore_nodes, name)
if rdef.allow_onpole ~= false then
local opdef = table.copy(def)
local offset = 0.3125
if opdef.uses_slim_pole_mount then
offset = 0.35
end
opdef.selection_box = rdef.onpole_selection_box or opdef.selection_box
opdef.node_box = rdef.onpole_node_box or opdef.selection_box
if opdef.paramtype2 == "wallmounted" then
opdef.node_box.wall_side[1] = def.node_box.wall_side[1] - offset
opdef.node_box.wall_side[4] = def.node_box.wall_side[4] - offset
opdef.selection_box.wall_side[1] = def.selection_box.wall_side[1] - offset
opdef.selection_box.wall_side[4] = def.selection_box.wall_side[4] - offset
else
opdef.node_box.fixed[3] = def.node_box.fixed[3] + offset
opdef.node_box.fixed[6] = def.node_box.fixed[6] + offset
opdef.selection_box.fixed[3] = def.selection_box.fixed[3] + offset
opdef.selection_box.fixed[6] = def.selection_box.fixed[6] + offset
end
opdef.groups.not_in_creative_inventory = 1
opdef.tiles[3] = "signs_lib_pole_mount.png"
opdef.mesh = string.gsub(opdef.mesh, ".obj$", "_onpole.obj")
opdef.on_rotate = nil
if opdef.entity_info then
opdef.entity_info.mesh = string.gsub(opdef.entity_info.mesh, ".obj$", "_onpole.obj")
end
minetest.register_node(":"..name.."_onpole", opdef)
table.insert(signs_lib.lbm_restore_nodes, name.."_onpole")
end
if rdef.allow_hanging then
local hdef = table.copy(def)
hdef.paramtype2 = "facedir"
local hcbox = signs_lib.make_selection_boxes(35, 32, false, 0, 3, -18.5, true)
hdef.selection_box = rdef.hanging_selection_box or hcbox
hdef.node_box = rdef.hanging_node_box or rdef.hanging_selection_box or hcbox
hdef.groups.not_in_creative_inventory = 1
hdef.tiles[3] = "signs_lib_hangers.png"
hdef.mesh = string.gsub(string.gsub(hdef.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj")
hdef.on_rotate = nil
if hdef.entity_info then
hdef.entity_info.mesh = string.gsub(string.gsub(hdef.entity_info.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj")
hdef.entity_info.yaw = signs_lib.standard_yaw
end
minetest.register_node(":"..name.."_hanging", hdef)
table.insert(signs_lib.lbm_restore_nodes, name.."_hanging")
end
end
--[[
The main sign registration function
===================================
Example minimal recommended def for writable signs:
signs_lib.register_sign("foo:my_cool_sign", {
description = "Wooden cool sign",
inventory_image = "signs_lib_sign_cool_inv.png",
tiles = {
"signs_lib_sign_cool.png",
"signs_lib_sign_cool_edges.png"
},
number_of_lines = 2,
horiz_scaling = 0.8,
vert_scaling = 1,
line_spacing = 9,
font_size = 31,
x_offset = 7,
y_offset = 4,
chars_per_line = 40,
entity_info = "standard"
})
* default def assumes a wallmounted sign with on-pole being allowed.
*For signs that can't support onpole, include in the def:
allow_onpole = false,
* "standard" entity info implies the standard wood/steel sign model, in
wallmounted mode. For facedir signs using the standard model, use:
entity_info = {
mesh = "signs_lib_standard_wall_sign_entity.obj",
yaw = signs_lib.standard_yaw
},
]]--
function signs_lib.register_sign(name, rdef)
register_sign(name, rdef)
if rdef.allow_widefont then
wdef = table.copy(minetest.registered_items[name])
wdef.groups.not_in_creative_inventory = 1
wdef.horiz_scaling = wdef.horiz_scaling / 2
register_sign(name.."_widefont", wdef)
end
end
-- restore signs' text after /clearobjects and the like, the next time
-- a block is reloaded by the server.
@ -678,12 +893,7 @@ minetest.register_lbm({
local oldfence = signs_lib.old_fenceposts[node.name]
local newsign = signs_lib.old_fenceposts_replacement_signs[node.name]
for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
local e = v:get_luaentity()
if e and e.name == "signs_lib:text" then
v:remove()
end
end
signs_lib.delete_objects(pos)
local oldmeta = minetest.get_meta(pos):to_table()
minetest.set_node(pos, {name = oldfence})
@ -694,3 +904,66 @@ minetest.register_lbm({
end
end
})
signs_lib.block_list = {}
signs_lib.totalblocks = 0
-- Maintain a list of currently-loaded blocks
minetest.register_lbm({
nodenames = {"group:sign"},
name = "signs_lib:update_block_list",
label = "Update list of loaded blocks, log only those with signs",
run_at_every_load = true,
action = function(pos, node)
-- yeah, yeah... I know I'm hashing a block pos, but it's still just a set of coords
local hash = minetest.hash_node_position(vector.floor(vector.divide(pos, core.MAP_BLOCKSIZE)))
if not signs_lib.block_list[hash] then
signs_lib.block_list[hash] = true
signs_lib.totalblocks = signs_lib.totalblocks + 1
end
end
})
minetest.register_chatcommand("regen_signs", {
params = "",
privs = {server = true},
description = "Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.",
func = function(player_name, params)
local allsigns = {}
local totalsigns = 0
for b in pairs(signs_lib.block_list) do
local blockpos = minetest.get_position_from_hash(b)
local pos1 = vector.multiply(blockpos, core.MAP_BLOCKSIZE)
local pos2 = vector.add(pos1, core.MAP_BLOCKSIZE - 1)
if minetest.get_node_or_nil(vector.add(pos1, core.MAP_BLOCKSIZE/2)) then
local signs_in_block = minetest.find_nodes_in_area(pos1, pos2, {"group:sign"})
allsigns[#allsigns + 1] = signs_in_block
totalsigns = totalsigns + #signs_in_block
else
signs_lib.block_list[b] = nil -- if the block is no longer loaded, remove it from the table
signs_lib.totalblocks = signs_lib.totalblocks - 1
end
end
if signs_lib.totalblocks < 0 then signs_lib.totalblocks = 0 end
if totalsigns == 0 then
minetest.chat_send_player(player_name, "There are no signs in the currently-loaded terrain.")
signs_lib.block_list = {}
return
end
minetest.chat_send_player(player_name, "Found a total of "..totalsigns.." sign nodes across "..signs_lib.totalblocks.." blocks.")
minetest.chat_send_player(player_name, "Regenerating sign entities...")
for _, b in pairs(allsigns) do
for _, pos in ipairs(b) do
signs_lib.delete_objects(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
if def and def.entity_info then
signs_lib.update_sign(pos)
end
end
end
minetest.chat_send_player(player_name, "Finished.")
end
})

Binary file not shown.

View File

@ -1,10 +1,10 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend'
# www.blender.org
o text_entity_Plane
v 0.406250 -0.281250 0.429688
v -0.406250 -0.281250 0.429688
v 0.406250 0.281250 0.429688
v -0.406250 0.281250 0.429688
v 0.406250 -0.281250 0.425781
v -0.406250 -0.281250 0.425781
v 0.406250 0.281250 0.425781
v -0.406250 0.281250 0.425781
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000

View File

@ -0,0 +1,15 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign.blend'
# www.blender.org
o Plane
v 0.406250 -0.281250 -0.042969
v -0.406250 -0.281250 -0.042969
v 0.406250 0.281250 -0.042969
v -0.406250 0.281250 -0.042969
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 -0.0000 -1.0000
g Plane_Plane_None
s off
f 1/1/1 2/2/1 4/3/1 3/4/1

View File

@ -1,10 +1,10 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend'
# www.blender.org
o text_entity.001_Plane
v 0.406250 -0.281250 0.742188
v -0.406250 -0.281250 0.742188
v 0.406250 0.281250 0.742188
v -0.406250 0.281250 0.742188
v 0.406250 -0.281250 0.738281
v -0.406250 -0.281250 0.738281
v 0.406250 0.281250 0.738281
v -0.406250 0.281250 0.738281
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000

View File

@ -1,6 +1,6 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden wall sign.blend'
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend'
# www.blender.org
o Cube.008_Cube
o sign_(3)_Cube
v 0.437500 -0.312500 0.500000
v 0.437500 -0.312500 0.437500
v 0.437500 0.312500 0.500000
@ -41,11 +41,11 @@ vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g Cube.008_Cube_front-back
g sign_(3)_Cube_front-back
s off
f 8/1/1 4/2/1 2/3/1 6/4/1
f 3/5/2 7/6/2 5/7/2 1/8/2
g Cube.008_Cube_edges
g sign_(3)_Cube_edges
f 13/9/3 14/10/3 10/11/3 9/12/3
f 11/13/4 12/14/4 16/15/4 15/16/4
f 11/13/5 9/17/5 10/18/5 12/14/5

View File

@ -1,6 +1,22 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden wall sign.blend'
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend'
# www.blender.org
o Cube.009_Cube.001
o sign_on_pole.001_Cube.002
v 0.437500 -0.312500 0.812500
v 0.437500 -0.312500 0.750000
v 0.437500 0.312500 0.812500
v 0.437500 0.312500 0.750000
v -0.437500 -0.312500 0.812500
v -0.437500 -0.312500 0.750000
v -0.437500 0.312500 0.812500
v -0.437500 0.312500 0.750000
v 0.437500 -0.312500 0.812500
v 0.437500 -0.312500 0.750000
v 0.437500 0.312500 0.812500
v 0.437500 0.312500 0.750000
v -0.437500 -0.312500 0.812500
v -0.437500 -0.312500 0.750000
v -0.437500 0.312500 0.812500
v -0.437500 0.312500 0.750000
v -0.125000 -0.187500 0.812500
v -0.125000 -0.187500 0.875000
v -0.125000 0.187500 0.812500
@ -57,6 +73,24 @@ v -0.164063 0.125000 1.125000
v 0.164062 0.125000 1.125000
v -0.164063 0.187500 1.125000
v 0.164062 0.187500 1.125000
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
vt 0.468750 0.187500
vt 0.531250 0.812500
vt 0.968750 0.812500
vt 0.968750 0.187500
vt 0.531250 0.187500
vt 0.234375 0.000000
vt 0.234375 1.000000
vt 0.015625 1.000000
vt 0.015625 -0.000000
vt 0.609375 -0.000000
vt 0.609375 1.000000
vt 0.390625 1.000000
vt 0.390625 -0.000000
vt 0.765625 0.000000
vt 0.765625 1.000000
vt 0.843750 0.507812
vt 0.703125 0.507812
vt 0.703125 0.093750
@ -161,94 +195,52 @@ vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 0.0000 -1.0000
g Cube.009_Cube.001_pole_mount
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 6/5/2 5/6/2 8/7/2 7/8/2
f 4/3/3 8/7/3 5/9/3 3/10/3
f 1/11/4 6/12/4 7/8/4 2/2/4
f 2/2/5 7/8/5 8/7/5 4/3/5
f 9/13/2 10/14/2 12/15/2 11/16/2
f 11/17/3 12/18/3 16/19/3 15/20/3
f 15/21/1 16/22/1 14/23/1 13/24/1
f 13/24/4 14/23/4 10/25/4 9/26/4
f 17/27/2 18/28/2 20/29/2 19/30/2
f 19/31/3 20/32/3 24/33/3 23/34/3
f 23/35/1 24/36/1 22/37/1 21/38/1
f 21/38/4 22/37/4 18/39/4 17/40/4
f 25/41/2 26/42/2 28/43/2 27/44/2
f 27/45/3 28/46/3 32/47/3 31/48/3
f 31/49/1 32/50/1 30/51/1 29/52/1
f 29/52/4 30/51/4 26/53/4 25/54/4
f 33/55/2 34/56/2 36/57/2 35/58/2
f 35/59/3 36/60/3 40/61/3 39/62/3
f 39/63/1 40/64/1 38/65/1 37/66/1
f 37/66/4 38/65/4 34/67/4 33/68/4
f 41/69/5 42/70/5 44/71/5 43/72/5
f 43/73/3 44/74/3 48/75/3 47/76/3
f 47/76/6 48/75/6 46/77/6 45/78/6
f 45/78/4 46/77/4 42/70/4 41/69/4
f 43/79/1 47/80/1 45/81/1 41/82/1
f 48/83/2 44/84/2 42/85/2 46/86/2
f 49/87/5 50/88/5 52/89/5 51/90/5
f 51/91/3 52/92/3 56/93/3 55/94/3
f 55/94/6 56/93/6 54/95/6 53/96/6
f 53/96/4 54/95/4 50/88/4 49/87/4
f 51/97/1 55/98/1 53/99/1 49/100/1
f 56/101/2 52/102/2 50/103/2 54/104/2
o Cube.004_Cube
v 0.437500 -0.312500 0.812500
v 0.437500 -0.312500 0.750000
v 0.437500 0.312500 0.812500
v 0.437500 0.312500 0.750000
v -0.437500 -0.312500 0.812500
v -0.437500 -0.312500 0.750000
v -0.437500 0.312500 0.812500
v -0.437500 0.312500 0.750000
v 0.437500 -0.312500 0.812500
v 0.437500 -0.312500 0.750000
v 0.437500 0.312500 0.812500
v 0.437500 0.312500 0.750000
v -0.437500 -0.312500 0.812500
v -0.437500 -0.312500 0.750000
v -0.437500 0.312500 0.812500
v -0.437500 0.312500 0.750000
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
vt 0.468750 0.187500
vt 0.531250 0.812500
vt 0.968750 0.812500
vt 0.968750 0.187500
vt 0.531250 0.187500
vt 0.234375 0.000000
vt 0.234375 1.000000
vt 0.015625 1.000000
vt 0.015625 -0.000000
vt 0.609375 -0.000000
vt 0.609375 1.000000
vt 0.390625 1.000000
vt 0.390625 -0.000000
vt 0.765625 0.000000
vt 0.765625 1.000000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g Cube.004_Cube_front-back
g sign_on_pole.001_Cube.002_front-back
s off
f 64/105/7 60/106/7 58/107/7 62/108/7
f 59/109/8 63/110/8 61/111/8 57/112/8
g Cube.004_Cube_edges
f 69/113/9 70/114/9 66/115/9 65/116/9
f 67/117/10 68/118/10 72/119/10 71/120/10
f 67/117/11 65/121/11 66/122/11 68/118/11
f 69/113/12 71/120/12 72/119/12 70/114/12
f 8/1/1 4/2/1 2/3/1 6/4/1
f 3/5/2 7/6/2 5/7/2 1/8/2
g sign_on_pole.001_Cube.002_edges
f 13/9/3 14/10/3 10/11/3 9/12/3
f 11/13/4 12/14/4 16/15/4 15/16/4
f 11/13/5 9/17/5 10/18/5 12/14/5
f 13/9/6 15/16/6 16/15/6 14/10/6
g sign_on_pole.001_Cube.002_pole_mount
f 17/19/6 18/20/6 20/21/6 19/22/6
f 22/23/5 21/24/5 24/25/5 23/26/5
f 20/21/4 24/25/4 21/27/4 19/28/4
f 17/29/3 22/30/3 23/26/3 18/20/3
f 18/20/2 23/26/2 24/25/2 20/21/2
f 25/31/5 26/32/5 28/33/5 27/34/5
f 27/35/4 28/36/4 32/37/4 31/38/4
f 31/39/6 32/40/6 30/41/6 29/42/6
f 29/42/3 30/41/3 26/43/3 25/44/3
f 33/45/5 34/46/5 36/47/5 35/48/5
f 35/49/4 36/50/4 40/51/4 39/52/4
f 39/53/6 40/54/6 38/55/6 37/56/6
f 37/56/3 38/55/3 34/57/3 33/58/3
f 41/59/5 42/60/5 44/61/5 43/62/5
f 43/63/4 44/64/4 48/65/4 47/66/4
f 47/67/6 48/68/6 46/69/6 45/70/6
f 45/70/3 46/69/3 42/71/3 41/72/3
f 49/73/5 50/74/5 52/75/5 51/76/5
f 51/77/4 52/78/4 56/79/4 55/80/4
f 55/81/6 56/82/6 54/83/6 53/84/6
f 53/84/3 54/83/3 50/85/3 49/86/3
f 57/87/2 58/88/2 60/89/2 59/90/2
f 59/91/4 60/92/4 64/93/4 63/94/4
f 63/94/1 64/93/1 62/95/1 61/96/1
f 61/96/3 62/95/3 58/88/3 57/87/3
f 59/97/6 63/98/6 61/99/6 57/100/6
f 64/101/5 60/102/5 58/103/5 62/104/5
f 65/105/2 66/106/2 68/107/2 67/108/2
f 67/109/4 68/110/4 72/111/4 71/112/4
f 71/112/1 72/111/1 70/113/1 69/114/1
f 69/114/3 70/113/3 66/106/3 65/105/3
f 67/115/6 71/116/6 69/117/6 65/118/6
f 72/119/5 68/120/5 66/121/5 70/122/5

View File

@ -0,0 +1,62 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign.blend'
# www.blender.org
o Cube
v 0.437500 -0.312500 0.031250
v 0.437500 -0.312500 -0.031250
v 0.437500 0.312500 0.031250
v 0.437500 0.312500 -0.031250
v -0.437500 -0.312500 0.031250
v -0.437500 -0.312500 -0.031250
v -0.437500 0.312500 0.031250
v -0.437500 0.312500 -0.031250
v 0.437500 -0.312500 0.031250
v 0.437500 -0.312500 -0.031250
v 0.437500 0.312500 0.031250
v 0.437500 0.312500 -0.031250
v -0.437500 -0.312500 0.031250
v -0.437500 -0.312500 -0.031250
v -0.437500 0.312500 0.031250
v -0.437500 0.312500 -0.031250
v 0.500000 0.312500 -0.000000
v 0.500000 0.500000 0.000000
v -0.500000 0.312500 -0.000000
v -0.500000 0.500000 0.000000
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
vt 0.468750 0.187500
vt 0.531250 0.812500
vt 0.968750 0.812500
vt 0.968750 0.187500
vt 0.531250 0.187500
vt 0.234375 0.000000
vt 0.234375 1.000000
vt 0.015625 1.000000
vt 0.015625 -0.000000
vt 0.609375 -0.000000
vt 0.609375 1.000000
vt 0.390625 1.000000
vt 0.390625 -0.000000
vt 0.765625 0.000000
vt 0.765625 1.000000
vt 1.000000 0.812500
vt 1.000000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.812500
vn 0.0000 0.0000 -1.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 -0.0000 0.0000
vn -1.0000 -0.0000 0.0000
g Cube_Cube_front-back
s off
f 8/1/1 4/2/1 2/3/1 6/4/1
f 3/5/2 7/6/2 5/7/2 1/8/2
g Cube_Cube_edges
f 13/9/3 14/10/3 10/11/3 9/12/3
f 11/13/4 12/14/4 16/15/4 15/16/4
f 11/13/5 9/17/5 10/18/5 12/14/5
f 13/9/6 15/16/6 16/15/6 14/10/6
g Cube_Cube_hangers
f 19/19/1 20/20/1 18/21/1 17/22/1

Binary file not shown.

View File

@ -1,105 +1,40 @@
-- Definitions for standard minetest_game wooden and steel wall signs
for _, onpole in ipairs({"", "_onpole"}) do
local nci = nil
local on_rotate = signs_lib.wallmounted_rotate
local pole_mount_tex = nil
if onpole == "_onpole" then
nci = 1
on_rotate = nil
pole_mount_tex = "signs_lib_pole_mount.png" -- the metal straps on back, if needed
end
local wood_groups = table.copy(signs_lib.standard_wood_groups)
wood_groups.not_in_creative_inventory = nci
local steel_groups = table.copy(signs_lib.standard_steel_groups)
steel_groups.not_in_creative_inventory = nci
cbox = signs_lib.make_selection_boxes(35, 25, onpole)
minetest.register_node(":default:sign_wall_wood"..onpole, {
signs_lib.register_sign("default:sign_wall_wood", {
description = "Wooden wall sign",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "signs_lib_standard_wall_sign"..onpole..".obj",
inventory_image = "signs_lib_sign_wall_wooden_inv.png",
tiles = {
"signs_lib_sign_wall_wooden.png",
"signs_lib_sign_wall_wooden_edges.png",
pole_mount_tex
},
inventory_image = "signs_lib_sign_wall_wooden_inv.png",
wield_image = "signs_lib_sign_wall_wooden_inv.png",
groups = wood_groups,
default_color = "0",
on_rightclick = signs_lib.construct_sign,
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
on_rotate = signs_lib.wallmounted_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "signs_lib_standard_wall_sign_entity"..onpole..".obj",
yaw = signs_lib.wallmounted_yaw
},
drop = "default:sign_wall_wood"
entity_info = "standard",
allow_hanging = true,
allow_widefont = true
})
table.insert(signs_lib.lbm_restore_nodes, "default:sign_wall_wood"..onpole)
minetest.register_node(":default:sign_wall_steel"..onpole, {
signs_lib.register_sign("default:sign_wall_steel", {
description = "Steel wall sign",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "signs_lib_standard_wall_sign"..onpole..".obj",
inventory_image = "signs_lib_sign_wall_steel_inv.png",
tiles = {
"signs_lib_sign_wall_steel.png",
"signs_lib_sign_wall_steel_edges.png",
pole_mount_tex
},
inventory_image = "signs_lib_sign_wall_steel_inv.png",
wield_image = "signs_lib_sign_wall_steel_inv.png",
groups = wood_groups,
default_color = "0",
on_rightclick = signs_lib.construct_sign,
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
after_place_node = function(pos, placer, itemstack, pointed_thing)
signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, true)
end,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
can_dig = signs_lib.can_modify,
on_rotate = signs_lib.wallmounted_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "signs_lib_standard_wall_sign_entity"..onpole..".obj",
yaw = signs_lib.wallmounted_yaw
},
drop = "default:sign_wall_steel"
groups = signs_lib.standard_steel_groups,
sounds = signs_lib.standard_steel_sign_sounds,
locked = true,
entity_info = "standard",
allow_hanging = true,
allow_widefont = true
})
table.insert(signs_lib.lbm_restore_nodes, "default:sign_wall_steel"..onpole)
end
minetest.register_alias("signs:sign_hanging", "default:sign_wall_wood_hanging")
minetest.register_alias("basic_signs:hanging_sign", "default:sign_wall_wood_hanging")
table.insert(signs_lib.lbm_restore_nodes, "signs:sign_hanging")
table.insert(signs_lib.lbm_restore_nodes, "basic_signs:hanging_sign")
-- insert the old wood sign-on-fencepost into signs_lib's conversion LBM
table.insert(signs_lib.old_fenceposts_with_signs, "signs:sign_post")
signs_lib.old_fenceposts["signs:sign_post"] = "default:fence_wood"
signs_lib.old_fenceposts_replacement_signs["signs:sign_post"] = "default:sign_wall_wood_onpole"

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B