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

Compare commits

..

14 Commits

Author SHA1 Message Date
831055095c remove debug prints 2019-09-18 20:28:42 -04:00
f0bc18154e fix corner case
Placing a "wallmounted" sign onto a streets lamp would cause a
weird rotation if you're pointing downward too far.  Now it
enforces NESW direction according to your yaw.

Also fixes bad orientation when you're really close to a post.
2019-09-18 20:25:41 -04:00
4eeaf90ae3 allow placement of "facedir" signs flat on floor
(and on ceiling, if hanging isn't available)
mimics the way wallmounted signs behave
2019-09-18 20:12:31 -04:00
906ddbbcc5 rotation fixups
* combine rotation functions -- one no longer needs to choose
  a particular rotation function for the node's paramtype2,
  it'll figure it out automatically.
* fix glitch in wallmounted rotation
* re-order rotation facing order to N, E, S, W, floor, ceiling.
* limit yard sign to simple NESW-only rotation
* allow rotation of hanging signs (NESW only)
* allow rotation of signs on poles/posts if there's nothing in
  the way of where the sign has to move to (NESW only).
2019-09-18 20:07:20 -04:00
01e2adaa46 allow visible text on
floor and when flat on a ceiling
2019-09-18 17:23:07 -04:00
03bd471230 fix a couple of global warnings 2019-09-18 16:33:56 -04:00
e5d525c272 in fact, just bail out if the sign needs no entity 2019-09-18 14:21:56 -04:00
a907f9535c bail out of make_sign_texture is the node is unknown 2019-09-18 14:08:17 -04:00
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
5 changed files with 387 additions and 273 deletions

650
api.lua
View File

@ -29,6 +29,8 @@ 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,
math.pi / -2,
@ -61,70 +63,184 @@ signs_lib.wall_fdir_to_back = {
{ 1, 0 },
}
signs_lib.rotate_facedir = {
[0] = 1,
[1] = 6,
[2] = 3,
[3] = 0,
[4] = 2,
[5] = 6,
[6] = 4
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] = 1,
[1] = 5,
[2] = 0,
[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
}
-- Initialize character texture cache
local ctexcache = {}
signs_lib.wallmounted_rotate = function(pos, node, user, mode)
if not signs_lib.can_modify(pos, user) then return false end
-- entity handling
if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then
return false
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 = {},
static_save = false
})
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
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
signs_lib.update_sign(pos)
return true
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 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
signs_lib.facedir_rotate = function(pos, node, user, mode)
if not signs_lib.can_modify(pos, user) then return false end
local yaw = def.entity_info.yaw[node.param2 + 1]
local pitch = 0
if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then
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 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
-- 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]
local newparam2 = signs_lib.rotate_facedir[node.param2] or 0
if string.match(node.name, "_onpole") then
local newparam2 = signs_lib.rotate_walldir_simple[node.param2] or 4
local t = signs_lib.wall_fdir_to_back_left
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()
if def.paramtype2 ~= "wallmounted" then
newparam2 = signs_lib.rotate_facedir_simple[node.param2] or 0
t = signs_lib.fdir_to_back_left
end
tpos = {
x = pos.x + t[node.param2][1],
y = pos.y,
z = pos.z + t[node.param2][2]
}
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(pos)
signs_lib.delete_objects(tpos)
signs_lib.update_sign(tpos)
return true
end
local DEFAULT_TEXT_SCALE = {x=10, y=10}
-- infinite stacks
if not minetest.settings:get_bool("creative_mode") then
@ -235,15 +351,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)
@ -388,6 +495,7 @@ end
local function make_sign_texture(lines, pos)
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 font_size
local line_width
@ -422,26 +530,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", "")
@ -449,18 +586,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("##", "#")))
@ -475,50 +606,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
@ -542,30 +668,6 @@ 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.
@ -602,6 +704,7 @@ function signs_lib.check_for_pole(pos, pointed_thing)
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)
)
@ -619,6 +722,14 @@ function signs_lib.check_for_ceiling(pointed_thing)
end
end
function signs_lib.check_for_floor(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()]
@ -628,12 +739,23 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke
local pdef = minetest.registered_items[pnode.name]
if (def.allow_onpole ~= false) and signs_lib.check_for_pole(pos, pointed_thing) then
local newparam2
local lookdir = minetest.yaw_to_dir(placer:get_look_horizontal())
if def.paramtype2 == "wallmounted" then
newparam2 = minetest.dir_to_wallmounted(lookdir)
else
newparam2 = minetest.dir_to_facedir(lookdir)
end
local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = itemstack:get_name().."_onpole", param2 = node.param2})
minetest.swap_node(pos, {name = itemstack:get_name().."_onpole", param2 = newparam2})
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})
elseif def.paramtype2 == "facedir" and signs_lib.check_for_ceiling(pointed_thing) then
minetest.swap_node(pos, {name = itemstack:get_name(), param2 = 6})
elseif def.paramtype2 == "facedir" and signs_lib.check_for_floor(pointed_thing) then
minetest.swap_node(pos, {name = itemstack:get_name(), param2 = 4})
end
if locked then
local meta = minetest.get_meta(pos)
@ -646,6 +768,130 @@ 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.paramtype2 = rdef.paramtype2 or "wallmounted"
def.on_rotate = rdef.on_rotate or signs_lib.handle_rotation
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)
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")
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, nil, 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")
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
===================================
@ -686,140 +932,16 @@ signs_lib.register_sign("foo:my_cool_sign", {
]]--
function signs_lib.register_sign(name, rdef)
register_sign(name, rdef)
local def = table.copy(rdef)
if rdef.allow_widefont then
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
local 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
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
else
def.after_place_node = rdef.after_place_node or signs_lib.after_place_node
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
-- restore signs' text after /clearobjects and the like, the next time
@ -856,12 +978,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})
@ -924,12 +1041,7 @@ minetest.register_chatcommand("regen_signs", {
for _, b in pairs(allsigns) do
for _, pos in ipairs(b) do
local objects = minetest.get_objects_inside_radius(pos, 0.5)
if #objects > 0 then
for _, v in ipairs(objects) do
v:remove()
end
end
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

View File

@ -9,6 +9,7 @@ signs_lib.register_sign("default:sign_wall_wood", {
},
entity_info = "standard",
allow_hanging = true,
allow_widefont = true
})
signs_lib.register_sign("default:sign_wall_steel", {
@ -23,6 +24,7 @@ signs_lib.register_sign("default:sign_wall_steel", {
locked = true,
entity_info = "standard",
allow_hanging = true,
allow_widefont = true
})
minetest.register_alias("signs:sign_hanging", "default:sign_wall_wood_hanging")

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