Skip to content

Commit 64fa8e6

Browse files
ShadowNinjaEkdohibs
authored andcommittedJun 7, 2015
Make books writable
1 parent 0aebf86 commit 64fa8e6

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed
 

Diff for: ‎mods/default/craftitems.lua

+69
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,79 @@ minetest.register_craftitem("default:paper", {
1111
inventory_image = "default_paper.png",
1212
})
1313

14+
local function book_on_use(itemstack, user, pointed_thing)
15+
local player_name = user:get_player_name()
16+
local data = minetest.deserialize(itemstack:get_metadata())
17+
local title, text, owner = "", "", player_name
18+
if data then
19+
title, text, owner = data.title, data.text, data.owner
20+
end
21+
local formspec
22+
if owner == player_name then
23+
formspec = "size[8,8]"..default.gui_bg..
24+
"field[0.5,1;7.5,0;title;Title:;"..
25+
minetest.formspec_escape(title).."]"..
26+
"textarea[0.5,1.5;7.5,7;text;Contents:;"..
27+
minetest.formspec_escape(text).."]"..
28+
"button_exit[2.5,7.5;3,1;save;Save]"
29+
else
30+
formspec = "size[8,8]"..default.gui_bg..
31+
"label[1,0.5;"..minetest.formspec_escape(title).."]"..
32+
"label[0.5,1.5;"..minetest.formspec_escape(text).."]"
33+
end
34+
minetest.show_formspec(user:get_player_name(), "default:book", formspec)
35+
end
36+
37+
minetest.register_on_player_receive_fields(function(player, form_name, fields)
38+
if form_name ~= "default:book" or not fields.save or
39+
fields.title == "" or fields.text == "" then
40+
return
41+
end
42+
local inv = player:get_inventory()
43+
local stack = player:get_wielded_item()
44+
local new_stack, data
45+
if stack:get_name() ~= "default:book_written" then
46+
local count = stack:get_count()
47+
if count == 1 then
48+
stack:set_name("default:book_written")
49+
else
50+
stack:set_count(count - 1)
51+
new_stack = ItemStack("default:book_written")
52+
end
53+
else
54+
data = minetest.deserialize(stack:get_metadata())
55+
end
56+
if not data then data = {} end
57+
data.title = fields.title
58+
data.text = fields.text
59+
data.owner = player:get_player_name()
60+
local data_str = minetest.serialize(data)
61+
if new_stack then
62+
new_stack:set_metadata(data_str)
63+
if inv:room_for_item("main", new_stack) then
64+
inv:add_item("main", new_stack)
65+
else
66+
minetest.add_item(player:getpos(), new_stack)
67+
end
68+
else
69+
stack:set_metadata(data_str)
70+
end
71+
player:set_wielded_item(stack)
72+
end)
73+
1474
minetest.register_craftitem("default:book", {
1575
description = "Book",
1676
inventory_image = "default_book.png",
1777
groups = {book=1},
78+
on_use = book_on_use,
79+
})
80+
81+
minetest.register_craftitem("default:book_written", {
82+
description = "Book With Text",
83+
inventory_image = "default_book.png",
84+
groups = {book=1, not_in_creative_inventory=1},
85+
stack_max = 1,
86+
on_use = book_on_use,
1887
})
1988

2089
minetest.register_craftitem("default:coal_lump", {

2 commit comments

Comments
 (2)

HybridDog commented on Jun 18, 2015

@HybridDog
Contributor

Can you also make books drawable (l don't mean ASCII art)?

ShadowNinja commented on Jul 30, 2015

@ShadowNinja
ContributorAuthor

No.

Please sign in to comment.