Modify textures, add map generator necessities
[oweals/minetest_game.git] / 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 -- Register and define map generator stuff
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}, maxwear=0, maxlevel=1},
31                         crumbly = {times={[2]=3.00, [3]=0.70}, maxwear=0, maxlevel=1},
32                         snappy = {times={[3]=0.40}, maxwear=0, maxlevel=1},
33                         oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, maxwear=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}, maxwear=0.1, 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}, maxwear=0.05, 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]=1.20, [2]=0.80, [3]=0.50}, maxwear=0.1, 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]=0.2, [2]=0.2, [3]=0.2}, maxwear=0.05, maxlevel=3},
76                         crumbly={times={[1]=0.2, [2]=0.2, [3]=0.2}, maxwear=0.05, maxlevel=3},
77                         snappy={times={[1]=0.2, [2]=0.2, [3]=0.2}, maxwear=0.05, 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]=1.50, [2]=0.80, [3]=0.50}, maxwear=0.1, 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]=0.80, [2]=0.50, [3]=0.30}, maxwear=0.05, 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]=0.50, [2]=0.35, [3]=0.30}, maxwear=0.1, 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}, maxwear=0.1, maxlevel=1},
118                         fleshy={times={[2]=1.50, [3]=0.80}, maxwear=0.1, 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}, maxwear=0.05, maxlevel=1},
129                         fleshy={times={[2]=1.30, [3]=0.70}, maxwear=0.05, 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]=1.00, [2]=0.80, [3]=0.50}, maxwear=0.1, maxlevel=2},
140                         fleshy={times={[2]=1.10, [3]=0.60}, maxwear=0.03, 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}, maxwear=0.1, maxlevel=1},
152                         snappy={times={[2]=1.00, [3]=0.50}, maxwear=0.1, maxlevel=1},
153                         choppy={times={[3]=1.00}, maxwear=0.05, 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}, maxwear=0.05, maxlevel=1},
165                         snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
166                         choppy={times={[3]=0.90}, maxwear=0.05, 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]=1.00, [2]=0.40, [3]=0.20}, maxwear=0.1, maxlevel=2},
178                         snappy={times={[2]=0.70, [3]=0.30}, maxwear=0.03, maxlevel=1},
179                         choppy={times={[3]=0.70}, maxwear=0.03, 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},
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 })
1116
1117 minetest.register_node("default:chest", {
1118         description = "Chest",
1119         tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1120                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1121         paramtype2 = "facedir",
1122         metadata_name = "chest",
1123         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1124         legacy_facedir_simple = true,
1125         sounds = default.node_sound_wood_defaults(),
1126 })
1127
1128 minetest.register_node("default:chest_locked", {
1129         description = "Locked Chest",
1130         tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1131                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1132         paramtype2 = "facedir",
1133         metadata_name = "locked_chest",
1134         groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
1135         legacy_facedir_simple = true,
1136         sounds = default.node_sound_wood_defaults(),
1137 })
1138
1139 minetest.register_node("default:furnace", {
1140         description = "Furnace",
1141         tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1142                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1143         paramtype2 = "facedir",
1144         metadata_name = "furnace",
1145         groups = {cracky=2},
1146         legacy_facedir_simple = true,
1147         sounds = default.node_sound_stone_defaults(),
1148 })
1149
1150 minetest.register_node("default:cobble", {
1151         description = "Cobble",
1152         tile_images = {"default_cobble.png"},
1153         is_ground_content = true,
1154         groups = {cracky=3},
1155         sounds = default.node_sound_stone_defaults(),
1156 })
1157
1158 minetest.register_node("default:mossycobble", {
1159         description = "Mossy Cobble",
1160         tile_images = {"default_mossycobble.png"},
1161         is_ground_content = true,
1162         groups = {cracky=3},
1163         sounds = default.node_sound_stone_defaults(),
1164 })
1165
1166 minetest.register_node("default:steelblock", {
1167         description = "Steel Block",
1168         tile_images = {"default_steel_block.png"},
1169         is_ground_content = true,
1170         groups = {snappy=1,bendy=2},
1171         sounds = default.node_sound_stone_defaults(),
1172 })
1173
1174 minetest.register_node("default:nyancat", {
1175         description = "Nyancat",
1176         tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1177                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1178         inventory_image = "default_nc_front.png",
1179         paramtype2 = "facedir",
1180         groups = {cracky=2},
1181         legacy_facedir_simple = true,
1182         sounds = default.node_sound_defaults(),
1183 })
1184
1185 minetest.register_node("default:nyancat_rainbow", {
1186         description = "Nyancat Rainbow",
1187         tile_images = {"default_nc_rb.png"},
1188         inventory_image = "default_nc_rb.png",
1189         groups = {cracky=2},
1190         sounds = default.node_sound_defaults(),
1191 })
1192
1193 minetest.register_node("default:sapling", {
1194         description = "Sapling",
1195         drawtype = "plantlike",
1196         visual_scale = 1.0,
1197         tile_images = {"default_sapling.png"},
1198         inventory_image = "default_sapling.png",
1199         wield_image = "default_sapling.png",
1200         paramtype = "light",
1201         walkable = false,
1202         groups = {snappy=2,dig_immediate=3},
1203         sounds = default.node_sound_defaults(),
1204 })
1205
1206 minetest.register_node("default:apple", {
1207         description = "Apple",
1208         drawtype = "plantlike",
1209         visual_scale = 1.0,
1210         tile_images = {"default_apple.png"},
1211         inventory_image = "default_apple.png",
1212         paramtype = "light",
1213         sunlight_propagates = true,
1214         walkable = false,
1215         groups = {fleshy=3,dig_immediate=3},
1216         on_use = minetest.item_eat(4),
1217         sounds = default.node_sound_defaults(),
1218 })
1219
1220 --
1221 -- Crafting items
1222 --
1223
1224 minetest.register_craftitem("default:stick", {
1225         description = "Stick",
1226         inventory_image = "default_stick.png",
1227 })
1228
1229 minetest.register_craftitem("default:paper", {
1230         description = "Paper",
1231         inventory_image = "default_paper.png",
1232 })
1233
1234 minetest.register_craftitem("default:book", {
1235         description = "Book",
1236         inventory_image = "default_book.png",
1237 })
1238
1239 minetest.register_craftitem("default:coal_lump", {
1240         description = "Lump of coal",
1241         inventory_image = "default_coal_lump.png",
1242 })
1243
1244 minetest.register_craftitem("default:iron_lump", {
1245         description = "Lump of iron",
1246         inventory_image = "default_iron_lump.png",
1247 })
1248
1249 minetest.register_craftitem("default:clay_lump", {
1250         description = "Lump of clay",
1251         inventory_image = "default_clay_lump.png",
1252 })
1253
1254 minetest.register_craftitem("default:steel_ingot", {
1255         description = "Steel ingot",
1256         inventory_image = "default_steel_ingot.png",
1257 })
1258
1259 minetest.register_craftitem("default:clay_brick", {
1260         description = "Clay brick",
1261         inventory_image = "default_steel_ingot.png",
1262         inventory_image = "default_clay_brick.png",
1263 })
1264
1265 minetest.register_craftitem("default:scorched_stuff", {
1266         description = "Scorched stuff",
1267         inventory_image = "default_scorched_stuff.png",
1268 })
1269
1270 --
1271 -- Creative inventory
1272 --
1273
1274 minetest.add_to_creative_inventory('default:pick_mese')
1275 minetest.add_to_creative_inventory('default:pick_steel')
1276 minetest.add_to_creative_inventory('default:axe_steel')
1277 minetest.add_to_creative_inventory('default:shovel_steel')
1278
1279 minetest.add_to_creative_inventory('default:torch')
1280 minetest.add_to_creative_inventory('default:cobble')
1281 minetest.add_to_creative_inventory('default:dirt')
1282 minetest.add_to_creative_inventory('default:stone')
1283 minetest.add_to_creative_inventory('default:sand')
1284 minetest.add_to_creative_inventory('default:sandstone')
1285 minetest.add_to_creative_inventory('default:clay')
1286 minetest.add_to_creative_inventory('default:brick')
1287 minetest.add_to_creative_inventory('default:tree')
1288 minetest.add_to_creative_inventory('default:wood')
1289 minetest.add_to_creative_inventory('default:leaves')
1290 minetest.add_to_creative_inventory('default:cactus')
1291 minetest.add_to_creative_inventory('default:papyrus')
1292 minetest.add_to_creative_inventory('default:bookshelf')
1293 minetest.add_to_creative_inventory('default:glass')
1294 minetest.add_to_creative_inventory('default:fence_wood')
1295 minetest.add_to_creative_inventory('default:rail')
1296 minetest.add_to_creative_inventory('default:mese')
1297 minetest.add_to_creative_inventory('default:chest')
1298 minetest.add_to_creative_inventory('default:furnace')
1299 minetest.add_to_creative_inventory('default:sign_wall')
1300 minetest.add_to_creative_inventory('default:water_source')
1301 minetest.add_to_creative_inventory('default:lava_source')
1302 minetest.add_to_creative_inventory('default:ladder')
1303
1304 --
1305 -- Aliases for map generator outputs
1306 -- (required at least by an in-development branch)
1307 --
1308
1309 minetest.register_alias("mapgen_air", "air")
1310 minetest.register_alias("mapgen_stone", "default:stone")
1311 minetest.register_alias("mapgen_tree", "default:tree")
1312 minetest.register_alias("mapgen_leaves", "default:leaves")
1313 minetest.register_alias("mapgen_apple", "default:apple")
1314 minetest.register_alias("mapgen_water_source", "default:water_source")
1315 minetest.register_alias("mapgen_dirt", "default:dirt")
1316 minetest.register_alias("mapgen_sand", "default:sand")
1317 minetest.register_alias("mapgen_gravel", "default:gravel")
1318 minetest.register_alias("mapgen_clay", "default:clay")
1319 minetest.register_alias("mapgen_lava_source", "default:lava_source")
1320 minetest.register_alias("mapgen_cobble", "default:cobble")
1321 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
1322 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
1323 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
1324 minetest.register_alias("mapgen_stone_with_coal", "default:stone_with_coal")
1325 minetest.register_alias("mapgen_stone_with_iron", "default:stone_with_iron")
1326 minetest.register_alias("mapgen_mese", "default:mese")
1327
1328 --
1329 -- Some common functions
1330 --
1331
1332 default.falling_node_names = {}
1333
1334 function nodeupdate_single(p)
1335         n = minetest.env:get_node(p)
1336         if default.falling_node_names[n.name] ~= nil then
1337                 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1338                 n_bottom = minetest.env:get_node(p_bottom)
1339                 if n_bottom.name == "air" then
1340                         minetest.env:remove_node(p)
1341                         minetest.env:add_entity(p, "default:falling_"..n.name)
1342                         nodeupdate(p)
1343                 end
1344         end
1345 end
1346
1347 function nodeupdate(p)
1348         for x = -1,1 do
1349         for y = -1,1 do
1350         for z = -1,1 do
1351                 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1352                 nodeupdate_single(p2)
1353         end
1354         end
1355         end
1356 end
1357
1358 --
1359 -- Falling stuff
1360 --
1361
1362 function default.register_falling_node(nodename, texture)
1363         default.falling_node_names[nodename] = true
1364         -- Override naming conventions for stuff like :default:falling_default:sand
1365         minetest.register_entity(":default:falling_"..nodename, {
1366                 -- Static definition
1367                 physical = true,
1368                 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1369                 visual = "cube",
1370                 textures = {texture,texture,texture,texture,texture,texture},
1371                 -- State
1372                 -- Methods
1373                 on_step = function(self, dtime)
1374                         -- Set gravity
1375                         self.object:setacceleration({x=0, y=-10, z=0})
1376                         -- Turn to actual sand when collides to ground or just move
1377                         local pos = self.object:getpos()
1378                         local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1379                         local bcn = minetest.env:get_node(bcp)
1380                         if bcn.name ~= "air" then
1381                                 -- Turn to a sand node
1382                                 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1383                                 minetest.env:add_node(np, {name=nodename})
1384                                 self.object:remove()
1385                         else
1386                                 -- Do nothing
1387                         end
1388                 end
1389         })
1390 end
1391
1392 default.register_falling_node("default:sand", "default_sand.png")
1393 default.register_falling_node("default:gravel", "default_gravel.png")
1394
1395 --
1396 -- Global callbacks
1397 --
1398
1399 -- Global environment step function
1400 function on_step(dtime)
1401         -- print("on_step")
1402 end
1403 minetest.register_globalstep(on_step)
1404
1405 function on_placenode(p, node)
1406         --print("on_placenode")
1407         nodeupdate(p)
1408 end
1409 minetest.register_on_placenode(on_placenode)
1410
1411 function on_dignode(p, node)
1412         --print("on_dignode")
1413         nodeupdate(p)
1414 end
1415 minetest.register_on_dignode(on_dignode)
1416
1417 function on_punchnode(p, node)
1418 end
1419 minetest.register_on_punchnode(on_punchnode)
1420
1421 local function handle_give_command(cmd, giver, receiver, stackstring)
1422         if not minetest.get_player_privs(giver)["give"] then
1423                 minetest.chat_send_player(giver, "error: you don't have permission to give")
1424                 return
1425         end
1426         minetest.debug("DEBUG: "..cmd..' invoked, stackstring="'..stackstring..'"')
1427         minetest.log(cmd..' invoked, stackstring="'..stackstring..'"')
1428         local itemstack = ItemStack(stackstring)
1429         if itemstack:is_empty() then
1430                 minetest.chat_send_player(giver, 'error: cannot give an empty item')
1431                 return
1432         elseif not itemstack:is_known() then
1433                 minetest.chat_send_player(giver, 'error: cannot give an unknown item')
1434                 return
1435         end
1436         local receiverref = minetest.env:get_player_by_name(receiver)
1437         if receiverref == nil then
1438                 minetest.chat_send_player(giver, receiver..' is not a known player')
1439                 return
1440         end
1441         local leftover = receiverref:get_inventory():add_item("main", itemstack)
1442         if leftover:is_empty() then
1443                 partiality = ""
1444         elseif leftover:get_count() == itemstack:get_count() then
1445                 partiality = "could not be "
1446         else
1447                 partiality = "partially "
1448         end
1449         -- The actual item stack string may be different from what the "giver"
1450         -- entered (e.g. big numbers are always interpreted as 2^16-1).
1451         stackstring = itemstack:to_string()
1452         if giver == receiver then
1453                 minetest.chat_send_player(giver, '"'..stackstring
1454                         ..'" '..partiality..'added to inventory.');
1455         else
1456                 minetest.chat_send_player(giver, '"'..stackstring
1457                         ..'" '..partiality..'added to '..receiver..'\'s inventory.');
1458                 minetest.chat_send_player(receiver, '"'..stackstring
1459                         ..'" '..partiality..'added to inventory.');
1460         end
1461 end
1462
1463 minetest.register_on_chat_message(function(name, message)
1464         --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1465         local cmd = "/giveme"
1466         if message:sub(0, #cmd) == cmd then
1467                 local stackstring = string.match(message, cmd.." (.*)")
1468                 if stackstring == nil then
1469                         minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1470                         return true -- Handled chat message
1471                 end
1472                 handle_give_command(cmd, name, name, stackstring)
1473                 return true
1474         end
1475         local cmd = "/give"
1476         if message:sub(0, #cmd) == cmd then
1477                 local receiver, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1478                 if receiver == nil or stackstring == nil then
1479                         minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1480                         return true -- Handled chat message
1481                 end
1482                 handle_give_command(cmd, name, receiver, stackstring)
1483                 return true
1484         end
1485         local cmd = "/spawnentity"
1486         if message:sub(0, #cmd) == cmd then
1487                 if not minetest.get_player_privs(name)["give"] then
1488                         minetest.chat_send_player(name, "you don't have permission to spawn (give)")
1489                         return true -- Handled chat message
1490                 end
1491                 if not minetest.get_player_privs(name)["interact"] then
1492                         minetest.chat_send_player(name, "you don't have permission to interact")
1493                         return true -- Handled chat message
1494                 end
1495                 local entityname = string.match(message, cmd.." (.*)")
1496                 if entityname == nil then
1497                         minetest.chat_send_player(name, 'usage: '..cmd..' entityname')
1498                         return true -- Handled chat message
1499                 end
1500                 print(cmd..' invoked, entityname="'..entityname..'"')
1501                 local player = minetest.env:get_player_by_name(name)
1502                 if player == nil then
1503                         print("Unable to spawn entity, player is nil")
1504                         return true -- Handled chat message
1505                 end
1506                 local p = player:getpos()
1507                 p.y = p.y + 1
1508                 minetest.env:add_entity(p, entityname)
1509                 minetest.chat_send_player(name, '"'..entityname
1510                                 ..'" spawned.');
1511                 return true -- Handled chat message
1512         end
1513         local cmd = "/pulverize"
1514         if message:sub(0, #cmd) == cmd then
1515                 local player = minetest.env:get_player_by_name(name)
1516                 if player == nil then
1517                         print("Unable to pulverize, player is nil")
1518                         return true -- Handled chat message
1519                 end
1520                 if player:get_wielded_item():is_empty() then
1521                         minetest.chat_send_player(name, 'Unable to pulverize, no item in hand.')
1522                 else
1523                         player:set_wielded_item(nil)
1524                         minetest.chat_send_player(name, 'An item was pulverized.')
1525                 end
1526                 return true
1527         end
1528 end)
1529
1530 -- END