Move falling to builtin
[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         default.node_sound_defaults(table)
663         return table
664 end
665
666 function default.node_sound_sand_defaults(table)
667         table = table or {}
668         table.footstep = table.footstep or
669                         {name="default_grass_footstep", gain=0.25}
670         --table.dug = table.dug or
671         --              {name="default_dirt_break", gain=0.25}
672         table.dug = table.dug or
673                         {name="", gain=0.25}
674         default.node_sound_defaults(table)
675         return table
676 end
677
678 function default.node_sound_wood_defaults(table)
679         table = table or {}
680         table.footstep = table.footstep or
681                         {name="default_hard_footstep", gain=0.3}
682         default.node_sound_defaults(table)
683         return table
684 end
685
686 function default.node_sound_leaves_defaults(table)
687         table = table or {}
688         table.footstep = table.footstep or
689                         {name="default_grass_footstep", gain=0.25}
690         table.dig = table.dig or
691                         {name="default_dig_crumbly", gain=0.4}
692         table.dug = table.dug or
693                         {name="", gain=1.0}
694         default.node_sound_defaults(table)
695         return table
696 end
697
698 function default.node_sound_glass_defaults(table)
699         table = table or {}
700         table.footstep = table.footstep or
701                         {name="default_stone_footstep", gain=0.25}
702         table.dug = table.dug or
703                         {name="default_break_glass", gain=1.0}
704         default.node_sound_defaults(table)
705         return table
706 end
707
708 --
709
710 minetest.register_node("default:stone", {
711         description = "Stone",
712         tiles ={"default_stone.png"},
713         is_ground_content = true,
714         groups = {cracky=3},
715         drop = 'default:cobble',
716         legacy_mineral = true,
717         sounds = default.node_sound_stone_defaults(),
718 })
719
720 minetest.register_node("default:stone_with_coal", {
721         description = "Stone with coal",
722         tiles ={"default_stone.png^default_mineral_coal.png"},
723         is_ground_content = true,
724         groups = {cracky=3},
725         drop = 'default:coal_lump',
726         sounds = default.node_sound_stone_defaults(),
727 })
728
729 minetest.register_node("default:stone_with_iron", {
730         description = "Stone with iron",
731         tiles ={"default_stone.png^default_mineral_iron.png"},
732         is_ground_content = true,
733         groups = {cracky=3},
734         drop = 'default:iron_lump',
735         sounds = default.node_sound_stone_defaults(),
736 })
737
738 minetest.register_node("default:dirt_with_grass", {
739         description = "Dirt with grass",
740         tiles ={"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
741         is_ground_content = true,
742         groups = {crumbly=3},
743         drop = 'default:dirt',
744         sounds = default.node_sound_dirt_defaults({
745                 footstep = {name="default_grass_footstep", gain=0.4},
746         }),
747 })
748
749 minetest.register_node("default:dirt_with_grass_footsteps", {
750         description = "Dirt with grass and footsteps",
751         tiles ={"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
752         is_ground_content = true,
753         groups = {crumbly=3},
754         drop = 'default:dirt',
755         sounds = default.node_sound_dirt_defaults({
756                 footstep = {name="default_grass_footstep", gain=0.4},
757         }),
758 })
759
760 minetest.register_node("default:dirt", {
761         description = "Dirt",
762         tiles ={"default_dirt.png"},
763         is_ground_content = true,
764         groups = {crumbly=3},
765         sounds = default.node_sound_dirt_defaults(),
766 })
767
768 minetest.register_node("default:sand", {
769         description = "Sand",
770         tiles ={"default_sand.png"},
771         is_ground_content = true,
772         groups = {crumbly=3, falling_node=1},
773         sounds = default.node_sound_sand_defaults(),
774 })
775
776 minetest.register_node("default:gravel", {
777         description = "Gravel",
778         tiles ={"default_gravel.png"},
779         is_ground_content = true,
780         groups = {crumbly=2, falling_node=1},
781         sounds = default.node_sound_dirt_defaults({
782                 footstep = {name="default_gravel_footstep", gain=0.45},
783         }),
784 })
785
786 minetest.register_node("default:sandstone", {
787         description = "Sandstone",
788         tiles ={"default_sandstone.png"},
789         is_ground_content = true,
790         groups = {crumbly=2,cracky=2},
791         drop = 'default:sand',
792         sounds = default.node_sound_stone_defaults(),
793 })
794
795 minetest.register_node("default:clay", {
796         description = "Clay",
797         tiles ={"default_clay.png"},
798         is_ground_content = true,
799         groups = {crumbly=3},
800         drop = 'default:clay_lump 4',
801         sounds = default.node_sound_dirt_defaults({
802                 footstep = "",
803         }),
804 })
805
806 minetest.register_node("default:brick", {
807         description = "Brick",
808         tiles ={"default_brick.png"},
809         is_ground_content = true,
810         groups = {cracky=3},
811         drop = 'default:clay_brick 4',
812         sounds = default.node_sound_stone_defaults(),
813 })
814
815 minetest.register_node("default:tree", {
816         description = "Tree",
817         tiles ={"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
818         is_ground_content = true,
819         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
820         sounds = default.node_sound_wood_defaults(),
821 })
822
823 minetest.register_node("default:jungletree", {
824         description = "Jungle Tree",
825         tiles ={"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
826         is_ground_content = true,
827         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
828         sounds = default.node_sound_wood_defaults(),
829 })
830
831 minetest.register_node("default:junglegrass", {
832         description = "Jungle Grass",
833         drawtype = "plantlike",
834         visual_scale = 1.3,
835         tiles ={"default_junglegrass.png"},
836         inventory_image = "default_junglegrass.png",
837         wield_image = "default_junglegrass.png",
838         paramtype = "light",
839         walkable = false,
840         groups = {snappy=3},
841         sounds = default.node_sound_leaves_defaults(),
842 })
843
844 minetest.register_node("default:leaves", {
845         description = "Leaves",
846         drawtype = "allfaces_optional",
847         visual_scale = 1.3,
848         tiles ={"default_leaves.png"},
849         paramtype = "light",
850         groups = {snappy=3},
851         drop = {
852                 max_items = 1,
853                 items = {
854                         {
855                                 -- player will get sapling with 1/20 chance
856                                 items = {'default:sapling'},
857                                 rarity = 20,
858                         },
859                         {
860                                 -- player will get leaves only if he get no saplings,
861                                 -- this is because max_items is 1
862                                 items = {'default:leaves'},
863                         }
864                 }
865         },
866         sounds = default.node_sound_leaves_defaults(),
867 })
868
869 minetest.register_node("default:cactus", {
870         description = "Cactus",
871         tiles ={"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
872         is_ground_content = true,
873         groups = {snappy=2,choppy=3},
874         sounds = default.node_sound_wood_defaults(),
875 })
876
877 minetest.register_node("default:papyrus", {
878         description = "Papyrus",
879         drawtype = "plantlike",
880         tiles ={"default_papyrus.png"},
881         inventory_image = "default_papyrus.png",
882         wield_image = "default_papyrus.png",
883         paramtype = "light",
884         is_ground_content = true,
885         walkable = false,
886         groups = {snappy=3},
887         sounds = default.node_sound_leaves_defaults(),
888 })
889
890 minetest.register_node("default:bookshelf", {
891         description = "Bookshelf",
892         tiles ={"default_wood.png", "default_wood.png", "default_bookshelf.png"},
893         is_ground_content = true,
894         groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2},
895         sounds = default.node_sound_wood_defaults(),
896 })
897
898 minetest.register_node("default:glass", {
899         description = "Glass",
900         drawtype = "glasslike",
901         tiles ={"default_glass.png"},
902         inventory_image = minetest.inventorycube("default_glass.png"),
903         paramtype = "light",
904         sunlight_propagates = true,
905         is_ground_content = true,
906         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
907         sounds = default.node_sound_glass_defaults(),
908 })
909
910 minetest.register_node("default:fence_wood", {
911         description = "Wooden Fence",
912         drawtype = "fencelike",
913         tiles ={"default_wood.png"},
914         inventory_image = "default_fence.png",
915         wield_image = "default_fence.png",
916         paramtype = "light",
917         is_ground_content = true,
918         selection_box = {
919                 type = "fixed",
920                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
921         },
922         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
923         sounds = default.node_sound_wood_defaults(),
924 })
925
926 minetest.register_node("default:rail", {
927         description = "Rail",
928         drawtype = "raillike",
929         tiles ={"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
930         inventory_image = "default_rail.png",
931         wield_image = "default_rail.png",
932         paramtype = "light",
933         is_ground_content = true,
934         walkable = false,
935         selection_box = {
936                 type = "fixed",
937                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
938         },
939         groups = {bendy=2,snappy=1,dig_immediate=2},
940 })
941
942 minetest.register_node("default:ladder", {
943         description = "Ladder",
944         drawtype = "signlike",
945         tiles ={"default_ladder.png"},
946         inventory_image = "default_ladder.png",
947         wield_image = "default_ladder.png",
948         paramtype = "light",
949         paramtype2 = "wallmounted",
950         is_ground_content = true,
951         walkable = false,
952         climbable = true,
953         selection_box = {
954                 type = "wallmounted",
955                 --wall_top = = <default>
956                 --wall_bottom = = <default>
957                 --wall_side = = <default>
958         },
959         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3},
960         legacy_wallmounted = true,
961         sounds = default.node_sound_wood_defaults(),
962 })
963
964 minetest.register_node("default:wood", {
965         description = "Wood",
966         tiles ={"default_wood.png"},
967         is_ground_content = true,
968         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
969         sounds = default.node_sound_wood_defaults(),
970 })
971
972 minetest.register_node("default:mese", {
973         description = "Mese",
974         tiles ={"default_mese.png"},
975         is_ground_content = true,
976         groups = {cracky=1,level=2},
977         sounds = default.node_sound_defaults(),
978 })
979
980 minetest.register_node("default:cloud", {
981         description = "Cloud",
982         tiles ={"default_cloud.png"},
983         is_ground_content = true,
984         sounds = default.node_sound_defaults(),
985 })
986
987 minetest.register_node("default:water_flowing", {
988         description = "Water (flowing)",
989         inventory_image = minetest.inventorycube("default_water.png"),
990         drawtype = "flowingliquid",
991         tiles ={"default_water.png"},
992         special_tiles = {
993                 {name="default_water.png", backface_culling=false},
994                 {name="default_water.png", backface_culling=true},
995         },
996         alpha = WATER_ALPHA,
997         paramtype = "light",
998         walkable = false,
999         pointable = false,
1000         diggable = false,
1001         buildable_to = true,
1002         liquidtype = "flowing",
1003         liquid_alternative_flowing = "default:water_flowing",
1004         liquid_alternative_source = "default:water_source",
1005         liquid_viscosity = WATER_VISC,
1006         post_effect_color = {a=64, r=100, g=100, b=200},
1007         groups = {water=3, liquid=3},
1008 })
1009
1010 minetest.register_node("default:water_source", {
1011         description = "Water",
1012         inventory_image = minetest.inventorycube("default_water.png"),
1013         drawtype = "liquid",
1014         tiles ={"default_water.png"},
1015         special_tiles = {
1016                 -- New-style water source material (mostly unused)
1017                 {name="default_water.png", backface_culling=false},
1018         },
1019         alpha = WATER_ALPHA,
1020         paramtype = "light",
1021         walkable = false,
1022         pointable = false,
1023         diggable = false,
1024         buildable_to = true,
1025         liquidtype = "source",
1026         liquid_alternative_flowing = "default:water_flowing",
1027         liquid_alternative_source = "default:water_source",
1028         liquid_viscosity = WATER_VISC,
1029         post_effect_color = {a=64, r=100, g=100, b=200},
1030         groups = {water=3, liquid=3},
1031 })
1032
1033 minetest.register_node("default:lava_flowing", {
1034         description = "Lava (flowing)",
1035         inventory_image = minetest.inventorycube("default_lava.png"),
1036         drawtype = "flowingliquid",
1037         tiles ={"default_lava.png"},
1038         special_tiles = {
1039                 {
1040                         image="default_lava_flowing_animated.png",
1041                         backface_culling=false,
1042                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1043                 },
1044                 {
1045                         image="default_lava_flowing_animated.png",
1046                         backface_culling=true,
1047                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1048                 },
1049         },
1050         paramtype = "light",
1051         light_source = LIGHT_MAX - 1,
1052         walkable = false,
1053         pointable = false,
1054         diggable = false,
1055         buildable_to = true,
1056         liquidtype = "flowing",
1057         liquid_alternative_flowing = "default:lava_flowing",
1058         liquid_alternative_source = "default:lava_source",
1059         liquid_viscosity = LAVA_VISC,
1060         damage_per_second = 4*2,
1061         post_effect_color = {a=192, r=255, g=64, b=0},
1062         groups = {lava=3, liquid=2, hot=3},
1063 })
1064
1065 minetest.register_node("default:lava_source", {
1066         description = "Lava",
1067         inventory_image = minetest.inventorycube("default_lava.png"),
1068         drawtype = "liquid",
1069         --tiles ={"default_lava.png"},
1070         tiles ={
1071                 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1072         },
1073         special_tiles = {
1074                 -- New-style lava source material (mostly unused)
1075                 {name="default_lava.png", backface_culling=false},
1076         },
1077         paramtype = "light",
1078         light_source = LIGHT_MAX - 1,
1079         walkable = false,
1080         pointable = false,
1081         diggable = false,
1082         buildable_to = true,
1083         liquidtype = "source",
1084         liquid_alternative_flowing = "default:lava_flowing",
1085         liquid_alternative_source = "default:lava_source",
1086         liquid_viscosity = LAVA_VISC,
1087         damage_per_second = 4*2,
1088         post_effect_color = {a=192, r=255, g=64, b=0},
1089         groups = {lava=3, liquid=2, hot=3},
1090 })
1091
1092 minetest.register_node("default:torch", {
1093         description = "Torch",
1094         drawtype = "torchlike",
1095         tiles ={"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1096         inventory_image = "default_torch_on_floor.png",
1097         wield_image = "default_torch_on_floor.png",
1098         paramtype = "light",
1099         paramtype2 = "wallmounted",
1100         sunlight_propagates = true,
1101         walkable = false,
1102         light_source = LIGHT_MAX-1,
1103         selection_box = {
1104                 type = "wallmounted",
1105                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1106                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1107                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1108         },
1109         groups = {choppy=2,dig_immediate=3},
1110         legacy_wallmounted = true,
1111         sounds = default.node_sound_defaults(),
1112 })
1113
1114 minetest.register_node("default:sign_wall", {
1115         description = "Sign",
1116         drawtype = "signlike",
1117         tiles ={"default_sign_wall.png"},
1118         inventory_image = "default_sign_wall.png",
1119         wield_image = "default_sign_wall.png",
1120         paramtype = "light",
1121         paramtype2 = "wallmounted",
1122         sunlight_propagates = true,
1123         walkable = false,
1124         selection_box = {
1125                 type = "wallmounted",
1126                 --wall_top = <default>
1127                 --wall_bottom = <default>
1128                 --wall_side = <default>
1129         },
1130         groups = {choppy=2,dig_immediate=2},
1131         legacy_wallmounted = true,
1132         sounds = default.node_sound_defaults(),
1133         on_construct = function(pos)
1134                 --local n = minetest.env:get_node(pos)
1135                 local meta = minetest.env:get_meta(pos)
1136                 meta:set_string("formspec", "field[text;;${text}]")
1137                 meta:set_string("infotext", "\"\"")
1138         end,
1139         on_receive_fields = function(pos, formname, fields, sender)
1140                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1141                 local meta = minetest.env:get_meta(pos)
1142                 fields.text = fields.text or ""
1143                 print((sender:get_player_name() or "").." wrote \""..fields.text..
1144                                 "\" to sign at "..minetest.pos_to_string(pos))
1145                 meta:set_string("text", fields.text)
1146                 meta:set_string("infotext", '"'..fields.text..'"')
1147         end,
1148 })
1149
1150 minetest.register_node("default:chest", {
1151         description = "Chest",
1152         tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1153                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1154         paramtype2 = "facedir",
1155         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1156         legacy_facedir_simple = true,
1157         sounds = default.node_sound_wood_defaults(),
1158         on_construct = function(pos)
1159                 local meta = minetest.env:get_meta(pos)
1160                 meta:set_string("formspec",
1161                                 "size[8,9]"..
1162                                 "list[current_name;main;0,0;8,4;]"..
1163                                 "list[current_player;main;0,5;8,4;]")
1164                 meta:set_string("infotext", "Chest")
1165                 local inv = meta:get_inventory()
1166                 inv:set_size("main", 8*4)
1167         end,
1168         can_dig = function(pos,player)
1169                 local meta = minetest.env:get_meta(pos);
1170                 local inv = meta:get_inventory()
1171                 return inv:is_empty("main")
1172         end,
1173 })
1174
1175 local function has_locked_chest_privilege(meta, player)
1176         if player:get_player_name() ~= meta:get_string("owner") then
1177                 return false
1178         end
1179         return true
1180 end
1181
1182 minetest.register_node("default:chest_locked", {
1183         description = "Locked Chest",
1184         tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1185                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1186         paramtype2 = "facedir",
1187         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1188         legacy_facedir_simple = true,
1189         sounds = default.node_sound_wood_defaults(),
1190         after_place_node = function(pos, placer)
1191                 local meta = minetest.env:get_meta(pos)
1192                 meta:set_string("owner", placer:get_player_name() or "")
1193                 meta:set_string("infotext", "Locked Chest (owned by "..
1194                                 meta:get_string("owner")..")")
1195         end,
1196         on_construct = function(pos)
1197                 local meta = minetest.env:get_meta(pos)
1198                 meta:set_string("formspec",
1199                                 "size[8,9]"..
1200                                 "list[current_name;main;0,0;8,4;]"..
1201                                 "list[current_player;main;0,5;8,4;]")
1202                 meta:set_string("infotext", "Locked Chest")
1203                 meta:set_string("owner", "")
1204                 local inv = meta:get_inventory()
1205                 inv:set_size("main", 8*4)
1206         end,
1207         can_dig = function(pos,player)
1208                 local meta = minetest.env:get_meta(pos);
1209                 local inv = meta:get_inventory()
1210                 return inv:is_empty("main")
1211         end,
1212         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1213                 local meta = minetest.env:get_meta(pos)
1214                 if not has_locked_chest_privilege(meta, player) then
1215                         minetest.log("action", player:get_player_name()..
1216                                         " tried to access a locked chest belonging to "..
1217                                         meta:get_string("owner").." at "..
1218                                         minetest.pos_to_string(pos))
1219                         return 0
1220                 end
1221                 return count
1222         end,
1223     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1224                 local meta = minetest.env:get_meta(pos)
1225                 if not has_locked_chest_privilege(meta, player) then
1226                         minetest.log("action", player:get_player_name()..
1227                                         " tried to access a locked chest belonging to "..
1228                                         meta:get_string("owner").." at "..
1229                                         minetest.pos_to_string(pos))
1230                         return 0
1231                 end
1232                 return stack:get_count()
1233         end,
1234     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1235                 local meta = minetest.env:get_meta(pos)
1236                 if not has_locked_chest_privilege(meta, player) then
1237                         minetest.log("action", player:get_player_name()..
1238                                         " tried to access a locked chest belonging to "..
1239                                         meta:get_string("owner").." at "..
1240                                         minetest.pos_to_string(pos))
1241                         return 0
1242                 end
1243                 return stack:get_count()
1244         end,
1245         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1246                 minetest.log("action", player:get_player_name()..
1247                                 " moves stuff in locked chest at "..minetest.pos_to_string(pos))
1248         end,
1249     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1250                 minetest.log("action", player:get_player_name()..
1251                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1252         end,
1253     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1254                 minetest.log("action", player:get_player_name()..
1255                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1256         end,
1257 })
1258
1259 default.furnace_inactive_formspec =
1260         "size[8,9]"..
1261         "image[2,2;1,1;default_furnace_fire_bg.png]"..
1262         "list[current_name;fuel;2,3;1,1;]"..
1263         "list[current_name;src;2,1;1,1;]"..
1264         "list[current_name;dst;5,1;2,2;]"..
1265         "list[current_player;main;0,5;8,4;]"
1266
1267 minetest.register_node("default:furnace", {
1268         description = "Furnace",
1269         tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1270                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1271         paramtype2 = "facedir",
1272         groups = {cracky=2},
1273         legacy_facedir_simple = true,
1274         sounds = default.node_sound_stone_defaults(),
1275         on_construct = function(pos)
1276                 local meta = minetest.env:get_meta(pos)
1277                 meta:set_string("formspec", default.furnace_inactive_formspec)
1278                 meta:set_string("infotext", "Furnace")
1279                 local inv = meta:get_inventory()
1280                 inv:set_size("fuel", 1)
1281                 inv:set_size("src", 1)
1282                 inv:set_size("dst", 4)
1283         end,
1284         can_dig = function(pos,player)
1285                 local meta = minetest.env:get_meta(pos);
1286                 local inv = meta:get_inventory()
1287                 if not inv:is_empty("fuel") then
1288                         return false
1289                 elseif not inv:is_empty("dst") then
1290                         return false
1291                 elseif not inv:is_empty("src") then
1292                         return false
1293                 end
1294                 return true
1295         end,
1296 })
1297
1298 minetest.register_node("default:furnace_active", {
1299         description = "Furnace",
1300         tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1301                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
1302         paramtype2 = "facedir",
1303         light_source = 8,
1304         drop = "default:furnace",
1305         groups = {cracky=2},
1306         legacy_facedir_simple = true,
1307         sounds = default.node_sound_stone_defaults(),
1308         on_construct = function(pos)
1309                 local meta = minetest.env:get_meta(pos)
1310                 meta:set_string("formspec", default.furnace_inactive_formspec)
1311                 meta:set_string("infotext", "Furnace");
1312                 local inv = meta:get_inventory()
1313                 inv:set_size("fuel", 1)
1314                 inv:set_size("src", 1)
1315                 inv:set_size("dst", 4)
1316         end,
1317         can_dig = function(pos,player)
1318                 local meta = minetest.env:get_meta(pos);
1319                 local inv = meta:get_inventory()
1320                 if not inv:is_empty("fuel") then
1321                         return false
1322                 elseif not inv:is_empty("dst") then
1323                         return false
1324                 elseif not inv:is_empty("src") then
1325                         return false
1326                 end
1327                 return true
1328         end,
1329 })
1330
1331 function hacky_swap_node(pos,name)
1332         local node = minetest.env:get_node(pos)
1333         local meta = minetest.env:get_meta(pos)
1334         local meta0 = meta:to_table()
1335         if node.name == name then
1336                 return
1337         end
1338         node.name = name
1339         local meta0 = meta:to_table()
1340         minetest.env:set_node(pos,node)
1341         meta = minetest.env:get_meta(pos)
1342         meta:from_table(meta0)
1343 end
1344
1345 minetest.register_abm({
1346         nodenames = {"default:furnace","default:furnace_active"},
1347         interval = 1.0,
1348         chance = 1,
1349         action = function(pos, node, active_object_count, active_object_count_wider)
1350                 local meta = minetest.env:get_meta(pos)
1351                 for i, name in ipairs({
1352                                 "fuel_totaltime",
1353                                 "fuel_time",
1354                                 "src_totaltime",
1355                                 "src_time"
1356                 }) do
1357                         if meta:get_string(name) == "" then
1358                                 meta:set_float(name, 0.0)
1359                         end
1360                 end
1361
1362                 local inv = meta:get_inventory()
1363
1364                 local srclist = inv:get_list("src")
1365                 local cooked = nil
1366                 
1367                 if srclist then
1368                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1369                 end
1370                 
1371                 local was_active = false
1372                 
1373                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1374                         was_active = true
1375                         meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
1376                         meta:set_float("src_time", meta:get_float("src_time") + 1)
1377                         if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
1378                                 -- check if there's room for output in "dst" list
1379                                 if inv:room_for_item("dst",cooked.item) then
1380                                         -- Put result in "dst" list
1381                                         inv:add_item("dst", cooked.item)
1382                                         -- take stuff from "src" list
1383                                         srcstack = inv:get_stack("src", 1)
1384                                         srcstack:take_item()
1385                                         inv:set_stack("src", 1, srcstack)
1386                                 else
1387                                         print("Could not insert '"..cooked.item:to_string().."'")
1388                                 end
1389                                 meta:set_string("src_time", 0)
1390                         end
1391                 end
1392                 
1393                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1394                         local percent = math.floor(meta:get_float("fuel_time") /
1395                                         meta:get_float("fuel_totaltime") * 100)
1396                         meta:set_string("infotext","Furnace active: "..percent.."%")
1397                         hacky_swap_node(pos,"default:furnace_active")
1398                         meta:set_string("formspec",
1399                                 "size[8,9]"..
1400                                 "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
1401                                                 (100-percent)..":default_furnace_fire_fg.png]"..
1402                                 "list[current_name;fuel;2,3;1,1;]"..
1403                                 "list[current_name;src;2,1;1,1;]"..
1404                                 "list[current_name;dst;5,1;2,2;]"..
1405                                 "list[current_player;main;0,5;8,4;]")
1406                         return
1407                 end
1408
1409                 local fuel = nil
1410                 local cooked = nil
1411                 local fuellist = inv:get_list("fuel")
1412                 local srclist = inv:get_list("src")
1413                 
1414                 if srclist then
1415                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1416                 end
1417                 if fuellist then
1418                         fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
1419                 end
1420
1421                 if fuel.time <= 0 then
1422                         meta:set_string("infotext","Furnace out of fuel")
1423                         hacky_swap_node(pos,"default:furnace")
1424                         meta:set_string("formspec", default.furnace_inactive_formspec)
1425                         return
1426                 end
1427
1428                 if cooked.item:is_empty() then
1429                         if was_active then
1430                                 meta:set_string("infotext","Furnace is empty")
1431                                 hacky_swap_node(pos,"default:furnace")
1432                                 meta:set_string("formspec", default.furnace_inactive_formspec)
1433                         end
1434                         return
1435                 end
1436
1437                 meta:set_string("fuel_totaltime", fuel.time)
1438                 meta:set_string("fuel_time", 0)
1439                 
1440                 local stack = inv:get_stack("fuel", 1)
1441                 stack:take_item()
1442                 inv:set_stack("fuel", 1, stack)
1443         end,
1444 })
1445
1446 minetest.register_node("default:cobble", {
1447         description = "Cobble",
1448         tiles ={"default_cobble.png"},
1449         is_ground_content = true,
1450         groups = {cracky=3},
1451         sounds = default.node_sound_stone_defaults(),
1452 })
1453
1454 minetest.register_node("default:mossycobble", {
1455         description = "Mossy Cobble",
1456         tiles ={"default_mossycobble.png"},
1457         is_ground_content = true,
1458         groups = {cracky=3},
1459         sounds = default.node_sound_stone_defaults(),
1460 })
1461
1462 minetest.register_node("default:steelblock", {
1463         description = "Steel Block",
1464         tiles ={"default_steel_block.png"},
1465         is_ground_content = true,
1466         groups = {snappy=1,bendy=2},
1467         sounds = default.node_sound_stone_defaults(),
1468 })
1469
1470 minetest.register_node("default:nyancat", {
1471         description = "Nyancat",
1472         tiles ={"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1473                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1474         inventory_image = "default_nc_front.png",
1475         paramtype2 = "facedir",
1476         groups = {cracky=2},
1477         legacy_facedir_simple = true,
1478         sounds = default.node_sound_defaults(),
1479 })
1480
1481 minetest.register_node("default:nyancat_rainbow", {
1482         description = "Nyancat Rainbow",
1483         tiles ={"default_nc_rb.png"},
1484         inventory_image = "default_nc_rb.png",
1485         groups = {cracky=2},
1486         sounds = default.node_sound_defaults(),
1487 })
1488
1489 minetest.register_node("default:sapling", {
1490         description = "Sapling",
1491         drawtype = "plantlike",
1492         visual_scale = 1.0,
1493         tiles ={"default_sapling.png"},
1494         inventory_image = "default_sapling.png",
1495         wield_image = "default_sapling.png",
1496         paramtype = "light",
1497         walkable = false,
1498         groups = {snappy=2,dig_immediate=3},
1499         sounds = default.node_sound_defaults(),
1500 })
1501
1502 minetest.register_node("default:apple", {
1503         description = "Apple",
1504         drawtype = "plantlike",
1505         visual_scale = 1.0,
1506         tiles ={"default_apple.png"},
1507         inventory_image = "default_apple.png",
1508         paramtype = "light",
1509         sunlight_propagates = true,
1510         walkable = false,
1511         groups = {fleshy=3,dig_immediate=3},
1512         on_use = minetest.item_eat(4),
1513         sounds = default.node_sound_defaults(),
1514 })
1515
1516 --
1517 -- Crafting items
1518 --
1519
1520 minetest.register_craftitem("default:stick", {
1521         description = "Stick",
1522         inventory_image = "default_stick.png",
1523 })
1524
1525 minetest.register_craftitem("default:paper", {
1526         description = "Paper",
1527         inventory_image = "default_paper.png",
1528 })
1529
1530 minetest.register_craftitem("default:book", {
1531         description = "Book",
1532         inventory_image = "default_book.png",
1533 })
1534
1535 minetest.register_craftitem("default:coal_lump", {
1536         description = "Lump of coal",
1537         inventory_image = "default_coal_lump.png",
1538 })
1539
1540 minetest.register_craftitem("default:iron_lump", {
1541         description = "Lump of iron",
1542         inventory_image = "default_iron_lump.png",
1543 })
1544
1545 minetest.register_craftitem("default:clay_lump", {
1546         description = "Lump of clay",
1547         inventory_image = "default_clay_lump.png",
1548 })
1549
1550 minetest.register_craftitem("default:steel_ingot", {
1551         description = "Steel ingot",
1552         inventory_image = "default_steel_ingot.png",
1553 })
1554
1555 minetest.register_craftitem("default:clay_brick", {
1556         description = "Clay brick",
1557         inventory_image = "default_steel_ingot.png",
1558         inventory_image = "default_clay_brick.png",
1559 })
1560
1561 minetest.register_craftitem("default:scorched_stuff", {
1562         description = "Scorched stuff",
1563         inventory_image = "default_scorched_stuff.png",
1564 })
1565
1566 --
1567 -- Aliases for the current map generator outputs
1568 --
1569
1570 minetest.register_alias("mapgen_air", "air")
1571 minetest.register_alias("mapgen_stone", "default:stone")
1572 minetest.register_alias("mapgen_tree", "default:tree")
1573 minetest.register_alias("mapgen_leaves", "default:leaves")
1574 minetest.register_alias("mapgen_apple", "default:apple")
1575 minetest.register_alias("mapgen_water_source", "default:water_source")
1576 minetest.register_alias("mapgen_dirt", "default:dirt")
1577 minetest.register_alias("mapgen_sand", "default:sand")
1578 minetest.register_alias("mapgen_gravel", "default:gravel")
1579 minetest.register_alias("mapgen_clay", "default:clay")
1580 minetest.register_alias("mapgen_lava_source", "default:lava_source")
1581 minetest.register_alias("mapgen_cobble", "default:cobble")
1582 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
1583 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
1584 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
1585 minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal")
1586 minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron")
1587 minetest.register_alias("mapgen_mese", "default:mese")
1588
1589 --
1590 -- Global callbacks
1591 --
1592
1593 -- Global environment step function
1594 function on_step(dtime)
1595         -- print("on_step")
1596 end
1597 minetest.register_globalstep(on_step)
1598
1599 function on_placenode(p, node)
1600         --print("on_placenode")
1601 end
1602 minetest.register_on_placenode(on_placenode)
1603
1604 function on_dignode(p, node)
1605         --print("on_dignode")
1606 end
1607 minetest.register_on_dignode(on_dignode)
1608
1609 function on_punchnode(p, node)
1610 end
1611 minetest.register_on_punchnode(on_punchnode)
1612
1613 --
1614 -- Test some things
1615 --
1616
1617 local function test_get_craft_result()
1618         minetest.log("info", "test_get_craft_result()")
1619         -- normal
1620         local input = {
1621                 method = "normal",
1622                 width = 2,
1623                 items = {"", "default:coal_lump", "", "default:stick"}
1624         }
1625         minetest.log("info", "torch crafting input: "..dump(input))
1626         local output, decremented_input = minetest.get_craft_result(input)
1627         minetest.log("info", "torch crafting output: "..dump(output))
1628         minetest.log("info", "torch crafting decremented input: "..dump(decremented_input))
1629         assert(output.item)
1630         minetest.log("info", "torch crafting output.item:to_table(): "..dump(output.item:to_table()))
1631         assert(output.item:get_name() == "default:torch")
1632         assert(output.item:get_count() == 4)
1633         -- fuel
1634         local input = {
1635                 method = "fuel",
1636                 width = 1,
1637                 items = {"default:coal_lump"}
1638         }
1639         minetest.log("info", "coal fuel input: "..dump(input))
1640         local output, decremented_input = minetest.get_craft_result(input)
1641         minetest.log("info", "coal fuel output: "..dump(output))
1642         minetest.log("info", "coal fuel decremented input: "..dump(decremented_input))
1643         assert(output.time)
1644         assert(output.time > 0)
1645         -- cook
1646         local input = {
1647                 method = "cooking",
1648                 width = 1,
1649                 items = {"default:cobble"}
1650         }
1651         minetest.log("info", "cobble cooking input: "..dump(output))
1652         local output, decremented_input = minetest.get_craft_result(input)
1653         minetest.log("info", "cobble cooking output: "..dump(output))
1654         minetest.log("info", "cobble cooking decremented input: "..dump(decremented_input))
1655         assert(output.time)
1656         assert(output.time > 0)
1657         assert(output.item)
1658         minetest.log("info", "cobble cooking output.item:to_table(): "..dump(output.item:to_table()))
1659         assert(output.item:get_name() == "default:stone")
1660         assert(output.item:get_count() == 1)
1661 end
1662 test_get_craft_result()
1663
1664 --
1665 -- Done, print some random stuff
1666 --
1667
1668 --print("minetest.registered_entities:")
1669 --dump2(minetest.registered_entities)
1670
1671 -- END