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