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