Default: Create 'grass', 'dry_grass' groups, use in dirt conversion ABM
[oweals/minetest_game.git] / mods / default / nodes.lua
1 -- mods/default/nodes.lua
2
3
4 --[[ Node name convention:
5
6 Although many node names are in combined-word form, the required form for new
7 node names is words separated by underscores. If both forms are used in written
8 language (for example pinewood and pine wood) the underscore form should be used.
9
10 --]]
11
12
13 --[[ Index:
14
15 Stone
16 -----
17 (1. Material 2. Cobble variant 3. Brick variant 4. Modified forms)
18
19 default:stone
20 default:cobble
21 default:stonebrick
22 default:mossycobble
23
24 default:desert_stone
25 default:desert_cobble
26 default:desert_stonebrick
27
28 default:sandstone
29 default:sandstonebrick
30
31 default:obsidian
32 default:obsidianbrick
33
34 Soft / Non-Stone
35 ----------------
36 (1. Material 2. Modified forms)
37
38 default:dirt
39 default:dirt_with_grass
40 default:dirt_with_grass_footsteps
41 default:dirt_with_dry_grass
42 default:dirt_with_snow
43
44 default:sand
45 default:desert_sand
46
47 default:gravel
48
49 default:clay
50
51 default:snow
52 default:snowblock
53
54 default:ice
55
56 Trees
57 -----
58 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits)
59
60 default:tree
61 default:wood
62 default:leaves
63 default:sapling
64 default:apple
65
66 default:jungletree
67 default:junglewood
68 default:jungleleaves
69 default:junglesapling
70
71 default:pine_tree
72 default:pine_wood
73 default:pine_needles
74 default:pine_sapling
75
76 default:acacia_tree
77 default:acacia_wood
78 default:acacia_leaves
79 default:acacia_sapling
80
81 default:aspen_tree
82 default:aspen_wood
83 default:aspen_leaves
84 default:aspen_sapling
85
86 Ores
87 ----
88 (1. In stone 2. Blocks)
89
90 default:stone_with_coal
91 default:coalblock
92
93 default:stone_with_iron
94 default:steelblock
95
96 default:stone_with_copper
97 default:copperblock
98 default:bronzeblock
99
100 default:stone_with_gold
101 default:goldblock
102
103 default:stone_with_mese
104 default:mese
105
106 default:stone_with_diamond
107 default:diamondblock
108
109 Plantlife (non-cubic)
110 ---------------------
111
112 default:cactus
113 default:papyrus
114 default:dry_shrub
115 default:junglegrass
116
117 default:grass_1
118 default:grass_2
119 default:grass_3
120 default:grass_4
121 default:grass_5
122
123 default:dry_grass_1
124 default:dry_grass_2
125 default:dry_grass_3
126 default:dry_grass_4
127 default:dry_grass_5
128
129 Liquids
130 -------
131 (1. Source 2. Flowing)
132
133 default:water_source
134 default:water_flowing
135
136 default:river_water_source
137 default:river_water_flowing
138
139 default:lava_source
140 default:lava_flowing
141
142 Tools / "Advanced" crafting / Non-"natural"
143 -------------------------------------------
144
145 default:torch
146
147 default:chest
148 default:chest_locked
149
150 default:bookshelf
151
152 default:sign_wall_wood
153 default:sign_wall_steel
154
155 default:ladder_wood
156 default:ladder_steel
157
158 default:fence_wood
159 default:fence_acacia_wood
160 default:fence_junglewood
161 default:fence_pine_wood
162 default:fence_aspen_wood
163
164 default:glass
165 default:obsidian_glass
166
167 default:rail
168
169 default:brick
170
171 default:meselamp
172
173 Misc
174 ----
175
176 default:cloud
177 default:nyancat
178 default:nyancat_rainbow
179
180 --]]
181
182 --
183 -- Stone
184 --
185
186 minetest.register_node("default:stone", {
187         description = "Stone",
188         tiles = {"default_stone.png"},
189         groups = {cracky = 3, stone = 1},
190         drop = 'default:cobble',
191         legacy_mineral = true,
192         sounds = default.node_sound_stone_defaults(),
193 })
194
195 minetest.register_node("default:cobble", {
196         description = "Cobblestone",
197         tiles = {"default_cobble.png"},
198         is_ground_content = false,
199         groups = {cracky = 3, stone = 2},
200         sounds = default.node_sound_stone_defaults(),
201 })
202
203 minetest.register_node("default:stonebrick", {
204         description = "Stone Brick",
205         tiles = {"default_stone_brick.png"},
206         is_ground_content = false,
207         groups = {cracky = 2, stone = 1},
208         sounds = default.node_sound_stone_defaults(),
209 })
210
211 minetest.register_node("default:mossycobble", {
212         description = "Mossy Cobblestone",
213         tiles = {"default_mossycobble.png"},
214         is_ground_content = false,
215         groups = {cracky = 3, stone = 1},
216         sounds = default.node_sound_stone_defaults(),
217 })
218
219
220 minetest.register_node("default:desert_stone", {
221         description = "Desert Stone",
222         tiles = {"default_desert_stone.png"},
223         groups = {cracky = 3, stone = 1},
224         drop = 'default:desert_cobble',
225         legacy_mineral = true,
226         sounds = default.node_sound_stone_defaults(),
227 })
228
229 minetest.register_node("default:desert_cobble", {
230         description = "Desert Cobblestone",
231         tiles = {"default_desert_cobble.png"},
232         is_ground_content = false,
233         groups = {cracky = 3, stone = 2},
234         sounds = default.node_sound_stone_defaults(),
235 })
236
237 minetest.register_node("default:desert_stonebrick", {
238         description = "Desert Stone Brick",
239         tiles = {"default_desert_stone_brick.png"},
240         is_ground_content = false,
241         groups = {cracky = 2, stone = 1},
242         sounds = default.node_sound_stone_defaults(),
243 })
244
245
246 minetest.register_node("default:sandstone", {
247         description = "Sandstone",
248         tiles = {"default_sandstone.png"},
249         groups = {crumbly = 2, cracky = 3},
250         sounds = default.node_sound_stone_defaults(),
251 })
252
253 minetest.register_node("default:sandstonebrick", {
254         description = "Sandstone Brick",
255         tiles = {"default_sandstone_brick.png"},
256         is_ground_content = false,
257         groups = {cracky = 2},
258         sounds = default.node_sound_stone_defaults(),
259 })
260
261
262 minetest.register_node("default:obsidian", {
263         description = "Obsidian",
264         tiles = {"default_obsidian.png"},
265         sounds = default.node_sound_stone_defaults(),
266         groups = {cracky = 1, level = 2},
267 })
268
269 minetest.register_node("default:obsidianbrick", {
270         description = "Obsidian Brick",
271         tiles = {"default_obsidian_brick.png"},
272         is_ground_content = false,
273         sounds = default.node_sound_stone_defaults(),
274         groups = {cracky = 1, level = 2},
275 })
276
277 --
278 -- Soft / Non-Stone
279 --
280
281 minetest.register_node("default:dirt", {
282         description = "Dirt",
283         tiles = {"default_dirt.png"},
284         groups = {crumbly = 3, soil = 1},
285         sounds = default.node_sound_dirt_defaults(),
286 })
287
288 minetest.register_node("default:dirt_with_grass", {
289         description = "Dirt with Grass",
290         tiles = {"default_grass.png", "default_dirt.png",
291                 {name = "default_dirt.png^default_grass_side.png",
292                         tileable_vertical = false}},
293         groups = {crumbly = 3, soil = 1},
294         drop = 'default:dirt',
295         sounds = default.node_sound_dirt_defaults({
296                 footstep = {name = "default_grass_footstep", gain = 0.25},
297         }),
298 })
299
300 minetest.register_node("default:dirt_with_grass_footsteps", {
301         description = "Dirt with Grass and Footsteps",
302         tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
303                 {name = "default_dirt.png^default_grass_side.png",
304                         tileable_vertical = false}},
305         groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1},
306         drop = 'default:dirt',
307         sounds = default.node_sound_dirt_defaults({
308                 footstep = {name = "default_grass_footstep", gain = 0.25},
309         }),
310 })
311
312 minetest.register_node("default:dirt_with_dry_grass", {
313         description = "Dirt with Dry Grass",
314         tiles = {"default_dry_grass.png",
315                 "default_dirt.png",
316                 {name = "default_dirt.png^default_dry_grass_side.png",
317                         tileable_vertical = false}},
318         groups = {crumbly = 3, soil = 1},
319         drop = 'default:dirt',
320         sounds = default.node_sound_dirt_defaults({
321                 footstep = {name = "default_grass_footstep", gain = 0.4},
322         }),
323 })
324
325 minetest.register_node("default:dirt_with_snow", {
326         description = "Dirt with Snow",
327         tiles = {"default_snow.png", "default_dirt.png",
328                 {name = "default_dirt.png^default_snow_side.png",
329                         tileable_vertical = false}},
330         groups = {crumbly = 3, soil = 1},
331         drop = 'default:dirt',
332         sounds = default.node_sound_dirt_defaults({
333                 footstep = {name = "default_snow_footstep", gain = 0.15},
334         }),
335 })
336
337 minetest.register_node("default:sand", {
338         description = "Sand",
339         tiles = {"default_sand.png"},
340         groups = {crumbly = 3, falling_node = 1, sand = 1},
341         sounds = default.node_sound_sand_defaults(),
342 })
343
344 minetest.register_node("default:desert_sand", {
345         description = "Desert Sand",
346         tiles = {"default_desert_sand.png"},
347         groups = {crumbly = 3, falling_node = 1, sand = 1},
348         sounds = default.node_sound_sand_defaults(),
349 })
350
351
352 minetest.register_node("default:gravel", {
353         description = "Gravel",
354         tiles = {"default_gravel.png"},
355         groups = {crumbly = 2, falling_node = 1},
356         sounds = default.node_sound_dirt_defaults({
357                 footstep = {name = "default_gravel_footstep", gain = 0.5},
358                 dug = {name = "default_gravel_footstep", gain = 1.0},
359         }),
360         drop = {
361                 max_items = 1,
362                 items = {
363                         {items = {'default:flint'}, rarity = 16},
364                         {items = {'default:gravel'}}
365                 }
366         }
367 })
368
369 minetest.register_node("default:clay", {
370         description = "Clay",
371         tiles = {"default_clay.png"},
372         groups = {crumbly = 3},
373         drop = 'default:clay_lump 4',
374         sounds = default.node_sound_dirt_defaults(),
375 })
376
377
378 minetest.register_node("default:snow", {
379         description = "Snow",
380         tiles = {"default_snow.png"},
381         inventory_image = "default_snowball.png",
382         wield_image = "default_snowball.png",
383         paramtype = "light",
384         buildable_to = true,
385         floodable = true,
386         drawtype = "nodebox",
387         node_box = {
388                 type = "fixed",
389                 fixed = {
390                         {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
391                 },
392         },
393         groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1},
394         sounds = default.node_sound_dirt_defaults({
395                 footstep = {name = "default_snow_footstep", gain = 0.15},
396                 dug = {name = "default_snow_footstep", gain = 0.2},
397                 dig = {name = "default_snow_footstep", gain = 0.2}
398         }),
399
400         on_construct = function(pos)
401                 pos.y = pos.y - 1
402                 if minetest.get_node(pos).name == "default:dirt_with_grass" then
403                         minetest.set_node(pos, {name = "default:dirt_with_snow"})
404                 end
405         end,
406 })
407
408 minetest.register_node("default:snowblock", {
409         description = "Snow Block",
410         tiles = {"default_snow.png"},
411         groups = {crumbly = 3, puts_out_fire = 1},
412         sounds = default.node_sound_dirt_defaults({
413                 footstep = {name = "default_snow_footstep", gain = 0.15},
414                 dug = {name = "default_snow_footstep", gain = 0.2},
415                 dig = {name = "default_snow_footstep", gain = 0.2}
416         }),
417 })
418
419 minetest.register_node("default:ice", {
420         description = "Ice",
421         tiles = {"default_ice.png"},
422         is_ground_content = false,
423         paramtype = "light",
424         groups = {cracky = 3, puts_out_fire = 1},
425         sounds = default.node_sound_glass_defaults(),
426 })
427
428 --
429 -- Trees
430 --
431
432 minetest.register_node("default:tree", {
433         description = "Tree",
434         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
435         paramtype2 = "facedir",
436         is_ground_content = false,
437         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
438         sounds = default.node_sound_wood_defaults(),
439
440         on_place = minetest.rotate_node
441 })
442
443 minetest.register_node("default:wood", {
444         description = "Wooden Planks",
445         tiles = {"default_wood.png"},
446         is_ground_content = false,
447         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
448         sounds = default.node_sound_wood_defaults(),
449 })
450
451 minetest.register_node("default:sapling", {
452         description = "Sapling",
453         drawtype = "plantlike",
454         visual_scale = 1.0,
455         tiles = {"default_sapling.png"},
456         inventory_image = "default_sapling.png",
457         wield_image = "default_sapling.png",
458         paramtype = "light",
459         sunlight_propagates = true,
460         walkable = false,
461         selection_box = {
462                 type = "fixed",
463                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
464         },
465         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
466                 attached_node = 1, sapling = 1},
467         sounds = default.node_sound_leaves_defaults(),
468 })
469
470 minetest.register_node("default:leaves", {
471         description = "Leaves",
472         drawtype = "allfaces_optional",
473         waving = 1,
474         visual_scale = 1.3,
475         tiles = {"default_leaves.png"},
476         special_tiles = {"default_leaves_simple.png"},
477         paramtype = "light",
478         is_ground_content = false,
479         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
480         drop = {
481                 max_items = 1,
482                 items = {
483                         {
484                                 -- player will get sapling with 1/20 chance
485                                 items = {'default:sapling'},
486                                 rarity = 20,
487                         },
488                         {
489                                 -- player will get leaves only if he get no saplings,
490                                 -- this is because max_items is 1
491                                 items = {'default:leaves'},
492                         }
493                 }
494         },
495         sounds = default.node_sound_leaves_defaults(),
496
497         after_place_node = default.after_place_leaves,
498 })
499
500 minetest.register_node("default:apple", {
501         description = "Apple",
502         drawtype = "plantlike",
503         visual_scale = 1.0,
504         tiles = {"default_apple.png"},
505         inventory_image = "default_apple.png",
506         paramtype = "light",
507         sunlight_propagates = true,
508         walkable = false,
509         is_ground_content = false,
510         selection_box = {
511                 type = "fixed",
512                 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
513         },
514         groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
515                 leafdecay = 3, leafdecay_drop = 1},
516         on_use = minetest.item_eat(2),
517         sounds = default.node_sound_leaves_defaults(),
518
519         after_place_node = function(pos, placer, itemstack)
520                 if placer:is_player() then
521                         minetest.set_node(pos, {name = "default:apple", param2 = 1})
522                 end
523         end,
524 })
525
526
527 minetest.register_node("default:jungletree", {
528         description = "Jungle Tree",
529         tiles = {"default_jungletree_top.png", "default_jungletree_top.png",
530                 "default_jungletree.png"},
531         paramtype2 = "facedir",
532         is_ground_content = false,
533         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
534         sounds = default.node_sound_wood_defaults(),
535
536         on_place = minetest.rotate_node
537 })
538
539 minetest.register_node("default:junglewood", {
540         description = "Junglewood Planks",
541         tiles = {"default_junglewood.png"},
542         is_ground_content = false,
543         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
544         sounds = default.node_sound_wood_defaults(),
545 })
546
547 minetest.register_node("default:jungleleaves", {
548         description = "Jungle Leaves",
549         drawtype = "allfaces_optional",
550         waving = 1,
551         visual_scale = 1.3,
552         tiles = {"default_jungleleaves.png"},
553         special_tiles = {"default_jungleleaves_simple.png"},
554         paramtype = "light",
555         is_ground_content = false,
556         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
557         drop = {
558                 max_items = 1,
559                 items = {
560                         {items = {'default:junglesapling'}, rarity = 20},
561                         {items = {'default:jungleleaves'}}
562                 }
563         },
564         sounds = default.node_sound_leaves_defaults(),
565
566         after_place_node = default.after_place_leaves,
567 })
568
569 minetest.register_node("default:junglesapling", {
570         description = "Jungle Sapling",
571         drawtype = "plantlike",
572         visual_scale = 1.0,
573         tiles = {"default_junglesapling.png"},
574         inventory_image = "default_junglesapling.png",
575         wield_image = "default_junglesapling.png",
576         paramtype = "light",
577         sunlight_propagates = true,
578         walkable = false,
579         selection_box = {
580                 type = "fixed",
581                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
582         },
583         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
584                 attached_node = 1, sapling = 1},
585         sounds = default.node_sound_leaves_defaults(),
586 })
587
588
589 minetest.register_node("default:pine_tree", {
590         description = "Pine Tree",
591         tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
592                 "default_pine_tree.png"},
593         paramtype2 = "facedir",
594         is_ground_content = false,
595         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
596         sounds = default.node_sound_wood_defaults(),
597
598         on_place = minetest.rotate_node
599 })
600
601 minetest.register_node("default:pine_wood", {
602         description = "Pine Wood Planks",
603         tiles = {"default_pine_wood.png"},
604         is_ground_content = false,
605         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
606         sounds = default.node_sound_wood_defaults(),
607 })
608
609 minetest.register_node("default:pine_needles",{
610         description = "Pine Needles",
611         drawtype = "allfaces_optional",
612         visual_scale = 1.3,
613         tiles = {"default_pine_needles.png"},
614         waving = 1,
615         paramtype = "light",
616         is_ground_content = false,
617         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
618         drop = {
619                 max_items = 1,
620                 items = {
621                         {items = {"default:pine_sapling"}, rarity = 20},
622                         {items = {"default:pine_needles"}}
623                 }
624         },
625         sounds = default.node_sound_leaves_defaults(),
626
627         after_place_node = default.after_place_leaves,
628 })
629
630 minetest.register_node("default:pine_sapling", {
631         description = "Pine Sapling",
632         drawtype = "plantlike",
633         visual_scale = 1.0,
634         tiles = {"default_pine_sapling.png"},
635         inventory_image = "default_pine_sapling.png",
636         wield_image = "default_pine_sapling.png",
637         paramtype = "light",
638         sunlight_propagates = true,
639         walkable = false,
640         selection_box = {
641                 type = "fixed",
642                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
643         },
644         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
645                 attached_node = 1, sapling = 1},
646         sounds = default.node_sound_leaves_defaults(),
647 })
648
649
650 minetest.register_node("default:acacia_tree", {
651         description = "Acacia Tree",
652         tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
653                 "default_acacia_tree.png"},
654         paramtype2 = "facedir",
655         is_ground_content = false,
656         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
657         sounds = default.node_sound_wood_defaults(),
658
659         on_place = minetest.rotate_node
660 })
661
662 minetest.register_node("default:acacia_wood", {
663         description = "Acacia Wood Planks",
664         tiles = {"default_acacia_wood.png"},
665         is_ground_content = false,
666         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
667         sounds = default.node_sound_wood_defaults(),
668 })
669
670 minetest.register_node("default:acacia_leaves", {
671         description = "Acacia Leaves",
672         drawtype = "allfaces_optional",
673         visual_scale = 1.3,
674         tiles = {"default_acacia_leaves.png"},
675         waving = 1,
676         paramtype = "light",
677         is_ground_content = false,
678         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
679         drop = {
680                 max_items = 1,
681                 items = {
682                         {items = {"default:acacia_sapling"}, rarity = 20},
683                         {items = {"default:acacia_leaves"}}
684                 }
685         },
686         sounds = default.node_sound_leaves_defaults(),
687
688         after_place_node = default.after_place_leaves,
689 })
690
691 minetest.register_node("default:acacia_sapling", {
692         description = "Acacia Tree Sapling",
693         drawtype = "plantlike",
694         visual_scale = 1.0,
695         tiles = {"default_acacia_sapling.png"},
696         inventory_image = "default_acacia_sapling.png",
697         wield_image = "default_acacia_sapling.png",
698         paramtype = "light",
699         sunlight_propagates = true,
700         walkable = false,
701         selection_box = {
702                 type = "fixed",
703                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
704         },
705         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
706                 attached_node = 1, sapling = 1},
707         sounds = default.node_sound_leaves_defaults(),
708 })
709
710 minetest.register_node("default:aspen_tree", {
711         description = "Aspen Tree",
712         tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
713                 "default_aspen_tree.png"},
714         paramtype2 = "facedir",
715         is_ground_content = false,
716         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
717         sounds = default.node_sound_wood_defaults(),
718
719         on_place = minetest.rotate_node
720 })
721
722 minetest.register_node("default:aspen_wood", {
723         description = "Aspen Wood Planks",
724         tiles = {"default_aspen_wood.png"},
725         is_ground_content = false,
726         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
727         sounds = default.node_sound_wood_defaults(),
728 })
729
730 minetest.register_node("default:aspen_leaves", {
731         description = "Aspen Leaves",
732         drawtype = "allfaces_optional",
733         visual_scale = 1.3,
734         tiles = {"default_aspen_leaves.png"},
735         waving = 1,
736         paramtype = "light",
737         is_ground_content = false,
738         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
739         drop = {
740                 max_items = 1,
741                 items = {
742                         {items = {"default:aspen_sapling"}, rarity = 20},
743                         {items = {"default:aspen_leaves"}}
744                 }
745         },
746         sounds = default.node_sound_leaves_defaults(),
747
748         after_place_node = default.after_place_leaves,
749 })
750
751 minetest.register_node("default:aspen_sapling", {
752         description = "Aspen Tree Sapling",
753         drawtype = "plantlike",
754         visual_scale = 1.0,
755         tiles = {"default_aspen_sapling.png"},
756         inventory_image = "default_aspen_sapling.png",
757         wield_image = "default_aspen_sapling.png",
758         paramtype = "light",
759         sunlight_propagates = true,
760         walkable = false,
761         selection_box = {
762                 type = "fixed",
763                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
764         },
765         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
766                 attached_node = 1, sapling = 1},
767         sounds = default.node_sound_leaves_defaults(),
768 })
769 --
770 -- Ores
771 --
772
773 minetest.register_node("default:stone_with_coal", {
774         description = "Coal Ore",
775         tiles = {"default_stone.png^default_mineral_coal.png"},
776         groups = {cracky = 3},
777         drop = 'default:coal_lump',
778         sounds = default.node_sound_stone_defaults(),
779 })
780
781 minetest.register_node("default:coalblock", {
782         description = "Coal Block",
783         tiles = {"default_coal_block.png"},
784         is_ground_content = false,
785         groups = {cracky = 3},
786         sounds = default.node_sound_stone_defaults(),
787 })
788
789
790 minetest.register_node("default:stone_with_iron", {
791         description = "Iron Ore",
792         tiles = {"default_stone.png^default_mineral_iron.png"},
793         groups = {cracky = 2},
794         drop = 'default:iron_lump',
795         sounds = default.node_sound_stone_defaults(),
796 })
797
798 minetest.register_node("default:steelblock", {
799         description = "Steel Block",
800         tiles = {"default_steel_block.png"},
801         is_ground_content = false,
802         groups = {cracky = 1, level = 2},
803         sounds = default.node_sound_stone_defaults(),
804 })
805
806
807 minetest.register_node("default:stone_with_copper", {
808         description = "Copper Ore",
809         tiles = {"default_stone.png^default_mineral_copper.png"},
810         groups = {cracky = 2},
811         drop = 'default:copper_lump',
812         sounds = default.node_sound_stone_defaults(),
813 })
814
815 minetest.register_node("default:copperblock", {
816         description = "Copper Block",
817         tiles = {"default_copper_block.png"},
818         is_ground_content = false,
819         groups = {cracky = 1, level = 2},
820         sounds = default.node_sound_stone_defaults(),
821 })
822
823 minetest.register_node("default:bronzeblock", {
824         description = "Bronze Block",
825         tiles = {"default_bronze_block.png"},
826         is_ground_content = false,
827         groups = {cracky = 1, level = 2},
828         sounds = default.node_sound_stone_defaults(),
829 })
830
831
832 minetest.register_node("default:stone_with_mese", {
833         description = "Mese Ore",
834         tiles = {"default_stone.png^default_mineral_mese.png"},
835         groups = {cracky = 1},
836         drop = "default:mese_crystal",
837         sounds = default.node_sound_stone_defaults(),
838 })
839
840 minetest.register_node("default:mese", {
841         description = "Mese Block",
842         tiles = {"default_mese_block.png"},
843         paramtype = "light",
844         groups = {cracky = 1, level = 2},
845         sounds = default.node_sound_stone_defaults(),
846         light_source = 3,
847 })
848
849
850 minetest.register_node("default:stone_with_gold", {
851         description = "Gold Ore",
852         tiles = {"default_stone.png^default_mineral_gold.png"},
853         groups = {cracky = 2},
854         drop = "default:gold_lump",
855         sounds = default.node_sound_stone_defaults(),
856 })
857
858 minetest.register_node("default:goldblock", {
859         description = "Gold Block",
860         tiles = {"default_gold_block.png"},
861         is_ground_content = false,
862         groups = {cracky = 1},
863         sounds = default.node_sound_stone_defaults(),
864 })
865
866
867 minetest.register_node("default:stone_with_diamond", {
868         description = "Diamond Ore",
869         tiles = {"default_stone.png^default_mineral_diamond.png"},
870         groups = {cracky = 1},
871         drop = "default:diamond",
872         sounds = default.node_sound_stone_defaults(),
873 })
874
875 minetest.register_node("default:diamondblock", {
876         description = "Diamond Block",
877         tiles = {"default_diamond_block.png"},
878         is_ground_content = false,
879         groups = {cracky = 1, level = 3},
880         sounds = default.node_sound_stone_defaults(),
881 })
882
883 --
884 -- Plantlife (non-cubic)
885 --
886
887 minetest.register_node("default:cactus", {
888         description = "Cactus",
889         tiles = {"default_cactus_top.png", "default_cactus_top.png",
890                 "default_cactus_side.png"},
891         paramtype2 = "facedir",
892         groups = {snappy = 1, choppy = 3},
893         sounds = default.node_sound_wood_defaults(),
894         on_place = minetest.rotate_node,
895 })
896
897 minetest.register_node("default:papyrus", {
898         description = "Papyrus",
899         drawtype = "plantlike",
900         tiles = {"default_papyrus.png"},
901         inventory_image = "default_papyrus.png",
902         wield_image = "default_papyrus.png",
903         paramtype = "light",
904         sunlight_propagates = true,
905         walkable = false,
906         selection_box = {
907                 type = "fixed",
908                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
909         },
910         groups = {snappy = 3, flammable = 2},
911         sounds = default.node_sound_leaves_defaults(),
912
913         after_dig_node = function(pos, node, metadata, digger)
914                 default.dig_up(pos, node, digger)
915         end,
916 })
917
918 minetest.register_node("default:dry_shrub", {
919         description = "Dry Shrub",
920         drawtype = "plantlike",
921         waving = 1,
922         visual_scale = 1.0,
923         tiles = {"default_dry_shrub.png"},
924         inventory_image = "default_dry_shrub.png",
925         wield_image = "default_dry_shrub.png",
926         paramtype = "light",
927         sunlight_propagates = true,
928         walkable = false,
929         buildable_to = true,
930         groups = {snappy = 3, flammable = 3, attached_node = 1},
931         sounds = default.node_sound_leaves_defaults(),
932         selection_box = {
933                 type = "fixed",
934                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
935         },
936 })
937
938 minetest.register_node("default:junglegrass", {
939         description = "Jungle Grass",
940         drawtype = "plantlike",
941         waving = 1,
942         visual_scale = 1.3,
943         tiles = {"default_junglegrass.png"},
944         inventory_image = "default_junglegrass.png",
945         wield_image = "default_junglegrass.png",
946         paramtype = "light",
947         sunlight_propagates = true,
948         walkable = false,
949         buildable_to = true,
950         groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1},
951         sounds = default.node_sound_leaves_defaults(),
952         selection_box = {
953                 type = "fixed",
954                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
955         },
956 })
957
958
959 minetest.register_node("default:grass_1", {
960         description = "Grass",
961         drawtype = "plantlike",
962         waving = 1,
963         tiles = {"default_grass_1.png"},
964         -- Use texture of a taller grass stage in inventory
965         inventory_image = "default_grass_3.png",
966         wield_image = "default_grass_3.png",
967         paramtype = "light",
968         sunlight_propagates = true,
969         walkable = false,
970         buildable_to = true,
971         groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1},
972         sounds = default.node_sound_leaves_defaults(),
973         selection_box = {
974                 type = "fixed",
975                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
976         },
977
978         on_place = function(itemstack, placer, pointed_thing)
979                 -- place a random grass node
980                 local stack = ItemStack("default:grass_" .. math.random(1,5))
981                 local ret = minetest.item_place(stack, placer, pointed_thing)
982                 return ItemStack("default:grass_1 " ..
983                         itemstack:get_count() - (1 - ret:get_count()))
984         end,
985 })
986
987 for i = 2, 5 do
988         minetest.register_node("default:grass_" .. i, {
989                 description = "Grass",
990                 drawtype = "plantlike",
991                 waving = 1,
992                 tiles = {"default_grass_" .. i .. ".png"},
993                 inventory_image = "default_grass_" .. i .. ".png",
994                 wield_image = "default_grass_" .. i .. ".png",
995                 paramtype = "light",
996                 sunlight_propagates = true,
997                 walkable = false,
998                 buildable_to = true,
999                 drop = "default:grass_1",
1000                 groups = {snappy = 3, flora = 1, attached_node = 1,
1001                         not_in_creative_inventory = 1, grass = 1},
1002                 sounds = default.node_sound_leaves_defaults(),
1003                 selection_box = {
1004                         type = "fixed",
1005                         fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1006                 },
1007         })
1008 end
1009
1010
1011 minetest.register_node("default:dry_grass_1", {
1012         description = "Dry Grass",
1013         drawtype = "plantlike",
1014         waving = 1,
1015         tiles = {"default_dry_grass_1.png"},
1016         inventory_image = "default_dry_grass_3.png",
1017         wield_image = "default_dry_grass_3.png",
1018         paramtype = "light",
1019         sunlight_propagates = true,
1020         walkable = false,
1021         buildable_to = true,
1022         groups = {snappy = 3, flammable = 3, flora = 1,
1023                 attached_node = 1, dry_grass = 1},
1024         sounds = default.node_sound_leaves_defaults(),
1025         selection_box = {
1026                 type = "fixed",
1027                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1028         },
1029
1030         on_place = function(itemstack, placer, pointed_thing)
1031                 -- place a random dry grass node
1032                 local stack = ItemStack("default:dry_grass_" .. math.random(1, 5))
1033                 local ret = minetest.item_place(stack, placer, pointed_thing)
1034                 return ItemStack("default:dry_grass_1 " ..
1035                         itemstack:get_count() - (1 - ret:get_count()))
1036         end,
1037 })
1038
1039 for i = 2, 5 do
1040         minetest.register_node("default:dry_grass_" .. i, {
1041                 description = "Dry Grass",
1042                 drawtype = "plantlike",
1043                 waving = 1,
1044                 tiles = {"default_dry_grass_" .. i .. ".png"},
1045                 inventory_image = "default_dry_grass_" .. i .. ".png",
1046                 wield_image = "default_dry_grass_" .. i .. ".png",
1047                 paramtype = "light",
1048                 sunlight_propagates = true,
1049                 walkable = false,
1050                 buildable_to = true,
1051                 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
1052                         not_in_creative_inventory=1, dry_grass = 1},
1053                 drop = "default:dry_grass_1",
1054                 sounds = default.node_sound_leaves_defaults(),
1055                 selection_box = {
1056                         type = "fixed",
1057                         fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1058                 },
1059         })
1060 end
1061
1062 --
1063 -- Liquids
1064 --
1065
1066 minetest.register_node("default:water_source", {
1067         description = "Water Source",
1068         drawtype = "liquid",
1069         tiles = {
1070                 {
1071                         name = "default_water_source_animated.png",
1072                         animation = {
1073                                 type = "vertical_frames",
1074                                 aspect_w = 16,
1075                                 aspect_h = 16,
1076                                 length = 2.0,
1077                         },
1078                 },
1079         },
1080         special_tiles = {
1081                 -- New-style water source material (mostly unused)
1082                 {
1083                         name = "default_water_source_animated.png",
1084                         animation = {
1085                                 type = "vertical_frames",
1086                                 aspect_w = 16,
1087                                 aspect_h = 16,
1088                                 length = 2.0,
1089                         },
1090                         backface_culling = false,
1091                 },
1092         },
1093         alpha = 160,
1094         paramtype = "light",
1095         walkable = false,
1096         pointable = false,
1097         diggable = false,
1098         buildable_to = true,
1099         is_ground_content = false,
1100         drop = "",
1101         drowning = 1,
1102         liquidtype = "source",
1103         liquid_alternative_flowing = "default:water_flowing",
1104         liquid_alternative_source = "default:water_source",
1105         liquid_viscosity = 1,
1106         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1107         groups = {water = 3, liquid = 3, puts_out_fire = 1},
1108 })
1109
1110 minetest.register_node("default:water_flowing", {
1111         description = "Flowing Water",
1112         drawtype = "flowingliquid",
1113         tiles = {"default_water.png"},
1114         special_tiles = {
1115                 {
1116                         name = "default_water_flowing_animated.png",
1117                         backface_culling = false,
1118                         animation = {
1119                                 type = "vertical_frames",
1120                                 aspect_w = 16,
1121                                 aspect_h = 16,
1122                                 length = 0.8,
1123                         },
1124                 },
1125                 {
1126                         name = "default_water_flowing_animated.png",
1127                         backface_culling = true,
1128                         animation = {
1129                                 type = "vertical_frames",
1130                                 aspect_w = 16,
1131                                 aspect_h = 16,
1132                                 length = 0.8,
1133                         },
1134                 },
1135         },
1136         alpha = 160,
1137         paramtype = "light",
1138         paramtype2 = "flowingliquid",
1139         walkable = false,
1140         pointable = false,
1141         diggable = false,
1142         buildable_to = true,
1143         is_ground_content = false,
1144         drop = "",
1145         drowning = 1,
1146         liquidtype = "flowing",
1147         liquid_alternative_flowing = "default:water_flowing",
1148         liquid_alternative_source = "default:water_source",
1149         liquid_viscosity = 1,
1150         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1151         groups = {water = 3, liquid = 3, puts_out_fire = 1,
1152                 not_in_creative_inventory = 1},
1153 })
1154
1155
1156 minetest.register_node("default:river_water_source", {
1157         description = "River Water Source",
1158         drawtype = "liquid",
1159         tiles = {
1160                 {
1161                         name = "default_river_water_source_animated.png",
1162                         animation = {
1163                                 type = "vertical_frames",
1164                                 aspect_w = 16,
1165                                 aspect_h = 16,
1166                                 length = 2.0,
1167                         },
1168                 },
1169         },
1170         special_tiles = {
1171                 {
1172                         name = "default_river_water_source_animated.png",
1173                         animation = {
1174                                 type = "vertical_frames",
1175                                 aspect_w = 16,
1176                                 aspect_h = 16,
1177                                 length = 2.0,
1178                         },
1179                         backface_culling = false,
1180                 },
1181         },
1182         alpha = 160,
1183         paramtype = "light",
1184         walkable = false,
1185         pointable = false,
1186         diggable = false,
1187         buildable_to = true,
1188         is_ground_content = false,
1189         drop = "",
1190         drowning = 1,
1191         liquidtype = "source",
1192         liquid_alternative_flowing = "default:river_water_flowing",
1193         liquid_alternative_source = "default:river_water_source",
1194         liquid_viscosity = 1,
1195         liquid_renewable = false,
1196         liquid_range = 2,
1197         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1198         groups = {water = 3, liquid = 3, puts_out_fire = 1},
1199 })
1200
1201 minetest.register_node("default:river_water_flowing", {
1202         description = "Flowing River Water",
1203         drawtype = "flowingliquid",
1204         tiles = {"default_river_water.png"},
1205         special_tiles = {
1206                 {
1207                         name = "default_river_water_flowing_animated.png",
1208                         backface_culling = false,
1209                         animation = {
1210                                 type = "vertical_frames",
1211                                 aspect_w = 16,
1212                                 aspect_h = 16,
1213                                 length = 0.8,
1214                         },
1215                 },
1216                 {
1217                         name = "default_river_water_flowing_animated.png",
1218                         backface_culling = true,
1219                         animation = {
1220                                 type = "vertical_frames",
1221                                 aspect_w = 16,
1222                                 aspect_h = 16,
1223                                 length = 0.8,
1224                         },
1225                 },
1226         },
1227         alpha = 160,
1228         paramtype = "light",
1229         paramtype2 = "flowingliquid",
1230         walkable = false,
1231         pointable = false,
1232         diggable = false,
1233         buildable_to = true,
1234         is_ground_content = false,
1235         drop = "",
1236         drowning = 1,
1237         liquidtype = "flowing",
1238         liquid_alternative_flowing = "default:river_water_flowing",
1239         liquid_alternative_source = "default:river_water_source",
1240         liquid_viscosity = 1,
1241         liquid_renewable = false,
1242         liquid_range = 2,
1243         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1244         groups = {water = 3, liquid = 3, puts_out_fire = 1,
1245                 not_in_creative_inventory = 1},
1246 })
1247
1248
1249 minetest.register_node("default:lava_source", {
1250         description = "Lava Source",
1251         drawtype = "liquid",
1252         tiles = {
1253                 {
1254                         name = "default_lava_source_animated.png",
1255                         animation = {
1256                                 type = "vertical_frames",
1257                                 aspect_w = 16,
1258                                 aspect_h = 16,
1259                                 length = 3.0,
1260                         },
1261                 },
1262         },
1263         special_tiles = {
1264                 -- New-style lava source material (mostly unused)
1265                 {
1266                         name = "default_lava_source_animated.png",
1267                         animation = {
1268                                 type = "vertical_frames",
1269                                 aspect_w = 16,
1270                                 aspect_h = 16,
1271                                 length = 3.0,
1272                         },
1273                         backface_culling = false,
1274                 },
1275         },
1276         paramtype = "light",
1277         light_source = default.LIGHT_MAX - 1,
1278         walkable = false,
1279         pointable = false,
1280         diggable = false,
1281         buildable_to = true,
1282         is_ground_content = false,
1283         drop = "",
1284         drowning = 1,
1285         liquidtype = "source",
1286         liquid_alternative_flowing = "default:lava_flowing",
1287         liquid_alternative_source = "default:lava_source",
1288         liquid_viscosity = 7,
1289         liquid_renewable = false,
1290         damage_per_second = 4 * 2,
1291         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1292         groups = {lava = 3, liquid = 2, hot = 3, igniter = 1},
1293 })
1294
1295 minetest.register_node("default:lava_flowing", {
1296         description = "Flowing Lava",
1297         drawtype = "flowingliquid",
1298         tiles = {"default_lava.png"},
1299         special_tiles = {
1300                 {
1301                         name = "default_lava_flowing_animated.png",
1302                         backface_culling = false,
1303                         animation = {
1304                                 type = "vertical_frames",
1305                                 aspect_w = 16,
1306                                 aspect_h = 16,
1307                                 length = 3.3,
1308                         },
1309                 },
1310                 {
1311                         name = "default_lava_flowing_animated.png",
1312                         backface_culling = true,
1313                         animation = {
1314                                 type = "vertical_frames",
1315                                 aspect_w = 16,
1316                                 aspect_h = 16,
1317                                 length = 3.3,
1318                         },
1319                 },
1320         },
1321         paramtype = "light",
1322         paramtype2 = "flowingliquid",
1323         light_source = default.LIGHT_MAX - 1,
1324         walkable = false,
1325         pointable = false,
1326         diggable = false,
1327         buildable_to = true,
1328         is_ground_content = false,
1329         drop = "",
1330         drowning = 1,
1331         liquidtype = "flowing",
1332         liquid_alternative_flowing = "default:lava_flowing",
1333         liquid_alternative_source = "default:lava_source",
1334         liquid_viscosity = 7,
1335         liquid_renewable = false,
1336         damage_per_second = 4 * 2,
1337         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1338         groups = {lava = 3, liquid = 2, hot = 3, igniter = 1,
1339                 not_in_creative_inventory = 1},
1340 })
1341
1342 --
1343 -- Tools / "Advanced" crafting / Non-"natural"
1344 --
1345
1346 minetest.register_node("default:torch", {
1347         description = "Torch",
1348         drawtype = "torchlike",
1349         tiles = {
1350                 {
1351                         name = "default_torch_on_floor_animated.png",
1352                         animation = {
1353                                 type = "vertical_frames",
1354                                 aspect_w = 16,
1355                                 aspect_h = 16,
1356                                 length = 3.0
1357                         },
1358                 },
1359                 {
1360                         name="default_torch_on_ceiling_animated.png",
1361                         animation = {
1362                                 type = "vertical_frames",
1363                                 aspect_w = 16,
1364                                 aspect_h = 16,
1365                                 length = 3.0
1366                         },
1367                 },
1368                 {
1369                         name="default_torch_animated.png",
1370                         animation = {
1371                                 type = "vertical_frames",
1372                                 aspect_w = 16,
1373                                 aspect_h = 16,
1374                                 length = 3.0
1375                         },
1376                 },
1377         },
1378         inventory_image = "default_torch_on_floor.png",
1379         wield_image = "default_torch_on_floor.png",
1380         paramtype = "light",
1381         paramtype2 = "wallmounted",
1382         sunlight_propagates = true,
1383         is_ground_content = false,
1384         walkable = false,
1385         light_source = default.LIGHT_MAX - 1,
1386         selection_box = {
1387                 type = "wallmounted",
1388                 wall_top = {-0.1, 0.5 - 0.6, -0.1, 0.1, 0.5, 0.1},
1389                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5 + 0.6, 0.1},
1390                 wall_side = {-0.5, -0.3, -0.1, -0.5 + 0.3, 0.3, 0.1},
1391         },
1392         groups = {choppy = 2, dig_immediate = 3, flammable = 1, attached_node = 1},
1393         legacy_wallmounted = true,
1394         sounds = default.node_sound_defaults(),
1395 })
1396
1397
1398 local chest_formspec =
1399         "size[8,9]" ..
1400         default.gui_bg ..
1401         default.gui_bg_img ..
1402         default.gui_slots ..
1403         "list[current_name;main;0,0.3;8,4;]" ..
1404         "list[current_player;main;0,4.85;8,1;]" ..
1405         "list[current_player;main;0,6.08;8,3;8]" ..
1406         "listring[current_name;main]" ..
1407         "listring[current_player;main]" ..
1408         default.get_hotbar_bg(0,4.85)
1409
1410 local function get_locked_chest_formspec(pos)
1411         local spos = pos.x .. "," .. pos.y .. "," .. pos.z
1412         local formspec =
1413                 "size[8,9]" ..
1414                 default.gui_bg ..
1415                 default.gui_bg_img ..
1416                 default.gui_slots ..
1417                 "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
1418                 "list[current_player;main;0,4.85;8,1;]" ..
1419                 "list[current_player;main;0,6.08;8,3;8]" ..
1420                 "listring[nodemeta:" .. spos .. ";main]" ..
1421                 "listring[current_player;main]" ..
1422                 default.get_hotbar_bg(0,4.85)
1423  return formspec
1424 end
1425
1426 local function has_locked_chest_privilege(meta, player)
1427         local name = ""
1428         if player then
1429                 if minetest.check_player_privs(player, "protection_bypass") then
1430                         return true
1431                 end
1432                 name = player:get_player_name()
1433         end
1434         if name ~= meta:get_string("owner") then
1435                 return false
1436         end
1437         return true
1438 end
1439
1440 minetest.register_node("default:chest", {
1441         description = "Chest",
1442         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1443                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1444         paramtype2 = "facedir",
1445         groups = {choppy = 2, oddly_breakable_by_hand = 2},
1446         legacy_facedir_simple = true,
1447         is_ground_content = false,
1448         sounds = default.node_sound_wood_defaults(),
1449
1450         on_construct = function(pos)
1451                 local meta = minetest.get_meta(pos)
1452                 meta:set_string("formspec", chest_formspec)
1453                 meta:set_string("infotext", "Chest")
1454                 local inv = meta:get_inventory()
1455                 inv:set_size("main", 8*4)
1456         end,
1457         can_dig = function(pos,player)
1458                 local meta = minetest.get_meta(pos);
1459                 local inv = meta:get_inventory()
1460                 return inv:is_empty("main")
1461         end,
1462         on_metadata_inventory_move = function(pos, from_list, from_index,
1463                         to_list, to_index, count, player)
1464                 minetest.log("action", player:get_player_name() ..
1465                         " moves stuff in chest at " .. minetest.pos_to_string(pos))
1466         end,
1467     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1468                 minetest.log("action", player:get_player_name() ..
1469                         " moves " .. stack:get_name() ..
1470                         " to chest at " .. minetest.pos_to_string(pos))
1471         end,
1472     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1473                 minetest.log("action", player:get_player_name() ..
1474                         " takes " .. stack:get_name() ..
1475                         " from chest at " .. minetest.pos_to_string(pos))
1476         end,
1477 })
1478
1479 minetest.register_node("default:chest_locked", {
1480         description = "Locked Chest",
1481         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1482                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1483         paramtype2 = "facedir",
1484         groups = {choppy = 2, oddly_breakable_by_hand = 2},
1485         legacy_facedir_simple = true,
1486         is_ground_content = false,
1487         sounds = default.node_sound_wood_defaults(),
1488
1489         after_place_node = function(pos, placer)
1490                 local meta = minetest.get_meta(pos)
1491                 meta:set_string("owner", placer:get_player_name() or "")
1492                 meta:set_string("infotext", "Locked Chest (owned by " ..
1493                                 meta:get_string("owner") .. ")")
1494         end,
1495         on_construct = function(pos)
1496                 local meta = minetest.get_meta(pos)
1497                 meta:set_string("infotext", "Locked Chest")
1498                 meta:set_string("owner", "")
1499                 local inv = meta:get_inventory()
1500                 inv:set_size("main", 8 * 4)
1501         end,
1502         can_dig = function(pos,player)
1503                 local meta = minetest.get_meta(pos);
1504                 local inv = meta:get_inventory()
1505                 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
1506         end,
1507         allow_metadata_inventory_move = function(pos, from_list, from_index,
1508                         to_list, to_index, count, player)
1509                 local meta = minetest.get_meta(pos)
1510                 if not has_locked_chest_privilege(meta, player) then
1511                         return 0
1512                 end
1513                 return count
1514         end,
1515     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1516                 local meta = minetest.get_meta(pos)
1517                 if not has_locked_chest_privilege(meta, player) then
1518                         return 0
1519                 end
1520                 return stack:get_count()
1521         end,
1522     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1523                 local meta = minetest.get_meta(pos)
1524                 if not has_locked_chest_privilege(meta, player) then
1525                         return 0
1526                 end
1527                 return stack:get_count()
1528         end,
1529     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1530                 minetest.log("action", player:get_player_name() ..
1531                         " moves " .. stack:get_name() ..
1532                         " to locked chest at " .. minetest.pos_to_string(pos))
1533         end,
1534     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1535                 minetest.log("action", player:get_player_name() ..
1536                         " takes " .. stack:get_name()  ..
1537                         " from locked chest at " .. minetest.pos_to_string(pos))
1538         end,
1539         on_rightclick = function(pos, node, clicker)
1540                 local meta = minetest.get_meta(pos)
1541                 if has_locked_chest_privilege(meta, clicker) then
1542                         minetest.show_formspec(
1543                                 clicker:get_player_name(),
1544                                 "default:chest_locked",
1545                                 get_locked_chest_formspec(pos)
1546                         )
1547                 end
1548         end,
1549         on_blast = function() end,
1550 })
1551
1552
1553 local bookshelf_formspec =
1554         "size[8,7;]" ..
1555         default.gui_bg ..
1556         default.gui_bg_img ..
1557         default.gui_slots ..
1558         "list[context;books;0,0.3;8,2;]" ..
1559         "list[current_player;main;0,2.85;8,1;]" ..
1560         "list[current_player;main;0,4.08;8,3;8]" ..
1561         "listring[context;books]" ..
1562         "listring[current_player;main]" ..
1563         default.get_hotbar_bg(0,2.85)
1564
1565 minetest.register_node("default:bookshelf", {
1566         description = "Bookshelf",
1567         tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1568         is_ground_content = false,
1569         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
1570         sounds = default.node_sound_wood_defaults(),
1571
1572         on_construct = function(pos)
1573                 local meta = minetest.get_meta(pos)
1574                 meta:set_string("formspec", bookshelf_formspec)
1575                 local inv = meta:get_inventory()
1576                 inv:set_size("books", 8 * 2)
1577         end,
1578         can_dig = function(pos,player)
1579                 local inv = minetest.get_meta(pos):get_inventory()
1580                 return inv:is_empty("books")
1581         end,
1582         allow_metadata_inventory_put = function(pos, listname, index, stack)
1583                 if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
1584                         return stack:get_count()
1585                 end
1586                 return 0
1587         end,
1588         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1589                 minetest.log("action", player:get_player_name() ..
1590                         " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
1591         end,
1592         on_metadata_inventory_put = function(pos, listname, index, stack, player)
1593                 minetest.log("action", player:get_player_name() ..
1594                         " moves stuff to bookshelf at " .. minetest.pos_to_string(pos))
1595         end,
1596         on_metadata_inventory_take = function(pos, listname, index, stack, player)
1597                 minetest.log("action", player:get_player_name() ..
1598                         " takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
1599         end,
1600 })
1601
1602 local function register_sign(material, desc, def)
1603         minetest.register_node("default:sign_wall_" .. material, {
1604                 description = desc .. " Sign",
1605                 drawtype = "nodebox",
1606                 tiles = {"default_sign_wall_" .. material .. ".png"},
1607                 inventory_image = "default_sign_" .. material .. ".png",
1608                 wield_image = "default_sign_" .. material .. ".png",
1609                 paramtype = "light",
1610                 paramtype2 = "wallmounted",
1611                 sunlight_propagates = true,
1612                 is_ground_content = false,
1613                 walkable = false,
1614                 node_box = {
1615                         type = "wallmounted",
1616                         wall_top    = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
1617                         wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
1618                         wall_side   = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
1619                 },
1620                 groups = def.groups,
1621                 legacy_wallmounted = true,
1622                 sounds = def.sounds,
1623
1624                 on_construct = function(pos)
1625                         --local n = minetest.get_node(pos)
1626                         local meta = minetest.get_meta(pos)
1627                         meta:set_string("formspec", "field[text;;${text}]")
1628                         meta:set_string("infotext", "\"\"")
1629                 end,
1630                 on_receive_fields = function(pos, formname, fields, sender)
1631                         --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1632                         local player_name = sender:get_player_name()
1633                         if minetest.is_protected(pos, player_name) then
1634                                 minetest.record_protection_violation(pos, player_name)
1635                                 return
1636                         end
1637                         local meta = minetest.get_meta(pos)
1638                         if not fields.text then return end
1639                         minetest.log("action", (player_name or "") .. " wrote \"" ..
1640                                 fields.text .. "\" to sign at " .. minetest.pos_to_string(pos))
1641                         meta:set_string("text", fields.text)
1642                         meta:set_string("infotext", '"' .. fields.text .. '"')
1643                 end,
1644         })
1645 end
1646
1647 register_sign("wood", "Wooden", {
1648         sounds = default.node_sound_wood_defaults(),
1649         groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3}
1650 })
1651
1652 register_sign("steel", "Steel", {
1653         sounds = default.node_sound_defaults(),
1654         groups = {cracky = 2, attached_node = 1}
1655 })
1656
1657 minetest.register_node("default:ladder_wood", {
1658         description = "Wooden Ladder",
1659         drawtype = "signlike",
1660         tiles = {"default_ladder_wood.png"},
1661         inventory_image = "default_ladder_wood.png",
1662         wield_image = "default_ladder_wood.png",
1663         paramtype = "light",
1664         paramtype2 = "wallmounted",
1665         sunlight_propagates = true,
1666         walkable = false,
1667         climbable = true,
1668         is_ground_content = false,
1669         selection_box = {
1670                 type = "wallmounted",
1671                 --wall_top = = <default>
1672                 --wall_bottom = = <default>
1673                 --wall_side = = <default>
1674         },
1675         groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
1676         legacy_wallmounted = true,
1677         sounds = default.node_sound_wood_defaults(),
1678 })
1679
1680 minetest.register_node("default:ladder_steel", {
1681         description = "Steel Ladder",
1682         drawtype = "signlike",
1683         tiles = {"default_ladder_steel.png"},
1684         inventory_image = "default_ladder_steel.png",
1685         wield_image = "default_ladder_steel.png",
1686         paramtype = "light",
1687         paramtype2 = "wallmounted",
1688         sunlight_propagates = true,
1689         walkable = false,
1690         climbable = true,
1691         is_ground_content = false,
1692         selection_box = {
1693                 type = "wallmounted",
1694                 --wall_top = = <default>
1695                 --wall_bottom = = <default>
1696                 --wall_side = = <default>
1697         },
1698         groups = {cracky = 2},
1699         sounds = default.node_sound_stone_defaults(),
1700 })
1701
1702 default.register_fence("default:fence_wood", {
1703         description = "Wooden Fence",
1704         texture = "default_fence_wood.png",
1705         material = "default:wood",
1706         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1707         sounds = default.node_sound_wood_defaults()
1708 })
1709
1710 default.register_fence("default:fence_acacia_wood", {
1711         description = "Acacia Fence",
1712         texture = "default_fence_acacia_wood.png",
1713         material = "default:acacia_wood",
1714         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1715         sounds = default.node_sound_wood_defaults()
1716 })
1717
1718 default.register_fence("default:fence_junglewood", {
1719         description = "Junglewood Fence",
1720         texture = "default_fence_junglewood.png",
1721         material = "default:junglewood",
1722         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1723         sounds = default.node_sound_wood_defaults()
1724 })
1725
1726 default.register_fence("default:fence_pine_wood", {
1727         description = "Pine Fence",
1728         texture = "default_fence_pine_wood.png",
1729         material = "default:pine_wood",
1730         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1731         sounds = default.node_sound_wood_defaults()
1732 })
1733
1734 default.register_fence("default:fence_aspen_wood", {
1735         description = "Aspen Fence",
1736         texture = "default_fence_aspen_wood.png",
1737         material = "default:aspen_wood",
1738         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1739         sounds = default.node_sound_wood_defaults()
1740 })
1741
1742 minetest.register_node("default:glass", {
1743         description = "Glass",
1744         drawtype = "glasslike_framed_optional",
1745         tiles = {"default_glass.png", "default_glass_detail.png"},
1746         paramtype = "light",
1747         sunlight_propagates = true,
1748         is_ground_content = false,
1749         groups = {cracky = 3, oddly_breakable_by_hand = 3},
1750         sounds = default.node_sound_glass_defaults(),
1751 })
1752
1753 minetest.register_node("default:obsidian_glass", {
1754         description = "Obsidian Glass",
1755         drawtype = "glasslike_framed_optional",
1756         tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
1757         paramtype = "light",
1758         is_ground_content = false,
1759         sunlight_propagates = true,
1760         sounds = default.node_sound_glass_defaults(),
1761         groups = {cracky = 3},
1762 })
1763
1764
1765 minetest.register_node("default:rail", {
1766         description = "Rail",
1767         drawtype = "raillike",
1768         tiles = {"default_rail.png", "default_rail_curved.png",
1769                 "default_rail_t_junction.png", "default_rail_crossing.png"},
1770         inventory_image = "default_rail.png",
1771         wield_image = "default_rail.png",
1772         paramtype = "light",
1773         sunlight_propagates = true,
1774         walkable = false,
1775         is_ground_content = false,
1776         selection_box = {
1777                 type = "fixed",
1778                 -- but how to specify the dimensions for curved and sideways rails?
1779                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1780         },
1781         groups = {bendy = 2, dig_immediate = 2, attached_node = 1,
1782                 connect_to_raillike = minetest.raillike_group("rail")},
1783 })
1784
1785
1786 minetest.register_node("default:brick", {
1787         description = "Brick Block",
1788         tiles = {"default_brick.png"},
1789         is_ground_content = false,
1790         groups = {cracky = 3},
1791         sounds = default.node_sound_stone_defaults(),
1792 })
1793
1794
1795 minetest.register_node("default:meselamp", {
1796         description = "Mese Lamp",
1797         drawtype = "glasslike",
1798         tiles = {"default_meselamp.png"},
1799         paramtype = "light",
1800         sunlight_propagates = true,
1801         is_ground_content = false,
1802         groups = {cracky = 3, oddly_breakable_by_hand = 3},
1803         sounds = default.node_sound_glass_defaults(),
1804         light_source = default.LIGHT_MAX,
1805 })
1806
1807 --
1808 -- Misc
1809 --
1810
1811 minetest.register_node("default:cloud", {
1812         description = "Cloud",
1813         tiles = {"default_cloud.png"},
1814         is_ground_content = false,
1815         sounds = default.node_sound_defaults(),
1816         groups = {not_in_creative_inventory = 1},
1817 })
1818
1819 minetest.register_node("default:nyancat", {
1820         description = "Nyan Cat",
1821         tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1822                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1823         paramtype2 = "facedir",
1824         groups = {cracky = 2},
1825         is_ground_content = false,
1826         legacy_facedir_simple = true,
1827         sounds = default.node_sound_defaults(),
1828 })
1829
1830 minetest.register_node("default:nyancat_rainbow", {
1831         description = "Nyan Cat Rainbow",
1832         tiles = {
1833                 "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
1834                 "default_nc_rb.png", "default_nc_rb.png"
1835         },
1836         paramtype2 = "facedir",
1837         groups = {cracky = 2},
1838         is_ground_content = false,
1839         sounds = default.node_sound_defaults(),
1840 })