1 -- mods/default/craftitems.lua
3 -- support for MT game translation.
4 local S = default.get_translator
6 local lpp = 14 -- Lines per book's page
7 local function book_on_use(itemstack, user)
8 local player_name = user:get_player_name()
9 local meta = itemstack:get_meta()
10 local title, text, owner = "", "", player_name
11 local page, page_max, lines, string = 1, 1, {}, ""
13 -- Backwards compatibility
14 local old_data = minetest.deserialize(itemstack:get_metadata())
16 meta:from_table({ fields = old_data })
19 local data = meta:to_table().fields
26 for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
32 page_max = data.page_max
34 for i = ((lpp * page) - lpp) + 1, lpp * page do
35 if not lines[i] then break end
36 string = string .. lines[i] .. "\n"
42 local esc = minetest.formspec_escape
43 if owner == player_name then
44 formspec = "size[8,8]" ..
45 "field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" ..
47 "textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" ..
49 "button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]"
51 formspec = "size[8,8]" ..
52 "label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" ..
53 "tablecolumns[color;text]" ..
54 "tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
55 "table[0.4,0;7,0.5;title;#FFFF00," .. esc(title) .. "]" ..
56 "textarea[0.5,1.5;7.5,7;;" ..
57 minetest.formspec_escape(string ~= "" and string or text) .. ";]" ..
58 "button[2.4,7.6;0.8,0.8;book_prev;<]" ..
59 "label[3.2,7.7;" .. esc(S("Page @1 of @2", page, page_max)) .. "]" ..
60 "button[4.9,7.6;0.8,0.8;book_next;>]"
63 minetest.show_formspec(player_name, "default:book", formspec)
67 local max_text_size = 10000
68 local max_title_size = 80
69 local short_title_size = 35
70 minetest.register_on_player_receive_fields(function(player, formname, fields)
71 if formname ~= "default:book" then return end
72 local inv = player:get_inventory()
73 local stack = player:get_wielded_item()
75 if fields.save and fields.title and fields.text
76 and fields.title ~= "" and fields.text ~= "" then
78 if stack:get_name() ~= "default:book_written" then
79 local count = stack:get_count()
81 stack:set_name("default:book_written")
83 stack:set_count(count - 1)
84 new_stack = ItemStack("default:book_written")
87 data = stack:get_meta():to_table().fields
90 if data and data.owner and data.owner ~= player:get_player_name() then
94 if not data then data = {} end
95 data.title = fields.title:sub(1, max_title_size)
96 data.owner = player:get_player_name()
97 local short_title = data.title
98 -- Don't bother triming the title if the trailing dots would make it longer
99 if #short_title > short_title_size + 3 then
100 short_title = short_title:sub(1, short_title_size) .. "..."
102 data.description = S("\"@1\" by @2", short_title, data.owner)
103 data.text = fields.text:sub(1, max_text_size)
104 data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n")
106 data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
109 new_stack:get_meta():from_table({ fields = data })
110 if inv:room_for_item("main", new_stack) then
111 inv:add_item("main", new_stack)
113 minetest.add_item(player:get_pos(), new_stack)
116 stack:get_meta():from_table({ fields = data })
119 elseif fields.book_next or fields.book_prev then
120 local data = stack:get_meta():to_table().fields
121 if not data or not data.page then
125 data.page = tonumber(data.page)
126 data.page_max = tonumber(data.page_max)
128 if fields.book_next then
129 data.page = data.page + 1
130 if data.page > data.page_max then
134 data.page = data.page - 1
135 if data.page == 0 then
136 data.page = data.page_max
140 stack:get_meta():from_table({fields = data})
141 stack = book_on_use(stack, player)
145 player:set_wielded_item(stack)
148 minetest.register_craftitem("default:skeleton_key", {
149 description = S("Skeleton Key"),
150 inventory_image = "default_key_skeleton.png",
151 on_use = function(itemstack, user, pointed_thing)
152 if pointed_thing.type ~= "node" then
156 local pos = pointed_thing.under
157 local node = minetest.get_node(pos)
163 local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use
164 if not on_skeleton_key_use then
168 -- make a new key secret in case the node callback needs it
169 local random = math.random
170 local newsecret = string.format(
172 random(2^16) - 1, random(2^16) - 1,
173 random(2^16) - 1, random(2^16) - 1)
175 local secret, _, _ = on_skeleton_key_use(pos, user, newsecret)
178 local inv = minetest.get_inventory({type="player", name=user:get_player_name()})
180 -- update original itemstack
181 itemstack:take_item()
183 -- finish and return the new key
184 local new_stack = ItemStack("default:key")
185 local meta = new_stack:get_meta()
186 meta:set_string("secret", secret)
187 meta:set_string("description", S("Key to @1's @2", user:get_player_name(),
188 minetest.registered_nodes[node.name].description))
190 if itemstack:get_count() == 0 then
191 itemstack = new_stack
193 if inv:add_item("main", new_stack):get_count() > 0 then
194 minetest.add_item(user:get_pos(), new_stack)
195 end -- else: added to inventory successfully
204 -- Craftitem registry
207 minetest.register_craftitem("default:blueberries", {
208 description = S("Blueberries"),
209 inventory_image = "default_blueberries.png",
210 groups = {food_blueberries = 1, food_berry = 1},
211 on_use = minetest.item_eat(2),
214 minetest.register_craftitem("default:book", {
215 description = S("Book"),
216 inventory_image = "default_book.png",
217 groups = {book = 1, flammable = 3},
218 on_use = book_on_use,
221 minetest.register_craftitem("default:book_written", {
222 description = S("Book with Text"),
223 inventory_image = "default_book_written.png",
224 groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
226 on_use = book_on_use,
229 minetest.register_craftitem("default:bronze_ingot", {
230 description = S("Bronze Ingot"),
231 inventory_image = "default_bronze_ingot.png"
234 minetest.register_craftitem("default:clay_brick", {
235 description = S("Clay Brick"),
236 inventory_image = "default_clay_brick.png",
239 minetest.register_craftitem("default:clay_lump", {
240 description = S("Clay Lump"),
241 inventory_image = "default_clay_lump.png",
244 minetest.register_craftitem("default:coal_lump", {
245 description = S("Coal Lump"),
246 inventory_image = "default_coal_lump.png",
247 groups = {coal = 1, flammable = 1}
250 minetest.register_craftitem("default:copper_ingot", {
251 description = S("Copper Ingot"),
252 inventory_image = "default_copper_ingot.png"
255 minetest.register_craftitem("default:copper_lump", {
256 description = S("Copper Lump"),
257 inventory_image = "default_copper_lump.png"
260 minetest.register_craftitem("default:diamond", {
261 description = S("Diamond"),
262 inventory_image = "default_diamond.png",
265 minetest.register_craftitem("default:flint", {
266 description = S("Flint"),
267 inventory_image = "default_flint.png"
270 minetest.register_craftitem("default:gold_ingot", {
271 description = S("Gold Ingot"),
272 inventory_image = "default_gold_ingot.png"
275 minetest.register_craftitem("default:gold_lump", {
276 description = S("Gold Lump"),
277 inventory_image = "default_gold_lump.png"
280 minetest.register_craftitem("default:iron_lump", {
281 description = S("Iron Lump"),
282 inventory_image = "default_iron_lump.png"
285 minetest.register_craftitem("default:mese_crystal", {
286 description = S("Mese Crystal"),
287 inventory_image = "default_mese_crystal.png",
290 minetest.register_craftitem("default:mese_crystal_fragment", {
291 description = S("Mese Crystal Fragment"),
292 inventory_image = "default_mese_crystal_fragment.png",
295 minetest.register_craftitem("default:obsidian_shard", {
296 description = S("Obsidian Shard"),
297 inventory_image = "default_obsidian_shard.png",
300 minetest.register_craftitem("default:paper", {
301 description = S("Paper"),
302 inventory_image = "default_paper.png",
303 groups = {flammable = 3},
306 minetest.register_craftitem("default:steel_ingot", {
307 description = S("Steel Ingot"),
308 inventory_image = "default_steel_ingot.png"
311 minetest.register_craftitem("default:stick", {
312 description = S("Stick"),
313 inventory_image = "default_stick.png",
314 groups = {stick = 1, flammable = 2},
317 minetest.register_craftitem("default:tin_ingot", {
318 description = S("Tin Ingot"),
319 inventory_image = "default_tin_ingot.png"
322 minetest.register_craftitem("default:tin_lump", {
323 description = S("Tin Lump"),
324 inventory_image = "default_tin_lump.png"
331 minetest.register_craft({
332 output = "default:book",
340 default.register_craft_metadata_copy("default:book", "default:book_written")
342 minetest.register_craft({
343 output = "default:bronze_ingot 9",
345 {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
346 {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"},
347 {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
351 minetest.register_craft({
352 output = "default:clay_brick 4",
358 minetest.register_craft({
359 output = "default:clay_lump 4",
365 minetest.register_craft({
366 output = "default:coal_lump 9",
368 {"default:coalblock"},
372 minetest.register_craft({
373 output = "default:copper_ingot 9",
375 {"default:copperblock"},
379 minetest.register_craft({
380 output = "default:diamond 9",
382 {"default:diamondblock"},
386 minetest.register_craft({
387 output = "default:gold_ingot 9",
389 {"default:goldblock"},
393 minetest.register_craft({
394 output = "default:mese_crystal",
396 {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
397 {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
398 {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
402 minetest.register_craft({
403 output = "default:mese_crystal 9",
409 minetest.register_craft({
410 output = "default:mese_crystal_fragment 9",
412 {"default:mese_crystal"},
416 minetest.register_craft({
417 output = "default:obsidian_shard 9",
423 minetest.register_craft({
424 output = "default:paper",
426 {"default:papyrus", "default:papyrus", "default:papyrus"},
430 minetest.register_craft({
431 output = "default:skeleton_key",
433 {"default:gold_ingot"},
437 minetest.register_craft({
438 output = "default:steel_ingot 9",
440 {"default:steelblock"},
444 minetest.register_craft({
445 output = "default:stick 4",
451 minetest.register_craft({
452 output = "default:tin_ingot 9",
454 {"default:tinblock"},
462 minetest.register_craft({
464 output = "default:clay_brick",
465 recipe = "default:clay_lump",
468 minetest.register_craft({
470 output = "default:copper_ingot",
471 recipe = "default:copper_lump",
474 minetest.register_craft({
476 output = "default:gold_ingot",
477 recipe = "default:gold_lump",
480 minetest.register_craft({
482 output = "default:gold_ingot",
483 recipe = "default:key",
487 minetest.register_craft({
489 output = "default:gold_ingot",
490 recipe = "default:skeleton_key",
494 minetest.register_craft({
496 output = "default:steel_ingot",
497 recipe = "default:iron_lump",
500 minetest.register_craft({
502 output = "default:tin_ingot",
503 recipe = "default:tin_lump",
510 minetest.register_craft({
512 recipe = "default:book",
516 minetest.register_craft({
518 recipe = "default:book_written",
522 minetest.register_craft({
524 recipe = "default:coal_lump",
528 minetest.register_craft({
530 recipe = "default:paper",
534 minetest.register_craft({
536 recipe = "group:stick",