a481d37e22426b9d3ee0fad389d50193b870f355
[oweals/minetest_game.git] / mods / default / init.lua
1 -- Minetest 0.4 mod: default
2 -- See README.txt for licensing and other information.
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").."/player.lua")
16 dofile(minetest.get_modpath("default").."/mapgen.lua")
17 dofile(minetest.get_modpath("default").."/leafdecay.lua")
18
19 --
20 -- Tool definition
21 --
22
23 -- The hand
24 minetest.register_item(":", {
25         type = "none",
26         wield_image = "wieldhand.png",
27         wield_scale = {x=1,y=1,z=2.5},
28         tool_capabilities = {
29                 full_punch_interval = 0.9,
30                 max_drop_level = 0,
31                 groupcaps = {
32                         fleshy = {times={[2]=0.75, [3]=0.6}, uses=0, maxlevel=1},
33                         crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1},
34                         snappy = {times={[3]=0.40}, uses=0, maxlevel=1},
35                         oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3}
36                 }
37         }
38 })
39
40 minetest.register_tool("default:pick_wood", {
41         description = "Wooden Pickaxe",
42         inventory_image = "default_tool_woodpick.png",
43         tool_capabilities = {
44                 full_punch_interval = 1.2,
45                 max_drop_level=0,
46                 groupcaps={
47                         cracky = {times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1},
48                         fleshy = {times={[2]=0.95, [3]=0.6}, uses=15, maxlevel=1}
49                 }
50         },
51 })
52 minetest.register_tool("default:pick_stone", {
53         description = "Stone Pickaxe",
54         inventory_image = "default_tool_stonepick.png",
55         tool_capabilities = {
56                 full_punch_interval = 1.3,
57                 max_drop_level=0,
58                 groupcaps={
59                         cracky = {times={[1]=3.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1},
60                         fleshy = {times={[2]=0.7, [3]=0.5}, uses=25, maxlevel=1}
61                 }
62         },
63 })
64 minetest.register_tool("default:pick_steel", {
65         description = "Steel Pickaxe",
66         inventory_image = "default_tool_steelpick.png",
67         tool_capabilities = {
68                 full_punch_interval = 1.0,
69                 max_drop_level=1,
70                 groupcaps={
71                         cracky = {times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=30, maxlevel=2},
72                         fleshy = {times={[2]=0.6, [3]=0.35}, uses=35, maxlevel=1}
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 = 0.65,
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                         fleshy = {times={[2]=0.6, [3]=0.5}, uses=80, maxlevel=1}
87                 }
88         },
89 })
90 minetest.register_tool("default:shovel_wood", {
91         description = "Wooden Shovel",
92         inventory_image = "default_tool_woodshovel.png",
93         wield_image = "default_tool_woodshovel.png^[transformR90",
94         tool_capabilities = {
95                 full_punch_interval = 1.2,
96                 max_drop_level=0,
97                 groupcaps={
98                         crumbly = {times={[1]=3.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1},
99                         fleshy = {times={[2]=1.05, [3]=0.70}, uses=25, maxlevel=1}
100                 }
101         },
102 })
103 minetest.register_tool("default:shovel_stone", {
104         description = "Stone Shovel",
105         inventory_image = "default_tool_stoneshovel.png",
106         wield_image = "default_tool_stoneshovel.png^[transformR90",
107         tool_capabilities = {
108                 full_punch_interval = 1.4,
109                 max_drop_level=0,
110                 groupcaps={
111                         crumbly = {times={[1]=1.50, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1},
112                         fleshy = {times={[2]=0.75, [3]=0.50}, uses=40, maxlevel=1}
113                 }
114         },
115 })
116 minetest.register_tool("default:shovel_steel", {
117         description = "Steel Shovel",
118         inventory_image = "default_tool_steelshovel.png",
119         wield_image = "default_tool_steelshovel.png^[transformR90",
120         tool_capabilities = {
121                 full_punch_interval = 1.1,
122                 max_drop_level=1,
123                 groupcaps={
124                         crumbly = {times={[1]=1.50, [2]=0.70, [3]=0.60}, uses=30, maxlevel=2},
125                         fleshy = {times={[2]=0.45, [3]=0.30}, uses=50, maxlevel=1}
126                 }
127         },
128 })
129 minetest.register_tool("default:axe_wood", {
130         description = "Wooden Axe",
131         inventory_image = "default_tool_woodaxe.png",
132         tool_capabilities = {
133                 full_punch_interval = 1.0,
134                 max_drop_level=0,
135                 groupcaps={
136                         choppy = {times={[2]=1.60, [3]=1.20}, uses=10, maxlevel=1},
137                         fleshy = {times={[2]=0.70, [3]=0.50}, uses=5, maxlevel=1}
138                 }
139         },
140 })
141 minetest.register_tool("default:axe_stone", {
142         description = "Stone Axe",
143         inventory_image = "default_tool_stoneaxe.png",
144         tool_capabilities = {
145                 full_punch_interval = 1.2,
146                 max_drop_level=0,
147                 groupcaps={
148                         choppy={times={[1]=3.00, [2]=1.40, [3]=1.00}, uses=20, maxlevel=1},
149                         fleshy={times={[2]=0.60, [3]=0.40}, uses=15, maxlevel=1}
150                 }
151         },
152 })
153 minetest.register_tool("default:axe_steel", {
154         description = "Steel Axe",
155         inventory_image = "default_tool_steelaxe.png",
156         tool_capabilities = {
157                 full_punch_interval = 0.9,
158                 max_drop_level=1,
159                 groupcaps={
160                         choppy={times={[1]=2.60, [2]=1.00, [3]=0.60}, uses=30, maxlevel=2},
161                         fleshy={times={[2]=0.40, [3]=0.25}, uses=25, maxlevel=1}
162                 }
163         },
164 })
165 minetest.register_tool("default:sword_wood", {
166         description = "Wooden Sword",
167         inventory_image = "default_tool_woodsword.png",
168         tool_capabilities = {
169                 full_punch_interval = 0.9,
170                 max_drop_level=0,
171                 groupcaps={
172                         fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1},
173                         snappy={times={[2]=0.9, [3]=0.45}, uses=10, maxlevel=1},
174                         choppy={times={[3]=0.90}, uses=20, maxlevel=0}
175                 }
176         }
177 })
178 minetest.register_tool("default:sword_stone", {
179         description = "Stone Sword",
180         inventory_image = "default_tool_stonesword.png",
181         tool_capabilities = {
182                 full_punch_interval = 1.1,
183                 max_drop_level=0,
184                 groupcaps={
185                         fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1},
186                         snappy={times={[2]=0.75, [3]=0.35}, uses=20, maxlevel=1},
187                         choppy={times={[3]=0.70}, uses=20, maxlevel=0}
188                 }
189         }
190 })
191 minetest.register_tool("default:sword_steel", {
192         description = "Steel Sword",
193         inventory_image = "default_tool_steelsword.png",
194         tool_capabilities = {
195                 full_punch_interval = 0.8,
196                 max_drop_level=1,
197                 groupcaps={
198                         fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2},
199                         snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1},
200                         choppy={times={[3]=0.65}, uses=40, maxlevel=0}
201                 }
202         }
203 })
204
205 --
206 -- Crafting definition
207 --
208
209 minetest.register_craft({
210         output = 'default:wood 4',
211         recipe = {
212                 {'default:tree'},
213         }
214 })
215
216 minetest.register_craft({
217         output = 'default:junglewood 4',
218         recipe = {
219                 {'default:jungletree'},
220         }
221 })
222
223 minetest.register_craft({
224         output = 'default:stick 4',
225         recipe = {
226                 {'group:wood'},
227         }
228 })
229
230 minetest.register_craft({
231         output = 'default:fence_wood 2',
232         recipe = {
233                 {'default:stick', 'default:stick', 'default:stick'},
234                 {'default:stick', 'default:stick', 'default:stick'},
235         }
236 })
237
238 minetest.register_craft({
239         output = 'default:sign_wall',
240         recipe = {
241                 {'group:wood', 'group:wood', 'group:wood'},
242                 {'group:wood', 'group:wood', 'group:wood'},
243                 {'', 'default:stick', ''},
244         }
245 })
246
247 minetest.register_craft({
248         output = 'default:torch 4',
249         recipe = {
250                 {'default:coal_lump'},
251                 {'default:stick'},
252         }
253 })
254
255 minetest.register_craft({
256         output = 'default:pick_wood',
257         recipe = {
258                 {'group:wood', 'group:wood', 'group:wood'},
259                 {'', 'default:stick', ''},
260                 {'', 'default:stick', ''},
261         }
262 })
263
264 minetest.register_craft({
265         output = 'default:pick_stone',
266         recipe = {
267                 {'group:stone', 'group:stone', 'group:stone'},
268                 {'', 'default:stick', ''},
269                 {'', 'default:stick', ''},
270         }
271 })
272
273 minetest.register_craft({
274         output = 'default:pick_steel',
275         recipe = {
276                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
277                 {'', 'default:stick', ''},
278                 {'', 'default:stick', ''},
279         }
280 })
281
282 minetest.register_craft({
283         output = 'default:pick_mese',
284         recipe = {
285                 {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
286                 {'', 'default:stick', ''},
287                 {'', 'default:stick', ''},
288         }
289 })
290
291 minetest.register_craft({
292         output = 'default:shovel_wood',
293         recipe = {
294                 {'group:wood'},
295                 {'default:stick'},
296                 {'default:stick'},
297         }
298 })
299
300 minetest.register_craft({
301         output = 'default:shovel_stone',
302         recipe = {
303                 {'group:stone'},
304                 {'default:stick'},
305                 {'default:stick'},
306         }
307 })
308
309 minetest.register_craft({
310         output = 'default:shovel_steel',
311         recipe = {
312                 {'default:steel_ingot'},
313                 {'default:stick'},
314                 {'default:stick'},
315         }
316 })
317
318 minetest.register_craft({
319         output = 'default:axe_wood',
320         recipe = {
321                 {'group:wood', 'group:wood'},
322                 {'group:wood', 'default:stick'},
323                 {'', 'default:stick'},
324         }
325 })
326
327 minetest.register_craft({
328         output = 'default:axe_stone',
329         recipe = {
330                 {'group:stone', 'group:stone'},
331                 {'group:stone', 'default:stick'},
332                 {'', 'default:stick'},
333         }
334 })
335
336 minetest.register_craft({
337         output = 'default:axe_steel',
338         recipe = {
339                 {'default:steel_ingot', 'default:steel_ingot'},
340                 {'default:steel_ingot', 'default:stick'},
341                 {'', 'default:stick'},
342         }
343 })
344
345 minetest.register_craft({
346         output = 'default:sword_wood',
347         recipe = {
348                 {'group:wood'},
349                 {'group:wood'},
350                 {'default:stick'},
351         }
352 })
353
354 minetest.register_craft({
355         output = 'default:sword_stone',
356         recipe = {
357                 {'group:stone'},
358                 {'group:stone'},
359                 {'default:stick'},
360         }
361 })
362
363 minetest.register_craft({
364         output = 'default:sword_steel',
365         recipe = {
366                 {'default:steel_ingot'},
367                 {'default:steel_ingot'},
368                 {'default:stick'},
369         }
370 })
371
372 minetest.register_craft({
373         output = 'default:rail 15',
374         recipe = {
375                 {'default:steel_ingot', '', 'default:steel_ingot'},
376                 {'default:steel_ingot', 'default:stick', 'default:steel_ingot'},
377                 {'default:steel_ingot', '', 'default:steel_ingot'},
378         }
379 })
380
381 minetest.register_craft({
382         output = 'default:chest',
383         recipe = {
384                 {'group:wood', 'group:wood', 'group:wood'},
385                 {'group:wood', '', 'group:wood'},
386                 {'group:wood', 'group:wood', 'group:wood'},
387         }
388 })
389
390 minetest.register_craft({
391         output = 'default:chest_locked',
392         recipe = {
393                 {'group:wood', 'group:wood', 'group:wood'},
394                 {'group:wood', 'default:steel_ingot', 'group:wood'},
395                 {'group:wood', 'group:wood', 'group:wood'},
396         }
397 })
398
399 minetest.register_craft({
400         output = 'default:furnace',
401         recipe = {
402                 {'group:stone', 'group:stone', 'group:stone'},
403                 {'group:stone', '', 'group:stone'},
404                 {'group:stone', 'group:stone', 'group:stone'},
405         }
406 })
407
408 minetest.register_craft({
409         output = 'default:steelblock',
410         recipe = {
411                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
412                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
413                 {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
414         }
415 })
416
417 minetest.register_craft({
418         output = 'default:steel_ingot 9',
419         recipe = {
420                 {'default:steelblock'},
421         }
422 })
423
424 minetest.register_craft({
425         output = 'default:sandstone',
426         recipe = {
427                 {'group:sand', 'group:sand'},
428                 {'group:sand', 'group:sand'},
429         }
430 })
431
432 minetest.register_craft({
433         output = 'default:sand 4',
434         recipe = {
435                 {'default:sandstone'},
436         }
437 })
438
439 minetest.register_craft({
440         output = 'default:clay',
441         recipe = {
442                 {'default:clay_lump', 'default:clay_lump'},
443                 {'default:clay_lump', 'default:clay_lump'},
444         }
445 })
446
447 minetest.register_craft({
448         output = 'default:brick',
449         recipe = {
450                 {'default:clay_brick', 'default:clay_brick'},
451                 {'default:clay_brick', 'default:clay_brick'},
452         }
453 })
454
455 minetest.register_craft({
456         output = 'default:clay_brick 4',
457         recipe = {
458                 {'default:brick'},
459         }
460 })
461
462 minetest.register_craft({
463         output = 'default:paper',
464         recipe = {
465                 {'default:papyrus', 'default:papyrus', 'default:papyrus'},
466         }
467 })
468
469 minetest.register_craft({
470         output = 'default:book',
471         recipe = {
472                 {'default:paper'},
473                 {'default:paper'},
474                 {'default:paper'},
475         }
476 })
477
478 minetest.register_craft({
479         output = 'default:bookshelf',
480         recipe = {
481                 {'group:wood', 'group:wood', 'group:wood'},
482                 {'default:book', 'default:book', 'default:book'},
483                 {'group:wood', 'group:wood', 'group:wood'},
484         }
485 })
486
487 minetest.register_craft({
488         output = 'default:ladder',
489         recipe = {
490                 {'default:stick', '', 'default:stick'},
491                 {'default:stick', 'default:stick', 'default:stick'},
492                 {'default:stick', '', 'default:stick'},
493         }
494 })
495
496 minetest.register_craft({
497         output = 'default:mese',
498         recipe = {
499                 {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
500                 {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
501                 {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
502         }
503 })
504
505 minetest.register_craft({
506         output = 'default:mese_crystal 9',
507         recipe = {
508                 {'default:mese'},
509         }
510 })
511
512 minetest.register_craft({
513         output = 'default:mese_crystal_fragment 9',
514         recipe = {
515                 {'default:mese_crystal'},
516         }
517 })
518
519 minetest.register_craft({
520         output = 'default:obsidian_shard 9',
521         recipe = {
522                 {'default:obsidian'}
523         }
524 })
525
526 minetest.register_craft({
527         output = 'default:obsidian',
528         recipe = {
529                 {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'},
530                 {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'},
531                 {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'},
532         }
533 })
534 --
535 -- Crafting (tool repair)
536 --
537 minetest.register_craft({
538         type = "toolrepair",
539         additional_wear = -0.02,
540 })
541
542 --
543 -- Cooking recipes
544 --
545
546 minetest.register_craft({
547         type = "cooking",
548         output = "default:glass",
549         recipe = "group:sand",
550 })
551
552 minetest.register_craft({
553         type = "cooking",
554         output = "default:obsidian_glass",
555         recipe = "default:obsidian_shard",
556 })
557
558 minetest.register_craft({
559         type = "cooking",
560         output = "default:stone",
561         recipe = "default:cobble",
562 })
563
564 minetest.register_craft({
565         type = "cooking",
566         output = "default:steel_ingot",
567         recipe = "default:iron_lump",
568 })
569
570 minetest.register_craft({
571         type = "cooking",
572         output = "default:clay_brick",
573         recipe = "default:clay_lump",
574 })
575
576 --
577 -- Fuels
578 --
579
580 minetest.register_craft({
581         type = "fuel",
582         recipe = "group:tree",
583         burntime = 30,
584 })
585
586 minetest.register_craft({
587         type = "fuel",
588         recipe = "default:junglegrass",
589         burntime = 2,
590 })
591
592 minetest.register_craft({
593         type = "fuel",
594         recipe = "group:leaves",
595         burntime = 1,
596 })
597
598 minetest.register_craft({
599         type = "fuel",
600         recipe = "default:cactus",
601         burntime = 15,
602 })
603
604 minetest.register_craft({
605         type = "fuel",
606         recipe = "default:papyrus",
607         burntime = 1,
608 })
609
610 minetest.register_craft({
611         type = "fuel",
612         recipe = "default:bookshelf",
613         burntime = 30,
614 })
615
616 minetest.register_craft({
617         type = "fuel",
618         recipe = "default:fence_wood",
619         burntime = 15,
620 })
621
622 minetest.register_craft({
623         type = "fuel",
624         recipe = "default:ladder",
625         burntime = 5,
626 })
627
628 minetest.register_craft({
629         type = "fuel",
630         recipe = "group:wood",
631         burntime = 7,
632 })
633
634 minetest.register_craft({
635         type = "fuel",
636         recipe = "default:lava_source",
637         burntime = 60,
638 })
639
640 minetest.register_craft({
641         type = "fuel",
642         recipe = "default:torch",
643         burntime = 4,
644 })
645
646 minetest.register_craft({
647         type = "fuel",
648         recipe = "default:sign_wall",
649         burntime = 10,
650 })
651
652 minetest.register_craft({
653         type = "fuel",
654         recipe = "default:chest",
655         burntime = 30,
656 })
657
658 minetest.register_craft({
659         type = "fuel",
660         recipe = "default:chest_locked",
661         burntime = 30,
662 })
663
664 minetest.register_craft({
665         type = "fuel",
666         recipe = "default:nyancat",
667         burntime = 1,
668 })
669
670 minetest.register_craft({
671         type = "fuel",
672         recipe = "default:nyancat_rainbow",
673         burntime = 1,
674 })
675
676 minetest.register_craft({
677         type = "fuel",
678         recipe = "default:sapling",
679         burntime = 10,
680 })
681
682 minetest.register_craft({
683         type = "fuel",
684         recipe = "default:apple",
685         burntime = 3,
686 })
687
688 minetest.register_craft({
689         type = "fuel",
690         recipe = "default:coal_lump",
691         burntime = 40,
692 })
693
694 minetest.register_craft({
695         type = "fuel",
696         recipe = "default:junglesapling",
697         burntime = 10,
698 })
699
700 minetest.register_craft({
701         type = "fuel",
702         recipe = "default:grass_1",
703         burntime = 2,
704 })
705
706 --
707 -- Node definitions
708 --
709
710 -- Default node sounds
711
712 function default.node_sound_defaults(table)
713         table = table or {}
714         table.footstep = table.footstep or
715                         {name="", gain=1.0}
716         table.dug = table.dug or
717                         {name="default_dug_node", gain=1.0}
718         return table
719 end
720
721 function default.node_sound_stone_defaults(table)
722         table = table or {}
723         table.footstep = table.footstep or
724                         {name="default_hard_footstep", gain=0.2}
725         default.node_sound_defaults(table)
726         return table
727 end
728
729 function default.node_sound_dirt_defaults(table)
730         table = table or {}
731         table.footstep = table.footstep or
732                         {name="", gain=0.5}
733         --table.dug = table.dug or
734         --              {name="default_dirt_break", gain=0.5}
735         default.node_sound_defaults(table)
736         return table
737 end
738
739 function default.node_sound_sand_defaults(table)
740         table = table or {}
741         table.footstep = table.footstep or
742                         {name="default_grass_footstep", gain=0.25}
743         --table.dug = table.dug or
744         --              {name="default_dirt_break", gain=0.25}
745         table.dug = table.dug or
746                         {name="", gain=0.25}
747         default.node_sound_defaults(table)
748         return table
749 end
750
751 function default.node_sound_wood_defaults(table)
752         table = table or {}
753         table.footstep = table.footstep or
754                         {name="default_hard_footstep", gain=0.3}
755         default.node_sound_defaults(table)
756         return table
757 end
758
759 function default.node_sound_leaves_defaults(table)
760         table = table or {}
761         table.footstep = table.footstep or
762                         {name="default_grass_footstep", gain=0.25}
763         table.dig = table.dig or
764                         {name="default_dig_crumbly", gain=0.4}
765         table.dug = table.dug or
766                         {name="", gain=1.0}
767         default.node_sound_defaults(table)
768         return table
769 end
770
771 function default.node_sound_glass_defaults(table)
772         table = table or {}
773         table.footstep = table.footstep or
774                         {name="default_hard_footstep", gain=0.25}
775         table.dug = table.dug or
776                         {name="default_break_glass", gain=1.0}
777         default.node_sound_defaults(table)
778         return table
779 end
780
781 --
782
783 minetest.register_node("default:stone", {
784         description = "Stone",
785         tiles = {"default_stone.png"},
786         is_ground_content = true,
787         groups = {cracky=3, stone=1},
788         drop = 'default:cobble',
789         legacy_mineral = true,
790         sounds = default.node_sound_stone_defaults(),
791 })
792
793 minetest.register_node("default:desert_stone", {
794         description = "Desert Stone",
795         tiles = {"default_desert_stone.png"},
796         is_ground_content = true,
797         groups = {cracky=3, stone=1},
798         drop = 'default:desert_stone',
799         legacy_mineral = true,
800         sounds = default.node_sound_stone_defaults(),
801 })
802
803 minetest.register_node("default:stone_with_coal", {
804         description = "Coal Ore",
805         tiles = {"default_stone.png^default_mineral_coal.png"},
806         is_ground_content = true,
807         groups = {cracky=3},
808         drop = 'default:coal_lump',
809         sounds = default.node_sound_stone_defaults(),
810 })
811
812 minetest.register_node("default:stone_with_iron", {
813         description = "Iron Ore",
814         tiles = {"default_stone.png^default_mineral_iron.png"},
815         is_ground_content = true,
816         groups = {cracky=3},
817         drop = 'default:iron_lump',
818         sounds = default.node_sound_stone_defaults(),
819 })
820
821 minetest.register_node("default:stone_with_mese", {
822         description = "Mese Crystals in Stone",
823         tiles = {"default_stone.png^default_mineral_mese.png"},
824         is_ground_content = true,
825         groups = {cracky=1},
826         drop = "default:mese_crystal",
827         sounds = default.node_sound_stone_defaults(),
828 })
829
830 minetest.register_node("default:dirt_with_grass", {
831         description = "Dirt with Grass",
832         tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
833         is_ground_content = true,
834         groups = {crumbly=3},
835         drop = 'default:dirt',
836         sounds = default.node_sound_dirt_defaults({
837                 footstep = {name="default_grass_footstep", gain=0.4},
838         }),
839 })
840
841 minetest.register_node("default:dirt_with_grass_footsteps", {
842         description = "Dirt with Grass and Footsteps",
843         tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
844         is_ground_content = true,
845         groups = {crumbly=3, not_in_creative_inventory=1},
846         drop = 'default:dirt',
847         sounds = default.node_sound_dirt_defaults({
848                 footstep = {name="default_grass_footstep", gain=0.4},
849         }),
850 })
851
852 minetest.register_node("default:dirt", {
853         description = "Dirt",
854         tiles = {"default_dirt.png"},
855         is_ground_content = true,
856         groups = {crumbly=3},
857         sounds = default.node_sound_dirt_defaults(),
858 })
859
860 minetest.register_node("default:sand", {
861         description = "Sand",
862         tiles = {"default_sand.png"},
863         is_ground_content = true,
864         groups = {crumbly=3, falling_node=1, sand=1},
865         sounds = default.node_sound_sand_defaults(),
866 })
867
868 minetest.register_node("default:desert_sand", {
869         description = "Desert Sand",
870         tiles = {"default_desert_sand.png"},
871         is_ground_content = true,
872         groups = {crumbly=3, falling_node=1, sand=1},
873         sounds = default.node_sound_sand_defaults(),
874 })
875
876 minetest.register_node("default:gravel", {
877         description = "Gravel",
878         tiles = {"default_gravel.png"},
879         is_ground_content = true,
880         groups = {crumbly=2, falling_node=1},
881         sounds = default.node_sound_dirt_defaults({
882                 footstep = {name="default_gravel_footstep", gain=0.45},
883         }),
884 })
885
886 minetest.register_node("default:sandstone", {
887         description = "Sandstone",
888         tiles = {"default_sandstone.png"},
889         is_ground_content = true,
890         groups = {crumbly=2,cracky=2},
891         sounds = default.node_sound_stone_defaults(),
892 })
893
894 minetest.register_node("default:clay", {
895         description = "Clay",
896         tiles = {"default_clay.png"},
897         is_ground_content = true,
898         groups = {crumbly=3},
899         drop = 'default:clay_lump 4',
900         sounds = default.node_sound_dirt_defaults({
901                 footstep = "",
902         }),
903 })
904
905 minetest.register_node("default:brick", {
906         description = "Brick Block",
907         tiles = {"default_brick.png"},
908         is_ground_content = true,
909         groups = {cracky=3},
910         sounds = default.node_sound_stone_defaults(),
911 })
912
913 minetest.register_node("default:tree", {
914         description = "Tree",
915         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
916         is_ground_content = true,
917         groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
918         sounds = default.node_sound_wood_defaults(),
919 })
920
921 minetest.register_node("default:jungletree", {
922         description = "Jungle Tree",
923         tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
924         is_ground_content = true,
925         groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
926         sounds = default.node_sound_wood_defaults(),
927 })
928
929 minetest.register_node("default:junglewood", {
930         description = "Junglewood Planks",
931         tiles = {"default_junglewood.png"},
932         is_ground_content = true,
933         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
934         sounds = default.node_sound_wood_defaults(),
935 })
936
937 minetest.register_node("default:jungleleaves", {
938         description = "Jungle Leaves",
939         drawtype = "allfaces_optional",
940         visual_scale = 1.3,
941         tiles = {"default_jungleleaves.png"},
942         paramtype = "light",
943         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
944         drop = {
945                 max_items = 1,
946                 items = {
947                         {
948                                 -- player will get sapling with 1/20 chance
949                                 items = {'default:junglesapling'},
950                                 rarity = 20,
951                         },
952                         {
953                                 -- player will get leaves only if he get no saplings,
954                                 -- this is because max_items is 1
955                                 items = {'default:jungleleaves'},
956                         }
957                 }
958         },
959         sounds = default.node_sound_leaves_defaults(),
960 })
961
962 minetest.register_node("default:junglesapling", {
963         description = "Jungle Sapling",
964         drawtype = "plantlike",
965         visual_scale = 1.0,
966         tiles = {"default_junglesapling.png"},
967         inventory_image = "default_junglesapling.png",
968         wield_image = "default_junglesapling.png",
969         paramtype = "light",
970         walkable = false,
971         selection_box = {
972                 type = "fixed",
973                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
974         },
975         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
976         sounds = default.node_sound_defaults(),
977 })
978 -- alias for tree growing abm in content_abm.cpp
979 minetest.register_alias("junglesapling", "default:junglesapling")
980
981 minetest.register_node("default:junglegrass", {
982         description = "Jungle Grass",
983         drawtype = "plantlike",
984         visual_scale = 1.3,
985         tiles = {"default_junglegrass.png"},
986         inventory_image = "default_junglegrass.png",
987         wield_image = "default_junglegrass.png",
988         paramtype = "light",
989         walkable = false,
990         groups = {snappy=3,flammable=2,attached_node=1},
991         sounds = default.node_sound_leaves_defaults(),
992         selection_box = {
993                 type = "fixed",
994                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
995         },
996 })
997
998 minetest.register_node("default:leaves", {
999         description = "Leaves",
1000         drawtype = "allfaces_optional",
1001         visual_scale = 1.3,
1002         tiles = {"default_leaves.png"},
1003         paramtype = "light",
1004         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
1005         drop = {
1006                 max_items = 1,
1007                 items = {
1008                         {
1009                                 -- player will get sapling with 1/20 chance
1010                                 items = {'default:sapling'},
1011                                 rarity = 20,
1012                         },
1013                         {
1014                                 -- player will get leaves only if he get no saplings,
1015                                 -- this is because max_items is 1
1016                                 items = {'default:leaves'},
1017                         }
1018                 }
1019         },
1020         sounds = default.node_sound_leaves_defaults(),
1021 })
1022
1023 minetest.register_node("default:cactus", {
1024         description = "Cactus",
1025         tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
1026         is_ground_content = true,
1027         groups = {snappy=2,choppy=3,flammable=2},
1028         sounds = default.node_sound_wood_defaults(),
1029 })
1030
1031 minetest.register_node("default:papyrus", {
1032         description = "Papyrus",
1033         drawtype = "plantlike",
1034         tiles = {"default_papyrus.png"},
1035         inventory_image = "default_papyrus.png",
1036         wield_image = "default_papyrus.png",
1037         paramtype = "light",
1038         is_ground_content = true,
1039         walkable = false,
1040         selection_box = {
1041                 type = "fixed",
1042                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
1043         },
1044         groups = {snappy=3,flammable=2},
1045         sounds = default.node_sound_leaves_defaults(),
1046 })
1047
1048 minetest.register_node("default:bookshelf", {
1049         description = "Bookshelf",
1050         tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1051         is_ground_content = true,
1052         groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2,flammable=3},
1053         sounds = default.node_sound_wood_defaults(),
1054 })
1055
1056 minetest.register_node("default:glass", {
1057         description = "Glass",
1058         drawtype = "glasslike",
1059         tiles = {"default_glass.png"},
1060         inventory_image = minetest.inventorycube("default_glass.png"),
1061         paramtype = "light",
1062         sunlight_propagates = true,
1063         is_ground_content = true,
1064         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
1065         sounds = default.node_sound_glass_defaults(),
1066 })
1067
1068 minetest.register_node("default:fence_wood", {
1069         description = "Wooden Fence",
1070         drawtype = "fencelike",
1071         tiles = {"default_wood.png"},
1072         inventory_image = "default_fence.png",
1073         wield_image = "default_fence.png",
1074         paramtype = "light",
1075         is_ground_content = true,
1076         selection_box = {
1077                 type = "fixed",
1078                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
1079         },
1080         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2},
1081         sounds = default.node_sound_wood_defaults(),
1082 })
1083
1084 minetest.register_node("default:rail", {
1085         description = "Rail",
1086         drawtype = "raillike",
1087         tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
1088         inventory_image = "default_rail.png",
1089         wield_image = "default_rail.png",
1090         paramtype = "light",
1091         is_ground_content = true,
1092         walkable = false,
1093         selection_box = {
1094                 type = "fixed",
1095                 -- but how to specify the dimensions for curved and sideways rails?
1096                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1097         },
1098         groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1},
1099 })
1100
1101 minetest.register_node("default:ladder", {
1102         description = "Ladder",
1103         drawtype = "signlike",
1104         tiles = {"default_ladder.png"},
1105         inventory_image = "default_ladder.png",
1106         wield_image = "default_ladder.png",
1107         paramtype = "light",
1108         paramtype2 = "wallmounted",
1109         is_ground_content = true,
1110         walkable = false,
1111         climbable = true,
1112         selection_box = {
1113                 type = "wallmounted",
1114                 --wall_top = = <default>
1115                 --wall_bottom = = <default>
1116                 --wall_side = = <default>
1117         },
1118         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=3,flammable=2},
1119         legacy_wallmounted = true,
1120         sounds = default.node_sound_wood_defaults(),
1121 })
1122
1123 minetest.register_node("default:wood", {
1124         description = "Wooden Planks",
1125         tiles = {"default_wood.png"},
1126         is_ground_content = true,
1127         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
1128         sounds = default.node_sound_wood_defaults(),
1129 })
1130
1131 minetest.register_node("default:cloud", {
1132         description = "Cloud",
1133         tiles = {"default_cloud.png"},
1134         is_ground_content = true,
1135         sounds = default.node_sound_defaults(),
1136         groups = {not_in_creative_inventory=1},
1137 })
1138
1139 minetest.register_node("default:water_flowing", {
1140         description = "Flowing Water",
1141         inventory_image = minetest.inventorycube("default_water.png"),
1142         drawtype = "flowingliquid",
1143         tiles = {"default_water.png"},
1144         special_tiles = {
1145                 {
1146                         image="default_water_flowing_animated.png",
1147                         backface_culling=false,
1148                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
1149                 },
1150                 {
1151                         image="default_water_flowing_animated.png",
1152                         backface_culling=true,
1153                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
1154                 },
1155         },
1156         alpha = WATER_ALPHA,
1157         paramtype = "light",
1158         walkable = false,
1159         pointable = false,
1160         diggable = false,
1161         buildable_to = true,
1162         drop = "",
1163         liquidtype = "flowing",
1164         liquid_alternative_flowing = "default:water_flowing",
1165         liquid_alternative_source = "default:water_source",
1166         liquid_viscosity = WATER_VISC,
1167         post_effect_color = {a=64, r=100, g=100, b=200},
1168         groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1169 })
1170
1171 minetest.register_node("default:water_source", {
1172         description = "Water Source",
1173         inventory_image = minetest.inventorycube("default_water.png"),
1174         drawtype = "liquid",
1175         tiles = {
1176                 {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}
1177         },
1178         special_tiles = {
1179                 -- New-style water source material (mostly unused)
1180                 {
1181                         name="default_water_source_animated.png",
1182                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0},
1183                         backface_culling = false,
1184                 }
1185         },
1186         alpha = WATER_ALPHA,
1187         paramtype = "light",
1188         walkable = false,
1189         pointable = false,
1190         diggable = false,
1191         buildable_to = true,
1192         drop = "",
1193         liquidtype = "source",
1194         liquid_alternative_flowing = "default:water_flowing",
1195         liquid_alternative_source = "default:water_source",
1196         liquid_viscosity = WATER_VISC,
1197         post_effect_color = {a=64, r=100, g=100, b=200},
1198         groups = {water=3, liquid=3, puts_out_fire=1},
1199 })
1200
1201 minetest.register_node("default:lava_flowing", {
1202         description = "Flowing Lava",
1203         inventory_image = minetest.inventorycube("default_lava.png"),
1204         drawtype = "flowingliquid",
1205         tiles = {"default_lava.png"},
1206         special_tiles = {
1207                 {
1208                         image="default_lava_flowing_animated.png",
1209                         backface_culling=false,
1210                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1211                 },
1212                 {
1213                         image="default_lava_flowing_animated.png",
1214                         backface_culling=true,
1215                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1216                 },
1217         },
1218         paramtype = "light",
1219         light_source = LIGHT_MAX - 1,
1220         walkable = false,
1221         pointable = false,
1222         diggable = false,
1223         buildable_to = true,
1224         drop = "",
1225         liquidtype = "flowing",
1226         liquid_alternative_flowing = "default:lava_flowing",
1227         liquid_alternative_source = "default:lava_source",
1228         liquid_viscosity = LAVA_VISC,
1229         liquid_renewable = false,
1230         damage_per_second = 4*2,
1231         post_effect_color = {a=192, r=255, g=64, b=0},
1232         groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
1233 })
1234
1235 minetest.register_node("default:lava_source", {
1236         description = "Lava Source",
1237         inventory_image = minetest.inventorycube("default_lava.png"),
1238         drawtype = "liquid",
1239         tiles = {
1240                 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1241         },
1242         special_tiles = {
1243                 -- New-style lava source material (mostly unused)
1244                 {
1245                         name="default_lava_source_animated.png",
1246                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0},
1247                         backface_culling = false,
1248                 }
1249         },
1250         paramtype = "light",
1251         light_source = LIGHT_MAX - 1,
1252         walkable = false,
1253         pointable = false,
1254         diggable = false,
1255         buildable_to = true,
1256         drop = "",
1257         liquidtype = "source",
1258         liquid_alternative_flowing = "default:lava_flowing",
1259         liquid_alternative_source = "default:lava_source",
1260         liquid_viscosity = LAVA_VISC,
1261         liquid_renewable = false,
1262         damage_per_second = 4*2,
1263         post_effect_color = {a=192, r=255, g=64, b=0},
1264         groups = {lava=3, liquid=2, hot=3, igniter=1},
1265 })
1266
1267 minetest.register_node("default:torch", {
1268         description = "Torch",
1269         drawtype = "torchlike",
1270         --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1271         tiles = {
1272                 {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
1273                 {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
1274                 {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1275         },
1276         inventory_image = "default_torch_on_floor.png",
1277         wield_image = "default_torch_on_floor.png",
1278         paramtype = "light",
1279         paramtype2 = "wallmounted",
1280         sunlight_propagates = true,
1281         walkable = false,
1282         light_source = LIGHT_MAX-1,
1283         selection_box = {
1284                 type = "wallmounted",
1285                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1286                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1287                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1288         },
1289         groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
1290         legacy_wallmounted = true,
1291         sounds = default.node_sound_defaults(),
1292 })
1293
1294 minetest.register_node("default:sign_wall", {
1295         description = "Sign",
1296         drawtype = "signlike",
1297         tiles = {"default_sign_wall.png"},
1298         inventory_image = "default_sign_wall.png",
1299         wield_image = "default_sign_wall.png",
1300         paramtype = "light",
1301         paramtype2 = "wallmounted",
1302         sunlight_propagates = true,
1303         walkable = false,
1304         selection_box = {
1305                 type = "wallmounted",
1306                 --wall_top = <default>
1307                 --wall_bottom = <default>
1308                 --wall_side = <default>
1309         },
1310         groups = {choppy=2,dig_immediate=2,attached_node=1},
1311         legacy_wallmounted = true,
1312         sounds = default.node_sound_defaults(),
1313         on_construct = function(pos)
1314                 --local n = minetest.env:get_node(pos)
1315                 local meta = minetest.env:get_meta(pos)
1316                 meta:set_string("formspec", "field[text;;${text}]")
1317                 meta:set_string("infotext", "\"\"")
1318         end,
1319         on_receive_fields = function(pos, formname, fields, sender)
1320                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1321                 local meta = minetest.env:get_meta(pos)
1322                 fields.text = fields.text or ""
1323                 print((sender:get_player_name() or "").." wrote \""..fields.text..
1324                                 "\" to sign at "..minetest.pos_to_string(pos))
1325                 meta:set_string("text", fields.text)
1326                 meta:set_string("infotext", '"'..fields.text..'"')
1327         end,
1328 })
1329
1330 minetest.register_node("default:chest", {
1331         description = "Chest",
1332         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1333                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1334         paramtype2 = "facedir",
1335         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1336         legacy_facedir_simple = true,
1337         sounds = default.node_sound_wood_defaults(),
1338         on_construct = function(pos)
1339                 local meta = minetest.env:get_meta(pos)
1340                 meta:set_string("formspec",
1341                                 "size[8,9]"..
1342                                 "list[current_name;main;0,0;8,4;]"..
1343                                 "list[current_player;main;0,5;8,4;]")
1344                 meta:set_string("infotext", "Chest")
1345                 local inv = meta:get_inventory()
1346                 inv:set_size("main", 8*4)
1347         end,
1348         can_dig = function(pos,player)
1349                 local meta = minetest.env:get_meta(pos);
1350                 local inv = meta:get_inventory()
1351                 return inv:is_empty("main")
1352         end,
1353         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1354                 minetest.log("action", player:get_player_name()..
1355                                 " moves stuff in chest at "..minetest.pos_to_string(pos))
1356         end,
1357     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1358                 minetest.log("action", player:get_player_name()..
1359                                 " moves stuff to chest at "..minetest.pos_to_string(pos))
1360         end,
1361     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1362                 minetest.log("action", player:get_player_name()..
1363                                 " takes stuff from chest at "..minetest.pos_to_string(pos))
1364         end,
1365 })
1366
1367 local function has_locked_chest_privilege(meta, player)
1368         if player:get_player_name() ~= meta:get_string("owner") then
1369                 return false
1370         end
1371         return true
1372 end
1373
1374 minetest.register_node("default:chest_locked", {
1375         description = "Locked Chest",
1376         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1377                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1378         paramtype2 = "facedir",
1379         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1380         legacy_facedir_simple = true,
1381         sounds = default.node_sound_wood_defaults(),
1382         after_place_node = function(pos, placer)
1383                 local meta = minetest.env:get_meta(pos)
1384                 meta:set_string("owner", placer:get_player_name() or "")
1385                 meta:set_string("infotext", "Locked Chest (owned by "..
1386                                 meta:get_string("owner")..")")
1387         end,
1388         on_construct = function(pos)
1389                 local meta = minetest.env:get_meta(pos)
1390                 meta:set_string("infotext", "Locked Chest")
1391                 meta:set_string("owner", "")
1392                 local inv = meta:get_inventory()
1393                 inv:set_size("main", 8*4)
1394         end,
1395         can_dig = function(pos,player)
1396                 local meta = minetest.env:get_meta(pos);
1397                 local inv = meta:get_inventory()
1398                 return inv:is_empty("main")
1399         end,
1400         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1401                 local meta = minetest.env:get_meta(pos)
1402                 if not has_locked_chest_privilege(meta, player) then
1403                         minetest.log("action", player:get_player_name()..
1404                                         " tried to access a locked chest belonging to "..
1405                                         meta:get_string("owner").." at "..
1406                                         minetest.pos_to_string(pos))
1407                         return 0
1408                 end
1409                 return count
1410         end,
1411     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1412                 local meta = minetest.env:get_meta(pos)
1413                 if not has_locked_chest_privilege(meta, player) then
1414                         minetest.log("action", player:get_player_name()..
1415                                         " tried to access a locked chest belonging to "..
1416                                         meta:get_string("owner").." at "..
1417                                         minetest.pos_to_string(pos))
1418                         return 0
1419                 end
1420                 return stack:get_count()
1421         end,
1422     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1423                 local meta = minetest.env:get_meta(pos)
1424                 if not has_locked_chest_privilege(meta, player) then
1425                         minetest.log("action", player:get_player_name()..
1426                                         " tried to access a locked chest belonging to "..
1427                                         meta:get_string("owner").." at "..
1428                                         minetest.pos_to_string(pos))
1429                         return 0
1430                 end
1431                 return stack:get_count()
1432         end,
1433         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1434                 minetest.log("action", player:get_player_name()..
1435                                 " moves stuff in locked chest at "..minetest.pos_to_string(pos))
1436         end,
1437     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1438                 minetest.log("action", player:get_player_name()..
1439                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1440         end,
1441     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1442                 minetest.log("action", player:get_player_name()..
1443                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1444         end,
1445         on_rightclick = function(pos, node, clicker)
1446                 local meta = minetest.env:get_meta(pos)
1447                 if has_locked_chest_privilege(meta, clicker) then
1448                         local pos = pos.x .. "," .. pos.y .. "," ..pos.z
1449                         minetest.show_formspec(clicker:get_player_name(), "default:chest_locked",
1450                                 "size[8,9]"..
1451                                 "list[nodemeta:".. pos .. ";main;0,0;8,4;]"..
1452                                 "list[current_player;main;0,5;8,4;]")
1453                 end
1454         end,
1455 })
1456
1457 default.furnace_inactive_formspec =
1458         "size[8,9]"..
1459         "image[2,2;1,1;default_furnace_fire_bg.png]"..
1460         "list[current_name;fuel;2,3;1,1;]"..
1461         "list[current_name;src;2,1;1,1;]"..
1462         "list[current_name;dst;5,1;2,2;]"..
1463         "list[current_player;main;0,5;8,4;]"
1464
1465 minetest.register_node("default:furnace", {
1466         description = "Furnace",
1467         tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
1468                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1469         paramtype2 = "facedir",
1470         groups = {cracky=2},
1471         legacy_facedir_simple = true,
1472         sounds = default.node_sound_stone_defaults(),
1473         on_construct = function(pos)
1474                 local meta = minetest.env:get_meta(pos)
1475                 meta:set_string("formspec", default.furnace_inactive_formspec)
1476                 meta:set_string("infotext", "Furnace")
1477                 local inv = meta:get_inventory()
1478                 inv:set_size("fuel", 1)
1479                 inv:set_size("src", 1)
1480                 inv:set_size("dst", 4)
1481         end,
1482         can_dig = function(pos,player)
1483                 local meta = minetest.env:get_meta(pos);
1484                 local inv = meta:get_inventory()
1485                 if not inv:is_empty("fuel") then
1486                         return false
1487                 elseif not inv:is_empty("dst") then
1488                         return false
1489                 elseif not inv:is_empty("src") then
1490                         return false
1491                 end
1492                 return true
1493         end,
1494         allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1495                 if listname == "fuel" then
1496                         if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then
1497                                 return stack:get_count()
1498                         else
1499                                 return 0
1500                         end
1501                 elseif listname == "src" then
1502                         return stack:get_count()
1503                 elseif listname == "dst" then
1504                         return 0
1505                 end
1506         end,
1507         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1508                 local stack = ItemStack(minetest.env:get_meta(pos):get_inventory():get_stack(from_list, from_index))
1509                 if to_list == "fuel" then
1510                         if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then
1511                                 return count
1512                         else
1513                                 return 0
1514                         end
1515                 elseif to_list == "src" then
1516                         return count
1517                 elseif to_list == "dst" then
1518                         return 0
1519                 end
1520         end,
1521 })
1522
1523 minetest.register_node("default:furnace_active", {
1524         description = "Furnace",
1525         tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
1526                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
1527         paramtype2 = "facedir",
1528         light_source = 8,
1529         drop = "default:furnace",
1530         groups = {cracky=2, not_in_creative_inventory=1},
1531         legacy_facedir_simple = true,
1532         sounds = default.node_sound_stone_defaults(),
1533         on_construct = function(pos)
1534                 local meta = minetest.env:get_meta(pos)
1535                 meta:set_string("formspec", default.furnace_inactive_formspec)
1536                 meta:set_string("infotext", "Furnace");
1537                 local inv = meta:get_inventory()
1538                 inv:set_size("fuel", 1)
1539                 inv:set_size("src", 1)
1540                 inv:set_size("dst", 4)
1541         end,
1542         can_dig = function(pos,player)
1543                 local meta = minetest.env:get_meta(pos);
1544                 local inv = meta:get_inventory()
1545                 if not inv:is_empty("fuel") then
1546                         return false
1547                 elseif not inv:is_empty("dst") then
1548                         return false
1549                 elseif not inv:is_empty("src") then
1550                         return false
1551                 end
1552                 return true
1553         end,
1554         allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1555                 if listname == "fuel" then
1556                         if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then
1557                                 return stack:get_count()
1558                         else
1559                                 return 0
1560                         end
1561                 elseif listname == "src" then
1562                         return stack:get_count()
1563                 elseif listname == "dst" then
1564                         return 0
1565                 end
1566         end,
1567         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1568                 local stack = ItemStack(minetest.env:get_meta(pos):get_inventory():get_stack(from_list, from_index))
1569                 if to_list == "fuel" then
1570                         if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then
1571                                 return count
1572                         else
1573                                 return 0
1574                         end
1575                 elseif to_list == "src" then
1576                         return count
1577                 elseif to_list == "dst" then
1578                         return 0
1579                 end
1580         end,
1581 })
1582
1583 function hacky_swap_node(pos,name)
1584         local node = minetest.env:get_node(pos)
1585         local meta = minetest.env:get_meta(pos)
1586         local meta0 = meta:to_table()
1587         if node.name == name then
1588                 return
1589         end
1590         node.name = name
1591         local meta0 = meta:to_table()
1592         minetest.env:set_node(pos,node)
1593         meta = minetest.env:get_meta(pos)
1594         meta:from_table(meta0)
1595 end
1596
1597 minetest.register_abm({
1598         nodenames = {"default:furnace","default:furnace_active"},
1599         interval = 1.0,
1600         chance = 1,
1601         action = function(pos, node, active_object_count, active_object_count_wider)
1602                 local meta = minetest.env:get_meta(pos)
1603                 for i, name in ipairs({
1604                                 "fuel_totaltime",
1605                                 "fuel_time",
1606                                 "src_totaltime",
1607                                 "src_time"
1608                 }) do
1609                         if meta:get_string(name) == "" then
1610                                 meta:set_float(name, 0.0)
1611                         end
1612                 end
1613
1614                 local inv = meta:get_inventory()
1615
1616                 local srclist = inv:get_list("src")
1617                 local cooked = nil
1618                 
1619                 if srclist then
1620                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1621                 end
1622                 
1623                 local was_active = false
1624                 
1625                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1626                         was_active = true
1627                         meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
1628                         meta:set_float("src_time", meta:get_float("src_time") + 1)
1629                         if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
1630                                 -- check if there's room for output in "dst" list
1631                                 if inv:room_for_item("dst",cooked.item) then
1632                                         -- Put result in "dst" list
1633                                         inv:add_item("dst", cooked.item)
1634                                         -- take stuff from "src" list
1635                                         srcstack = inv:get_stack("src", 1)
1636                                         srcstack:take_item()
1637                                         inv:set_stack("src", 1, srcstack)
1638                                 else
1639                                         print("Could not insert '"..cooked.item:to_string().."'")
1640                                 end
1641                                 meta:set_string("src_time", 0)
1642                         end
1643                 end
1644                 
1645                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1646                         local percent = math.floor(meta:get_float("fuel_time") /
1647                                         meta:get_float("fuel_totaltime") * 100)
1648                         meta:set_string("infotext","Furnace active: "..percent.."%")
1649                         hacky_swap_node(pos,"default:furnace_active")
1650                         meta:set_string("formspec",
1651                                 "size[8,9]"..
1652                                 "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
1653                                                 (100-percent)..":default_furnace_fire_fg.png]"..
1654                                 "list[current_name;fuel;2,3;1,1;]"..
1655                                 "list[current_name;src;2,1;1,1;]"..
1656                                 "list[current_name;dst;5,1;2,2;]"..
1657                                 "list[current_player;main;0,5;8,4;]")
1658                         return
1659                 end
1660
1661                 local fuel = nil
1662                 local cooked = nil
1663                 local fuellist = inv:get_list("fuel")
1664                 local srclist = inv:get_list("src")
1665                 
1666                 if srclist then
1667                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1668                 end
1669                 if fuellist then
1670                         fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
1671                 end
1672
1673                 if fuel.time <= 0 then
1674                         meta:set_string("infotext","Furnace out of fuel")
1675                         hacky_swap_node(pos,"default:furnace")
1676                         meta:set_string("formspec", default.furnace_inactive_formspec)
1677                         return
1678                 end
1679
1680                 if cooked.item:is_empty() then
1681                         if was_active then
1682                                 meta:set_string("infotext","Furnace is empty")
1683                                 hacky_swap_node(pos,"default:furnace")
1684                                 meta:set_string("formspec", default.furnace_inactive_formspec)
1685                         end
1686                         return
1687                 end
1688
1689                 meta:set_string("fuel_totaltime", fuel.time)
1690                 meta:set_string("fuel_time", 0)
1691                 
1692                 local stack = inv:get_stack("fuel", 1)
1693                 stack:take_item()
1694                 inv:set_stack("fuel", 1, stack)
1695         end,
1696 })
1697
1698 minetest.register_node("default:cobble", {
1699         description = "Cobblestone",
1700         tiles = {"default_cobble.png"},
1701         is_ground_content = true,
1702         groups = {cracky=3, stone=2},
1703         sounds = default.node_sound_stone_defaults(),
1704 })
1705
1706 minetest.register_node("default:mossycobble", {
1707         description = "Mossy Cobblestone",
1708         tiles = {"default_mossycobble.png"},
1709         is_ground_content = true,
1710         groups = {cracky=3},
1711         sounds = default.node_sound_stone_defaults(),
1712 })
1713
1714 minetest.register_node("default:steelblock", {
1715         description = "Steel Block",
1716         tiles = {"default_steel_block.png"},
1717         is_ground_content = true,
1718         groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2},
1719         sounds = default.node_sound_stone_defaults(),
1720 })
1721
1722 minetest.register_node("default:mese", {
1723         description = "Mese Block",
1724         tiles = {"default_mese_block.png"},
1725         is_ground_content = true,
1726         groups = {cracky=1},
1727         sounds = default.node_sound_stone_defaults(),
1728 })
1729 minetest.register_alias("default:mese_block", "default:mese")
1730
1731
1732 minetest.register_node("default:obsidian_glass", {
1733         description = "Obsidian Glass",
1734         drawtype = "glasslike",
1735         tiles = {"default_obsidian_glass.png"},
1736         is_ground_content = true,
1737         paramtype = "light",
1738         sunlight_propagates = true,
1739         sounds = default.node_sound_glass_defaults(),
1740         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
1741 })
1742
1743 minetest.register_node("default:obsidian", {
1744         description = "Obsidian",
1745         tiles = {"default_obsidian.png"},
1746         is_ground_content = true,
1747         sounds = default.node_sound_stone_defaults(),
1748         groups = {cracky=1,level=2},
1749 })
1750
1751 minetest.register_node("default:nyancat", {
1752         description = "Nyan Cat",
1753         tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1754                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1755         paramtype2 = "facedir",
1756         groups = {cracky=2},
1757         legacy_facedir_simple = true,
1758         sounds = default.node_sound_defaults(),
1759 })
1760
1761 minetest.register_node("default:nyancat_rainbow", {
1762         description = "Nyan Cat Rainbow",
1763         tiles = {"default_nc_rb.png"},
1764         groups = {cracky=2},
1765         sounds = default.node_sound_defaults(),
1766 })
1767
1768 minetest.register_node("default:sapling", {
1769         description = "Sapling",
1770         drawtype = "plantlike",
1771         visual_scale = 1.0,
1772         tiles = {"default_sapling.png"},
1773         inventory_image = "default_sapling.png",
1774         wield_image = "default_sapling.png",
1775         paramtype = "light",
1776         walkable = false,
1777         selection_box = {
1778                 type = "fixed",
1779                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1780         },
1781         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
1782         sounds = default.node_sound_defaults(),
1783 })
1784
1785 minetest.register_node("default:apple", {
1786         description = "Apple",
1787         drawtype = "plantlike",
1788         visual_scale = 1.0,
1789         tiles = {"default_apple.png"},
1790         inventory_image = "default_apple.png",
1791         paramtype = "light",
1792         sunlight_propagates = true,
1793         walkable = false,
1794         selection_box = {
1795                 type = "fixed",
1796                 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
1797         },
1798         groups = {fleshy=3,dig_immediate=3,flammable=2},
1799         on_use = minetest.item_eat(4),
1800         sounds = default.node_sound_defaults(),
1801 })
1802
1803 minetest.register_node("default:dry_shrub", {
1804         description = "Dry Shrub",
1805         drawtype = "plantlike",
1806         visual_scale = 1.0,
1807         tiles = {"default_dry_shrub.png"},
1808         inventory_image = "default_dry_shrub.png",
1809         wield_image = "default_dry_shrub.png",
1810         paramtype = "light",
1811         walkable = false,
1812         groups = {snappy=3,flammable=3,attached_node=1},
1813         sounds = default.node_sound_leaves_defaults(),
1814         selection_box = {
1815                 type = "fixed",
1816                 fixed = {-1/3, -1/2, -1/3, 1/3, 1/6, 1/3},
1817         },
1818 })
1819
1820 minetest.register_node("default:grass_1", {
1821         description = "Grass",
1822         drawtype = "plantlike",
1823         tiles = {"default_grass_1.png"},
1824         -- use a bigger inventory image
1825         inventory_image = "default_grass_3.png",
1826         wield_image = "default_grass_3.png",
1827         paramtype = "light",
1828         walkable = false,
1829         groups = {snappy=3,flammable=3,attached_node=1},
1830         sounds = default.node_sound_leaves_defaults(),
1831         selection_box = {
1832                 type = "fixed",
1833                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1834         },
1835         on_place = function(itemstack, placer, pointed_thing)
1836                 -- place a random grass node
1837                 local stack = ItemStack("default:grass_"..math.random(1,5))
1838                 local ret = minetest.item_place(stack, placer, pointed_thing)
1839                 return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count()))
1840         end,
1841 })
1842
1843 minetest.register_node("default:grass_2", {
1844         description = "Grass",
1845         drawtype = "plantlike",
1846         tiles = {"default_grass_2.png"},
1847         inventory_image = "default_grass_2.png",
1848         wield_image = "default_grass_2.png",
1849         paramtype = "light",
1850         walkable = false,
1851         drop = "default:grass_1",
1852         groups = {snappy=3,flammable=3,attached_node=1,not_in_creative_inventory=1},
1853         sounds = default.node_sound_leaves_defaults(),
1854         selection_box = {
1855                 type = "fixed",
1856                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1857         },
1858 })
1859 minetest.register_node("default:grass_3", {
1860         description = "Grass",
1861         drawtype = "plantlike",
1862         tiles = {"default_grass_3.png"},
1863         inventory_image = "default_grass_3.png",
1864         wield_image = "default_grass_3.png",
1865         paramtype = "light",
1866         walkable = false,
1867         drop = "default:grass_1",
1868         groups = {snappy=3,flammable=3,attached_node=1,not_in_creative_inventory=1},
1869         sounds = default.node_sound_leaves_defaults(),
1870         selection_box = {
1871                 type = "fixed",
1872                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1873         },
1874 })
1875
1876 minetest.register_node("default:grass_4", {
1877         description = "Grass",
1878         drawtype = "plantlike",
1879         tiles = {"default_grass_4.png"},
1880         inventory_image = "default_grass_4.png",
1881         wield_image = "default_grass_4.png",
1882         paramtype = "light",
1883         walkable = false,
1884         drop = "default:grass_1",
1885         groups = {snappy=3,flammable=3,attached_node=1,not_in_creative_inventory=1},
1886         sounds = default.node_sound_leaves_defaults(),
1887         selection_box = {
1888                 type = "fixed",
1889                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1890         },
1891 })
1892
1893 minetest.register_node("default:grass_5", {
1894         description = "Grass",
1895         drawtype = "plantlike",
1896         tiles = {"default_grass_5.png"},
1897         inventory_image = "default_grass_5.png",
1898         wield_image = "default_grass_5.png",
1899         paramtype = "light",
1900         walkable = false,
1901         drop = "default:grass_1",
1902         groups = {snappy=3,flammable=3,attached_node=1,not_in_creative_inventory=1},
1903         sounds = default.node_sound_leaves_defaults(),
1904         selection_box = {
1905                 type = "fixed",
1906                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1907         },
1908 })
1909
1910 --
1911 -- Crafting items
1912 --
1913
1914 minetest.register_craftitem("default:stick", {
1915         description = "Stick",
1916         inventory_image = "default_stick.png",
1917 })
1918
1919 minetest.register_craftitem("default:paper", {
1920         description = "Paper",
1921         inventory_image = "default_paper.png",
1922 })
1923
1924 minetest.register_craftitem("default:book", {
1925         description = "Book",
1926         inventory_image = "default_book.png",
1927 })
1928
1929 minetest.register_craftitem("default:coal_lump", {
1930         description = "Coal Lump",
1931         inventory_image = "default_coal_lump.png",
1932 })
1933
1934 minetest.register_craftitem("default:iron_lump", {
1935         description = "Iron Lump",
1936         inventory_image = "default_iron_lump.png",
1937 })
1938
1939 minetest.register_craftitem("default:mese_crystal", {
1940         description = "Mese Crystal",
1941         inventory_image = "default_mese_crystal.png",
1942 })
1943
1944 minetest.register_craftitem("default:clay_lump", {
1945         description = "Clay Lump",
1946         inventory_image = "default_clay_lump.png",
1947 })
1948
1949 minetest.register_craftitem("default:steel_ingot", {
1950         description = "Steel Ingot",
1951         inventory_image = "default_steel_ingot.png",
1952 })
1953
1954 minetest.register_craftitem("default:mese_crystal_fragment", {
1955         description = "Mese Crystal Fragment",
1956         inventory_image = "default_mese_crystal_fragment.png",
1957 })
1958
1959 minetest.register_craftitem("default:clay_brick", {
1960         description = "Clay Brick",
1961         inventory_image = "default_clay_brick.png",
1962 })
1963
1964 minetest.register_craftitem("default:scorched_stuff", {
1965         description = "Scorched Stuff",
1966         inventory_image = "default_scorched_stuff.png",
1967 })
1968
1969 minetest.register_craftitem("default:obsidian_shard", {
1970         description = "Obsidian Shard",
1971         inventory_image = "default_obsidian_shard.png",
1972 })
1973
1974 -- Support old code
1975 function default.spawn_falling_node(p, nodename)
1976         spawn_falling_node(p, nodename)
1977 end
1978
1979 -- Horrible crap to support old code
1980 -- Don't use this and never do what this does, it's completely wrong!
1981 -- (More specifically, the client and the C++ code doesn't get the group)
1982 function default.register_falling_node(nodename, texture)
1983         minetest.log("error", debug.traceback())
1984         minetest.log('error', "WARNING: default.register_falling_node is deprecated")
1985         if minetest.registered_nodes[nodename] then
1986                 minetest.registered_nodes[nodename].groups.falling_node = 1
1987         end
1988 end
1989
1990 --
1991 -- Global callbacks
1992 --
1993
1994 -- Global environment step function
1995 function on_step(dtime)
1996         -- print("on_step")
1997 end
1998 minetest.register_globalstep(on_step)
1999
2000 function on_placenode(p, node)
2001         --print("on_placenode")
2002 end
2003 minetest.register_on_placenode(on_placenode)
2004
2005 function on_dignode(p, node)
2006         --print("on_dignode")
2007 end
2008 minetest.register_on_dignode(on_dignode)
2009
2010 function on_punchnode(p, node)
2011 end
2012 minetest.register_on_punchnode(on_punchnode)
2013
2014 --
2015 -- Lavacooling
2016 --
2017
2018 default.cool_lava_source = function(pos)
2019         minetest.env:set_node(pos, {name="default:obsidian"})
2020 end
2021
2022 default.cool_lava_flowing = function(pos)
2023         minetest.env:set_node(pos, {name="default:stone"})
2024 end
2025
2026 minetest.register_abm({
2027         nodenames = {"default:lava_flowing"},
2028         neighbors = {"group:water"},
2029         interval = 1,
2030         chance = 1,
2031         action = default.cool_lava_flowing,
2032 })
2033
2034 minetest.register_abm({
2035         nodenames = {"default:lava_source"},
2036         neighbors = {"group:water"},
2037         interval = 1,
2038         chance = 1,
2039         action = default.cool_lava_source,
2040 })
2041
2042 -- END