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