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