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