Add obsidian
[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 --
701 -- Node definitions
702 --
703
704 -- Default node sounds
705
706 function default.node_sound_defaults(table)
707         table = table or {}
708         table.footstep = table.footstep or
709                         {name="", gain=1.0}
710         table.dug = table.dug or
711                         {name="default_dug_node", gain=1.0}
712         return table
713 end
714
715 function default.node_sound_stone_defaults(table)
716         table = table or {}
717         table.footstep = table.footstep or
718                         {name="default_hard_footstep", gain=0.2}
719         default.node_sound_defaults(table)
720         return table
721 end
722
723 function default.node_sound_dirt_defaults(table)
724         table = table or {}
725         table.footstep = table.footstep or
726                         {name="", gain=0.5}
727         --table.dug = table.dug or
728         --              {name="default_dirt_break", gain=0.5}
729         default.node_sound_defaults(table)
730         return table
731 end
732
733 function default.node_sound_sand_defaults(table)
734         table = table or {}
735         table.footstep = table.footstep or
736                         {name="default_grass_footstep", gain=0.25}
737         --table.dug = table.dug or
738         --              {name="default_dirt_break", gain=0.25}
739         table.dug = table.dug or
740                         {name="", gain=0.25}
741         default.node_sound_defaults(table)
742         return table
743 end
744
745 function default.node_sound_wood_defaults(table)
746         table = table or {}
747         table.footstep = table.footstep or
748                         {name="default_hard_footstep", gain=0.3}
749         default.node_sound_defaults(table)
750         return table
751 end
752
753 function default.node_sound_leaves_defaults(table)
754         table = table or {}
755         table.footstep = table.footstep or
756                         {name="default_grass_footstep", gain=0.25}
757         table.dig = table.dig or
758                         {name="default_dig_crumbly", gain=0.4}
759         table.dug = table.dug or
760                         {name="", gain=1.0}
761         default.node_sound_defaults(table)
762         return table
763 end
764
765 function default.node_sound_glass_defaults(table)
766         table = table or {}
767         table.footstep = table.footstep or
768                         {name="default_hard_footstep", gain=0.25}
769         table.dug = table.dug or
770                         {name="default_break_glass", gain=1.0}
771         default.node_sound_defaults(table)
772         return table
773 end
774
775 --
776
777 minetest.register_node("default:stone", {
778         description = "Stone",
779         tiles = {"default_stone.png"},
780         is_ground_content = true,
781         groups = {cracky=3, stone=1},
782         drop = 'default:cobble',
783         legacy_mineral = true,
784         sounds = default.node_sound_stone_defaults(),
785 })
786
787 minetest.register_node("default:desert_stone", {
788         description = "Desert Stone",
789         tiles = {"default_desert_stone.png"},
790         is_ground_content = true,
791         groups = {cracky=3, stone=1},
792         drop = 'default:desert_stone',
793         legacy_mineral = true,
794         sounds = default.node_sound_stone_defaults(),
795 })
796
797 minetest.register_node("default:stone_with_coal", {
798         description = "Coal Ore",
799         tiles = {"default_stone.png^default_mineral_coal.png"},
800         is_ground_content = true,
801         groups = {cracky=3},
802         drop = 'default:coal_lump',
803         sounds = default.node_sound_stone_defaults(),
804 })
805
806 minetest.register_node("default:stone_with_iron", {
807         description = "Iron Ore",
808         tiles = {"default_stone.png^default_mineral_iron.png"},
809         is_ground_content = true,
810         groups = {cracky=3},
811         drop = 'default:iron_lump',
812         sounds = default.node_sound_stone_defaults(),
813 })
814
815 minetest.register_node("default:stone_with_mese", {
816         description = "Mese Crystals in Stone",
817         tiles = {"default_stone.png^default_mineral_mese.png"},
818         is_ground_content = true,
819         groups = {cracky=1},
820         drop = "default:mese_crystal",
821         sounds = default.node_sound_stone_defaults(),
822 })
823
824 minetest.register_node("default:dirt_with_grass", {
825         description = "Dirt with Grass",
826         tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
827         is_ground_content = true,
828         groups = {crumbly=3},
829         drop = 'default:dirt',
830         sounds = default.node_sound_dirt_defaults({
831                 footstep = {name="default_grass_footstep", gain=0.4},
832         }),
833 })
834
835 minetest.register_node("default:dirt_with_grass_footsteps", {
836         description = "Dirt with Grass and Footsteps",
837         tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
838         is_ground_content = true,
839         groups = {crumbly=3, not_in_creative_inventory=1},
840         drop = 'default:dirt',
841         sounds = default.node_sound_dirt_defaults({
842                 footstep = {name="default_grass_footstep", gain=0.4},
843         }),
844 })
845
846 minetest.register_node("default:dirt", {
847         description = "Dirt",
848         tiles = {"default_dirt.png"},
849         is_ground_content = true,
850         groups = {crumbly=3},
851         sounds = default.node_sound_dirt_defaults(),
852 })
853
854 minetest.register_node("default:sand", {
855         description = "Sand",
856         tiles = {"default_sand.png"},
857         is_ground_content = true,
858         groups = {crumbly=3, falling_node=1, sand=1},
859         sounds = default.node_sound_sand_defaults(),
860 })
861
862 minetest.register_node("default:desert_sand", {
863         description = "Desert Sand",
864         tiles = {"default_desert_sand.png"},
865         is_ground_content = true,
866         groups = {crumbly=3, falling_node=1, sand=1},
867         sounds = default.node_sound_sand_defaults(),
868 })
869
870 minetest.register_node("default:gravel", {
871         description = "Gravel",
872         tiles = {"default_gravel.png"},
873         is_ground_content = true,
874         groups = {crumbly=2, falling_node=1},
875         sounds = default.node_sound_dirt_defaults({
876                 footstep = {name="default_gravel_footstep", gain=0.45},
877         }),
878 })
879
880 minetest.register_node("default:sandstone", {
881         description = "Sandstone",
882         tiles = {"default_sandstone.png"},
883         is_ground_content = true,
884         groups = {crumbly=2,cracky=2},
885         sounds = default.node_sound_stone_defaults(),
886 })
887
888 minetest.register_node("default:clay", {
889         description = "Clay",
890         tiles = {"default_clay.png"},
891         is_ground_content = true,
892         groups = {crumbly=3},
893         drop = 'default:clay_lump 4',
894         sounds = default.node_sound_dirt_defaults({
895                 footstep = "",
896         }),
897 })
898
899 minetest.register_node("default:brick", {
900         description = "Brick Block",
901         tiles = {"default_brick.png"},
902         is_ground_content = true,
903         groups = {cracky=3},
904         sounds = default.node_sound_stone_defaults(),
905 })
906
907 minetest.register_node("default:tree", {
908         description = "Tree",
909         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
910         is_ground_content = true,
911         groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
912         sounds = default.node_sound_wood_defaults(),
913 })
914
915 minetest.register_node("default:jungletree", {
916         description = "Jungle Tree",
917         tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
918         is_ground_content = true,
919         groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
920         sounds = default.node_sound_wood_defaults(),
921 })
922
923 minetest.register_node("default:junglewood", {
924         description = "Junglewood Planks",
925         tiles = {"default_junglewood.png"},
926         is_ground_content = true,
927         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
928         sounds = default.node_sound_wood_defaults(),
929 })
930
931 minetest.register_node("default:jungleleaves", {
932         description = "Jungle Leaves",
933         drawtype = "allfaces_optional",
934         visual_scale = 1.3,
935         tiles = {"default_jungleleaves.png"},
936         paramtype = "light",
937         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
938         drop = {
939                 max_items = 1,
940                 items = {
941                         {
942                                 -- player will get sapling with 1/20 chance
943                                 items = {'default:junglesapling'},
944                                 rarity = 20,
945                         },
946                         {
947                                 -- player will get leaves only if he get no saplings,
948                                 -- this is because max_items is 1
949                                 items = {'default:jungleleaves'},
950                         }
951                 }
952         },
953         sounds = default.node_sound_leaves_defaults(),
954 })
955
956 minetest.register_node("default:junglesapling", {
957         description = "Jungle Sapling",
958         drawtype = "plantlike",
959         visual_scale = 1.0,
960         tiles = {"default_junglesapling.png"},
961         inventory_image = "default_junglesapling.png",
962         wield_image = "default_junglesapling.png",
963         paramtype = "light",
964         walkable = false,
965         selection_box = {
966                 type = "fixed",
967                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
968         },
969         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
970         sounds = default.node_sound_defaults(),
971 })
972 -- alias for tree growing abm in content_abm.cpp
973 minetest.register_alias("junglesapling", "default:junglesapling")
974
975 minetest.register_node("default:junglegrass", {
976         description = "Jungle Grass",
977         drawtype = "plantlike",
978         visual_scale = 1.3,
979         tiles = {"default_junglegrass.png"},
980         inventory_image = "default_junglegrass.png",
981         wield_image = "default_junglegrass.png",
982         paramtype = "light",
983         walkable = false,
984         groups = {snappy=3,flammable=2,attached_node=1},
985         sounds = default.node_sound_leaves_defaults(),
986 })
987
988 minetest.register_node("default:leaves", {
989         description = "Leaves",
990         drawtype = "allfaces_optional",
991         visual_scale = 1.3,
992         tiles = {"default_leaves.png"},
993         paramtype = "light",
994         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
995         drop = {
996                 max_items = 1,
997                 items = {
998                         {
999                                 -- player will get sapling with 1/20 chance
1000                                 items = {'default:sapling'},
1001                                 rarity = 20,
1002                         },
1003                         {
1004                                 -- player will get leaves only if he get no saplings,
1005                                 -- this is because max_items is 1
1006                                 items = {'default:leaves'},
1007                         }
1008                 }
1009         },
1010         sounds = default.node_sound_leaves_defaults(),
1011 })
1012
1013 minetest.register_node("default:cactus", {
1014         description = "Cactus",
1015         tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
1016         is_ground_content = true,
1017         groups = {snappy=2,choppy=3,flammable=2},
1018         sounds = default.node_sound_wood_defaults(),
1019 })
1020
1021 minetest.register_node("default:papyrus", {
1022         description = "Papyrus",
1023         drawtype = "plantlike",
1024         tiles = {"default_papyrus.png"},
1025         inventory_image = "default_papyrus.png",
1026         wield_image = "default_papyrus.png",
1027         paramtype = "light",
1028         is_ground_content = true,
1029         walkable = false,
1030         selection_box = {
1031                 type = "fixed",
1032                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
1033         },
1034         groups = {snappy=3,flammable=2},
1035         sounds = default.node_sound_leaves_defaults(),
1036 })
1037
1038 minetest.register_node("default:bookshelf", {
1039         description = "Bookshelf",
1040         tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1041         is_ground_content = true,
1042         groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2,flammable=3},
1043         sounds = default.node_sound_wood_defaults(),
1044 })
1045
1046 minetest.register_node("default:glass", {
1047         description = "Glass",
1048         drawtype = "glasslike",
1049         tiles = {"default_glass.png"},
1050         inventory_image = minetest.inventorycube("default_glass.png"),
1051         paramtype = "light",
1052         sunlight_propagates = true,
1053         is_ground_content = true,
1054         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
1055         sounds = default.node_sound_glass_defaults(),
1056 })
1057
1058 minetest.register_node("default:fence_wood", {
1059         description = "Wooden Fence",
1060         drawtype = "fencelike",
1061         tiles = {"default_wood.png"},
1062         inventory_image = "default_fence.png",
1063         wield_image = "default_fence.png",
1064         paramtype = "light",
1065         is_ground_content = true,
1066         selection_box = {
1067                 type = "fixed",
1068                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
1069         },
1070         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2},
1071         sounds = default.node_sound_wood_defaults(),
1072 })
1073
1074 minetest.register_node("default:rail", {
1075         description = "Rail",
1076         drawtype = "raillike",
1077         tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
1078         inventory_image = "default_rail.png",
1079         wield_image = "default_rail.png",
1080         paramtype = "light",
1081         is_ground_content = true,
1082         walkable = false,
1083         selection_box = {
1084                 type = "fixed",
1085                 -- but how to specify the dimensions for curved and sideways rails?
1086                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1087         },
1088         groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1},
1089 })
1090
1091 minetest.register_node("default:ladder", {
1092         description = "Ladder",
1093         drawtype = "signlike",
1094         tiles = {"default_ladder.png"},
1095         inventory_image = "default_ladder.png",
1096         wield_image = "default_ladder.png",
1097         paramtype = "light",
1098         paramtype2 = "wallmounted",
1099         is_ground_content = true,
1100         walkable = false,
1101         climbable = true,
1102         selection_box = {
1103                 type = "wallmounted",
1104                 --wall_top = = <default>
1105                 --wall_bottom = = <default>
1106                 --wall_side = = <default>
1107         },
1108         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=3,flammable=2},
1109         legacy_wallmounted = true,
1110         sounds = default.node_sound_wood_defaults(),
1111 })
1112
1113 minetest.register_node("default:wood", {
1114         description = "Wooden Planks",
1115         tiles = {"default_wood.png"},
1116         is_ground_content = true,
1117         groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
1118         sounds = default.node_sound_wood_defaults(),
1119 })
1120
1121 minetest.register_node("default:cloud", {
1122         description = "Cloud",
1123         tiles = {"default_cloud.png"},
1124         is_ground_content = true,
1125         sounds = default.node_sound_defaults(),
1126         groups = {not_in_creative_inventory=1},
1127 })
1128
1129 minetest.register_node("default:water_flowing", {
1130         description = "Flowing Water",
1131         inventory_image = minetest.inventorycube("default_water.png"),
1132         drawtype = "flowingliquid",
1133         tiles = {"default_water.png"},
1134         special_tiles = {
1135                 {
1136                         image="default_water_flowing_animated.png",
1137                         backface_culling=false,
1138                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
1139                 },
1140                 {
1141                         image="default_water_flowing_animated.png",
1142                         backface_culling=true,
1143                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
1144                 },
1145         },
1146         alpha = WATER_ALPHA,
1147         paramtype = "light",
1148         walkable = false,
1149         pointable = false,
1150         diggable = false,
1151         buildable_to = true,
1152         drop = "",
1153         liquidtype = "flowing",
1154         liquid_alternative_flowing = "default:water_flowing",
1155         liquid_alternative_source = "default:water_source",
1156         liquid_viscosity = WATER_VISC,
1157         post_effect_color = {a=64, r=100, g=100, b=200},
1158         groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1159 })
1160
1161 minetest.register_node("default:water_source", {
1162         description = "Water Source",
1163         inventory_image = minetest.inventorycube("default_water.png"),
1164         drawtype = "liquid",
1165         tiles = {
1166                 {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}
1167         },
1168         special_tiles = {
1169                 -- New-style water source material (mostly unused)
1170                 {
1171                         name="default_water_source_animated.png",
1172                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0},
1173                         backface_culling = false,
1174                 }
1175         },
1176         alpha = WATER_ALPHA,
1177         paramtype = "light",
1178         walkable = false,
1179         pointable = false,
1180         diggable = false,
1181         buildable_to = true,
1182         drop = "",
1183         liquidtype = "source",
1184         liquid_alternative_flowing = "default:water_flowing",
1185         liquid_alternative_source = "default:water_source",
1186         liquid_viscosity = WATER_VISC,
1187         post_effect_color = {a=64, r=100, g=100, b=200},
1188         groups = {water=3, liquid=3, puts_out_fire=1},
1189 })
1190
1191 minetest.register_node("default:lava_flowing", {
1192         description = "Flowing Lava",
1193         inventory_image = minetest.inventorycube("default_lava.png"),
1194         drawtype = "flowingliquid",
1195         tiles = {"default_lava.png"},
1196         special_tiles = {
1197                 {
1198                         image="default_lava_flowing_animated.png",
1199                         backface_culling=false,
1200                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1201                 },
1202                 {
1203                         image="default_lava_flowing_animated.png",
1204                         backface_culling=true,
1205                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
1206                 },
1207         },
1208         paramtype = "light",
1209         light_source = LIGHT_MAX - 1,
1210         walkable = false,
1211         pointable = false,
1212         diggable = false,
1213         buildable_to = true,
1214         drop = "",
1215         liquidtype = "flowing",
1216         liquid_alternative_flowing = "default:lava_flowing",
1217         liquid_alternative_source = "default:lava_source",
1218         liquid_viscosity = LAVA_VISC,
1219         damage_per_second = 4*2,
1220         post_effect_color = {a=192, r=255, g=64, b=0},
1221         groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
1222 })
1223
1224 minetest.register_node("default:lava_source", {
1225         description = "Lava Source",
1226         inventory_image = minetest.inventorycube("default_lava.png"),
1227         drawtype = "liquid",
1228         tiles = {
1229                 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1230         },
1231         special_tiles = {
1232                 -- New-style lava source material (mostly unused)
1233                 {
1234                         name="default_lava_source_animated.png",
1235                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0},
1236                         backface_culling = false,
1237                 }
1238         },
1239         paramtype = "light",
1240         light_source = LIGHT_MAX - 1,
1241         walkable = false,
1242         pointable = false,
1243         diggable = false,
1244         buildable_to = true,
1245         drop = "",
1246         liquidtype = "source",
1247         liquid_alternative_flowing = "default:lava_flowing",
1248         liquid_alternative_source = "default:lava_source",
1249         liquid_viscosity = LAVA_VISC,
1250         damage_per_second = 4*2,
1251         post_effect_color = {a=192, r=255, g=64, b=0},
1252         groups = {lava=3, liquid=2, hot=3, igniter=1},
1253 })
1254
1255 minetest.register_node("default:torch", {
1256         description = "Torch",
1257         drawtype = "torchlike",
1258         --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1259         tiles = {
1260                 {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
1261                 {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
1262                 {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
1263         },
1264         inventory_image = "default_torch_on_floor.png",
1265         wield_image = "default_torch_on_floor.png",
1266         paramtype = "light",
1267         paramtype2 = "wallmounted",
1268         sunlight_propagates = true,
1269         walkable = false,
1270         light_source = LIGHT_MAX-1,
1271         selection_box = {
1272                 type = "wallmounted",
1273                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1274                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1275                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1276         },
1277         groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
1278         legacy_wallmounted = true,
1279         sounds = default.node_sound_defaults(),
1280 })
1281
1282 minetest.register_node("default:sign_wall", {
1283         description = "Sign",
1284         drawtype = "signlike",
1285         tiles = {"default_sign_wall.png"},
1286         inventory_image = "default_sign_wall.png",
1287         wield_image = "default_sign_wall.png",
1288         paramtype = "light",
1289         paramtype2 = "wallmounted",
1290         sunlight_propagates = true,
1291         walkable = false,
1292         selection_box = {
1293                 type = "wallmounted",
1294                 --wall_top = <default>
1295                 --wall_bottom = <default>
1296                 --wall_side = <default>
1297         },
1298         groups = {choppy=2,dig_immediate=2,attached_node=1},
1299         legacy_wallmounted = true,
1300         sounds = default.node_sound_defaults(),
1301         on_construct = function(pos)
1302                 --local n = minetest.env:get_node(pos)
1303                 local meta = minetest.env:get_meta(pos)
1304                 meta:set_string("formspec", "field[text;;${text}]")
1305                 meta:set_string("infotext", "\"\"")
1306         end,
1307         on_receive_fields = function(pos, formname, fields, sender)
1308                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1309                 local meta = minetest.env:get_meta(pos)
1310                 fields.text = fields.text or ""
1311                 print((sender:get_player_name() or "").." wrote \""..fields.text..
1312                                 "\" to sign at "..minetest.pos_to_string(pos))
1313                 meta:set_string("text", fields.text)
1314                 meta:set_string("infotext", '"'..fields.text..'"')
1315         end,
1316 })
1317
1318 minetest.register_node("default:chest", {
1319         description = "Chest",
1320         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1321                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1322         paramtype2 = "facedir",
1323         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1324         legacy_facedir_simple = true,
1325         sounds = default.node_sound_wood_defaults(),
1326         on_construct = function(pos)
1327                 local meta = minetest.env:get_meta(pos)
1328                 meta:set_string("formspec",
1329                                 "size[8,9]"..
1330                                 "list[current_name;main;0,0;8,4;]"..
1331                                 "list[current_player;main;0,5;8,4;]")
1332                 meta:set_string("infotext", "Chest")
1333                 local inv = meta:get_inventory()
1334                 inv:set_size("main", 8*4)
1335         end,
1336         can_dig = function(pos,player)
1337                 local meta = minetest.env:get_meta(pos);
1338                 local inv = meta:get_inventory()
1339                 return inv:is_empty("main")
1340         end,
1341         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1342                 minetest.log("action", player:get_player_name()..
1343                                 " moves stuff in chest at "..minetest.pos_to_string(pos))
1344         end,
1345     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1346                 minetest.log("action", player:get_player_name()..
1347                                 " moves stuff to chest at "..minetest.pos_to_string(pos))
1348         end,
1349     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1350                 minetest.log("action", player:get_player_name()..
1351                                 " takes stuff from chest at "..minetest.pos_to_string(pos))
1352         end,
1353 })
1354
1355 local function has_locked_chest_privilege(meta, player)
1356         if player:get_player_name() ~= meta:get_string("owner") then
1357                 return false
1358         end
1359         return true
1360 end
1361
1362 minetest.register_node("default:chest_locked", {
1363         description = "Locked Chest",
1364         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1365                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1366         paramtype2 = "facedir",
1367         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1368         legacy_facedir_simple = true,
1369         sounds = default.node_sound_wood_defaults(),
1370         after_place_node = function(pos, placer)
1371                 local meta = minetest.env:get_meta(pos)
1372                 meta:set_string("owner", placer:get_player_name() or "")
1373                 meta:set_string("infotext", "Locked Chest (owned by "..
1374                                 meta:get_string("owner")..")")
1375         end,
1376         on_construct = function(pos)
1377                 local meta = minetest.env:get_meta(pos)
1378                 meta:set_string("infotext", "Locked Chest")
1379                 meta:set_string("owner", "")
1380                 local inv = meta:get_inventory()
1381                 inv:set_size("main", 8*4)
1382         end,
1383         can_dig = function(pos,player)
1384                 local meta = minetest.env:get_meta(pos);
1385                 local inv = meta:get_inventory()
1386                 return inv:is_empty("main")
1387         end,
1388         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1389                 local meta = minetest.env:get_meta(pos)
1390                 if not has_locked_chest_privilege(meta, player) then
1391                         minetest.log("action", player:get_player_name()..
1392                                         " tried to access a locked chest belonging to "..
1393                                         meta:get_string("owner").." at "..
1394                                         minetest.pos_to_string(pos))
1395                         return 0
1396                 end
1397                 return count
1398         end,
1399     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1400                 local meta = minetest.env:get_meta(pos)
1401                 if not has_locked_chest_privilege(meta, player) then
1402                         minetest.log("action", player:get_player_name()..
1403                                         " tried to access a locked chest belonging to "..
1404                                         meta:get_string("owner").." at "..
1405                                         minetest.pos_to_string(pos))
1406                         return 0
1407                 end
1408                 return stack:get_count()
1409         end,
1410     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1411                 local meta = minetest.env:get_meta(pos)
1412                 if not has_locked_chest_privilege(meta, player) then
1413                         minetest.log("action", player:get_player_name()..
1414                                         " tried to access a locked chest belonging to "..
1415                                         meta:get_string("owner").." at "..
1416                                         minetest.pos_to_string(pos))
1417                         return 0
1418                 end
1419                 return stack:get_count()
1420         end,
1421         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1422                 minetest.log("action", player:get_player_name()..
1423                                 " moves stuff in locked chest at "..minetest.pos_to_string(pos))
1424         end,
1425     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1426                 minetest.log("action", player:get_player_name()..
1427                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1428         end,
1429     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1430                 minetest.log("action", player:get_player_name()..
1431                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1432         end,
1433         on_rightclick = function(pos, node, clicker)
1434                 local meta = minetest.env:get_meta(pos)
1435                 if has_locked_chest_privilege(meta, clicker) then
1436                         local pos = pos.x .. "," .. pos.y .. "," ..pos.z
1437                         minetest.show_formspec(clicker:get_player_name(), "default:chest_locked",
1438                                 "size[8,9]"..
1439                                 "list[nodemeta:".. pos .. ";main;0,0;8,4;]"..
1440                                 "list[current_player;main;0,5;8,4;]")
1441                 end
1442         end,
1443 })
1444
1445 default.furnace_inactive_formspec =
1446         "size[8,9]"..
1447         "image[2,2;1,1;default_furnace_fire_bg.png]"..
1448         "list[current_name;fuel;2,3;1,1;]"..
1449         "list[current_name;src;2,1;1,1;]"..
1450         "list[current_name;dst;5,1;2,2;]"..
1451         "list[current_player;main;0,5;8,4;]"
1452
1453 minetest.register_node("default:furnace", {
1454         description = "Furnace",
1455         tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
1456                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1457         paramtype2 = "facedir",
1458         groups = {cracky=2},
1459         legacy_facedir_simple = true,
1460         sounds = default.node_sound_stone_defaults(),
1461         on_construct = function(pos)
1462                 local meta = minetest.env:get_meta(pos)
1463                 meta:set_string("formspec", default.furnace_inactive_formspec)
1464                 meta:set_string("infotext", "Furnace")
1465                 local inv = meta:get_inventory()
1466                 inv:set_size("fuel", 1)
1467                 inv:set_size("src", 1)
1468                 inv:set_size("dst", 4)
1469         end,
1470         can_dig = function(pos,player)
1471                 local meta = minetest.env:get_meta(pos);
1472                 local inv = meta:get_inventory()
1473                 if not inv:is_empty("fuel") then
1474                         return false
1475                 elseif not inv:is_empty("dst") then
1476                         return false
1477                 elseif not inv:is_empty("src") then
1478                         return false
1479                 end
1480                 return true
1481         end,
1482 })
1483
1484 minetest.register_node("default:furnace_active", {
1485         description = "Furnace",
1486         tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
1487                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
1488         paramtype2 = "facedir",
1489         light_source = 8,
1490         drop = "default:furnace",
1491         groups = {cracky=2, not_in_creative_inventory=1},
1492         legacy_facedir_simple = true,
1493         sounds = default.node_sound_stone_defaults(),
1494         on_construct = function(pos)
1495                 local meta = minetest.env:get_meta(pos)
1496                 meta:set_string("formspec", default.furnace_inactive_formspec)
1497                 meta:set_string("infotext", "Furnace");
1498                 local inv = meta:get_inventory()
1499                 inv:set_size("fuel", 1)
1500                 inv:set_size("src", 1)
1501                 inv:set_size("dst", 4)
1502         end,
1503         can_dig = function(pos,player)
1504                 local meta = minetest.env:get_meta(pos);
1505                 local inv = meta:get_inventory()
1506                 if not inv:is_empty("fuel") then
1507                         return false
1508                 elseif not inv:is_empty("dst") then
1509                         return false
1510                 elseif not inv:is_empty("src") then
1511                         return false
1512                 end
1513                 return true
1514         end,
1515 })
1516
1517 function hacky_swap_node(pos,name)
1518         local node = minetest.env:get_node(pos)
1519         local meta = minetest.env:get_meta(pos)
1520         local meta0 = meta:to_table()
1521         if node.name == name then
1522                 return
1523         end
1524         node.name = name
1525         local meta0 = meta:to_table()
1526         minetest.env:set_node(pos,node)
1527         meta = minetest.env:get_meta(pos)
1528         meta:from_table(meta0)
1529 end
1530
1531 minetest.register_abm({
1532         nodenames = {"default:furnace","default:furnace_active"},
1533         interval = 1.0,
1534         chance = 1,
1535         action = function(pos, node, active_object_count, active_object_count_wider)
1536                 local meta = minetest.env:get_meta(pos)
1537                 for i, name in ipairs({
1538                                 "fuel_totaltime",
1539                                 "fuel_time",
1540                                 "src_totaltime",
1541                                 "src_time"
1542                 }) do
1543                         if meta:get_string(name) == "" then
1544                                 meta:set_float(name, 0.0)
1545                         end
1546                 end
1547
1548                 local inv = meta:get_inventory()
1549
1550                 local srclist = inv:get_list("src")
1551                 local cooked = nil
1552                 
1553                 if srclist then
1554                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1555                 end
1556                 
1557                 local was_active = false
1558                 
1559                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1560                         was_active = true
1561                         meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
1562                         meta:set_float("src_time", meta:get_float("src_time") + 1)
1563                         if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
1564                                 -- check if there's room for output in "dst" list
1565                                 if inv:room_for_item("dst",cooked.item) then
1566                                         -- Put result in "dst" list
1567                                         inv:add_item("dst", cooked.item)
1568                                         -- take stuff from "src" list
1569                                         srcstack = inv:get_stack("src", 1)
1570                                         srcstack:take_item()
1571                                         inv:set_stack("src", 1, srcstack)
1572                                 else
1573                                         print("Could not insert '"..cooked.item:to_string().."'")
1574                                 end
1575                                 meta:set_string("src_time", 0)
1576                         end
1577                 end
1578                 
1579                 if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
1580                         local percent = math.floor(meta:get_float("fuel_time") /
1581                                         meta:get_float("fuel_totaltime") * 100)
1582                         meta:set_string("infotext","Furnace active: "..percent.."%")
1583                         hacky_swap_node(pos,"default:furnace_active")
1584                         meta:set_string("formspec",
1585                                 "size[8,9]"..
1586                                 "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
1587                                                 (100-percent)..":default_furnace_fire_fg.png]"..
1588                                 "list[current_name;fuel;2,3;1,1;]"..
1589                                 "list[current_name;src;2,1;1,1;]"..
1590                                 "list[current_name;dst;5,1;2,2;]"..
1591                                 "list[current_player;main;0,5;8,4;]")
1592                         return
1593                 end
1594
1595                 local fuel = nil
1596                 local cooked = nil
1597                 local fuellist = inv:get_list("fuel")
1598                 local srclist = inv:get_list("src")
1599                 
1600                 if srclist then
1601                         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
1602                 end
1603                 if fuellist then
1604                         fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
1605                 end
1606
1607                 if fuel.time <= 0 then
1608                         meta:set_string("infotext","Furnace out of fuel")
1609                         hacky_swap_node(pos,"default:furnace")
1610                         meta:set_string("formspec", default.furnace_inactive_formspec)
1611                         return
1612                 end
1613
1614                 if cooked.item:is_empty() then
1615                         if was_active then
1616                                 meta:set_string("infotext","Furnace is empty")
1617                                 hacky_swap_node(pos,"default:furnace")
1618                                 meta:set_string("formspec", default.furnace_inactive_formspec)
1619                         end
1620                         return
1621                 end
1622
1623                 meta:set_string("fuel_totaltime", fuel.time)
1624                 meta:set_string("fuel_time", 0)
1625                 
1626                 local stack = inv:get_stack("fuel", 1)
1627                 stack:take_item()
1628                 inv:set_stack("fuel", 1, stack)
1629         end,
1630 })
1631
1632 minetest.register_node("default:cobble", {
1633         description = "Cobblestone",
1634         tiles = {"default_cobble.png"},
1635         is_ground_content = true,
1636         groups = {cracky=3, stone=2},
1637         sounds = default.node_sound_stone_defaults(),
1638 })
1639
1640 minetest.register_node("default:mossycobble", {
1641         description = "Mossy Cobblestone",
1642         tiles = {"default_mossycobble.png"},
1643         is_ground_content = true,
1644         groups = {cracky=3},
1645         sounds = default.node_sound_stone_defaults(),
1646 })
1647
1648 minetest.register_node("default:steelblock", {
1649         description = "Steel Block",
1650         tiles = {"default_steel_block.png"},
1651         is_ground_content = true,
1652         groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2},
1653         sounds = default.node_sound_stone_defaults(),
1654 })
1655
1656 minetest.register_node("default:mese", {
1657         description = "Mese Block",
1658         tiles = {"default_mese_block.png"},
1659         is_ground_content = true,
1660         groups = {cracky=1},
1661         sounds = default.node_sound_stone_defaults(),
1662 })
1663 minetest.register_alias("default:mese_block", "default:mese")
1664
1665
1666 minetest.register_node("default:obsidian_glass", {
1667         description = "Obsidian Glass",
1668         drawtype = "glasslike",
1669         tiles = {"default_obsidian_glass.png"},
1670         is_ground_content = true,
1671         paramtype = "light",
1672         sunlight_propagates = true,
1673         sounds = default.node_sound_glass_defaults(),
1674         groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
1675 })
1676
1677 minetest.register_node("default:obsidian", {
1678         description = "Obsidian",
1679         tiles = {"default_obsidian.png"},
1680         is_ground_content = true,
1681         sounds = default.node_sound_stone_defaults(),
1682         groups = {cracky=1,level=2},
1683 })
1684
1685 minetest.register_node("default:nyancat", {
1686         description = "Nyan Cat",
1687         tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1688                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1689         paramtype2 = "facedir",
1690         groups = {cracky=2},
1691         legacy_facedir_simple = true,
1692         sounds = default.node_sound_defaults(),
1693 })
1694
1695 minetest.register_node("default:nyancat_rainbow", {
1696         description = "Nyan Cat Rainbow",
1697         tiles = {"default_nc_rb.png"},
1698         groups = {cracky=2},
1699         sounds = default.node_sound_defaults(),
1700 })
1701
1702 minetest.register_node("default:sapling", {
1703         description = "Sapling",
1704         drawtype = "plantlike",
1705         visual_scale = 1.0,
1706         tiles = {"default_sapling.png"},
1707         inventory_image = "default_sapling.png",
1708         wield_image = "default_sapling.png",
1709         paramtype = "light",
1710         walkable = false,
1711         selection_box = {
1712                 type = "fixed",
1713                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1714         },
1715         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
1716         sounds = default.node_sound_defaults(),
1717 })
1718
1719 minetest.register_node("default:apple", {
1720         description = "Apple",
1721         drawtype = "plantlike",
1722         visual_scale = 1.0,
1723         tiles = {"default_apple.png"},
1724         inventory_image = "default_apple.png",
1725         paramtype = "light",
1726         sunlight_propagates = true,
1727         walkable = false,
1728         selection_box = {
1729                 type = "fixed",
1730                 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
1731         },
1732         groups = {fleshy=3,dig_immediate=3,flammable=2},
1733         on_use = minetest.item_eat(4),
1734         sounds = default.node_sound_defaults(),
1735 })
1736
1737 minetest.register_node("default:dry_shrub", {
1738         description = "Dry Shrub",
1739         drawtype = "plantlike",
1740         visual_scale = 1.0,
1741         tiles = {"default_dry_shrub.png"},
1742         inventory_image = "default_dry_shrub.png",
1743         wield_image = "default_dry_shrub.png",
1744         paramtype = "light",
1745         walkable = false,
1746         groups = {snappy=3,flammable=3,attached_node=1},
1747         sounds = default.node_sound_leaves_defaults(),
1748         selection_box = {
1749                 type = "fixed",
1750                 fixed = {-1/3, -1/2, -1/3, 1/3, 1/6, 1/3},
1751         },
1752 })
1753
1754 --
1755 -- Crafting items
1756 --
1757
1758 minetest.register_craftitem("default:stick", {
1759         description = "Stick",
1760         inventory_image = "default_stick.png",
1761 })
1762
1763 minetest.register_craftitem("default:paper", {
1764         description = "Paper",
1765         inventory_image = "default_paper.png",
1766 })
1767
1768 minetest.register_craftitem("default:book", {
1769         description = "Book",
1770         inventory_image = "default_book.png",
1771 })
1772
1773 minetest.register_craftitem("default:coal_lump", {
1774         description = "Coal Lump",
1775         inventory_image = "default_coal_lump.png",
1776 })
1777
1778 minetest.register_craftitem("default:iron_lump", {
1779         description = "Iron Lump",
1780         inventory_image = "default_iron_lump.png",
1781 })
1782
1783 minetest.register_craftitem("default:mese_crystal", {
1784         description = "Mese Crystal",
1785         inventory_image = "default_mese_crystal.png",
1786 })
1787
1788 minetest.register_craftitem("default:clay_lump", {
1789         description = "Clay Lump",
1790         inventory_image = "default_clay_lump.png",
1791 })
1792
1793 minetest.register_craftitem("default:steel_ingot", {
1794         description = "Steel Ingot",
1795         inventory_image = "default_steel_ingot.png",
1796 })
1797
1798 minetest.register_craftitem("default:mese_crystal_fragment", {
1799         description = "Mese Crystal Fragment",
1800         inventory_image = "default_mese_crystal_fragment.png",
1801 })
1802
1803 minetest.register_craftitem("default:clay_brick", {
1804         description = "Clay Brick",
1805         inventory_image = "default_clay_brick.png",
1806 })
1807
1808 minetest.register_craftitem("default:scorched_stuff", {
1809         description = "Scorched Stuff",
1810         inventory_image = "default_scorched_stuff.png",
1811 })
1812
1813 minetest.register_craftitem("default:obsidian_shard", {
1814         description = "Obsidian Shard",
1815         inventory_image = "default_obsidian_shard.png",
1816 })
1817
1818 -- Support old code
1819 function default.spawn_falling_node(p, nodename)
1820         spawn_falling_node(p, nodename)
1821 end
1822
1823 -- Horrible crap to support old code
1824 -- Don't use this and never do what this does, it's completely wrong!
1825 -- (More specifically, the client and the C++ code doesn't get the group)
1826 function default.register_falling_node(nodename, texture)
1827         minetest.log("error", debug.traceback())
1828         minetest.log('error', "WARNING: default.register_falling_node is deprecated")
1829         if minetest.registered_nodes[nodename] then
1830                 minetest.registered_nodes[nodename].groups.falling_node = 1
1831         end
1832 end
1833
1834 --
1835 -- Global callbacks
1836 --
1837
1838 -- Global environment step function
1839 function on_step(dtime)
1840         -- print("on_step")
1841 end
1842 minetest.register_globalstep(on_step)
1843
1844 function on_placenode(p, node)
1845         --print("on_placenode")
1846 end
1847 minetest.register_on_placenode(on_placenode)
1848
1849 function on_dignode(p, node)
1850         --print("on_dignode")
1851 end
1852 minetest.register_on_dignode(on_dignode)
1853
1854 function on_punchnode(p, node)
1855 end
1856 minetest.register_on_punchnode(on_punchnode)
1857
1858 --
1859 -- Lavacooling
1860 --
1861
1862 default.cool_lava_source = function(pos)
1863         minetest.env:set_node(pos, {name="default:obsidian"})
1864 end
1865
1866 default.cool_lava_flowing = function(pos)
1867         minetest.env:set_node(pos, {name="default:stone"})
1868 end
1869
1870 minetest.register_abm({
1871         nodenames = {"default:lava_flowing"},
1872         neighbors = {"group:water"},
1873         interval = 1,
1874         chance = 1,
1875         action = default.cool_lava_flowing,
1876 })
1877
1878 minetest.register_abm({
1879         nodenames = {"default:lava_source"},
1880         neighbors = {"group:water"},
1881         interval = 1,
1882         chance = 1,
1883         action = default.cool_lava_source,
1884 })
1885
1886 -- END