2022-10-20 00:09:14 +02:00

152 lines
4.3 KiB
Lua

--
-- Editable books
--
--[[ Get translation function. The 'book' name is used
here instead of 'rp_book' due to legacy reasons,
so that old written books still have their
correct translation after the renaming orgy
after 1.5.3. If we switch to 'rp_book',
then the item tooltip of writen books would
lose their translation.
This could be solved if Minetest had a function like
minetest.register_lbm, but for items.
But the 'book' identifier works just fine for now,
it's just a minor deviation from convention. ]]
local S = minetest.get_translator("book")
local F = minetest.formspec_escape
local BOOK_MAX_TITLE_LENGTH = 64
local BOOK_MAX_TEXT_LENGTH = 4500
local on_use = function(itemstack, player, pointed_thing)
local name = player:get_player_name()
local data = itemstack:get_meta()
local title = ""
local text = ""
if data then
text = data:get_string("book:text")
title = data:get_string("book:title")
end
local form = rp_formspec.get_page("rp_formspec:default")
form = form .. "field[0.5,1.25;8,0;title;"..F(S("Title:"))..";"..F(title).."]"
form = form .. "textarea[0.5,1.75;8,6.75;text;"..F(S("Contents:"))..";"..F(text).."]"
form = form .. rp_formspec.button_exit(2.75, 7.75, 3, 1, "write", S("Write"))
minetest.show_formspec(name, "rp_book:book", form)
end
-- Unwritten book (stackable)
minetest.register_craftitem(
":rp_default:book_empty",
{
description = S("Book"),
_tt_help = S("Write down some notes"),
inventory_image = "rp_book_book_empty.png",
groups = { book = 2, tool = 1 },
on_use = function(itemstack, player, pointed_thing)
on_use(itemstack, player, pointed_thing)
end,
})
-- Writable book (not stackable)
minetest.register_craftitem(
":rp_default:book",
{
description = S("Unnamed Book"),
inventory_image = "default_book.png",
stack_max = 1,
groups = { book = 2, tool = 1, not_in_creative_inventory = 1 },
on_use = function(itemstack, player, pointed_thing)
on_use(itemstack, player, pointed_thing)
end,
})
minetest.register_on_player_receive_fields(
function(player, form_name, fields)
if form_name ~= "rp_book:book" or (not fields.write and not fields.key_enter) then
return
end
local wieldstack = player:get_wielded_item()
local iname = wieldstack:get_name()
if minetest.get_item_group(iname, "book") ~= 2 then
return
end
local title = fields.title
local text = fields.text
-- Limit title and text length
if string.len(title) > BOOK_MAX_TITLE_LENGTH then
title = string.sub(title, 1, BOOK_MAX_TITLE_LENGTH)
end
if string.len(text) > BOOK_MAX_TEXT_LENGTH then
text= string.sub(text, 1, BOOK_MAX_TEXT_LENGTH)
end
local function set_book_meta(item, title, text)
local meta = item:get_meta()
if title ~= "" then
meta:set_string("description", S("Book: “@1”", minetest.colorize("#ffff00", title))) -- Set the item description
else
meta:set_string("description", "")
end
meta:set_string("book:title", title)
meta:set_string("book:text", text)
end
if wieldstack:get_name() ~= "rp_default:book" then
if wieldstack:get_count() == 1 then
wieldstack:set_name("rp_default:book")
set_book_meta(wieldstack, title, text)
player:set_wielded_item(wieldstack)
else
local newstack = wieldstack:take_item()
newstack:set_count(1)
newstack:set_name("rp_default:book")
set_book_meta(newstack, title, text)
local inv = player:get_inventory()
if inv:room_for_item("main", newstack) then
inv:add_item("main", newstack)
else
minetest.add_item(player:get_pos(), newstack)
end
player:set_wielded_item(wieldstack)
end
else
set_book_meta(wieldstack, title, text)
player:set_wielded_item(wieldstack)
end
end)
minetest.register_craft(
{
type = "fuel",
recipe = "rp_default:book_empty",
burntime = 2,
})
minetest.register_craft(
{
type = "fuel",
recipe = "rp_default:book",
burntime = 2,
})
crafting.register_craft(
{
output = "rp_default:book_empty",
items = {
"rp_default:paper 3",
"rp_default:stick",
"rp_default:fiber",
}
})