Compare commits

...

21 Commits
fix1 ... tmp

Author SHA1 Message Date
c655902676 I have no idea what I'm doing. 2017-02-22 20:48:24 -03:00
7657d0d1f2 pass pointed_thing to on_rightclick 2017-01-28 06:59:19 -05:00
66265132dd Merge pull request #7 from xisd/patch-1
make colored metal signs optional (default to enabled)
2016-10-04 05:14:42 -04:00
9daf035d44 colored metal signs optional and display size
That a small change but for someone who try to prevent having one craft guide page per item (and multiples variants) it make all the difference :)
This mod is great but it would be even greater if it was easier to configure
like an option use_big_font_size that would change CHARS_PERLINE from 30 to 12  and NUMBER_OF_LINES from 6 to 3
(I tried to do that but I failed)
2016-10-04 10:43:07 +02:00
db0973439c minor API change: defaultcolor -> default_color 2016-09-15 08:40:16 -04:00
4481ea8726 infinite stacks only depend on creative mode now
(don't care of unified inventory is installed)
2016-09-15 08:33:23 -04:00
9dab7d8736 add default steel sign to restore-entities LBM 2016-09-15 07:57:34 -04:00
a6caa51a85 allow custom nodes to define the text entity's size
in your node def, add:

text_size = {x=foo, y=bar},

Size defaults to x=0.8 and y=0.5, respectively.
2016-09-15 07:20:34 -04:00
707f28c309 removed metal sign -> locked wooden sign recipe
(makes no sense in practice)
2016-09-09 06:45:50 -04:00
a6be7f222d Allow setting default text color in sign node def
Caveat: signs used to reset the text color to black at the start of each
line. Now, they reset to the node's default text color, after which
users' "#x" color codes are applied.  This means some signs will change
to a new color where the user didn't explicitly set it.  This will only
be visible on green, red w/white border, white w/red border, blue, and
brown metal signs, as these have either white or red as the new default
color.  All other signs will render in black, as usual.
2016-09-09 05:37:36 -04:00
b85eabb58d added option to specify text position when making a custom sign node 2016-09-09 04:32:51 -04:00
5bbaa4f294 remove debug stuff 2016-09-09 04:14:34 -04:00
9d6d9b11e1 add support for visible text on default steel signs
(if defined by subgame)
2016-09-09 04:08:20 -04:00
931a3e2b15 Use minetest_game steel sign to craft the various colored metal signs
instead of using steel ingots.  Reduced yield to one per craft.

(the "sheet metal" recipes still exist for users of "steel" mod, yield
there is unchanged)
2016-09-09 03:45:25 -04:00
fef163662a adjusted positions of all signs' entities
to move them to approx. 1 pixels in front of the surface

(trying to workaround an apparent irrlicht/Minetest precision glitch on
entity reload)
2016-09-09 03:28:32 -04:00
7735a3a382 Clarify comment/reason for LBM 2016-09-09 02:55:21 -04:00
700baef196 Merge pull request #6 from cheapie/master
Use LBM instead of ABM to restore sign text
2016-09-03 17:59:15 -04:00
d85713cf63 Use LBM instead of ABM to restore sign text 2016-09-03 15:09:55 -05:00
cbe3c8a811 "debug" is not a valid log level. 2016-04-23 19:57:16 -07:00
f40f588367 Add screenshot.png 2016-03-27 22:24:35 -07:00
62989f1e1d Adding standard mod files 2016-03-27 21:35:38 -07:00
5 changed files with 250 additions and 197 deletions

1
description.txt Normal file
View File

@ -0,0 +1 @@
Adds signs with readable text.

193
init.lua
View File

@ -9,6 +9,8 @@
-- { delta = {entity position for 270° yaw}, exact yaw expression }
-- { delta = {entity position for 90° yaw}, exact yaw expression }
-- }
-- Made colored metal signs optionals
local enable_colored_metal_signs = true
-- CWz's keyword interact mod uses this setting.
local current_keyword = minetest.setting_get("interact_keyword") or "iaccept"
@ -31,6 +33,8 @@ end
signs_lib.modpath = minetest.get_modpath("signs_lib")
local DEFAULT_TEXT_SCALE = {x=0.8, y=0.5}
signs_lib.regular_wall_sign_model = {
nodebox = {
type = "wallmounted",
@ -41,10 +45,10 @@ signs_lib.regular_wall_sign_model = {
textpos = {
nil,
nil,
{delta = {x = 0.43, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = {x = -0.43, y = 0.07, z = 0 }, yaw = math.pi / 2},
{delta = {x = 0, y = 0.07, z = 0.43 }, yaw = 0},
{delta = {x = 0, y = 0.07, z = -0.43 }, yaw = math.pi},
{delta = { x = 0.41, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = { x = -0.41, y = 0.07, z = 0 }, yaw = math.pi / 2},
{delta = { x = 0, y = 0.07, z = 0.41 }, yaw = 0},
{delta = { x = 0, y = 0.07, z = -0.41 }, yaw = math.pi},
}
}
@ -54,10 +58,10 @@ signs_lib.metal_wall_sign_model = {
fixed = {-0.4375, -0.25, 0.4375, 0.4375, 0.375, 0.5}
},
textpos = {
{delta = {x = 0, y = 0.07, z = 0.43 }, yaw = 0},
{delta = {x = 0.43, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = {x = 0, y = 0.07, z = -0.43 }, yaw = math.pi},
{delta = {x = -0.43, y = 0.07, z = 0 }, yaw = math.pi / 2},
{delta = { x = 0, y = 0.07, z = 0.41 }, yaw = 0},
{delta = { x = 0.41, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = { x = 0, y = 0.07, z = -0.41 }, yaw = math.pi},
{delta = { x = -0.41, y = 0.07, z = 0 }, yaw = math.pi / 2},
}
}
@ -70,10 +74,10 @@ signs_lib.yard_sign_model = {
}
},
textpos = {
{delta = {x = 0, y = 0.07, z = -0.068}, yaw = 0},
{delta = {x = -0.068, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = {x = 0, y = 0.07, z = 0.068}, yaw = math.pi},
{delta = {x = 0.068, y = 0.07, z = 0 }, yaw = math.pi / 2},
{delta = { x = 0, y = 0.07, z = -0.08 }, yaw = 0},
{delta = { x = -0.08, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = { x = 0, y = 0.07, z = 0.08 }, yaw = math.pi},
{delta = { x = 0.08, y = 0.07, z = 0 }, yaw = math.pi / 2},
}
}
@ -86,10 +90,10 @@ signs_lib.hanging_sign_model = {
}
},
textpos = {
{delta = {x = 0, y = -0.02, z = -0.063}, yaw = 0},
{delta = {x = -0.063, y = -0.02, z = 0 }, yaw = math.pi / -2},
{delta = {x = 0, y = -0.02, z = 0.063}, yaw = math.pi},
{delta = {x = 0.063, y = -0.02, z = 0 }, yaw = math.pi / 2},
{delta = { x = 0, y = -0.02, z = -0.08 }, yaw = 0},
{delta = { x = -0.08, y = -0.02, z = 0 }, yaw = math.pi / -2},
{delta = { x = 0, y = -0.02, z = 0.08 }, yaw = math.pi},
{delta = { x = 0.08, y = -0.02, z = 0 }, yaw = math.pi / 2},
}
}
@ -102,10 +106,10 @@ signs_lib.sign_post_model = {
}
},
textpos = {
{delta = {x = 0, y = 0.07, z = -0.188}, yaw = 0},
{delta = {x = -0.188, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = {x = 0, y = 0.07, z = 0.188 }, yaw = math.pi},
{delta = {x = 0.188, y = 0.07, z = 0 }, yaw = math.pi / 2},
{delta = { x = 0, y = 0.07, z = -0.2 }, yaw = 0},
{delta = { x = -0.2, y = 0.07, z = 0 }, yaw = math.pi / -2},
{delta = { x = 0, y = 0.07, z = 0.2 }, yaw = math.pi},
{delta = { x = 0.2, y = 0.07, z = 0 }, yaw = math.pi / 2},
}
}
@ -117,6 +121,7 @@ signs_lib.gettext = S
signs_lib.sign_node_list = {
"default:sign_wall_wood",
"default:sign_wall_steel",
"signs:sign_yard",
"signs:sign_hanging",
"signs:sign_wall_green",
@ -141,6 +146,9 @@ else
default_sign_image = "default_sign_wall.png"
end
default_sign_metal = "default:sign_wall_steel"
default_sign_metal_image = "default_sign_steel.png"
--table copy
function signs_lib.table_copy(t)
@ -157,7 +165,7 @@ end
-- infinite stacks
if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then
if not minetest.setting_getbool("creative_mode") then
signs_lib.expect_infinite_stacks = false
else
signs_lib.expect_infinite_stacks = true
@ -176,8 +184,6 @@ local FONT_FMT_SIMPLE = "hdf_%02x.png"
-- Path to the textures.
local TP = MP.."/textures"
local TEXT_SCALE = {x=0.8, y=0.5}
-- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza
local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A)
@ -301,14 +307,16 @@ local function fill_line(x, y, w, c)
return table.concat(tex)
end
local function make_line_texture(line, lineno)
local function make_line_texture(line, lineno, pos)
local width = 0
local maxw = 0
local words = { }
local n = minetest.registered_nodes[minetest.get_node(pos).name]
local default_color = n.default_color or 0
local cur_color = 0
local cur_color = tonumber(default_color, 16)
-- We check which chars are available here.
for word_i, word in ipairs(line) do
@ -389,12 +397,12 @@ local function make_line_texture(line, lineno)
return table.concat(texture), lineno
end
local function make_sign_texture(lines)
local function make_sign_texture(lines, pos)
local texture = { ("[combine:%dx%d"):format(SIGN_WIDTH, LINE_HEIGHT * NUMBER_OF_LINES) }
local lineno = 0
for i = 1, #lines do
if lineno >= NUMBER_OF_LINES then break end
local linetex, ln = make_line_texture(lines[i], lineno)
local linetex, ln = make_line_texture(lines[i], lineno, pos)
table.insert(texture, linetex)
lineno = ln + 1
end
@ -402,11 +410,13 @@ local function make_sign_texture(lines)
return table.concat(texture, "")
end
local function set_obj_text(obj, text, new)
local function set_obj_text(obj, text, new, pos)
local split = new and split_lines_and_words or split_lines_and_words_old
local n = minetest.registered_nodes[minetest.get_node(pos).name]
local text_scale = n.text_scale or DEFAULT_TEXT_SCALE
obj:set_properties({
textures={make_sign_texture(split(text))},
visual_size = TEXT_SCALE,
textures={make_sign_texture(split(text), pos)},
visual_size = text_scale,
})
end
@ -488,31 +498,27 @@ signs_lib.update_sign = function(pos, fields, owner)
local text = meta:get_string("text")
if text == nil then return end
local objects = minetest.get_objects_inside_radius(pos, 0.5)
local found
for _, v in ipairs(objects) do
local e = v:get_luaentity()
if e and e.name == "signs:text" then
if found then
v:remove()
else
set_obj_text(v, text, new)
found = true
end
end
end
if found then
return
end
-- if there is no entity
local sign_info
local signnode = minetest.get_node(pos)
if signnode.name == "signs:sign_yard" then
local signname = signnode.name
local textpos = minetest.registered_nodes[signname].textpos
if textpos then
sign_info = textpos[minetest.get_node(pos).param2 + 1]
elseif signnode.name == "signs:sign_yard" then
sign_info = signs_lib.yard_sign_model.textpos[minetest.get_node(pos).param2 + 1]
elseif signnode.name == "signs:sign_hanging" then
sign_info = signs_lib.hanging_sign_model.textpos[minetest.get_node(pos).param2 + 1]
elseif string.find(signnode.name, "sign_wall") then
if signnode.name == default_sign
or signnode.name == default_sign_metal
or signnode.name == "locked_sign:sign_wall_locked" then
sign_info = signs_lib.regular_wall_sign_model.textpos[minetest.get_node(pos).param2 + 1]
else
@ -557,7 +563,7 @@ function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked)
local node=minetest.get_node(pointed_thing.under)
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack)
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing)
else
local above = pointed_thing.above
local under = pointed_thing.under
@ -577,7 +583,6 @@ function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked)
end
local fdir = minetest.dir_to_facedir(dir)
local pt_name = minetest.get_node(under).name
local signname = itemstack:get_name()
@ -587,8 +592,11 @@ function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked)
minetest.add_node(above, {name = "signs:sign_hanging", param2 = fdir})
elseif wdir == 1 and signname == default_sign then
minetest.add_node(above, {name = "signs:sign_yard", param2 = fdir})
elseif signname == default_sign_metal then
minetest.add_node(above, {name = signname, param2 = wdir })
elseif signname ~= default_sign
and signname ~= "locked_sign:sign_wall_locked" then -- it's a metal wall sign.
and signname ~= default_sign_metal
and signname ~= "locked_sign:sign_wall_locked" then -- it's a signs_lib colored metal wall sign.
minetest.add_node(above, {name = signname, param2 = fdir})
else -- it must be a default or locked wooden wall sign
minetest.add_node(above, {name = signname, param2 = wdir }) -- note it's wallmounted here!
@ -793,11 +801,47 @@ minetest.register_node(":locked_sign:sign_wall_locked", {
on_rotate = signs_lib.wallmounted_rotate
})
-- default metal sign, if defined
if minetest.registered_nodes["default:sign_wall_steel"] then
minetest.register_node(":"..default_sign_metal, {
description = S("Sign"),
inventory_image = default_sign_metal_image,
wield_image = default_sign_metal_image,
node_placement_prediction = "",
sunlight_propagates = true,
paramtype = "light",
paramtype2 = "wallmounted",
drawtype = "nodebox",
node_box = signs_lib.regular_wall_sign_model.nodebox,
tiles = {"signs_wall_sign_metal.png"},
groups = sign_groups,
on_place = function(itemstack, placer, pointed_thing)
return signs_lib.determine_sign_type(itemstack, placer, pointed_thing)
end,
on_construct = function(pos)
signs_lib.construct_sign(pos)
end,
on_destruct = function(pos)
signs_lib.destruct_sign(pos)
end,
on_receive_fields = function(pos, formname, fields, sender)
signs_lib.receive_fields(pos, formname, fields, sender)
end,
on_punch = function(pos, node, puncher)
signs_lib.update_sign(pos)
end,
on_rotate = signs_lib.wallmounted_rotate
})
end
-- metal, colored signs
if enable_colored_metal_signs then
local sign_colors = { "green", "yellow", "red", "white_red", "white_black", "orange", "blue", "brown" }
local sign_default_text_colors = { "f", "0", "f", "4", "0", "0", "f", "f" }
for _, color in ipairs(sign_colors) do
for i, color in ipairs(sign_colors) do
minetest.register_node(":signs:sign_wall_"..color, {
description = S("Sign ("..color..", metal)"),
inventory_image = "signs_"..color.."_inv.png",
@ -816,6 +860,7 @@ for _, color in ipairs(sign_colors) do
"signs_metal_back.png",
"signs_"..color.."_front.png"
},
default_color = sign_default_text_colors[i],
groups = sign_groups,
on_place = function(itemstack, placer, pointed_thing)
return signs_lib.determine_sign_type(itemstack, placer, pointed_thing)
@ -834,16 +879,18 @@ for _, color in ipairs(sign_colors) do
end,
})
end
end
local signs_text_on_activate
signs_text_on_activate = function(self)
local meta = minetest.get_meta(self.object:getpos())
local pos = self.object:getpos()
local meta = minetest.get_meta(pos)
local text = meta:get_string("text")
local new = (meta:get_int("__signslib_new_format") ~= 0)
if text then
text = trim_input(text)
set_obj_text(self.object, text, new)
set_obj_text(self.object, text, new, pos)
end
end
@ -887,7 +934,7 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname)
end
if def_under and def_under.on_rightclick then
return def_under.on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack
return def_under.on_rightclick(pointed_thing.under, node_under, placer, itemstack, pointed_thing) or itemstack
elseif def_under and def_under.buildable_to then
minetest.add_node(pointed_thing.under, {name = fencename, param2 = fdir})
if not signs_lib.expect_infinite_stacks then
@ -924,7 +971,7 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname)
minetest.register_node(":"..fencename, def)
minetest.register_node(":"..fencewithsignname, def_sign)
table.insert(signs_lib.sign_node_list, fencewithsignname)
minetest.log("debug", S("Registered %s and %s"):format(fencename, fencewithsignname))
minetest.log("verbose", S("Registered %s and %s"):format(fencename, fencewithsignname))
end
build_char_db()
@ -934,13 +981,15 @@ minetest.register_alias("sign_wall_locked", "locked_sign:sign_wall_locked")
signs_lib.register_fence_with_sign("default:fence_wood", "signs:sign_post")
-- restore signs' text after /clearobjects and the like
-- restore signs' text after /clearobjects and the like, the next time
-- a block is reloaded by the server.
minetest.register_abm({
minetest.register_lbm({
nodenames = signs_lib.sign_node_list,
interval = 15,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
name = "signs_lib:restore_sign_text",
label = "Restore sign text",
run_at_every_load = true,
action = function(pos, node)
signs_lib.update_sign(pos)
end
})
@ -956,7 +1005,7 @@ minetest.register_craft({
}
})
--Alternate recipe.
--Alternate recipe
minetest.register_craft({
output = "locked_sign:sign_wall_locked",
@ -967,12 +1016,13 @@ minetest.register_craft({
})
-- craft recipes for the metal signs
if enable_colored_metal_signs then
minetest.register_craft( {
output = "signs:sign_wall_green 4",
output = "signs:sign_wall_green",
recipe = {
{ "dye:dark_green", "dye:white", "dye:dark_green" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -985,10 +1035,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_yellow 4",
output = "signs:sign_wall_yellow",
recipe = {
{ "dye:yellow", "dye:black", "dye:yellow" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1001,10 +1051,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_red 4",
output = "signs:sign_wall_red",
recipe = {
{ "dye:red", "dye:white", "dye:red" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1017,10 +1067,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_white_red 4",
output = "signs:sign_wall_white_red",
recipe = {
{ "dye:white", "dye:red", "dye:white" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1033,10 +1083,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_white_black 4",
output = "signs:sign_wall_white_black",
recipe = {
{ "dye:white", "dye:black", "dye:white" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1049,10 +1099,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_orange 4",
output = "signs:sign_wall_orange",
recipe = {
{ "dye:orange", "dye:black", "dye:orange" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1065,10 +1115,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_blue 4",
output = "signs:sign_wall_blue",
recipe = {
{ "dye:blue", "dye:white", "dye:blue" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1081,10 +1131,10 @@ minetest.register_craft( {
})
minetest.register_craft( {
output = "signs:sign_wall_brown 4",
output = "signs:sign_wall_brown",
recipe = {
{ "dye:brown", "dye:white", "dye:brown" },
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
{ "", default_sign_metal, "" }
},
})
@ -1095,6 +1145,7 @@ minetest.register_craft( {
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
end
if minetest.setting_get("log_mods") then
minetest.log("action", S("signs loaded"))

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = signs_lib

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B