Writable Books...
For players wanting to write inside books and have other players read them, here is the latest book code that has been submitted to minetest_game as a feature request... <fingers crossed> it will be included in default minetest :)
Note: VanessaE's latest homedecor mod has writable books also but the following code word-wraps books when being read.
Note: VanessaE's latest homedecor mod has writable books also but the following code word-wraps books when being read.
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- Code: Select all
--= Book (use to read or write to)
minetest.register_craftitem(":default:book", {
description = "Book",
inventory_image = "default_book.png",
groups = {book=1},
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
local player_name = user:get_player_name()
local data = minetest.deserialize(itemstack:get_metadata())
local title, text, owner = "", "", player_name
if data then
title, text, owner = data.title, data.text, data.owner
end
local formspec
if owner == player_name then
formspec = "size[8,8]"..default.gui_bg.. -- default.gui_bg_img..
"field[0.5,1;7.5,0;title;Title:;"..
minetest.formspec_escape(title).."]"..
"textarea[0.5,1.5;7.5,7;text;Contents:;"..
minetest.formspec_escape(text).."]"..
"button_exit[2.5,7.5;3,1;save;Save]"
minetest.show_formspec(user:get_player_name(), "default:book", formspec)
else
formspec = "size[8,8]"..default.gui_bg.. -- default.gui_bg_img..
"button_exit[7,0.25;1,0.5;close;x]"..
"label[0.5,0;"..minetest.formspec_escape(title).."]"..
"label[0.5,0.5;by "..owner.."]"..
"textarea[0.5,1.5;7.5,7;text;;"..
minetest.formspec_escape(text).."]"
minetest.show_formspec(user:get_player_name(), "default:lockedbook", formspec)
end
end,
})
minetest.register_on_player_receive_fields(function(player, form_name, fields)
if form_name ~= "default:book" or not fields.save then
return
end
local stack = player:get_wielded_item()
if minetest.get_item_group(stack:get_name(), "book") == 0 then
return
end
local data = minetest.deserialize(stack:get_metadata())
if not data then data = {} end
data.title, data.text, data.owner =
fields.title, fields.text, player:get_player_name()
stack:set_metadata(minetest.serialize(data))
player:set_wielded_item(stack)
end)