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