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