Merge remote-tracking branch 'origin/master'
[oweals/minetest.git] / games / minimal / mods / default / init.lua
1 -- default (Minetest 0.4 mod)
2 -- Most default stuff
3
4 -- The API documentation in here was moved into doc/lua_api.txt
5
6 WATER_ALPHA = 160
7 WATER_VISC = 1
8 LAVA_VISC = 7
9 LIGHT_MAX = 14
10
11 -- Definitions made by this mod that other mods can use too
12 default = {}
13
14 -- Load other files
15 dofile(minetest.get_modpath("default").."/mapgen.lua")
16
17 -- Set a noticeable inventory formspec for players
18 minetest.register_on_joinplayer(function(player)
19         local cb = function(player)
20                 minetest.chat_send_player(player:get_player_name(), "This is the [minimal] \"Minimal Development Test\" game. Use [minetest_game] for the real thing.")
21         end
22         minetest.after(2.0, cb, player)
23 end)
24
25 --
26 -- Tool definition
27 --
28
29 -- The hand
30 minetest.register_item(":", {
31         type = "none",
32         wield_image = "wieldhand.png",
33         wield_scale = {x=1,y=1,z=2.5},
34         tool_capabilities = {
35                 full_punch_interval = 1.0,
36                 max_drop_level = 0,
37                 groupcaps = {
38                         fleshy = {times={[2]=2.00, [3]=1.00}, uses=0, maxlevel=1},
39                         crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1},
40                         snappy = {times={[3]=0.40}, uses=0, maxlevel=1},
41                         oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3},
42                 }
43         }
44 })
45
46 minetest.register_tool("default:pick_wood", {
47         description = "Wooden Pickaxe",
48         inventory_image = "default_tool_woodpick.png",
49         tool_capabilities = {
50                 max_drop_level=0,
51                 groupcaps={
52                         cracky={times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1}
53                 }
54         },
55 })
56 minetest.register_tool("default:pick_stone", {
57         description = "Stone Pickaxe",
58         inventory_image = "default_tool_stonepick.png",
59         tool_capabilities = {
60                 max_drop_level=0,
61                 groupcaps={
62                         cracky={times={[1]=2.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1}
63                 }
64         },
65 })
66 minetest.register_tool("default:pick_steel", {
67         description = "Steel Pickaxe",
68         inventory_image = "default_tool_steelpick.png",
69         tool_capabilities = {
70                 max_drop_level=1,
71                 groupcaps={
72                         cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2}
73                 }
74         },
75 })
76 minetest.register_tool("default:pick_mese", {
77         description = "Mese Pickaxe",
78         inventory_image = "default_tool_mesepick.png",
79         tool_capabilities = {
80                 full_punch_interval = 1.0,
81                 max_drop_level=3,
82                 groupcaps={
83                         cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
84                         crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
85                         snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}
86                 }
87         },
88 })
89 minetest.register_tool("default:shovel_wood", {
90         description = "Wooden Shovel",
91         inventory_image = "default_tool_woodshovel.png",
92         tool_capabilities = {
93                 max_drop_level=0,
94                 groupcaps={
95                         crumbly={times={[1]=2.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1}
96                 }
97         },
98 })
99 minetest.register_tool("default:shovel_stone", {
100         description = "Stone Shovel",
101         inventory_image = "default_tool_stoneshovel.png",
102         tool_capabilities = {
103                 max_drop_level=0,
104                 groupcaps={
105                         crumbly={times={[1]=1.20, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1}
106                 }
107         },
108 })
109 minetest.register_tool("default:shovel_steel", {
110         description = "Steel Shovel",
111         inventory_image = "default_tool_steelshovel.png",
112         tool_capabilities = {
113                 max_drop_level=1,
114                 groupcaps={
115                         crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=10, maxlevel=2}
116                 }
117         },
118 })
119 minetest.register_tool("default:axe_wood", {
120         description = "Wooden Axe",
121         inventory_image = "default_tool_woodaxe.png",
122         tool_capabilities = {
123                 max_drop_level=0,
124                 groupcaps={
125                         choppy={times={[2]=1.40, [3]=0.80}, uses=10, maxlevel=1},
126                         fleshy={times={[2]=1.50, [3]=0.80}, uses=10, maxlevel=1}
127                 }
128         },
129 })
130 minetest.register_tool("default:axe_stone", {
131         description = "Stone Axe",
132         inventory_image = "default_tool_stoneaxe.png",
133         tool_capabilities = {
134                 max_drop_level=0,
135                 groupcaps={
136                         choppy={times={[1]=1.50, [2]=1.00, [3]=0.60}, uses=20, maxlevel=1},
137                         fleshy={times={[2]=1.30, [3]=0.70}, uses=20, maxlevel=1}
138                 }
139         },
140 })
141 minetest.register_tool("default:axe_steel", {
142         description = "Steel Axe",
143         inventory_image = "default_tool_steelaxe.png",
144         tool_capabilities = {
145                 max_drop_level=1,
146                 groupcaps={
147                         choppy={times={[1]=2.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2},
148                         fleshy={times={[2]=1.10, [3]=0.60}, uses=40, maxlevel=1}
149                 }
150         },
151 })
152 minetest.register_tool("default:sword_wood", {
153         description = "Wooden Sword",
154         inventory_image = "default_tool_woodsword.png",
155         tool_capabilities = {
156                 full_punch_interval = 1.0,
157                 max_drop_level=0,
158                 groupcaps={
159                         fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1},
160                         snappy={times={[2]=1.00, [3]=0.50}, uses=10, maxlevel=1},
161                         choppy={times={[3]=1.00}, uses=20, maxlevel=0}
162                 }
163         }
164 })
165 minetest.register_tool("default:sword_stone", {
166         description = "Stone Sword",
167         inventory_image = "default_tool_stonesword.png",
168         tool_capabilities = {
169                 full_punch_interval = 1.0,
170                 max_drop_level=0,
171                 groupcaps={
172                         fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1},
173                         snappy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1},
174                         choppy={times={[3]=0.90}, uses=20, maxlevel=0}
175                 }
176         }
177 })
178 minetest.register_tool("default:sword_steel", {
179         description = "Steel Sword",
180         inventory_image = "default_tool_steelsword.png",
181         tool_capabilities = {
182                 full_punch_interval = 1.0,
183                 max_drop_level=1,
184                 groupcaps={
185                         fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2},
186                         snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1},
187                         choppy={times={[3]=0.70}, uses=40, maxlevel=0}
188                 }
189         }
190 })
191
192 --
193 -- Crafting definition
194 --
195
196 minetest.register_craft({
197         output = 'default:wood 4',
198         recipe = {
199                 {'default:tree'},
200         }
201 })
202
203 minetest.register_craft({
204         output = 'default:stick 4',
205         recipe = {
206                 {'default:wood'},
207         }
208 })
209
210 minetest.register_craft({
211         output = 'default:fence_wood 2',
212         recipe = {
213                 {'default:stick', 'default:stick', 'default:stick'},
214                 {'default:stick', 'default:stick', 'default:stick'},
215         }
216 })
217
218 minetest.register_craft({
219         output = 'default:sign_wall',
220         recipe = {
221                 {'default:wood', 'default:wood', 'default:wood'},
222                 {'default:wood', 'default:wood', 'default:wood'},
223                 {'', 'default:stick', ''},
224         }
225 })
226
227 minetest.register_craft({
228         output = 'default:torch 4',
229         recipe = {
230                 {'default:coal_lump'},
231                 {'default:stick'},
232         }
233 })
234
235 minetest.register_craft({
236         output = 'default:pick_wood',
237         recipe = {
238                 {'default:wood', 'default:wood', 'default:wood'},
239                 {'', 'default:stick', ''},
240                 {'', 'default:stick', ''},
241         }
242 })
243
244 minetest.register_craft({
245         output = 'default:pick_stone',
246         recipe = {
247                 {'default:cobble', 'default:cobble', 'default:cobble'},
248                 {'', 'default:stick', ''},
249                 {'', 'default:stick', ''},
250         }
251 })
252
253 minetest.register_craft({
254         output = 'default:pick_steel',
255         recipe = {
256                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
257                 {'', 'default:stick', ''},
258                 {'', 'default:stick', ''},
259         }
260 })
261
262 minetest.register_craft({
263         output = 'default:pick_mese',
264         recipe = {
265                 {'default:mese', 'default:mese', 'default:mese'},
266                 {'', 'default:stick', ''},
267                 {'', 'default:stick', ''},
268         }
269 })
270
271 minetest.register_craft({
272         output = 'default:shovel_wood',
273         recipe = {
274                 {'default:wood'},
275                 {'default:stick'},
276                 {'default:stick'},
277         }
278 })
279
280 minetest.register_craft({
281         output = 'default:shovel_stone',
282         recipe = {
283                 {'default:cobble'},
284                 {'default:stick'},
285                 {'default:stick'},
286         }
287 })
288
289 minetest.register_craft({
290         output = 'default:shovel_steel',
291         recipe = {
292                 {'default:steel_ingot'},
293                 {'default:stick'},
294                 {'default:stick'},
295         }
296 })
297
298 minetest.register_craft({
299         output = 'default:axe_wood',
300         recipe = {
301                 {'default:wood', 'default:wood'},
302                 {'default:wood', 'default:stick'},
303                 {'', 'default:stick'},
304         }
305 })
306
307 minetest.register_craft({
308         output = 'default:axe_stone',
309         recipe = {
310                 {'default:cobble', 'default:cobble'},
311                 {'default:cobble', 'default:stick'},
312                 {'', 'default:stick'},
313         }
314 })
315
316 minetest.register_craft({
317         output = 'default:axe_steel',
318         recipe = {
319                 {'default:steel_ingot', 'default:steel_ingot'},
320                 {'default:steel_ingot', 'default:stick'},
321                 {'', 'default:stick'},
322         }
323 })
324
325 minetest.register_craft({
326         output = 'default:sword_wood',
327         recipe = {
328                 {'default:wood'},
329                 {'default:wood'},
330                 {'default:stick'},
331         }
332 })
333
334 minetest.register_craft({
335         output = 'default:sword_stone',
336         recipe = {
337                 {'default:cobble'},
338                 {'default:cobble'},
339                 {'default:stick'},
340         }
341 })
342
343 minetest.register_craft({
344         output = 'default:sword_steel',
345         recipe = {
346                 {'default:steel_ingot'},
347                 {'default:steel_ingot'},
348                 {'default:stick'},
349         }
350 })
351
352 minetest.register_craft({
353         output = 'default:rail 15',
354         recipe = {
355                 {'default:steel_ingot', '', 'default:steel_ingot'},
356                 {'default:steel_ingot', 'default:stick', 'default:steel_ingot'},
357                 {'default:steel_ingot', '', 'default:steel_ingot'},
358         }
359 })
360
361 minetest.register_craft({
362         output = 'default:chest',
363         recipe = {
364                 {'default:wood', 'default:wood', 'default:wood'},
365                 {'default:wood', '', 'default:wood'},
366                 {'default:wood', 'default:wood', 'default:wood'},
367         }
368 })
369
370 minetest.register_craft({
371         output = 'default:chest_locked',
372         recipe = {
373                 {'default:wood', 'default:wood', 'default:wood'},
374                 {'default:wood', 'default:steel_ingot', 'default:wood'},
375                 {'default:wood', 'default:wood', 'default:wood'},
376         }
377 })
378
379 minetest.register_craft({
380         output = 'default:furnace',
381         recipe = {
382                 {'default:cobble', 'default:cobble', 'default:cobble'},
383                 {'default:cobble', '', 'default:cobble'},
384                 {'default:cobble', 'default:cobble', 'default:cobble'},
385         }
386 })
387
388 minetest.register_craft({
389         output = 'default:steelblock',
390         recipe = {
391                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
392                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
393                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
394         }
395 })
396
397 minetest.register_craft({
398         output = 'default:sandstone',
399         recipe = {
400                 {'default:sand', 'default:sand'},
401                 {'default:sand', 'default:sand'},
402         }
403 })
404
405 minetest.register_craft({
406         output = 'default:clay',
407         recipe = {
408                 {'default:clay_lump', 'default:clay_lump'},
409                 {'default:clay_lump', 'default:clay_lump'},
410         }
411 })
412
413 minetest.register_craft({
414         output = 'default:brick',
415         recipe = {
416                 {'default:clay_brick', 'default:clay_brick'},
417                 {'default:clay_brick', 'default:clay_brick'},
418         }
419 })
420
421 minetest.register_craft({
422         output = 'default:paper',
423         recipe = {
424                 {'default:papyrus', 'default:papyrus', 'default:papyrus'},
425         }
426 })
427
428 minetest.register_craft({
429         output = 'default:book',
430         recipe = {
431                 {'default:paper'},
432                 {'default:paper'},
433                 {'default:paper'},
434         }
435 })
436
437 minetest.register_craft({
438         output = 'default:bookshelf',
439         recipe = {
440                 {'default:wood', 'default:wood', 'default:wood'},
441                 {'default:book', 'default:book', 'default:book'},
442                 {'default:wood', 'default:wood', 'default:wood'},
443         }
444 })
445
446 minetest.register_craft({
447         output = 'default:ladder',
448         recipe = {
449                 {'default:stick', '', 'default:stick'},
450                 {'default:stick', 'default:stick', 'default:stick'},
451                 {'default:stick', '', 'default:stick'},
452         }
453 })
454
455 --
456 -- Crafting (tool repair)
457 --
458 minetest.register_craft({
459         type = "toolrepair",
460         additional_wear = -0.02,
461 })
462
463 --
464 -- Cooking recipes
465 --
466
467 minetest.register_craft({
468         type = "cooking",
469         output = "default:glass",
470         recipe = "default:sand",
471 })
472
473 minetest.register_craft({
474         type = "cooking",
475         output = "default:coal_lump",
476         recipe = "default:tree",
477 })
478
479 minetest.register_craft({
480         type = "cooking",
481         output = "default:coal_lump",
482         recipe = "default:jungletree",
483 })
484
485 minetest.register_craft({
486         type = "cooking",
487         output = "default:stone",
488         recipe = "default:cobble",
489 })
490
491 minetest.register_craft({
492         type = "cooking",
493         output = "default:steel_ingot",
494         recipe = "default:iron_lump",
495 })
496
497 minetest.register_craft({
498         type = "cooking",
499         output = "default:clay_brick",
500         recipe = "default:clay_lump",
501 })
502
503 --
504 -- Fuels
505 --
506
507 minetest.register_craft({
508         type = "fuel",
509         recipe = "default:tree",
510         burntime = 30,
511 })
512
513 minetest.register_craft({
514         type = "fuel",
515         recipe = "default:jungletree",
516         burntime = 30,
517 })
518
519 minetest.register_craft({
520         type = "fuel",
521         recipe = "default:junglegrass",
522         burntime = 2,
523 })
524
525 minetest.register_craft({
526         type = "fuel",
527         recipe = "default:leaves",
528         burntime = 1,
529 })
530
531 minetest.register_craft({
532         type = "fuel",
533         recipe = "default:cactus",
534         burntime = 15,
535 })
536
537 minetest.register_craft({
538         type = "fuel",
539         recipe = "default:papyrus",
540         burntime = 1,
541 })
542
543 minetest.register_craft({
544         type = "fuel",
545         recipe = "default:bookshelf",
546         burntime = 30,
547 })
548
549 minetest.register_craft({
550         type = "fuel",
551         recipe = "default:fence_wood",
552         burntime = 15,
553 })
554
555 minetest.register_craft({
556         type = "fuel",
557         recipe = "default:ladder",
558         burntime = 5,
559 })
560
561 minetest.register_craft({
562         type = "fuel",
563         recipe = "default:wood",
564         burntime = 7,
565 })
566
567 minetest.register_craft({
568         type = "fuel",
569         recipe = "default:mese",
570         burntime = 30,
571 })
572
573 minetest.register_craft({
574         type = "fuel",
575         recipe = "default:lava_source",
576         burntime = 60,
577 })
578
579 minetest.register_craft({
580         type = "fuel",
581         recipe = "default:torch",
582         burntime = 4,
583 })
584
585 minetest.register_craft({
586         type = "fuel",
587         recipe = "default:sign_wall",
588         burntime = 10,
589 })
590
591 minetest.register_craft({
592         type = "fuel",
593         recipe = "default:chest",
594         burntime = 30,
595 })
596
597 minetest.register_craft({
598         type = "fuel",
599         recipe = "default:chest_locked",
600         burntime = 30,
601 })
602
603 minetest.register_craft({
604         type = "fuel",
605         recipe = "default:nyancat",
606         burntime = 1,
607 })
608
609 minetest.register_craft({
610         type = "fuel",
611         recipe = "default:nyancat_rainbow",
612         burntime = 1,
613 })
614
615 minetest.register_craft({
616         type = "fuel",
617         recipe = "default:sapling",
618         burntime = 10,
619 })
620
621 minetest.register_craft({
622         type = "fuel",
623         recipe = "default:apple",
624         burntime = 3,
625 })
626
627 minetest.register_craft({
628         type = "fuel",
629         recipe = "default:coal_lump",
630         burntime = 40,
631 })
632
633 --
634 -- Node definitions
635 --
636
637 -- Default node sounds
638
639 function default.node_sound_defaults(table)
640         table = table or {}
641         table.footstep = table.footstep or
642                         {name="", gain=1.0}
643         table.dug = table.dug or
644                         {name="default_dug_node", gain=1.0}
645         return table
646 end
647
648 function default.node_sound_stone_defaults(table)
649         table = table or {}
650         table.footstep = table.footstep or
651                         {name="default_hard_footstep", gain=0.2}
652         default.node_sound_defaults(table)
653         return table
654 end
655
656 function default.node_sound_dirt_defaults(table)
657         table = table or {}
658         table.footstep = table.footstep or
659                         {name="", gain=0.5}
660         --table.dug = table.dug or
661         --              {name="default_dirt_break", gain=0.5}
662         table.place = table.place or
663                         {name="default_grass_footstep", gain=0.5}
664         default.node_sound_defaults(table)
665         return table
666 end
667
668 function default.node_sound_sand_defaults(table)
669         table = table or {}
670         table.footstep = table.footstep or
671                         {name="default_grass_footstep", gain=0.25}
672         --table.dug = table.dug or
673         --              {name="default_dirt_break", gain=0.25}
674         table.dug = table.dug or
675                         {name="", gain=0.25}
676         default.node_sound_defaults(table)
677         return table
678 end
679
680 function default.node_sound_wood_defaults(table)
681         table = table or {}
682         table.footstep = table.footstep or
683                         {name="default_hard_footstep", gain=0.3}
684         default.node_sound_defaults(table)
685         return table
686 end
687
688 function default.node_sound_leaves_defaults(table)
689         table = table or {}
690         table.footstep = table.footstep or
691                         {name="default_grass_footstep", gain=0.25}
692         table.dig = table.dig or
693                         {name="default_dig_crumbly", gain=0.4}
694         table.dug = table.dug or
695                         {name="", gain=1.0}
696         default.node_sound_defaults(table)
697         return table
698 end
699
700 function default.node_sound_glass_defaults(table)
701         table = table or {}
702         table.footstep = table.footstep or
703                         {name="default_stone_footstep", gain=0.25}
704         table.dug = table.dug or
705                         {name="default_break_glass", gain=1.0}
706         default.node_sound_defaults(table)
707         return table
708 end
709
710 --
711
712 minetest.register_node("default:stone", {
713         description = "Stone",
714         tiles ={"default_stone.png"},
715         is_ground_content = true,
716         groups = {cracky=3},
717         drop = 'default:cobble',
718         legacy_mineral = true,
719         sounds = default.node_sound_stone_defaults(),
720 })
721
722 minetest.register_node("default:stone_with_coal", {
723         description = "Stone with coal",
724         tiles ={"default_stone.png^default_mineral_coal.png"},
725         is_ground_content = true,
726         groups = {cracky=3},
727         drop = 'default:coal_lump',
728         sounds = default.node_sound_stone_defaults(),
729 })
730
731 minetest.register_node("default:stone_with_iron", {
732         description = "Stone with iron",
733         tiles ={"default_stone.png^default_mineral_iron.png"},
734         is_ground_content = true,
735         groups = {cracky=3},
736         drop = 'default:iron_lump',
737         sounds = default.node_sound_stone_defaults(),
738 })
739
740 minetest.register_node("default:dirt_with_grass", {
741         description = "Dirt with grass",
742         tiles ={"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
743         is_ground_content = true,
744         groups = {crumbly=3, soil=1},
745         drop = 'default:dirt',
746         sounds = default.node_sound_dirt_defaults({
747                 footstep = {name="default_grass_footstep", gain=0.4},
748         }),
749 })
750
751 minetest.register_node("default:dirt_with_grass_footsteps", {
752         description = "Dirt with grass and footsteps",
753         tiles ={"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
754         is_ground_content = true,
755         groups = {crumbly=3, soil=1},
756         drop = 'default:dirt',
757         sounds = default.node_sound_dirt_defaults({
758                 footstep = {name="default_grass_footstep", gain=0.4},
759         }),
760 })
761
762 minetest.register_node("default:dirt", {
763         description = "Dirt",
764         tiles ={"default_dirt.png"},
765         is_ground_content = true,
766         groups = {crumbly=3, soil=1},
767         sounds = default.node_sound_dirt_defaults(),
768 })
769
770 minetest.register_node("default:sand", {
771         description = "Sand",
772         tiles ={"default_sand.png"},
773         is_ground_content = true,
774         groups = {crumbly=3, falling_node=1},
775         sounds = default.node_sound_sand_defaults(),
776 })
777
778 minetest.register_node("default:gravel", {
779         description = "Gravel",
780         tiles ={"default_gravel.png"},
781         is_ground_content = true,
782         groups = {crumbly=2, falling_node=1},
783         sounds = default.node_sound_dirt_defaults({
784                 footstep = {name="default_gravel_footstep", gain=0.45},
785         }),
786 })
787
788 minetest.register_node("default:sandstone", {
789         description = "Sandstone",
790         tiles ={"default_sandstone.png"},
791         is_ground_content = true,
792         groups = {crumbly=2,cracky=2},
793         drop = 'default:sand',
794         sounds = default.node_sound_stone_defaults(),
795 })
796
797 minetest.register_node("default:clay", {
798         description = "Clay",
799         tiles ={"default_clay.png"},
800         is_ground_content = true,
801         groups = {crumbly=3},
802         drop = 'default:clay_lump 4',
803         sounds = default.node_sound_dirt_defaults({
804                 footstep = "",
805         }),
806 })
807
808 minetest.register_node("default:brick", {
809         description = "Brick",
810         tiles ={"default_brick.png"},
811         is_ground_content = true,
812         groups = {cracky=3},
813         drop = 'default:clay_brick 4',
814         sounds = default.node_sound_stone_defaults(),
815 })
816
817 minetest.register_node("default:tree", {
818         description = "Tree",
819         tiles ={"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
820         is_ground_content = true,
821         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
822         sounds = default.node_sound_wood_defaults(),
823 })
824
825 minetest.register_node("default:jungletree", {
826         description = "Jungle Tree",
827         tiles ={"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
828         is_ground_content = true,
829         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
830         sounds = default.node_sound_wood_defaults(),
831 })
832
833 minetest.register_node("default:junglegrass", {
834         description = "Jungle Grass",
835         drawtype = "plantlike",
836         visual_scale = 1.3,
837         tiles ={"default_junglegrass.png"},
838         inventory_image = "default_junglegrass.png",
839         wield_image = "default_junglegrass.png",
840         paramtype = "light",
841         walkable = false,
842         groups = {snappy=3,attached_node=1},
843         sounds = default.node_sound_leaves_defaults(),
844 })
845
846 minetest.register_node("default:leaves", {
847         description = "Leaves",
848         drawtype = "allfaces_optional",
849         visual_scale = 1.3,
850         tiles ={"default_leaves.png"},
851         paramtype = "light",
852         groups = {snappy=3},
853         drop = {
854                 max_items = 1,
855                 items = {
856                         {
857                                 -- player will get sapling with 1/20 chance
858                                 items = {'default:sapling'},
859                                 rarity = 20,
860                         },
861                         {
862                                 -- player will get leaves only if he get no saplings,
863                                 -- this is because max_items is 1
864                                 items = {'default:leaves'},
865                         }
866                 }
867         },
868         sounds = default.node_sound_leaves_defaults(),
869 })
870
871 minetest.register_node("default:cactus", {
872         description = "Cactus",
873         tiles ={"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
874         is_ground_content = true,
875         groups = {snappy=2,choppy=3},
876         sounds = default.node_sound_wood_defaults(),
877 })
878
879 minetest.register_node("default:papyrus", {
880         description = "Papyrus",
881         drawtype = "plantlike",
882         tiles ={"default_papyrus.png"},
883         inventory_image = "default_papyrus.png",
884         wield_image = "default_papyrus.png",
885         paramtype = "light",
886         is_ground_content = true,
887         walkable = false,
888         groups = {snappy=3},
889         sounds = default.node_sound_leaves_defaults(),
890 })
891
892 minetest.register_node("default:bookshelf", {
893         description = "Bookshelf",
894         tiles ={"default_wood.png", "default_wood.png", "default_bookshelf.png"},
895         is_ground_content = true,
896         groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2},
897         sounds = default.node_sound_wood_defaults(),
898 })
899
900 minetest.register_node("default:glass", {
901         description = "Glass",
902         drawtype = "glasslike",
903         tiles ={"default_glass.png"},
904         inventory_image = minetest.inventorycube("default_glass.png"),
905         paramtype = "light",
906         sunlight_propagates = true,
907         is_ground_content = true,
908         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
909         sounds = default.node_sound_glass_defaults(),
910 })
911
912 minetest.register_node("default:fence_wood", {
913         description = "Wooden Fence",
914         drawtype = "fencelike",
915         tiles ={"default_wood.png"},
916         inventory_image = "default_fence.png",
917         wield_image = "default_fence.png",
918         paramtype = "light",
919         is_ground_content = true,
920         selection_box = {
921                 type = "fixed",
922                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
923         },
924         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
925         sounds = default.node_sound_wood_defaults(),
926 })
927
928 minetest.register_node("default:rail", {
929         description = "Rail",
930         drawtype = "raillike",
931         tiles ={"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
932         inventory_image = "default_rail.png",
933         wield_image = "default_rail.png",
934         paramtype = "light",
935         is_ground_content = true,
936         walkable = false,
937         selection_box = {
938                 type = "fixed",
939                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
940         },
941         groups = {bendy=2,snappy=1,dig_immediate=2},
942 })
943
944 minetest.register_node("default:ladder", {
945         description = "Ladder",
946         drawtype = "signlike",
947         tiles ={"default_ladder.png"},
948         inventory_image = "default_ladder.png",
949         wield_image = "default_ladder.png",
950         paramtype = "light",
951         paramtype2 = "wallmounted",
952         is_ground_content = true,
953         walkable = false,
954         climbable = true,
955         selection_box = {
956                 type = "wallmounted",
957                 --wall_top = = <default>
958                 --wall_bottom = = <default>
959                 --wall_side = = <default>
960         },
961         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3},
962         legacy_wallmounted = true,
963         sounds = default.node_sound_wood_defaults(),
964 })
965
966 minetest.register_node("default:wood", {
967         description = "Wood",
968         tiles ={"default_wood.png"},
969         is_ground_content = true,
970         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
971         sounds = default.node_sound_wood_defaults(),
972 })
973
974 minetest.register_node("default:mese", {
975         description = "Mese",
976         tiles ={"default_mese.png"},
977         is_ground_content = true,
978         groups = {cracky=1,level=2},
979         sounds = default.node_sound_defaults(),
980 })
981
982 minetest.register_node("default:cloud", {
983         description = "Cloud",
984         tiles ={"default_cloud.png"},
985         is_ground_content = true,
986         sounds = default.node_sound_defaults(),
987 })
988
989 minetest.register_node("default:water_flowing", {
990         description = "Water (flowing)",
991         inventory_image = minetest.inventorycube("default_water.png"),
992         drawtype = "flowingliquid",
993         tiles ={"default_water.png"},
994         special_tiles = {
995                 {name="default_water.png", backface_culling=false},
996                 {name="default_water.png", backface_culling=true},
997         },
998         alpha = WATER_ALPHA,
999         paramtype = "light",
1000         walkable = false,
1001         pointable = false,
1002         diggable = false,
1003         buildable_to = true,
1004         liquidtype = "flowing",
1005         liquid_alternative_flowing = "default:water_flowing",
1006         liquid_alternative_source = "default:water_source",
1007         liquid_viscosity = WATER_VISC,
1008         post_effect_color = {a=64, r=100, g=100, b=200},
1009         groups = {water=3, liquid=3},
1010 })
1011
1012 minetest.register_node("default:water_source", {
1013         description = "Water",
1014         inventory_image = minetest.inventorycube("default_water.png"),
1015         drawtype = "liquid",
1016         tiles ={"default_water.png"},
1017         special_tiles = {
1018                 -- New-style water source material (mostly unused)
1019                 {name="default_water.png", backface_culling=false},
1020         },
1021         alpha = WATER_ALPHA,
1022         paramtype = "light",
1023         walkable = false,
1024         pointable = false,
1025         diggable = false,
1026         buildable_to = true,
1027         liquidtype = "source",
1028         liquid_alternative_flowing = "default:water_flowing",
1029         liquid_alternative_source = "default:water_source",
1030         liquid_viscosity = WATER_VISC,
1031         post_effect_color = {a=64, r=100, g=100, b=200},
1032         groups = {water=3, liquid=3},
1033 })
1034
1035 minetest.register_node("default:lava_flowing", {
1036         description = "Lava (flowing)",
1037         inventory_image = minetest.inventorycube("default_lava.png"),
1038         drawtype = "flowingliquid",
1039         tiles ={"default_lava.png"},
1040         special_tiles = {
1041                 {
1042                         image="default_lava_flowing_animated.png",
1043                         backface_culling=false,
1044                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1045                 },
1046                 {
1047                         image="default_lava_flowing_animated.png",
1048                         backface_culling=true,
1049                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1050                 },
1051         },
1052         paramtype = "light",
1053         light_source = LIGHT_MAX - 1,
1054         walkable = false,
1055         pointable = false,
1056         diggable = false,
1057         buildable_to = true,
1058         liquidtype = "flowing",
1059         liquid_alternative_flowing = "default:lava_flowing",
1060         liquid_alternative_source = "default:lava_source",
1061         liquid_viscosity = LAVA_VISC,
1062         damage_per_second = 4*2,
1063         post_effect_color = {a=192, r=255, g=64, b=0},
1064         groups = {lava=3, liquid=2, hot=3},
1065 })
1066
1067 minetest.register_node("default:lava_source", {
1068         description = "Lava",
1069         inventory_image = minetest.inventorycube("default_lava.png"),
1070         drawtype = "liquid",
1071         --tiles ={"default_lava.png"},
1072         tiles ={
1073                 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1074         },
1075         special_tiles = {
1076                 -- New-style lava source material (mostly unused)
1077                 {name="default_lava.png", backface_culling=false},
1078         },
1079         paramtype = "light",
1080         light_source = LIGHT_MAX - 1,
1081         walkable = false,
1082         pointable = false,
1083         diggable = false,
1084         buildable_to = true,
1085         liquidtype = "source",
1086         liquid_alternative_flowing = "default:lava_flowing",
1087         liquid_alternative_source = "default:lava_source",
1088         liquid_viscosity = LAVA_VISC,
1089         damage_per_second = 4*2,
1090         post_effect_color = {a=192, r=255, g=64, b=0},
1091         groups = {lava=3, liquid=2, hot=3},
1092 })
1093
1094 minetest.register_node("default:torch", {
1095         description = "Torch",
1096         drawtype = "torchlike",
1097         tiles ={"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1098         inventory_image = "default_torch_on_floor.png",
1099         wield_image = "default_torch_on_floor.png",
1100         paramtype = "light",
1101         paramtype2 = "wallmounted",
1102         sunlight_propagates = true,
1103         walkable = false,
1104         light_source = LIGHT_MAX-1,
1105         selection_box = {
1106                 type = "wallmounted",
1107                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1108                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1109                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1110         },
1111         groups = {choppy=2,dig_immediate=3,attached_node=1},
1112         legacy_wallmounted = true,
1113         sounds = default.node_sound_defaults(),
1114 })
1115
1116 minetest.register_node("default:sign_wall", {
1117         description = "Sign",
1118         drawtype = "signlike",
1119         tiles ={"default_sign_wall.png"},
1120         inventory_image = "default_sign_wall.png",
1121         wield_image = "default_sign_wall.png",
1122         paramtype = "light",
1123         paramtype2 = "wallmounted",
1124         sunlight_propagates = true,
1125         walkable = false,
1126         selection_box = {
1127                 type = "wallmounted",
1128                 --wall_top = <default>
1129                 --wall_bottom = <default>
1130                 --wall_side = <default>
1131         },
1132         groups = {choppy=2,dig_immediate=2,attached_node=1},
1133         legacy_wallmounted = true,
1134         sounds = default.node_sound_defaults(),
1135         on_construct = function(pos)
1136                 --local n = minetest.get_node(pos)
1137                 local meta = minetest.get_meta(pos)
1138                 meta:set_string("formspec", "field[text;;${text}]")
1139                 meta:set_string("infotext", "\"\"")
1140         end,
1141         on_receive_fields = function(pos, formname, fields, sender)
1142                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1143                 local meta = minetest.get_meta(pos)
1144                 fields.text = fields.text or ""
1145                 print((sender:get_player_name() or "").." wrote \""..fields.text..
1146                                 "\" to sign at "..minetest.pos_to_string(pos))
1147                 meta:set_string("text", fields.text)
1148                 meta:set_string("infotext", '"'..fields.text..'"')
1149         end,
1150 })
1151
1152 minetest.register_node("default:chest", {
1153         description = "Chest",
1154         tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1155                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1156         paramtype2 = "facedir",
1157         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1158         legacy_facedir_simple = true,
1159         sounds = default.node_sound_wood_defaults(),
1160         on_construct = function(pos)
1161                 local meta = minetest.get_meta(pos)
1162                 meta:set_string("formspec",
1163                                 "size[8,9]"..
1164                                 "list[current_name;main;0,0;8,4;]"..
1165                                 "list[current_player;main;0,5;8,4;]")
1166                 meta:set_string("infotext", "Chest")
1167                 local inv = meta:get_inventory()
1168                 inv:set_size("main", 8*4)
1169         end,
1170         can_dig = function(pos,player)
1171                 local meta = minetest.get_meta(pos);
1172                 local inv = meta:get_inventory()
1173                 return inv:is_empty("main")
1174         end,
1175 })
1176
1177 local function has_locked_chest_privilege(meta, player)
1178         if player:get_player_name() ~= meta:get_string("owner") then
1179                 return false
1180         end
1181         return true
1182 end
1183
1184 minetest.register_node("default:chest_locked", {
1185         description = "Locked Chest",
1186         tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1187                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1188         paramtype2 = "facedir",
1189         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1190         legacy_facedir_simple = true,
1191         sounds = default.node_sound_wood_defaults(),
1192         after_place_node = function(pos, placer)
1193                 local meta = minetest.get_meta(pos)
1194                 meta:set_string("owner", placer:get_player_name() or "")
1195                 meta:set_string("infotext", "Locked Chest (owned by "..
1196                                 meta:get_string("owner")..")")
1197         end,
1198         on_construct = function(pos)
1199                 local meta = minetest.get_meta(pos)
1200                 meta:set_string("formspec",
1201                                 "size[8,9]"..
1202                                 "list[current_name;main;0,0;8,4;]"..
1203                                 "list[current_player;main;0,5;8,4;]")
1204                 meta:set_string("infotext", "Locked Chest")
1205                 meta:set_string("owner", "")
1206                 local inv = meta:get_inventory()
1207                 inv:set_size("main", 8*4)
1208         end,
1209         can_dig = function(pos,player)
1210                 local meta = minetest.get_meta(pos);
1211                 local inv = meta:get_inventory()
1212                 return inv:is_empty("main")
1213         end,
1214         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1215                 local meta = minetest.get_meta(pos)
1216                 if not has_locked_chest_privilege(meta, player) then
1217                         minetest.log("action", player:get_player_name()..
1218                                         " tried to access a locked chest belonging to "..
1219                                         meta:get_string("owner").." at "..
1220                                         minetest.pos_to_string(pos))
1221                         return 0
1222                 end
1223                 return count
1224         end,
1225     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1226                 local meta = minetest.get_meta(pos)
1227                 if not has_locked_chest_privilege(meta, player) then
1228                         minetest.log("action", player:get_player_name()..
1229                                         " tried to access a locked chest belonging to "..
1230                                         meta:get_string("owner").." at "..
1231                                         minetest.pos_to_string(pos))
1232                         return 0
1233                 end
1234                 return stack:get_count()
1235         end,
1236     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1237                 local meta = minetest.get_meta(pos)
1238                 if not has_locked_chest_privilege(meta, player) then
1239                         minetest.log("action", player:get_player_name()..
1240                                         " tried to access a locked chest belonging to "..
1241                                         meta:get_string("owner").." at "..
1242                                         minetest.pos_to_string(pos))
1243                         return 0
1244                 end
1245                 return stack:get_count()
1246         end,
1247         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1248                 minetest.log("action", player:get_player_name()..
1249                                 " moves stuff in locked chest at "..minetest.pos_to_string(pos))
1250         end,
1251     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1252                 minetest.log("action", player:get_player_name()..
1253                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1254         end,
1255     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1256                 minetest.log("action", player:get_player_name()..
1257                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1258         end,
1259 })
1260
1261 default.furnace_inactive_formspec =
1262         "size[8,9]"..
1263         "image[2,2;1,1;default_furnace_fire_bg.png]"..
1264         "list[current_name;fuel;2,3;1,1;]"..
1265         "list[current_name;src;2,1;1,1;]"..
1266         "list[current_name;dst;5,1;2,2;]"..
1267         "list[current_player;main;0,5;8,4;]"
1268
1269 minetest.register_node("default:furnace", {
1270         description = "Furnace",
1271         tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1272                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1273         paramtype2 = "facedir",
1274         groups = {cracky=2},
1275         legacy_facedir_simple = true,
1276         sounds = default.node_sound_stone_defaults(),
1277         on_construct = function(pos)
1278                 local meta = minetest.get_meta(pos)
1279                 meta:set_string("formspec", default.furnace_inactive_formspec)
1280                 meta:set_string("infotext", "Furnace")
1281                 local inv = meta:get_inventory()
1282                 inv:set_size("fuel", 1)
1283                 inv:set_size("src", 1)
1284                 inv:set_size("dst", 4)
1285         end,
1286         can_dig = function(pos,player)
1287                 local meta = minetest.get_meta(pos);
1288                 local inv = meta:get_inventory()
1289                 if not inv:is_empty("fuel") then
1290                         return false
1291                 elseif not inv:is_empty("dst") then
1292                         return false
1293                 elseif not inv:is_empty("src") then
1294                         return false
1295                 end
1296                 return true
1297         end,
1298 })
1299
1300 minetest.register_node("default:furnace_active", {
1301         description = "Furnace",
1302         tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1303                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
1304         paramtype2 = "facedir",
1305         light_source = 8,
1306         drop = "default:furnace",
1307         groups = {cracky=2},
1308         legacy_facedir_simple = true,
1309         sounds = default.node_sound_stone_defaults(),
1310         on_construct = function(pos)
1311                 local meta = minetest.get_meta(pos)
1312                 meta:set_string("formspec", default.furnace_inactive_formspec)
1313                 meta:set_string("infotext", "Furnace");
1314                 local inv = meta:get_inventory()
1315                 inv:set_size("fuel", 1)
1316                 inv:set_size("src", 1)
1317                 inv:set_size("dst", 4)
1318         end,
1319         can_dig = function(pos,player)
1320                 local meta = minetest.get_meta(pos);
1321                 local inv = meta:get_inventory()
1322                 if not inv:is_empty("fuel") then
1323                         return false
1324                 elseif not inv:is_empty("dst") then
1325                         return false
1326                 elseif not inv:is_empty("src") then
1327                         return false
1328                 end
1329                 return true
1330         end,
1331 })
1332
1333 function hacky_swap_node(pos,name)
1334         local node = minetest.get_node(pos)
1335         local meta = minetest.get_meta(pos)
1336         local meta0 = meta:to_table()
1337         if node.name == name then
1338                 return
1339         end
1340         node.name = name
1341         local meta0 = meta:to_table()
1342         minetest.set_node(pos,node)
1343         meta = minetest.get_meta(pos)
1344         meta:from_table(meta0)
1345 end
1346
1347 minetest.register_abm({
1348         nodenames = {"default:furnace","default:furnace_active"},
1349         interval = 1.0,
1350         chance = 1,
1351         action = function(pos, node, active_object_count, active_object_count_wider)
1352                 local meta = minetest.get_meta(pos)
1353                 for i, name in ipairs({
1354                                 "fuel_totaltime",
1355                                 "fuel_time",
1356                                 "src_totaltime",
1357                                 "src_time"
1358                 }) do
1359                         if meta:get_string(name) == "" then
1360                                 meta:set_float(name, 0.0)
1361                         end
1362                 end
1363
1364                 local inv = meta:get_inventory()
1365
1366                 local srclist = inv:get_list("src")
1367                 local cooked = nil
1368                 
1369                 if srclist then
1370                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1371                 end
1372                 
1373                 local was_active = false
1374                 
1375                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1376                         was_active = true
1377                         meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
1378                         meta:set_float("src_time", meta:get_float("src_time") + 1)
1379                         if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
1380                                 -- check if there's room for output in "dst" list
1381                                 if inv:room_for_item("dst",cooked.item) then
1382                                         -- Put result in "dst" list
1383                                         inv:add_item("dst", cooked.item)
1384                                         -- take stuff from "src" list
1385                                         srcstack = inv:get_stack("src", 1)
1386                                         srcstack:take_item()
1387                                         inv:set_stack("src", 1, srcstack)
1388                                 else
1389                                         print("Could not insert '"..cooked.item:to_string().."'")
1390                                 end
1391                                 meta:set_string("src_time", 0)
1392                         end
1393                 end
1394                 
1395                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1396                         local percent = math.floor(meta:get_float("fuel_time") /
1397                                         meta:get_float("fuel_totaltime") * 100)
1398                         meta:set_string("infotext","Furnace active: "..percent.."%")
1399                         hacky_swap_node(pos,"default:furnace_active")
1400                         meta:set_string("formspec",
1401                                 "size[8,9]"..
1402                                 "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
1403                                                 (100-percent)..":default_furnace_fire_fg.png]"..
1404                                 "list[current_name;fuel;2,3;1,1;]"..
1405                                 "list[current_name;src;2,1;1,1;]"..
1406                                 "list[current_name;dst;5,1;2,2;]"..
1407                                 "list[current_player;main;0,5;8,4;]")
1408                         return
1409                 end
1410
1411                 local fuel = nil
1412                 local cooked = nil
1413                 local fuellist = inv:get_list("fuel")
1414                 local srclist = inv:get_list("src")
1415                 
1416                 if srclist then
1417                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1418                 end
1419                 if fuellist then
1420                         fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
1421                 end
1422
1423                 if fuel.time <= 0 then
1424                         meta:set_string("infotext","Furnace out of fuel")
1425                         hacky_swap_node(pos,"default:furnace")
1426                         meta:set_string("formspec", default.furnace_inactive_formspec)
1427                         return
1428                 end
1429
1430                 if cooked.item:is_empty() then
1431                         if was_active then
1432                                 meta:set_string("infotext","Furnace is empty")
1433                                 hacky_swap_node(pos,"default:furnace")
1434                                 meta:set_string("formspec", default.furnace_inactive_formspec)
1435                         end
1436                         return
1437                 end
1438
1439                 meta:set_string("fuel_totaltime", fuel.time)
1440                 meta:set_string("fuel_time", 0)
1441                 
1442                 local stack = inv:get_stack("fuel", 1)
1443                 stack:take_item()
1444                 inv:set_stack("fuel", 1, stack)
1445         end,
1446 })
1447
1448 minetest.register_node("default:cobble", {
1449         description = "Cobble",
1450         tiles ={"default_cobble.png"},
1451         is_ground_content = true,
1452         groups = {cracky=3},
1453         sounds = default.node_sound_stone_defaults(),
1454 })
1455
1456 minetest.register_node("default:mossycobble", {
1457         description = "Mossy Cobble",
1458         tiles ={"default_mossycobble.png"},
1459         is_ground_content = true,
1460         groups = {cracky=3},
1461         sounds = default.node_sound_stone_defaults(),
1462 })
1463
1464 minetest.register_node("default:steelblock", {
1465         description = "Steel Block",
1466         tiles ={"default_steel_block.png"},
1467         is_ground_content = true,
1468         groups = {snappy=1,bendy=2},
1469         sounds = default.node_sound_stone_defaults(),
1470 })
1471
1472 minetest.register_node("default:nyancat", {
1473         description = "Nyancat",
1474         tiles ={"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1475                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1476         inventory_image = "default_nc_front.png",
1477         paramtype2 = "facedir",
1478         groups = {cracky=2},
1479         legacy_facedir_simple = true,
1480         sounds = default.node_sound_defaults(),
1481 })
1482
1483 minetest.register_node("default:nyancat_rainbow", {
1484         description = "Nyancat Rainbow",
1485         tiles ={"default_nc_rb.png"},
1486         inventory_image = "default_nc_rb.png",
1487         groups = {cracky=2},
1488         sounds = default.node_sound_defaults(),
1489 })
1490
1491 minetest.register_node("default:sapling", {
1492         description = "Sapling",
1493         drawtype = "plantlike",
1494         visual_scale = 1.0,
1495         tiles ={"default_sapling.png"},
1496         inventory_image = "default_sapling.png",
1497         wield_image = "default_sapling.png",
1498         paramtype = "light",
1499         walkable = false,
1500         groups = {snappy=2,dig_immediate=3,attached_node=1},
1501         sounds = default.node_sound_defaults(),
1502 })
1503
1504 minetest.register_node("default:apple", {
1505         description = "Apple",
1506         drawtype = "plantlike",
1507         visual_scale = 1.0,
1508         tiles ={"default_apple.png"},
1509         inventory_image = "default_apple.png",
1510         paramtype = "light",
1511         sunlight_propagates = true,
1512         walkable = false,
1513         groups = {fleshy=3,dig_immediate=3},
1514         on_use = minetest.item_eat(4),
1515         sounds = default.node_sound_defaults(),
1516 })
1517
1518 --
1519 -- Crafting items
1520 --
1521
1522 minetest.register_craftitem("default:stick", {
1523         description = "Stick",
1524         inventory_image = "default_stick.png",
1525 })
1526
1527 minetest.register_craftitem("default:paper", {
1528         description = "Paper",
1529         inventory_image = "default_paper.png",
1530 })
1531
1532 minetest.register_craftitem("default:book", {
1533         description = "Book",
1534         inventory_image = "default_book.png",
1535 })
1536
1537 minetest.register_craftitem("default:coal_lump", {
1538         description = "Lump of coal",
1539         inventory_image = "default_coal_lump.png",
1540 })
1541
1542 minetest.register_craftitem("default:iron_lump", {
1543         description = "Lump of iron",
1544         inventory_image = "default_iron_lump.png",
1545 })
1546
1547 minetest.register_craftitem("default:clay_lump", {
1548         description = "Lump of clay",
1549         inventory_image = "default_clay_lump.png",
1550 })
1551
1552 minetest.register_craftitem("default:steel_ingot", {
1553         description = "Steel ingot",
1554         inventory_image = "default_steel_ingot.png",
1555 })
1556
1557 minetest.register_craftitem("default:clay_brick", {
1558         description = "Clay brick",
1559         inventory_image = "default_steel_ingot.png",
1560         inventory_image = "default_clay_brick.png",
1561 })
1562
1563 minetest.register_craftitem("default:scorched_stuff", {
1564         description = "Scorched stuff",
1565         inventory_image = "default_scorched_stuff.png",
1566 })
1567
1568 --
1569 -- Aliases for the current map generator outputs
1570 --
1571
1572 minetest.register_alias("mapgen_air", "air")
1573 minetest.register_alias("mapgen_stone", "default:stone")
1574 minetest.register_alias("mapgen_tree", "default:tree")
1575 minetest.register_alias("mapgen_leaves", "default:leaves")
1576 minetest.register_alias("mapgen_apple", "default:apple")
1577 minetest.register_alias("mapgen_water_source", "default:water_source")
1578 minetest.register_alias("mapgen_dirt", "default:dirt")
1579 minetest.register_alias("mapgen_sand", "default:sand")
1580 minetest.register_alias("mapgen_gravel", "default:gravel")
1581 minetest.register_alias("mapgen_clay", "default:clay")
1582 minetest.register_alias("mapgen_lava_source", "default:lava_source")
1583 minetest.register_alias("mapgen_cobble", "default:cobble")
1584 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
1585 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
1586 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
1587 minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal")
1588 minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron")
1589 minetest.register_alias("mapgen_mese", "default:mese")
1590
1591 -- Support old code
1592 function default.spawn_falling_node(p, nodename)
1593         spawn_falling_node(p, nodename)
1594 end
1595
1596 -- Horrible crap to support old code
1597 -- Don't use this and never do what this does, it's completely wrong!
1598 -- (More specifically, the client and the C++ code doesn't get the group)
1599 function default.register_falling_node(nodename, texture)
1600         minetest.log("error", debug.traceback())
1601         minetest.log('error', "WARNING: default.register_falling_node is deprecated")
1602         if minetest.registered_nodes[nodename] then
1603                 minetest.registered_nodes[nodename].groups.falling_node = 1
1604         end
1605 end
1606
1607 --
1608 -- Global callbacks
1609 --
1610
1611 -- Global environment step function
1612 function on_step(dtime)
1613         -- print("on_step")
1614 end
1615 minetest.register_globalstep(on_step)
1616
1617 function on_placenode(p, node)
1618         --print("on_placenode")
1619 end
1620 minetest.register_on_placenode(on_placenode)
1621
1622 function on_dignode(p, node)
1623         --print("on_dignode")
1624 end
1625 minetest.register_on_dignode(on_dignode)
1626
1627 function on_punchnode(p, node)
1628 end
1629 minetest.register_on_punchnode(on_punchnode)
1630
1631 --
1632 -- Test some things
1633 --
1634
1635 local function test_get_craft_result()
1636         minetest.log("info", "test_get_craft_result()")
1637         -- normal
1638         local input = {
1639                 method = "normal",
1640                 width = 2,
1641                 items = {"", "default:coal_lump", "", "default:stick"}
1642         }
1643         minetest.log("info", "torch crafting input: "..dump(input))
1644         local output, decremented_input = minetest.get_craft_result(input)
1645         minetest.log("info", "torch crafting output: "..dump(output))
1646         minetest.log("info", "torch crafting decremented input: "..dump(decremented_input))
1647         assert(output.item)
1648         minetest.log("info", "torch crafting output.item:to_table(): "..dump(output.item:to_table()))
1649         assert(output.item:get_name() == "default:torch")
1650         assert(output.item:get_count() == 4)
1651         -- fuel
1652         local input = {
1653                 method = "fuel",
1654                 width = 1,
1655                 items = {"default:coal_lump"}
1656         }
1657         minetest.log("info", "coal fuel input: "..dump(input))
1658         local output, decremented_input = minetest.get_craft_result(input)
1659         minetest.log("info", "coal fuel output: "..dump(output))
1660         minetest.log("info", "coal fuel decremented input: "..dump(decremented_input))
1661         assert(output.time)
1662         assert(output.time > 0)
1663         -- cook
1664         local input = {
1665                 method = "cooking",
1666                 width = 1,
1667                 items = {"default:cobble"}
1668         }
1669         minetest.log("info", "cobble cooking input: "..dump(output))
1670         local output, decremented_input = minetest.get_craft_result(input)
1671         minetest.log("info", "cobble cooking output: "..dump(output))
1672         minetest.log("info", "cobble cooking decremented input: "..dump(decremented_input))
1673         assert(output.time)
1674         assert(output.time > 0)
1675         assert(output.item)
1676         minetest.log("info", "cobble cooking output.item:to_table(): "..dump(output.item:to_table()))
1677         assert(output.item:get_name() == "default:stone")
1678         assert(output.item:get_count() == 1)
1679 end
1680 test_get_craft_result()
1681
1682 --
1683 -- Done, print some random stuff
1684 --
1685
1686 --print("minetest.registered_entities:")
1687 --dump2(minetest.registered_entities)
1688
1689 -- END