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