local lpp = 14 -- Lines per book's page
local function book_on_use(itemstack, user)
local player_name = user:get_player_name()
- local data = minetest.deserialize(itemstack:get_metadata())
+ local meta = itemstack:get_meta()
local title, text, owner = "", "", player_name
local page, page_max, lines, string = 1, 1, {}, ""
- if data then
+ -- Backwards compatibility
+ local old_data = minetest.deserialize(itemstack:get_metadata())
+ if old_data then
+ meta:from_table({ fields = old_data })
+ end
+
+ local data = meta:to_table().fields
+
+ if data.owner then
title = data.title
text = data.text
owner = data.owner
new_stack = ItemStack("default:book_written")
end
else
- data = minetest.deserialize(stack:get_metadata())
+ data = stack:get_meta():to_table().fields
end
if not data then data = {} end
data.title = fields.title
+ data.owner = player:get_player_name()
+ data.description = "\""..fields.title.."\" by "..data.owner
data.text = fields.text
data.text_len = #data.text
data.page = 1
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
- data.owner = player:get_player_name()
- local data_str = minetest.serialize(data)
if new_stack then
- new_stack:set_metadata(data_str)
+ new_stack:get_meta():from_table({ fields = data })
if inv:room_for_item("main", new_stack) then
inv:add_item("main", new_stack)
else
minetest.add_item(player:getpos(), new_stack)
end
else
- stack:set_metadata(data_str)
+ stack:get_meta():from_table({ fields = data })
end
elseif fields.book_next or fields.book_prev then
- local data = minetest.deserialize(stack:get_metadata())
+ local data = stack:get_meta():to_table().fields
if not data or not data.page then
return
end
+ data.page = tonumber(data.page)
+ data.page_max = tonumber(data.page_max)
+
if fields.book_next then
data.page = data.page + 1
if data.page > data.page_max then
description = "Flint",
inventory_image = "default_flint.png"
})
-