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