local S = minetest.get_translator("rp_default") local SIGN_MAX_TEXT_LENGTH = 500 -- Formspec pages for sign (different background textures) local sign_pages = {} local register_sign_page = function(id, node_names) local page_name = "rp_default:"..id local form = rp_formspec.default.version form = form .. "size[8.5,4.5]" form = form .. rp_formspec.default.boilerplate form = form .. "background[0,0;8.5,4.5;ui_formspec_bg_"..id..".png]" form = form .. rp_formspec.button_exit(2.75, 3, 3, 1, "", minetest.formspec_escape(S("Write")), false) form = form .. "set_focus[text;true]" form = form .. "field[0.5,1.7;7.5,0.5;text;;${text}]" rp_formspec.register_page(page_name, form) for n=1, #node_names do sign_pages[node_names[n]] = page_name end end default.refresh_sign = function(meta, node) local pagename = sign_pages[node.name] local page if pagename then page = rp_formspec.get_page(pagename) else page = rp_formspec.get_page("rp_formspec:field") end meta:set_string("formspec", page) local text = meta:get_string("text") -- Show sign text in quotation marks meta:set_string("infotext", S('"@1"', text)) end local on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("text", "") local node = minetest.get_node(pos) default.refresh_sign(meta, node) end local on_receive_fields = function(pos, formname, fields, sender) if fields.text == nil then return end if minetest.is_protected(pos, sender:get_player_name()) and not minetest.check_player_privs(sender, "protection_bypass") then minetest.record_protection_violation(pos, sender:get_player_name()) return itemstack end local meta = minetest.get_meta(pos) local text = fields.text if string.len(text) > SIGN_MAX_TEXT_LENGTH then text = string.sub(text, 1, SIGN_MAX_TEXT_LENGTH) end minetest.sound_play({name="rp_default_write_sign", gain=0.2}, {pos=pos, max_hear_distance=16}, true) minetest.log("action", "[rp_default] " .. (sender:get_player_name() or "").. " wrote \""..text.."\" to sign at ".. minetest.pos_to_string(pos)) meta:set_string("text", text) -- Show sign text in quotation marks meta:set_string("infotext", S('"@1"', text)) default.write_name(pos, meta:get_string("text")) end local on_destruct = function(pos) default.write_name(pos, "") end local function register_sign(id, def) local sdef = { description = def.description, _tt_help = S("Write a short message"), drawtype = "nodebox", tiles = {def.tile}, inventory_image = def.inv_image, wield_image = def.inv_image, paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, node_box = { type = "wallmounted", wall_top = {-0.5+(1/16), 0.5, -0.5+(4/16), 0.5-(1/16), 0.5-(1/16), 0.5-(4/16)}, wall_bottom = {-0.5+(1/16), -0.5, -0.5+(4/16), 0.5-(1/16), -0.5+(1/16), 0.5-(4/16)}, wall_side = {-0.5, -0.5+(4/16), -0.5+(1/16), -0.5+(1/16), 0.5-(4/16), 0.5-(1/16)}, }, groups = {choppy = 3,oddly_breakable_by_hand=2,level=-4,attached_node = 1, sign=1, creative_decoblock = 1, paintable = 2}, is_ground_content = false, sounds = def.sounds, floodable = true, on_flood = function(pos) minetest.add_item(pos, "rp_default:"..id) end, on_construct = on_construct, on_receive_fields = on_receive_fields, on_destruct = on_destruct, on_place = function(itemstack, placer, pointed_thing) -- Boilerplace to handle pointed node's rightclick handler if not placer or not placer:is_player() then return itemstack end if pointed_thing.type ~= "node" then return minetest.item_place_node(itemstack, placer, pointed_thing) end local node = minetest.get_node(pointed_thing.under) local def = minetest.registered_nodes[node.name] if def and def.on_rightclick and ((not placer) or (placer and not placer:get_player_control().sneak)) then return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) or itemstack end if pointed_thing.under.y == pointed_thing.above.y then return minetest.item_place_node(itemstack, placer, pointed_thing) end local r90 = false local yaw = placer:get_look_horizontal() if not ((yaw > (1/4)*math.pi and yaw < (3/4)*math.pi) or (yaw > (5/4)*math.pi and yaw < (7/4)*math.pi)) then return minetest.item_place_node(itemstack, placer, pointed_thing) end local r90sign = ItemStack("rp_default:"..id.."_r90") r90sign = minetest.item_place_node(r90sign, placer, pointed_thing) if r90sign:is_empty() then itemstack:take_item() end return itemstack end, } minetest.register_node("rp_default:"..id, sdef) local sdef_r90 = { drawtype = "nodebox", tiles = {"("..def.tile..")^[transformR90"}, inventory_image = "("..def.inv_image..")^[transformR90", wield_image = "("..def.inv_image..")^[transformR90", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, node_box = { type = "wallmounted", wall_top = {-0.5+(4/16), 0.5, -0.5+(1/16), 0.5-(4/16), 0.5-(1/16), 0.5-(1/16)}, wall_bottom = {-0.5+(4/16), -0.5, -0.5+(1/16), 0.5-(4/16), -0.5+(1/16), 0.5-(1/16)}, wall_side = {-0.5, -0.5+(1/16), -0.5+(4/16), -0.5+(1/16), 0.5-(1/16), 0.5-(4/16)}, }, groups = {choppy = 3,oddly_breakable_by_hand=2,level=-4,attached_node = 1, sign=1, not_in_creative_inventory=1, paintable = 2}, is_ground_content = false, sounds = def.sounds, floodable = true, on_flood = function(pos) minetest.add_item(pos, "rp_default:"..id) end, on_construct = on_construct, on_receive_fields = on_receive_fields, on_destruct = on_destruct, drop = "rp_default:"..id, } minetest.register_node("rp_default:"..id.."_r90", sdef_r90) local sdef_p = table.copy(sdef) sdef_p.description = def.description_painted sdef_p.paramtype2 = "colorwallmounted" sdef_p.palette = "rp_paint_palette_32.png" sdef_p.groups.paintable = 1 sdef_p.groups.not_in_creative_inventory = 1 sdef_p.tiles = { def.tile_painted } sdef_p.inventory_image = def.inv_image.."^[hsl:0:-100:0" sdef_p.wield_image = def.inv_image.."^[hsl:0:-100:0" sdef_p.drop = "rp_default:"..id minetest.register_node("rp_default:"..id.."_painted", sdef_p) local sdef_r90_p = table.copy(sdef_r90) sdef_r90_p.paramtype2 = "colorwallmounted" sdef_r90_p.palette = "rp_paint_palette_32.png" sdef_r90_p.groups.paintable = 1 sdef_r90_p.tiles = { "("..def.tile_painted..")^[transformR90" } sdef_r90_p.inventory_image = "("..def.inv_image..")^[transformR90^[hsl:0:-100:0" sdef_r90_p.wield_image = "("..def.inv_image..")^[transformR90^[hsl:0:-100:0" sdef_r90_p.drop = "rp_default:"..id minetest.register_node("rp_default:"..id.."_r90_painted", sdef_r90_p) register_sign_page(id, {"rp_default:"..id, "rp_default:"..id.."_r90"}) end local sounds_wood_sign = rp_sounds.node_sound_planks_defaults({ footstep = {}, dig = { name = "rp_sounds_dig_wood", pitch = 1.5, gain = 0.5 }, dug = { name = "rp_sounds_dug_planks", pitch = 1.2, gain = 0.7 }, fall = { name = "rp_sounds_dug_planks", pitch = 1.2, gain = 0.6 }, place = { name = "rp_sounds_place_planks", pitch = 1.4, gain = 0.9 }, }) register_sign("sign", { description = S("Wooden Sign"), description_painted = S("Painted Wooden Sign"), tile = "default_sign.png", tile_painted = "rp_default_sign_painted.png", inv_image = "default_sign_inventory.png", sounds = sounds_wood_sign, }) register_sign("sign_oak", { description = S("Oak Sign"), description_painted = S("Painted Oak Sign"), tile = "rp_default_sign_oak.png", tile_painted = "rp_default_sign_oak_painted.png", inv_image = "rp_default_sign_oak_inventory.png", sounds = sounds_wood_sign, }) register_sign("sign_birch", { description = S("Birch Sign"), description_painted = S("Painted Birch Sign"), tile = "rp_default_sign_birch.png", tile_painted = "rp_default_sign_birch_painted.png", inv_image = "rp_default_sign_birch_inventory.png", sounds = sounds_wood_sign, })