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