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

Compare commits

...

22 Commits

Author SHA1 Message Date
de5926233a also include hanging widefont signs 2019-09-22 06:01:32 -04:00
ae6e707ebe forgot to include onpole_widefont signs in conversion list 2019-09-22 04:28:01 -04:00
dcdee22265 allow mods to pass a function or just true
to the pole and horiz pole check routines, in case they need
their own, custom checking routines, if the usual, simple
checks aren't good enough.

got rid of the allowed-poles table, as it's now obsolete

moved all existing special code into compat.lua, altered to
use this feature.
2019-09-22 03:19:31 -04:00
e4336e320c fix empty lines being skipped 2019-09-21 22:04:39 -04:00
d41e2ffd73 use a meta key to select wide-font mode
instead of using a separate node
add LBM to convert old nodes.
2019-09-21 21:42:46 -04:00
77987d12b9 detect streets:bigpole_tjunction
Treat T-junction as a vertical or horizontal pole (depending
on its orientation), if the sign could be placed flat against
the back or side of the junction.

In this instance, the "front" of the junction is the side with
the middle bit sticking out, and will just get a regular wall
signif targeted, as with any non-pole node.
2019-09-21 21:39:53 -04:00
dfece5275e rework horizontal pole detection slightly 2019-09-21 19:24:48 -04:00
6285d250d7 default "allow_onpole" to disabled
for consistency with other similar flags
2019-09-21 15:56:45 -04:00
9502812088 Add necessary bits to allow signs to be placed onto horizontal poles
(both wooden and steel signs)

only streets mod's "bigpole" supported for now.

Model changes:

To make a sign support horizontal mounting, make a single "_onpole"
model, with two copies of the pole mount, one rotated by 90°.  Make sure
the second copy appears has its own material entry, and that it is last
in the materials list in the exported .obj (`grep "g " file.obj` to
check).

When registered, signs_lib will set the "_onpole" and "_onpole_horiz"
tiles{} to reveal one mount or the other: entry 3 will expose the
vertical mount, entry 4 is the horizontal copy, with the opposite entry
being set to the "blank" image.
2019-09-21 15:45:48 -04:00
c66c1b70bd disable backface culling on the sign entity
(allows for transparent signs i.e. glass)
2019-09-19 01:02:44 -04:00
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
8 changed files with 1036 additions and 317 deletions

626
api.lua
View File

@ -6,7 +6,6 @@ signs_lib.lbm_restore_nodes = {}
signs_lib.old_fenceposts = {}
signs_lib.old_fenceposts_replacement_signs = {}
signs_lib.old_fenceposts_with_signs = {}
signs_lib.allowed_poles = {}
-- Settings used for a standard wood or steel wall sign
signs_lib.standard_lines = 6
@ -29,6 +28,13 @@ 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.old_widefont_signs = {}
signs_lib.block_list = {}
signs_lib.totalblocks = 0
signs_lib.standard_yaw = {
0,
math.pi / -2,
@ -61,70 +67,232 @@ 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_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] = 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
}
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
}
-- 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,
backface_culling = 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
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
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]
}
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
signs_lib.update_sign(pos)
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.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 +403,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)
@ -387,23 +546,31 @@ end
local function make_sign_texture(lines, pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(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
local line_height
local char_width
local colorbgw
local widemult = 1
if meta:get_int("widefont") == 1 then
widemult = 0.5
end
if def.font_size and def.font_size == 31 then
font_size = 31
line_width = math.floor(signs_lib.avgwidth31 * def.chars_per_line) * def.horiz_scaling
line_width = math.floor(signs_lib.avgwidth31 * def.chars_per_line) * (def.horiz_scaling * widemult)
line_height = signs_lib.lineheight31
char_width = signs_lib.charwidth31
colorbgw = signs_lib.colorbgw31
else
font_size = 15
line_width = math.floor(signs_lib.avgwidth15 * def.chars_per_line) * def.horiz_scaling
line_width = math.floor(signs_lib.avgwidth15 * def.chars_per_line) * (def.horiz_scaling * widemult)
line_height = signs_lib.lineheight15
char_width = signs_lib.charwidth15
colorbgw = signs_lib.colorbgw15
@ -422,27 +589,21 @@ 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", true)) do
table.insert(lines, line:split(" "))
end
return lines
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
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
function signs_lib.construct_sign(pos)
@ -450,11 +611,12 @@ function signs_lib.construct_sign(pos)
"textarea[0,-0.3;6.5,3;text;;${text}]"..
"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)
local def = minetest.registered_items[node.name]
local meta = minetest.get_meta(pos)
if minetest.registered_items[wname] then
if def.allow_widefont then
local state = "off"
if string.find(node.name, "widefont") then state = "on" end
if meta:get_int("widefont") == 1 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;"..
@ -464,7 +626,6 @@ function signs_lib.construct_sign(pos)
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.
@ -473,18 +634,12 @@ function signs_lib.construct_sign(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("##", "#")))
@ -499,40 +654,12 @@ 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)
@ -548,21 +675,22 @@ function signs_lib.receive_fields(pos, formname, fields, sender)
signs_lib.update_sign(pos, fields)
elseif fields.on or fields.off then
local node = minetest.get_node(pos)
local newname
local meta = minetest.get_meta(pos)
local change
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)
if fields.on and meta:get_int("widefont") == 1 then
meta:set_int("widefont", 0)
change = true
elseif fields.off and meta:get_int("widefont") == 0 then
meta:set_int("widefont", 1)
change = true
end
if newname then
if change 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
@ -589,30 +717,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.
@ -644,16 +748,32 @@ function signs_lib.check_for_pole(pos, pointed_thing)
local pnode = minetest.get_node(ppos)
local pdef = minetest.registered_items[pnode.name]
if (signs_lib.allowed_poles[pnode.name]
or (pdef and pdef.drawtype == "fencelike")
or string.find(pnode.name, "default:fence_")
if not pdef then return end
if type(pdef.check_for_pole) == "function" then
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
return pdef.check_for_pole(pos, node, def, ppos, pnode, pdef)
elseif pdef.check_for_pole
or pdef.drawtype == "fencelike"
or string.find(pnode.name, "_post")
or string.find(pnode.name, "fencepost")
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
or string.find(pnode.name, "fencepost") then
return true
end
end
function signs_lib.check_for_horizontal_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]
if not pdef then return end
if type(pdef.check_for_horiz_pole) == "function" then
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
return pdef.check_for_horiz_pole(pos, node, def, ppos, pnode, pdef)
elseif pdef.check_for_horiz_pole then
return true
end
end
@ -666,22 +786,49 @@ 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)
print("after_place_node")
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]
if (def.allow_onpole ~= false) and signs_lib.check_for_pole(pos, pointed_thing) then
if def.allow_onpole 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_onpole_horizontal and signs_lib.check_for_horizontal_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_horiz", 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)
@ -694,7 +841,53 @@ 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)
--[[
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 support being on a pole, include in the def:
allow_onpole = true,
(defaults to disabled)
*For signs that can support being on a horizontal pole, include in the def:
allow_onpole_horizontal = true,
(defaults to disabled)
* onpole/onpole_horizontal are independent; one may be allowed without the other
* "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)
local def = table.copy(rdef)
if rdef.entity_info == "standard" then
@ -736,16 +929,8 @@ local function register_sign(name, rdef)
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
def.on_rotate = rdef.on_rotate or signs_lib.handle_rotation
if rdef.groups then
def.groups = rdef.groups
@ -753,7 +938,7 @@ local function register_sign(name, rdef)
def.groups = signs_lib.standard_wood_groups
end
local cbox = signs_lib.make_selection_boxes(35, 25, allow_onpole)
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)
@ -765,10 +950,10 @@ local function register_sign(name, rdef)
minetest.register_node(":"..name, def)
table.insert(signs_lib.lbm_restore_nodes, name)
if rdef.allow_onpole ~= false then
local opdef = table.copy(def)
if rdef.allow_onpole or rdef.allow_onpole_horizontal then
local offset = 0.3125
if opdef.uses_slim_pole_mount then
offset = 0.35
@ -792,24 +977,38 @@ local function register_sign(name, rdef)
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
end
-- setting one of item 3 or 4 to a texture and leaving the other "blank",
-- reveals either the vertical or horizontal pole mount part of the model
if rdef.allow_onpole then
opdef.tiles[3] = "signs_lib_pole_mount.png"
opdef.tiles[4] = "signs_lib_blank.png"
minetest.register_node(":"..name.."_onpole", opdef)
table.insert(signs_lib.lbm_restore_nodes, name.."_onpole")
end
local ophdef = table.copy(opdef)
if rdef.allow_onpole_horizontal then
ophdef.tiles[3] = "signs_lib_blank.png"
ophdef.tiles[4] = "signs_lib_pole_mount.png"
minetest.register_node(":"..name.."_onpole_horiz", ophdef)
table.insert(signs_lib.lbm_restore_nodes, name.."_onpole_horiz")
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)
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
@ -817,7 +1016,6 @@ local function register_sign(name, rdef)
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")
@ -827,57 +1025,11 @@ local function register_sign(name, rdef)
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)
table.insert(signs_lib.old_widefont_signs, name.."_widefont")
table.insert(signs_lib.old_widefont_signs, name.."_widefont_onpole")
table.insert(signs_lib.old_widefont_signs, name.."_widefont_hanging")
end
end
@ -915,12 +1067,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})
@ -932,8 +1079,22 @@ minetest.register_lbm({
end
})
signs_lib.block_list = {}
signs_lib.totalblocks = 0
-- Convert widefont sign nodes to use one base node with meta flag to select wide mode
minetest.register_lbm({
nodenames = signs_lib.old_widefont_signs,
name = "signs_lib:convert_widefont_signs",
label = "Convert widefont sign nodes",
run_at_every_load = false,
action = function(pos, node)
local basename = string.gsub(node.name, "_widefont", "")
minetest.swap_node(pos, {name = basename, param2 = node.param2})
local meta = minetest.get_meta(pos)
meta:set_int("widefont", 1)
signs_lib.delete_objects(pos)
signs_lib.update_sign(pos)
end
})
-- Maintain a list of currently-loaded blocks
minetest.register_lbm({
@ -983,12 +1144,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

176
compat.lua Normal file
View File

@ -0,0 +1,176 @@
local default_fences = {
"default:fence_wood",
"default:fence_acacia_wood",
"default:fence_aspen_wood",
"default:fence_junglewood",
"default:fence_pine_wood"
}
for _, n in ipairs(default_fences) do
minetest.override_item(n, {
check_for_pole = true
})
end
if minetest.get_modpath("streetspoles") then
local htj_north = {
[1] = true,
[3] = true,
[9] = true,
[11] = true,
[21] = true,
[23] = true
}
local htj_east = {
[0] = true,
[2] = true,
[16] = true,
[18] = true,
[20] = true,
[22] = true
}
local htj_south = {
[1] = true,
[3] = true,
[5] = true,
[7] = true,
[21] = true,
[23] = true
}
local htj_west = {
[0] = true,
[2] = true,
[12] = true,
[14] = true,
[20] = true,
[22] = true
}
local vtj_north = {
[8] = true,
[10] = true,
[13] = true,
[15] = true,
[17] = true,
[19] = true
}
local vtj_east = {
[4] = true,
[6] = true,
[8] = true,
[10] = true,
[17] = true,
[19] = true
}
local vtj_south = {
[4] = true,
[6] = true,
[13] = true,
[15] = true,
[17] = true,
[10] = true
}
local vtj_west = {
[4] = true,
[6] = true,
[8] = true,
[10] = true,
[13] = true,
[15] = true
}
minetest.override_item("streets:bigpole", {
check_for_pole = function(pos, node, def, ppos, pnode, pdef)
if pnode.param2 < 4
or (pnode.param2 > 19 and pnode.param2 < 24)
and (pos.x ~= ppos.x or pos.z ~= ppos.z) then
return true
end
end,
check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef)
if pnode.param2 > 3 and pnode.param2 < 12 then
if def.paramtype2 == "wallmounted" then
if node.param2 == 2 or node.param2 == 3 -- E/W
then return true
end
else
if node.param2 == 1 or node.param2 == 3 -- E/W
then return true
end
end
elseif pnode.param2 > 11 and pnode.param2 < 20 then
if def.paramtype2 == "wallmounted" then
if node.param2 == 4 or node.param2 == 5 then
return true
end
else
if node.param2 == 0 or node.param2 == 2 then
return true
end
end
end
end
})
minetest.override_item("streets:bigpole_tjunction", {
check_for_pole = function(pos, node, def, ppos, pnode, pdef)
if def.paramtype2 == "wallmounted" then
if (node.param2 == 4 and vtj_north[pnode.param2])
or (node.param2 == 2 and vtj_east[pnode.param2])
or (node.param2 == 5 and vtj_south[pnode.param2])
or (node.param2 == 3 and vtj_west[pnode.param2]) then
return true
end
else
if (node.param2 == 0 and vtj_north[pnode.param2])
or (node.param2 == 1 and vtj_east[pnode.param2])
or (node.param2 == 2 and vtj_south[pnode.param2])
or (node.param2 == 3 and vtj_west[pnode.param2]) then
return true
end
end
end,
check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef)
if def.paramtype2 == "wallmounted" then
if (node.param2 == 4 and htj_north[pnode.param2])
or (node.param2 == 2 and htj_east[pnode.param2])
or (node.param2 == 5 and htj_south[pnode.param2])
or (node.param2 == 3 and htj_west[pnode.param2]) then
return true
end
else
if (node.param2 == 0 and htj_north[pnode.param2])
or (node.param2 == 1 and htj_east[pnode.param2])
or (node.param2 == 2 and htj_south[pnode.param2])
or (node.param2 == 3 and htj_west[pnode.param2]) then
return true
end
end
end
})
end
if minetest.get_modpath("streetlamps") then
minetest.override_item("streets:streetlamp_basic_top_on", {
selection_box = {
type = "fixed",
fixed = {
{-0.3,-0.4,-0.3,0.3,0.5,0.3},
{-0.15,-0.4,-0.15,0.15,-1.55,0.15},
{-0.18,-1.55,-0.18,0.18,-2.5,0.18},
}
},
check_for_pole = true
})
end

View File

@ -1,3 +1,5 @@
default
intllib?
screwdriver?
streetspoles?
streetlamps?

View File

@ -13,3 +13,4 @@ signs_lib.gettext = S
dofile(signs_lib.path.."/api.lua")
dofile(signs_lib.path.."/encoding.lua")
dofile(signs_lib.path.."/standard_signs.lua")
dofile(signs_lib.path.."/compat.lua")

View File

@ -73,6 +73,62 @@ 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
v 0.187500 -0.125000 0.812500
v 0.187500 -0.125000 0.875000
v -0.187500 -0.125000 0.812500
v -0.187500 -0.125000 0.875000
v -0.187500 0.125000 0.812500
v 0.187500 0.125000 0.812500
v 0.187500 0.125000 0.875000
v -0.187500 0.125000 0.875000
v 0.187500 -0.125000 1.125000
v 0.187500 -0.125000 0.812500
v 0.125000 -0.125000 1.125000
v 0.125000 -0.125000 0.812500
v 0.187500 -0.164063 1.125000
v 0.187500 -0.164063 0.812500
v 0.125000 -0.164063 1.125000
v 0.125000 -0.164063 0.812500
v -0.125000 -0.125000 1.125000
v -0.125000 -0.125000 0.812500
v -0.187500 -0.125000 1.125000
v -0.187500 -0.125000 0.812500
v -0.125000 -0.164063 1.125000
v -0.125000 -0.164063 0.812500
v -0.187500 -0.164063 1.125000
v -0.187500 -0.164063 0.812500
v 0.187500 0.164062 1.125000
v 0.187500 0.164062 0.812500
v 0.125000 0.164062 1.125000
v 0.125000 0.164062 0.812500
v 0.187500 0.125000 1.125000
v 0.187500 0.125000 0.812500
v 0.125000 0.125000 1.125000
v 0.125000 0.125000 0.812500
v -0.125000 0.164062 1.125000
v -0.125000 0.164062 0.812500
v -0.187500 0.164062 1.125000
v -0.187500 0.164062 0.812500
v -0.125000 0.125000 1.125000
v -0.125000 0.125000 0.812500
v -0.187500 0.125000 1.125000
v -0.187500 0.125000 0.812500
v 0.187500 -0.164063 1.164063
v 0.187500 0.164062 1.164063
v 0.125000 -0.164063 1.164063
v 0.125000 0.164062 1.164063
v 0.187500 -0.164063 1.125000
v 0.187500 0.164062 1.125000
v 0.125000 -0.164063 1.125000
v 0.125000 0.164062 1.125000
v -0.125000 -0.164063 1.164063
v -0.125000 0.164062 1.164063
v -0.187500 -0.164063 1.164063
v -0.187500 0.164062 1.164063
v -0.125000 -0.164063 1.125000
v -0.125000 0.164062 1.125000
v -0.187500 -0.164063 1.125000
v -0.187500 0.164062 1.125000
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
@ -195,6 +251,110 @@ vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vt 0.843750 0.507812
vt 0.703125 0.507812
vt 0.703125 0.093750
vt 0.843750 0.093750
vt 0.015625 0.507812
vt 0.015625 0.093750
vt 0.156250 0.093750
vt 0.156250 0.507812
vt 0.156250 0.031250
vt 0.703125 0.031250
vt 0.703125 0.578125
vt 0.156250 0.578125
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.781250 0.664062
vt 0.781250 0.992188
vt 0.921875 0.992188
vt 0.921875 0.664062
vt 0.484375 0.664062
vt 0.484375 0.992188
vt 0.562500 0.992188
vt 0.562500 0.664062
vt 0.703125 0.992188
vt 0.703125 0.664062
vt 0.234375 0.593750
vt 0.234375 0.640625
vt 0.093750 0.640625
vt 0.093750 0.593750
vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vt 0.781250 0.664062
vt 0.781250 0.992188
vt 0.921875 0.992188
vt 0.921875 0.664062
vt 0.484375 0.664062
vt 0.484375 0.992188
vt 0.562500 0.992188
vt 0.562500 0.664062
vt 0.703125 0.992188
vt 0.703125 0.664062
vt 0.234375 0.593750
vt 0.234375 0.640625
vt 0.093750 0.640625
vt 0.093750 0.593750
vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
@ -244,3 +404,37 @@ 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
g sign_on_pole.001_Cube.002_pole_mount_horizontal
f 73/123/3 74/124/3 76/125/3 75/126/3
f 78/127/4 77/128/4 80/129/4 79/130/4
f 76/125/6 80/129/6 77/131/6 75/132/6
f 73/133/5 78/134/5 79/130/5 74/124/5
f 74/124/2 79/130/2 80/129/2 76/125/2
f 81/135/4 82/136/4 84/137/4 83/138/4
f 83/139/6 84/140/6 88/141/6 87/142/6
f 87/143/3 88/144/3 86/145/3 85/146/3
f 85/146/5 86/145/5 82/147/5 81/148/5
f 89/149/4 90/150/4 92/151/4 91/152/4
f 91/153/6 92/154/6 96/155/6 95/156/6
f 95/157/3 96/158/3 94/159/3 93/160/3
f 93/160/5 94/159/5 90/161/5 89/162/5
f 97/163/4 98/164/4 100/165/4 99/166/4
f 99/167/6 100/168/6 104/169/6 103/170/6
f 103/171/3 104/172/3 102/173/3 101/174/3
f 101/174/5 102/173/5 98/175/5 97/176/5
f 105/177/4 106/178/4 108/179/4 107/180/4
f 107/181/6 108/182/6 112/183/6 111/184/6
f 111/185/3 112/186/3 110/187/3 109/188/3
f 109/188/5 110/187/5 106/189/5 105/190/5
f 113/191/2 114/192/2 116/193/2 115/194/2
f 115/195/6 116/196/6 120/197/6 119/198/6
f 119/198/1 120/197/1 118/199/1 117/200/1
f 117/200/5 118/199/5 114/192/5 113/191/5
f 115/201/3 119/202/3 117/203/3 113/204/3
f 120/205/4 116/206/4 114/207/4 118/208/4
f 121/209/2 122/210/2 124/211/2 123/212/2
f 123/213/6 124/214/6 128/215/6 127/216/6
f 127/216/1 128/215/1 126/217/1 125/218/1
f 125/218/5 126/217/5 122/210/5 121/209/5
f 123/219/3 127/220/3 125/221/3 121/222/3
f 128/223/4 124/224/4 122/225/4 126/226/4

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.003_Cube
o sign_on_pole_Cube.002
v 0.437500 -0.812500 -0.312500
v 0.437500 -0.750000 -0.312500
v 0.437500 -0.812500 0.312500
@ -17,40 +17,6 @@ v -0.437500 -0.812500 -0.312500
v -0.437500 -0.750000 -0.312500
v -0.437500 -0.812500 0.312500
v -0.437500 -0.750000 0.312500
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 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
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g Cube.003_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.003_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
o Cube.001
v -0.125000 -0.812500 -0.187500
v -0.125000 -0.875000 -0.187500
v -0.125000 -0.812500 0.187500
@ -107,6 +73,184 @@ v -0.164063 -1.125000 0.125000
v 0.164062 -1.125000 0.125000
v -0.164063 -1.125000 0.187500
v 0.164062 -1.125000 0.187500
v 0.187500 -0.812500 -0.125000
v 0.187500 -0.875000 -0.125000
v -0.187500 -0.812500 -0.125000
v -0.187500 -0.875000 -0.125000
v -0.187500 -0.812500 0.125000
v 0.187500 -0.812500 0.125000
v 0.187500 -0.875000 0.125000
v -0.187500 -0.875000 0.125000
v 0.187500 -1.125000 -0.125000
v 0.187500 -0.812500 -0.125000
v 0.125000 -1.125000 -0.125000
v 0.125000 -0.812500 -0.125000
v 0.187500 -1.125000 -0.164063
v 0.187500 -0.812500 -0.164063
v 0.125000 -1.125000 -0.164063
v 0.125000 -0.812500 -0.164063
v -0.125000 -1.125000 -0.125000
v -0.125000 -0.812500 -0.125000
v -0.187500 -1.125000 -0.125000
v -0.187500 -0.812500 -0.125000
v -0.125000 -1.125000 -0.164063
v -0.125000 -0.812500 -0.164063
v -0.187500 -1.125000 -0.164063
v -0.187500 -0.812500 -0.164063
v 0.187500 -1.125000 0.164062
v 0.187500 -0.812500 0.164062
v 0.125000 -1.125000 0.164062
v 0.125000 -0.812500 0.164062
v 0.187500 -1.125000 0.125000
v 0.187500 -0.812500 0.125000
v 0.125000 -1.125000 0.125000
v 0.125000 -0.812500 0.125000
v -0.125000 -1.125000 0.164062
v -0.125000 -0.812500 0.164062
v -0.187500 -1.125000 0.164062
v -0.187500 -0.812500 0.164062
v -0.125000 -1.125000 0.125000
v -0.125000 -0.812500 0.125000
v -0.187500 -1.125000 0.125000
v -0.187500 -0.812500 0.125000
v 0.187500 -1.164063 -0.164063
v 0.187500 -1.164063 0.164062
v 0.125000 -1.164063 -0.164063
v 0.125000 -1.164063 0.164062
v 0.187500 -1.125000 -0.164063
v 0.187500 -1.125000 0.164062
v 0.125000 -1.125000 -0.164063
v 0.125000 -1.125000 0.164062
v -0.125000 -1.164063 -0.164063
v -0.125000 -1.164063 0.164062
v -0.187500 -1.164063 -0.164063
v -0.187500 -1.164063 0.164062
v -0.125000 -1.125000 -0.164063
v -0.125000 -1.125000 0.164062
v -0.187500 -1.125000 -0.164063
v -0.187500 -1.125000 0.164062
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
vt 0.843750 0.093750
vt 0.015625 0.507812
vt 0.015625 0.093750
vt 0.156250 0.093750
vt 0.156250 0.507812
vt 0.156250 0.031250
vt 0.703125 0.031250
vt 0.703125 0.578125
vt 0.156250 0.578125
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.312500 0.640625
vt 0.312500 0.992188
vt 0.453125 0.992188
vt 0.453125 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.312500 0.992188
vt 0.312500 0.640625
vt 0.234375 0.640625
vt 0.234375 0.992188
vt 0.093750 0.992188
vt 0.093750 0.640625
vt 0.015625 0.992188
vt 0.015625 0.640625
vt 0.781250 0.664062
vt 0.781250 0.992188
vt 0.921875 0.992188
vt 0.921875 0.664062
vt 0.484375 0.664062
vt 0.484375 0.992188
vt 0.562500 0.992188
vt 0.562500 0.664062
vt 0.703125 0.992188
vt 0.703125 0.664062
vt 0.234375 0.593750
vt 0.234375 0.640625
vt 0.093750 0.640625
vt 0.093750 0.593750
vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vt 0.781250 0.664062
vt 0.781250 0.992188
vt 0.921875 0.992188
vt 0.921875 0.664062
vt 0.484375 0.664062
vt 0.484375 0.992188
vt 0.562500 0.992188
vt 0.562500 0.664062
vt 0.703125 0.992188
vt 0.703125 0.664062
vt 0.234375 0.593750
vt 0.234375 0.640625
vt 0.093750 0.640625
vt 0.093750 0.593750
vt 0.453125 0.640625
vt 0.453125 0.593750
vt 0.312500 0.593750
vt 0.312500 0.640625
vt 0.843750 0.507812
vt 0.703125 0.507812
vt 0.703125 0.093750
@ -211,44 +355,86 @@ 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 -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
g Cube.001_Cube.001_pole_mount
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g sign_on_pole_Cube.002_front-back
s off
f 17/19/7 18/20/7 20/21/7 19/22/7
f 22/23/8 21/24/8 24/25/8 23/26/8
f 20/21/9 24/25/9 21/27/9 19/28/9
f 17/29/10 22/30/10 23/26/10 18/20/10
f 18/20/11 23/26/11 24/25/11 20/21/11
f 25/31/8 26/32/8 28/33/8 27/34/8
f 27/35/9 28/36/9 32/37/9 31/38/9
f 31/39/7 32/40/7 30/41/7 29/42/7
f 29/42/10 30/41/10 26/43/10 25/44/10
f 33/45/8 34/46/8 36/47/8 35/48/8
f 35/49/9 36/50/9 40/51/9 39/52/9
f 39/53/7 40/54/7 38/55/7 37/56/7
f 37/56/10 38/55/10 34/57/10 33/58/10
f 41/59/8 42/60/8 44/61/8 43/62/8
f 43/63/9 44/64/9 48/65/9 47/66/9
f 47/67/7 48/68/7 46/69/7 45/70/7
f 45/70/10 46/69/10 42/71/10 41/72/10
f 49/73/8 50/74/8 52/75/8 51/76/8
f 51/77/9 52/78/9 56/79/9 55/80/9
f 55/81/7 56/82/7 54/83/7 53/84/7
f 53/84/10 54/83/10 50/85/10 49/86/10
f 57/87/11 58/88/11 60/89/11 59/90/11
f 59/91/9 60/92/9 64/93/9 63/94/9
f 63/94/12 64/93/12 62/95/12 61/96/12
f 61/96/10 62/95/10 58/88/10 57/87/10
f 59/97/7 63/98/7 61/99/7 57/100/7
f 64/101/8 60/102/8 58/103/8 62/104/8
f 65/105/11 66/106/11 68/107/11 67/108/11
f 67/109/9 68/110/9 72/111/9 71/112/9
f 71/112/12 72/111/12 70/113/12 69/114/12
f 69/114/10 70/113/10 66/106/10 65/105/10
f 67/115/7 71/116/7 69/117/7 65/118/7
f 72/119/8 68/120/8 66/121/8 70/122/8
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_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_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
g sign_on_pole_Cube.002_pole_mount_horizontal
f 73/123/3 74/124/3 76/125/3 75/126/3
f 78/127/4 77/128/4 80/129/4 79/130/4
f 76/125/6 80/129/6 77/131/6 75/132/6
f 73/133/5 78/134/5 79/130/5 74/124/5
f 74/124/2 79/130/2 80/129/2 76/125/2
f 81/135/4 82/136/4 84/137/4 83/138/4
f 83/139/6 84/140/6 88/141/6 87/142/6
f 87/143/3 88/144/3 86/145/3 85/146/3
f 85/146/5 86/145/5 82/147/5 81/148/5
f 89/149/4 90/150/4 92/151/4 91/152/4
f 91/153/6 92/154/6 96/155/6 95/156/6
f 95/157/3 96/158/3 94/159/3 93/160/3
f 93/160/5 94/159/5 90/161/5 89/162/5
f 97/163/4 98/164/4 100/165/4 99/166/4
f 99/167/6 100/168/6 104/169/6 103/170/6
f 103/171/3 104/172/3 102/173/3 101/174/3
f 101/174/5 102/173/5 98/175/5 97/176/5
f 105/177/4 106/178/4 108/179/4 107/180/4
f 107/181/6 108/182/6 112/183/6 111/184/6
f 111/185/3 112/186/3 110/187/3 109/188/3
f 109/188/5 110/187/5 106/189/5 105/190/5
f 113/191/2 114/192/2 116/193/2 115/194/2
f 115/195/6 116/196/6 120/197/6 119/198/6
f 119/198/1 120/197/1 118/199/1 117/200/1
f 117/200/5 118/199/5 114/192/5 113/191/5
f 115/201/3 119/202/3 117/203/3 113/204/3
f 120/205/4 116/206/4 114/207/4 118/208/4
f 121/209/2 122/210/2 124/211/2 123/212/2
f 123/213/6 124/214/6 128/215/6 127/216/6
f 127/216/1 128/215/1 126/217/1 125/218/1
f 125/218/5 126/217/5 122/210/5 121/209/5
f 123/219/3 127/220/3 125/221/3 121/222/3
f 128/223/4 124/224/4 122/225/4 126/226/4

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B