Visual scale: Update plantlike nodes to post-bugfix values
[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         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         tiles = {"default_apple.png"},
585         inventory_image = "default_apple.png",
586         paramtype = "light",
587         sunlight_propagates = true,
588         walkable = false,
589         is_ground_content = false,
590         selection_box = {
591                 type = "fixed",
592                 fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16}
593         },
594         groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
595                 leafdecay = 3, leafdecay_drop = 1},
596         on_use = minetest.item_eat(2),
597         sounds = default.node_sound_leaves_defaults(),
598
599         after_place_node = function(pos, placer, itemstack)
600                 if placer:is_player() then
601                         minetest.set_node(pos, {name = "default:apple", param2 = 1})
602                 end
603         end,
604 })
605
606
607 minetest.register_node("default:jungletree", {
608         description = "Jungle Tree",
609         tiles = {"default_jungletree_top.png", "default_jungletree_top.png",
610                 "default_jungletree.png"},
611         paramtype2 = "facedir",
612         is_ground_content = false,
613         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
614         sounds = default.node_sound_wood_defaults(),
615
616         on_place = minetest.rotate_node
617 })
618
619 minetest.register_node("default:junglewood", {
620         description = "Junglewood Planks",
621         paramtype2 = "facedir",
622         place_param2 = 0,
623         tiles = {"default_junglewood.png"},
624         is_ground_content = false,
625         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
626         sounds = default.node_sound_wood_defaults(),
627 })
628
629 minetest.register_node("default:jungleleaves", {
630         description = "Jungle Leaves",
631         drawtype = "allfaces_optional",
632         waving = 1,
633         tiles = {"default_jungleleaves.png"},
634         special_tiles = {"default_jungleleaves_simple.png"},
635         paramtype = "light",
636         is_ground_content = false,
637         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
638         drop = {
639                 max_items = 1,
640                 items = {
641                         {items = {'default:junglesapling'}, rarity = 20},
642                         {items = {'default:jungleleaves'}}
643                 }
644         },
645         sounds = default.node_sound_leaves_defaults(),
646
647         after_place_node = default.after_place_leaves,
648 })
649
650 minetest.register_node("default:junglesapling", {
651         description = "Jungle Sapling",
652         drawtype = "plantlike",
653         tiles = {"default_junglesapling.png"},
654         inventory_image = "default_junglesapling.png",
655         wield_image = "default_junglesapling.png",
656         paramtype = "light",
657         sunlight_propagates = true,
658         walkable = false,
659         on_timer = default.grow_sapling,
660         selection_box = {
661                 type = "fixed",
662                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
663         },
664         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
665                 attached_node = 1, sapling = 1},
666         sounds = default.node_sound_leaves_defaults(),
667
668         on_construct = function(pos)
669                 minetest.get_node_timer(pos):start(math.random(2400,4800))
670         end,
671
672         on_place = function(itemstack, placer, pointed_thing)
673                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
674                         "default:junglesapling",
675                         -- minp, maxp to be checked, relative to sapling pos
676                         -- minp_relative.y = 1 because sapling pos has been checked
677                         {x = -2, y = 1, z = -2},
678                         {x = 2, y = 15, z = 2},
679                         -- maximum interval of interior volume check
680                         4)
681
682                 return itemstack
683         end,
684 })
685
686
687 minetest.register_node("default:pine_tree", {
688         description = "Pine Tree",
689         tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
690                 "default_pine_tree.png"},
691         paramtype2 = "facedir",
692         is_ground_content = false,
693         groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
694         sounds = default.node_sound_wood_defaults(),
695
696         on_place = minetest.rotate_node
697 })
698
699 minetest.register_node("default:pine_wood", {
700         description = "Pine Wood Planks",
701         paramtype2 = "facedir",
702         place_param2 = 0,
703         tiles = {"default_pine_wood.png"},
704         is_ground_content = false,
705         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
706         sounds = default.node_sound_wood_defaults(),
707 })
708
709 minetest.register_node("default:pine_needles",{
710         description = "Pine Needles",
711         drawtype = "allfaces_optional",
712         tiles = {"default_pine_needles.png"},
713         waving = 1,
714         paramtype = "light",
715         is_ground_content = false,
716         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
717         drop = {
718                 max_items = 1,
719                 items = {
720                         {items = {"default:pine_sapling"}, rarity = 20},
721                         {items = {"default:pine_needles"}}
722                 }
723         },
724         sounds = default.node_sound_leaves_defaults(),
725
726         after_place_node = default.after_place_leaves,
727 })
728
729 minetest.register_node("default:pine_sapling", {
730         description = "Pine Sapling",
731         drawtype = "plantlike",
732         tiles = {"default_pine_sapling.png"},
733         inventory_image = "default_pine_sapling.png",
734         wield_image = "default_pine_sapling.png",
735         paramtype = "light",
736         sunlight_propagates = true,
737         walkable = false,
738         on_timer = default.grow_sapling,
739         selection_box = {
740                 type = "fixed",
741                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
742         },
743         groups = {snappy = 2, dig_immediate = 3, flammable = 3,
744                 attached_node = 1, sapling = 1},
745         sounds = default.node_sound_leaves_defaults(),
746
747         on_construct = function(pos)
748                 minetest.get_node_timer(pos):start(math.random(2400,4800))
749         end,
750
751         on_place = function(itemstack, placer, pointed_thing)
752                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
753                         "default:pine_sapling",
754                         -- minp, maxp to be checked, relative to sapling pos
755                         -- minp_relative.y = 1 because sapling pos has been checked
756                         {x = -2, y = 1, z = -2},
757                         {x = 2, y = 12, z = 2},
758                         -- maximum interval of interior volume check
759                         4)
760
761                 return itemstack
762         end,
763 })
764
765
766 minetest.register_node("default:acacia_tree", {
767         description = "Acacia Tree",
768         tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
769                 "default_acacia_tree.png"},
770         paramtype2 = "facedir",
771         is_ground_content = false,
772         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
773         sounds = default.node_sound_wood_defaults(),
774
775         on_place = minetest.rotate_node
776 })
777
778 minetest.register_node("default:acacia_wood", {
779         description = "Acacia Wood Planks",
780         paramtype2 = "facedir",
781         place_param2 = 0,
782         tiles = {"default_acacia_wood.png"},
783         is_ground_content = false,
784         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
785         sounds = default.node_sound_wood_defaults(),
786 })
787
788 minetest.register_node("default:acacia_leaves", {
789         description = "Acacia Leaves",
790         drawtype = "allfaces_optional",
791         tiles = {"default_acacia_leaves.png"},
792         special_tiles = {"default_acacia_leaves_simple.png"},
793         waving = 1,
794         paramtype = "light",
795         is_ground_content = false,
796         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
797         drop = {
798                 max_items = 1,
799                 items = {
800                         {items = {"default:acacia_sapling"}, rarity = 20},
801                         {items = {"default:acacia_leaves"}}
802                 }
803         },
804         sounds = default.node_sound_leaves_defaults(),
805
806         after_place_node = default.after_place_leaves,
807 })
808
809 minetest.register_node("default:acacia_sapling", {
810         description = "Acacia Tree Sapling",
811         drawtype = "plantlike",
812         tiles = {"default_acacia_sapling.png"},
813         inventory_image = "default_acacia_sapling.png",
814         wield_image = "default_acacia_sapling.png",
815         paramtype = "light",
816         sunlight_propagates = true,
817         walkable = false,
818         on_timer = default.grow_sapling,
819         selection_box = {
820                 type = "fixed",
821                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
822         },
823         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
824                 attached_node = 1, sapling = 1},
825         sounds = default.node_sound_leaves_defaults(),
826
827         on_construct = function(pos)
828                 minetest.get_node_timer(pos):start(math.random(2400,4800))
829         end,
830
831         on_place = function(itemstack, placer, pointed_thing)
832                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
833                         "default:acacia_sapling",
834                         -- minp, maxp to be checked, relative to sapling pos
835                         -- minp_relative.y = 1 because sapling pos has been checked
836                         {x = -4, y = 1, z = -4},
837                         {x = 4, y = 6, z = 4},
838                         -- maximum interval of interior volume check
839                         4)
840
841                 return itemstack
842         end,
843 })
844
845 minetest.register_node("default:aspen_tree", {
846         description = "Aspen Tree",
847         tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
848                 "default_aspen_tree.png"},
849         paramtype2 = "facedir",
850         is_ground_content = false,
851         groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
852         sounds = default.node_sound_wood_defaults(),
853
854         on_place = minetest.rotate_node
855 })
856
857 minetest.register_node("default:aspen_wood", {
858         description = "Aspen Wood Planks",
859         paramtype2 = "facedir",
860         place_param2 = 0,
861         tiles = {"default_aspen_wood.png"},
862         is_ground_content = false,
863         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
864         sounds = default.node_sound_wood_defaults(),
865 })
866
867 minetest.register_node("default:aspen_leaves", {
868         description = "Aspen Leaves",
869         drawtype = "allfaces_optional",
870         tiles = {"default_aspen_leaves.png"},
871         waving = 1,
872         paramtype = "light",
873         is_ground_content = false,
874         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
875         drop = {
876                 max_items = 1,
877                 items = {
878                         {items = {"default:aspen_sapling"}, rarity = 20},
879                         {items = {"default:aspen_leaves"}}
880                 }
881         },
882         sounds = default.node_sound_leaves_defaults(),
883
884         after_place_node = default.after_place_leaves,
885 })
886
887 minetest.register_node("default:aspen_sapling", {
888         description = "Aspen Tree Sapling",
889         drawtype = "plantlike",
890         tiles = {"default_aspen_sapling.png"},
891         inventory_image = "default_aspen_sapling.png",
892         wield_image = "default_aspen_sapling.png",
893         paramtype = "light",
894         sunlight_propagates = true,
895         walkable = false,
896         on_timer = default.grow_sapling,
897         selection_box = {
898                 type = "fixed",
899                 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}
900         },
901         groups = {snappy = 2, dig_immediate = 3, flammable = 3,
902                 attached_node = 1, sapling = 1},
903         sounds = default.node_sound_leaves_defaults(),
904
905         on_construct = function(pos)
906                 minetest.get_node_timer(pos):start(math.random(2400,4800))
907         end,
908
909         on_place = function(itemstack, placer, pointed_thing)
910                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
911                         "default:aspen_sapling",
912                         -- minp, maxp to be checked, relative to sapling pos
913                         -- minp_relative.y = 1 because sapling pos has been checked
914                         {x = -2, y = 1, z = -2},
915                         {x = 2, y = 12, z = 2},
916                         -- maximum interval of interior volume check
917                         4)
918
919                 return itemstack
920         end,
921 })
922
923 --
924 -- Ores
925 --
926
927 minetest.register_node("default:stone_with_coal", {
928         description = "Coal Ore",
929         tiles = {"default_stone.png^default_mineral_coal.png"},
930         groups = {cracky = 3},
931         drop = 'default:coal_lump',
932         sounds = default.node_sound_stone_defaults(),
933 })
934
935 minetest.register_node("default:coalblock", {
936         description = "Coal Block",
937         tiles = {"default_coal_block.png"},
938         is_ground_content = false,
939         groups = {cracky = 3},
940         sounds = default.node_sound_stone_defaults(),
941 })
942
943
944 minetest.register_node("default:stone_with_iron", {
945         description = "Iron Ore",
946         tiles = {"default_stone.png^default_mineral_iron.png"},
947         groups = {cracky = 2},
948         drop = 'default:iron_lump',
949         sounds = default.node_sound_stone_defaults(),
950 })
951
952 minetest.register_node("default:steelblock", {
953         description = "Steel Block",
954         tiles = {"default_steel_block.png"},
955         is_ground_content = false,
956         groups = {cracky = 1, level = 2},
957         sounds = default.node_sound_metal_defaults(),
958 })
959
960
961 minetest.register_node("default:stone_with_copper", {
962         description = "Copper Ore",
963         tiles = {"default_stone.png^default_mineral_copper.png"},
964         groups = {cracky = 2},
965         drop = 'default:copper_lump',
966         sounds = default.node_sound_stone_defaults(),
967 })
968
969 minetest.register_node("default:copperblock", {
970         description = "Copper Block",
971         tiles = {"default_copper_block.png"},
972         is_ground_content = false,
973         groups = {cracky = 1, level = 2},
974         sounds = default.node_sound_metal_defaults(),
975 })
976
977 minetest.register_node("default:bronzeblock", {
978         description = "Bronze Block",
979         tiles = {"default_bronze_block.png"},
980         is_ground_content = false,
981         groups = {cracky = 1, level = 2},
982         sounds = default.node_sound_metal_defaults(),
983 })
984
985
986 minetest.register_node("default:stone_with_mese", {
987         description = "Mese Ore",
988         tiles = {"default_stone.png^default_mineral_mese.png"},
989         groups = {cracky = 1},
990         drop = "default:mese_crystal",
991         sounds = default.node_sound_stone_defaults(),
992 })
993
994 minetest.register_node("default:mese", {
995         description = "Mese Block",
996         tiles = {"default_mese_block.png"},
997         paramtype = "light",
998         groups = {cracky = 1, level = 2},
999         sounds = default.node_sound_stone_defaults(),
1000         light_source = 3,
1001 })
1002
1003
1004 minetest.register_node("default:stone_with_gold", {
1005         description = "Gold Ore",
1006         tiles = {"default_stone.png^default_mineral_gold.png"},
1007         groups = {cracky = 2},
1008         drop = "default:gold_lump",
1009         sounds = default.node_sound_stone_defaults(),
1010 })
1011
1012 minetest.register_node("default:goldblock", {
1013         description = "Gold Block",
1014         tiles = {"default_gold_block.png"},
1015         is_ground_content = false,
1016         groups = {cracky = 1},
1017         sounds = default.node_sound_metal_defaults(),
1018 })
1019
1020
1021 minetest.register_node("default:stone_with_diamond", {
1022         description = "Diamond Ore",
1023         tiles = {"default_stone.png^default_mineral_diamond.png"},
1024         groups = {cracky = 1},
1025         drop = "default:diamond",
1026         sounds = default.node_sound_stone_defaults(),
1027 })
1028
1029 minetest.register_node("default:diamondblock", {
1030         description = "Diamond Block",
1031         tiles = {"default_diamond_block.png"},
1032         is_ground_content = false,
1033         groups = {cracky = 1, level = 3},
1034         sounds = default.node_sound_stone_defaults(),
1035 })
1036
1037 --
1038 -- Plantlife (non-cubic)
1039 --
1040
1041 minetest.register_node("default:cactus", {
1042         description = "Cactus",
1043         tiles = {"default_cactus_top.png", "default_cactus_top.png",
1044                 "default_cactus_side.png"},
1045         paramtype2 = "facedir",
1046         groups = {choppy = 3},
1047         sounds = default.node_sound_wood_defaults(),
1048         on_place = minetest.rotate_node,
1049 })
1050
1051 minetest.register_node("default:papyrus", {
1052         description = "Papyrus",
1053         drawtype = "plantlike",
1054         tiles = {"default_papyrus.png"},
1055         inventory_image = "default_papyrus.png",
1056         wield_image = "default_papyrus.png",
1057         paramtype = "light",
1058         sunlight_propagates = true,
1059         walkable = false,
1060         selection_box = {
1061                 type = "fixed",
1062                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
1063         },
1064         groups = {snappy = 3, flammable = 2},
1065         sounds = default.node_sound_leaves_defaults(),
1066
1067         after_dig_node = function(pos, node, metadata, digger)
1068                 default.dig_up(pos, node, digger)
1069         end,
1070 })
1071
1072 minetest.register_node("default:dry_shrub", {
1073         description = "Dry Shrub",
1074         drawtype = "plantlike",
1075         waving = 1,
1076         tiles = {"default_dry_shrub.png"},
1077         inventory_image = "default_dry_shrub.png",
1078         wield_image = "default_dry_shrub.png",
1079         paramtype = "light",
1080         sunlight_propagates = true,
1081         walkable = false,
1082         buildable_to = true,
1083         groups = {snappy = 3, flammable = 3, attached_node = 1},
1084         sounds = default.node_sound_leaves_defaults(),
1085         selection_box = {
1086                 type = "fixed",
1087                 fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16},
1088         },
1089 })
1090
1091 minetest.register_node("default:junglegrass", {
1092         description = "Jungle Grass",
1093         drawtype = "plantlike",
1094         waving = 1,
1095         visual_scale = 1.69,
1096         tiles = {"default_junglegrass.png"},
1097         inventory_image = "default_junglegrass.png",
1098         wield_image = "default_junglegrass.png",
1099         paramtype = "light",
1100         sunlight_propagates = true,
1101         walkable = false,
1102         buildable_to = true,
1103         groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
1104         sounds = default.node_sound_leaves_defaults(),
1105         selection_box = {
1106                 type = "fixed",
1107                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 1.19, 7 / 16},
1108         },
1109 })
1110
1111
1112 minetest.register_node("default:grass_1", {
1113         description = "Grass",
1114         drawtype = "plantlike",
1115         waving = 1,
1116         tiles = {"default_grass_1.png"},
1117         -- Use texture of a taller grass stage in inventory
1118         inventory_image = "default_grass_3.png",
1119         wield_image = "default_grass_3.png",
1120         paramtype = "light",
1121         sunlight_propagates = true,
1122         walkable = false,
1123         buildable_to = true,
1124         groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
1125         sounds = default.node_sound_leaves_defaults(),
1126         selection_box = {
1127                 type = "fixed",
1128                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
1129         },
1130
1131         on_place = function(itemstack, placer, pointed_thing)
1132                 -- place a random grass node
1133                 local stack = ItemStack("default:grass_" .. math.random(1,5))
1134                 local ret = minetest.item_place(stack, placer, pointed_thing)
1135                 return ItemStack("default:grass_1 " ..
1136                         itemstack:get_count() - (1 - ret:get_count()))
1137         end,
1138 })
1139
1140 for i = 2, 5 do
1141         minetest.register_node("default:grass_" .. i, {
1142                 description = "Grass",
1143                 drawtype = "plantlike",
1144                 waving = 1,
1145                 tiles = {"default_grass_" .. i .. ".png"},
1146                 inventory_image = "default_grass_" .. i .. ".png",
1147                 wield_image = "default_grass_" .. i .. ".png",
1148                 paramtype = "light",
1149                 sunlight_propagates = true,
1150                 walkable = false,
1151                 buildable_to = true,
1152                 drop = "default:grass_1",
1153                 groups = {snappy = 3, flora = 1, attached_node = 1,
1154                         not_in_creative_inventory = 1, grass = 1, flammable = 1},
1155                 sounds = default.node_sound_leaves_defaults(),
1156                 selection_box = {
1157                         type = "fixed",
1158                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
1159                 },
1160         })
1161 end
1162
1163
1164 minetest.register_node("default:dry_grass_1", {
1165         description = "Dry Grass",
1166         drawtype = "plantlike",
1167         waving = 1,
1168         tiles = {"default_dry_grass_1.png"},
1169         inventory_image = "default_dry_grass_3.png",
1170         wield_image = "default_dry_grass_3.png",
1171         paramtype = "light",
1172         sunlight_propagates = true,
1173         walkable = false,
1174         buildable_to = true,
1175         groups = {snappy = 3, flammable = 3, flora = 1,
1176                 attached_node = 1, dry_grass = 1},
1177         sounds = default.node_sound_leaves_defaults(),
1178         selection_box = {
1179                 type = "fixed",
1180                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
1181         },
1182
1183         on_place = function(itemstack, placer, pointed_thing)
1184                 -- place a random dry grass node
1185                 local stack = ItemStack("default:dry_grass_" .. math.random(1, 5))
1186                 local ret = minetest.item_place(stack, placer, pointed_thing)
1187                 return ItemStack("default:dry_grass_1 " ..
1188                         itemstack:get_count() - (1 - ret:get_count()))
1189         end,
1190 })
1191
1192 for i = 2, 5 do
1193         minetest.register_node("default:dry_grass_" .. i, {
1194                 description = "Dry Grass",
1195                 drawtype = "plantlike",
1196                 waving = 1,
1197                 tiles = {"default_dry_grass_" .. i .. ".png"},
1198                 inventory_image = "default_dry_grass_" .. i .. ".png",
1199                 wield_image = "default_dry_grass_" .. i .. ".png",
1200                 paramtype = "light",
1201                 sunlight_propagates = true,
1202                 walkable = false,
1203                 buildable_to = true,
1204                 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
1205                         not_in_creative_inventory=1, dry_grass = 1},
1206                 drop = "default:dry_grass_1",
1207                 sounds = default.node_sound_leaves_defaults(),
1208                 selection_box = {
1209                         type = "fixed",
1210                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16},
1211                 },
1212         })
1213 end
1214
1215
1216 minetest.register_node("default:bush_stem", {
1217         description = "Bush Stem",
1218         drawtype = "plantlike",
1219         visual_scale = 1.41,
1220         tiles = {"default_bush_stem.png"},
1221         inventory_image = "default_bush_stem.png",
1222         wield_image = "default_bush_stem.png",
1223         paramtype = "light",
1224         sunlight_propagates = true,
1225         groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1226         sounds = default.node_sound_wood_defaults(),
1227         selection_box = {
1228                 type = "fixed",
1229                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16},
1230         },
1231 })
1232
1233 minetest.register_node("default:bush_leaves", {
1234         description = "Bush Leaves",
1235         drawtype = "allfaces_optional",
1236         waving = 1,
1237         tiles = {"default_leaves_simple.png"},
1238         paramtype = "light",
1239         groups = {snappy = 3, flammable = 2, leaves = 1},
1240         sounds = default.node_sound_leaves_defaults(),
1241 })
1242
1243 minetest.register_node("default:acacia_bush_stem", {
1244         description = "Acacia Bush Stem",
1245         drawtype = "plantlike",
1246         visual_scale = 1.41,
1247         tiles = {"default_acacia_bush_stem.png"},
1248         inventory_image = "default_acacia_bush_stem.png",
1249         wield_image = "default_acacia_bush_stem.png",
1250         paramtype = "light",
1251         sunlight_propagates = true,
1252         groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1253         sounds = default.node_sound_wood_defaults(),
1254         selection_box = {
1255                 type = "fixed",
1256                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16},
1257         },
1258 })
1259
1260 minetest.register_node("default:acacia_bush_leaves", {
1261         description = "Acacia Bush Leaves",
1262         drawtype = "allfaces_optional",
1263         waving = 1,
1264         tiles = {"default_acacia_leaves_simple.png"},
1265         paramtype = "light",
1266         groups = {snappy = 3, flammable = 2, leaves = 1},
1267         sounds = default.node_sound_leaves_defaults(),
1268 })
1269
1270
1271 --
1272 -- Corals
1273 --
1274
1275 minetest.register_node("default:coral_brown", {
1276         description = "Brown Coral",
1277         tiles = {"default_coral_brown.png"},
1278         groups = {cracky = 3},
1279         drop = "default:coral_skeleton",
1280         sounds = default.node_sound_stone_defaults(),
1281 })
1282
1283 minetest.register_node("default:coral_orange", {
1284         description = "Orange Coral",
1285         tiles = {"default_coral_orange.png"},
1286         groups = {cracky = 3},
1287         drop = "default:coral_skeleton",
1288         sounds = default.node_sound_stone_defaults(),
1289 })
1290
1291 minetest.register_node("default:coral_skeleton", {
1292         description = "Coral Skeleton",
1293         tiles = {"default_coral_skeleton.png"},
1294         groups = {cracky = 3},
1295         sounds = default.node_sound_stone_defaults(),
1296 })
1297
1298
1299 --
1300 -- Liquids
1301 --
1302
1303 minetest.register_node("default:water_source", {
1304         description = "Water Source",
1305         drawtype = "liquid",
1306         tiles = {
1307                 {
1308                         name = "default_water_source_animated.png",
1309                         animation = {
1310                                 type = "vertical_frames",
1311                                 aspect_w = 16,
1312                                 aspect_h = 16,
1313                                 length = 2.0,
1314                         },
1315                 },
1316         },
1317         special_tiles = {
1318                 -- New-style water source material (mostly unused)
1319                 {
1320                         name = "default_water_source_animated.png",
1321                         animation = {
1322                                 type = "vertical_frames",
1323                                 aspect_w = 16,
1324                                 aspect_h = 16,
1325                                 length = 2.0,
1326                         },
1327                         backface_culling = false,
1328                 },
1329         },
1330         alpha = 160,
1331         paramtype = "light",
1332         walkable = false,
1333         pointable = false,
1334         diggable = false,
1335         buildable_to = true,
1336         is_ground_content = false,
1337         drop = "",
1338         drowning = 1,
1339         liquidtype = "source",
1340         liquid_alternative_flowing = "default:water_flowing",
1341         liquid_alternative_source = "default:water_source",
1342         liquid_viscosity = 1,
1343         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1344         groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
1345         sounds = default.node_sound_water_defaults(),
1346 })
1347
1348 minetest.register_node("default:water_flowing", {
1349         description = "Flowing Water",
1350         drawtype = "flowingliquid",
1351         tiles = {"default_water.png"},
1352         special_tiles = {
1353                 {
1354                         name = "default_water_flowing_animated.png",
1355                         backface_culling = false,
1356                         animation = {
1357                                 type = "vertical_frames",
1358                                 aspect_w = 16,
1359                                 aspect_h = 16,
1360                                 length = 0.8,
1361                         },
1362                 },
1363                 {
1364                         name = "default_water_flowing_animated.png",
1365                         backface_culling = true,
1366                         animation = {
1367                                 type = "vertical_frames",
1368                                 aspect_w = 16,
1369                                 aspect_h = 16,
1370                                 length = 0.8,
1371                         },
1372                 },
1373         },
1374         alpha = 160,
1375         paramtype = "light",
1376         paramtype2 = "flowingliquid",
1377         walkable = false,
1378         pointable = false,
1379         diggable = false,
1380         buildable_to = true,
1381         is_ground_content = false,
1382         drop = "",
1383         drowning = 1,
1384         liquidtype = "flowing",
1385         liquid_alternative_flowing = "default:water_flowing",
1386         liquid_alternative_source = "default:water_source",
1387         liquid_viscosity = 1,
1388         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1389         groups = {water = 3, liquid = 3, puts_out_fire = 1,
1390                 not_in_creative_inventory = 1, cools_lava = 1},
1391         sounds = default.node_sound_water_defaults(),
1392 })
1393
1394
1395 minetest.register_node("default:river_water_source", {
1396         description = "River Water Source",
1397         drawtype = "liquid",
1398         tiles = {
1399                 {
1400                         name = "default_river_water_source_animated.png",
1401                         animation = {
1402                                 type = "vertical_frames",
1403                                 aspect_w = 16,
1404                                 aspect_h = 16,
1405                                 length = 2.0,
1406                         },
1407                 },
1408         },
1409         special_tiles = {
1410                 {
1411                         name = "default_river_water_source_animated.png",
1412                         animation = {
1413                                 type = "vertical_frames",
1414                                 aspect_w = 16,
1415                                 aspect_h = 16,
1416                                 length = 2.0,
1417                         },
1418                         backface_culling = false,
1419                 },
1420         },
1421         alpha = 160,
1422         paramtype = "light",
1423         walkable = false,
1424         pointable = false,
1425         diggable = false,
1426         buildable_to = true,
1427         is_ground_content = false,
1428         drop = "",
1429         drowning = 1,
1430         liquidtype = "source",
1431         liquid_alternative_flowing = "default:river_water_flowing",
1432         liquid_alternative_source = "default:river_water_source",
1433         liquid_viscosity = 1,
1434         liquid_renewable = false,
1435         liquid_range = 2,
1436         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1437         groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
1438         sounds = default.node_sound_water_defaults(),
1439 })
1440
1441 minetest.register_node("default:river_water_flowing", {
1442         description = "Flowing River Water",
1443         drawtype = "flowingliquid",
1444         tiles = {"default_river_water.png"},
1445         special_tiles = {
1446                 {
1447                         name = "default_river_water_flowing_animated.png",
1448                         backface_culling = false,
1449                         animation = {
1450                                 type = "vertical_frames",
1451                                 aspect_w = 16,
1452                                 aspect_h = 16,
1453                                 length = 0.8,
1454                         },
1455                 },
1456                 {
1457                         name = "default_river_water_flowing_animated.png",
1458                         backface_culling = true,
1459                         animation = {
1460                                 type = "vertical_frames",
1461                                 aspect_w = 16,
1462                                 aspect_h = 16,
1463                                 length = 0.8,
1464                         },
1465                 },
1466         },
1467         alpha = 160,
1468         paramtype = "light",
1469         paramtype2 = "flowingliquid",
1470         walkable = false,
1471         pointable = false,
1472         diggable = false,
1473         buildable_to = true,
1474         is_ground_content = false,
1475         drop = "",
1476         drowning = 1,
1477         liquidtype = "flowing",
1478         liquid_alternative_flowing = "default:river_water_flowing",
1479         liquid_alternative_source = "default:river_water_source",
1480         liquid_viscosity = 1,
1481         liquid_renewable = false,
1482         liquid_range = 2,
1483         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1484         groups = {water = 3, liquid = 3, puts_out_fire = 1,
1485                 not_in_creative_inventory = 1, cools_lava = 1},
1486         sounds = default.node_sound_water_defaults(),
1487 })
1488
1489
1490 minetest.register_node("default:lava_source", {
1491         description = "Lava Source",
1492         drawtype = "liquid",
1493         tiles = {
1494                 {
1495                         name = "default_lava_source_animated.png",
1496                         animation = {
1497                                 type = "vertical_frames",
1498                                 aspect_w = 16,
1499                                 aspect_h = 16,
1500                                 length = 3.0,
1501                         },
1502                 },
1503         },
1504         special_tiles = {
1505                 -- New-style lava source material (mostly unused)
1506                 {
1507                         name = "default_lava_source_animated.png",
1508                         animation = {
1509                                 type = "vertical_frames",
1510                                 aspect_w = 16,
1511                                 aspect_h = 16,
1512                                 length = 3.0,
1513                         },
1514                         backface_culling = false,
1515                 },
1516         },
1517         paramtype = "light",
1518         light_source = default.LIGHT_MAX - 1,
1519         walkable = false,
1520         pointable = false,
1521         diggable = false,
1522         buildable_to = true,
1523         is_ground_content = false,
1524         drop = "",
1525         drowning = 1,
1526         liquidtype = "source",
1527         liquid_alternative_flowing = "default:lava_flowing",
1528         liquid_alternative_source = "default:lava_source",
1529         liquid_viscosity = 7,
1530         liquid_renewable = false,
1531         damage_per_second = 4 * 2,
1532         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1533         groups = {lava = 3, liquid = 2, igniter = 1},
1534 })
1535
1536 minetest.register_node("default:lava_flowing", {
1537         description = "Flowing Lava",
1538         drawtype = "flowingliquid",
1539         tiles = {"default_lava.png"},
1540         special_tiles = {
1541                 {
1542                         name = "default_lava_flowing_animated.png",
1543                         backface_culling = false,
1544                         animation = {
1545                                 type = "vertical_frames",
1546                                 aspect_w = 16,
1547                                 aspect_h = 16,
1548                                 length = 3.3,
1549                         },
1550                 },
1551                 {
1552                         name = "default_lava_flowing_animated.png",
1553                         backface_culling = true,
1554                         animation = {
1555                                 type = "vertical_frames",
1556                                 aspect_w = 16,
1557                                 aspect_h = 16,
1558                                 length = 3.3,
1559                         },
1560                 },
1561         },
1562         paramtype = "light",
1563         paramtype2 = "flowingliquid",
1564         light_source = default.LIGHT_MAX - 1,
1565         walkable = false,
1566         pointable = false,
1567         diggable = false,
1568         buildable_to = true,
1569         is_ground_content = false,
1570         drop = "",
1571         drowning = 1,
1572         liquidtype = "flowing",
1573         liquid_alternative_flowing = "default:lava_flowing",
1574         liquid_alternative_source = "default:lava_source",
1575         liquid_viscosity = 7,
1576         liquid_renewable = false,
1577         damage_per_second = 4 * 2,
1578         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1579         groups = {lava = 3, liquid = 2, igniter = 1,
1580                 not_in_creative_inventory = 1},
1581 })
1582
1583 --
1584 -- Tools / "Advanced" crafting / Non-"natural"
1585 --
1586
1587 local chest_formspec =
1588         "size[8,9]" ..
1589         default.gui_bg ..
1590         default.gui_bg_img ..
1591         default.gui_slots ..
1592         "list[current_name;main;0,0.3;8,4;]" ..
1593         "list[current_player;main;0,4.85;8,1;]" ..
1594         "list[current_player;main;0,6.08;8,3;8]" ..
1595         "listring[current_name;main]" ..
1596         "listring[current_player;main]" ..
1597         default.get_hotbar_bg(0,4.85)
1598
1599 local function get_locked_chest_formspec(pos)
1600         local spos = pos.x .. "," .. pos.y .. "," .. pos.z
1601         local formspec =
1602                 "size[8,9]" ..
1603                 default.gui_bg ..
1604                 default.gui_bg_img ..
1605                 default.gui_slots ..
1606                 "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
1607                 "list[current_player;main;0,4.85;8,1;]" ..
1608                 "list[current_player;main;0,6.08;8,3;8]" ..
1609                 "listring[nodemeta:" .. spos .. ";main]" ..
1610                 "listring[current_player;main]" ..
1611                 default.get_hotbar_bg(0,4.85)
1612  return formspec
1613 end
1614
1615 local function has_locked_chest_privilege(meta, player)
1616         if player then
1617                 if minetest.check_player_privs(player, "protection_bypass") then
1618                         return true
1619                 end
1620         else
1621                 return false
1622         end
1623
1624         -- is player wielding the right key?
1625         local item = player:get_wielded_item()
1626         if item:get_name() == "default:key" then
1627                 local key_meta = minetest.parse_json(item:get_metadata())
1628                 local secret = meta:get_string("key_lock_secret")
1629                 if secret ~= key_meta.secret then
1630                         return false
1631                 end
1632
1633                 return true
1634         end
1635
1636         if player:get_player_name() ~= meta:get_string("owner") then
1637                 return false
1638         end
1639
1640         return true
1641 end
1642
1643 minetest.register_node("default:chest", {
1644         description = "Chest",
1645         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1646                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1647         paramtype2 = "facedir",
1648         groups = {choppy = 2, oddly_breakable_by_hand = 2},
1649         legacy_facedir_simple = true,
1650         is_ground_content = false,
1651         sounds = default.node_sound_wood_defaults(),
1652
1653         on_construct = function(pos)
1654                 local meta = minetest.get_meta(pos)
1655                 meta:set_string("formspec", chest_formspec)
1656                 local inv = meta:get_inventory()
1657                 inv:set_size("main", 8*4)
1658         end,
1659         can_dig = function(pos,player)
1660                 local meta = minetest.get_meta(pos);
1661                 local inv = meta:get_inventory()
1662                 return inv:is_empty("main")
1663         end,
1664         on_metadata_inventory_move = function(pos, from_list, from_index,
1665                         to_list, to_index, count, player)
1666                 minetest.log("action", player:get_player_name() ..
1667                         " moves stuff in chest at " .. minetest.pos_to_string(pos))
1668         end,
1669     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1670                 minetest.log("action", player:get_player_name() ..
1671                         " moves " .. stack:get_name() ..
1672                         " to chest at " .. minetest.pos_to_string(pos))
1673         end,
1674     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1675                 minetest.log("action", player:get_player_name() ..
1676                         " takes " .. stack:get_name() ..
1677                         " from chest at " .. minetest.pos_to_string(pos))
1678         end,
1679         on_blast = function(pos)
1680                 local drops = {}
1681                 default.get_inventory_drops(pos, "main", drops)
1682                 drops[#drops+1] = "default:chest"
1683                 minetest.remove_node(pos)
1684                 return drops
1685         end,
1686 })
1687
1688 minetest.register_node("default:chest_locked", {
1689         description = "Locked Chest",
1690         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1691                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1692         paramtype2 = "facedir",
1693         groups = {choppy = 2, oddly_breakable_by_hand = 2},
1694         legacy_facedir_simple = true,
1695         is_ground_content = false,
1696         sounds = default.node_sound_wood_defaults(),
1697
1698         after_place_node = function(pos, placer)
1699                 local meta = minetest.get_meta(pos)
1700                 meta:set_string("owner", placer:get_player_name() or "")
1701                 meta:set_string("infotext", "Locked Chest (owned by " ..
1702                                 meta:get_string("owner") .. ")")
1703         end,
1704         on_construct = function(pos)
1705                 local meta = minetest.get_meta(pos)
1706                 meta:set_string("owner", "")
1707                 local inv = meta:get_inventory()
1708                 inv:set_size("main", 8 * 4)
1709         end,
1710         can_dig = function(pos,player)
1711                 local meta = minetest.get_meta(pos);
1712                 local inv = meta:get_inventory()
1713                 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
1714         end,
1715         allow_metadata_inventory_move = function(pos, from_list, from_index,
1716                         to_list, to_index, count, player)
1717                 local meta = minetest.get_meta(pos)
1718                 if not has_locked_chest_privilege(meta, player) then
1719                         return 0
1720                 end
1721                 return count
1722         end,
1723     allow_metadata_inventory_put = function(pos, listname, index, stack, 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 stack:get_count()
1729         end,
1730     allow_metadata_inventory_take = 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     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1738                 minetest.log("action", player:get_player_name() ..
1739                         " moves " .. stack:get_name() ..
1740                         " to locked chest at " .. minetest.pos_to_string(pos))
1741         end,
1742     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1743                 minetest.log("action", player:get_player_name() ..
1744                         " takes " .. stack:get_name()  ..
1745                         " from locked chest at " .. minetest.pos_to_string(pos))
1746         end,
1747         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
1748                 local meta = minetest.get_meta(pos)
1749                 if has_locked_chest_privilege(meta, clicker) then
1750                         minetest.show_formspec(
1751                                 clicker:get_player_name(),
1752                                 "default:chest_locked",
1753                                 get_locked_chest_formspec(pos)
1754                         )
1755                 end
1756                 return itemstack
1757         end,
1758         on_blast = function() end,
1759         on_key_use = function(pos, player)
1760                 local secret = minetest.get_meta(pos):get_string("key_lock_secret")
1761                 local itemstack = player:get_wielded_item()
1762                 local key_meta = minetest.parse_json(itemstack:get_metadata())
1763
1764                 if secret ~= key_meta.secret then
1765                         return
1766                 end
1767
1768                 minetest.show_formspec(
1769                         player:get_player_name(),
1770                         "default:chest_locked",
1771                         get_locked_chest_formspec(pos)
1772                 )
1773         end,
1774         on_skeleton_key_use = function(pos, player, newsecret)
1775                 local meta = minetest.get_meta(pos)
1776                 local owner = meta:get_string("owner")
1777                 local name = player:get_player_name()
1778
1779                 -- verify placer is owner of lockable chest
1780                 if owner ~= name then
1781                         minetest.record_protection_violation(pos, name)
1782                         minetest.chat_send_player(name, "You do not own this chest.")
1783                         return nil
1784                 end
1785
1786                 local secret = meta:get_string("key_lock_secret")
1787                 if secret == "" then
1788                         secret = newsecret
1789                         meta:set_string("key_lock_secret", secret)
1790                 end
1791
1792                 return secret, "a locked chest", owner
1793         end,
1794 })
1795
1796
1797 local bookshelf_formspec =
1798         "size[8,7;]" ..
1799         default.gui_bg ..
1800         default.gui_bg_img ..
1801         default.gui_slots ..
1802         "list[context;books;0,0.3;8,2;]" ..
1803         "list[current_player;main;0,2.85;8,1;]" ..
1804         "list[current_player;main;0,4.08;8,3;8]" ..
1805         "listring[context;books]" ..
1806         "listring[current_player;main]" ..
1807         default.get_hotbar_bg(0,2.85)
1808
1809 local function get_bookshelf_formspec(inv)
1810         local formspec = bookshelf_formspec
1811         local invlist = inv and inv:get_list("books")
1812         -- Inventory slots overlay
1813         local bx, by = 0, 0.3
1814         for i = 1, 16 do
1815                 if i == 9 then
1816                         bx = 0
1817                         by = by + 1
1818                 end
1819                 if not invlist or invlist[i]:is_empty() then
1820                         formspec = formspec ..
1821                                 "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
1822                 end
1823                 bx = bx + 1
1824         end
1825         return formspec
1826 end
1827
1828 minetest.register_node("default:bookshelf", {
1829         description = "Bookshelf",
1830         tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
1831                 "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
1832         paramtype2 = "facedir",
1833         is_ground_content = false,
1834         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
1835         sounds = default.node_sound_wood_defaults(),
1836
1837         on_construct = function(pos)
1838                 local meta = minetest.get_meta(pos)
1839                 meta:set_string("formspec", get_bookshelf_formspec(nil))
1840                 local inv = meta:get_inventory()
1841                 inv:set_size("books", 8 * 2)
1842         end,
1843         can_dig = function(pos,player)
1844                 local inv = minetest.get_meta(pos):get_inventory()
1845                 return inv:is_empty("books")
1846         end,
1847         allow_metadata_inventory_put = function(pos, listname, index, stack)
1848                 if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
1849                         return stack:get_count()
1850                 end
1851                 return 0
1852         end,
1853         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1854                 minetest.log("action", player:get_player_name() ..
1855                         " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
1856                 local meta = minetest.get_meta(pos)
1857                 meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
1858         end,
1859         on_metadata_inventory_put = function(pos, listname, index, stack, player)
1860                 minetest.log("action", player:get_player_name() ..
1861                         " moves stuff to 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_take = function(pos, listname, index, stack, player)
1866                 minetest.log("action", player:get_player_name() ..
1867                         " takes stuff from 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_blast = function(pos)
1872                 local drops = {}
1873                 default.get_inventory_drops(pos, "books", drops)
1874                 drops[#drops+1] = "default:bookshelf"
1875                 minetest.remove_node(pos)
1876                 return drops
1877         end,
1878 })
1879
1880 local function register_sign(material, desc, def)
1881         minetest.register_node("default:sign_wall_" .. material, {
1882                 description = desc .. " Sign",
1883                 drawtype = "nodebox",
1884                 tiles = {"default_sign_wall_" .. material .. ".png"},
1885                 inventory_image = "default_sign_" .. material .. ".png",
1886                 wield_image = "default_sign_" .. material .. ".png",
1887                 paramtype = "light",
1888                 paramtype2 = "wallmounted",
1889                 sunlight_propagates = true,
1890                 is_ground_content = false,
1891                 walkable = false,
1892                 node_box = {
1893                         type = "wallmounted",
1894                         wall_top    = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
1895                         wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
1896                         wall_side   = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
1897                 },
1898                 groups = def.groups,
1899                 legacy_wallmounted = true,
1900                 sounds = def.sounds,
1901
1902                 on_construct = function(pos)
1903                         --local n = minetest.get_node(pos)
1904                         local meta = minetest.get_meta(pos)
1905                         meta:set_string("formspec", "field[text;;${text}]")
1906                 end,
1907                 on_receive_fields = function(pos, formname, fields, sender)
1908                         --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1909                         local player_name = sender:get_player_name()
1910                         if minetest.is_protected(pos, player_name) then
1911                                 minetest.record_protection_violation(pos, player_name)
1912                                 return
1913                         end
1914                         local meta = minetest.get_meta(pos)
1915                         if not fields.text then return end
1916                         minetest.log("action", (player_name or "") .. " wrote \"" ..
1917                                 fields.text .. "\" to sign at " .. minetest.pos_to_string(pos))
1918                         meta:set_string("text", fields.text)
1919                         meta:set_string("infotext", '"' .. fields.text .. '"')
1920                 end,
1921         })
1922 end
1923
1924 register_sign("wood", "Wooden", {
1925         sounds = default.node_sound_wood_defaults(),
1926         groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3}
1927 })
1928
1929 register_sign("steel", "Steel", {
1930         sounds = default.node_sound_metal_defaults(),
1931         groups = {cracky = 2, attached_node = 1}
1932 })
1933
1934 minetest.register_node("default:ladder_wood", {
1935         description = "Wooden Ladder",
1936         drawtype = "signlike",
1937         tiles = {"default_ladder_wood.png"},
1938         inventory_image = "default_ladder_wood.png",
1939         wield_image = "default_ladder_wood.png",
1940         paramtype = "light",
1941         paramtype2 = "wallmounted",
1942         sunlight_propagates = true,
1943         walkable = false,
1944         climbable = true,
1945         is_ground_content = false,
1946         selection_box = {
1947                 type = "wallmounted",
1948                 --wall_top = = <default>
1949                 --wall_bottom = = <default>
1950                 --wall_side = = <default>
1951         },
1952         groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
1953         legacy_wallmounted = true,
1954         sounds = default.node_sound_wood_defaults(),
1955 })
1956
1957 minetest.register_node("default:ladder_steel", {
1958         description = "Steel Ladder",
1959         drawtype = "signlike",
1960         tiles = {"default_ladder_steel.png"},
1961         inventory_image = "default_ladder_steel.png",
1962         wield_image = "default_ladder_steel.png",
1963         paramtype = "light",
1964         paramtype2 = "wallmounted",
1965         sunlight_propagates = true,
1966         walkable = false,
1967         climbable = true,
1968         is_ground_content = false,
1969         selection_box = {
1970                 type = "wallmounted",
1971                 --wall_top = = <default>
1972                 --wall_bottom = = <default>
1973                 --wall_side = = <default>
1974         },
1975         groups = {cracky = 2},
1976         sounds = default.node_sound_metal_defaults(),
1977 })
1978
1979 default.register_fence("default:fence_wood", {
1980         description = "Wooden Fence",
1981         texture = "default_fence_wood.png",
1982         inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
1983         wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
1984         material = "default:wood",
1985         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1986         sounds = default.node_sound_wood_defaults()
1987 })
1988
1989 default.register_fence("default:fence_acacia_wood", {
1990         description = "Acacia Fence",
1991         texture = "default_fence_acacia_wood.png",
1992         inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
1993         wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
1994         material = "default:acacia_wood",
1995         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1996         sounds = default.node_sound_wood_defaults()
1997 })
1998
1999 default.register_fence("default:fence_junglewood", {
2000         description = "Junglewood Fence",
2001         texture = "default_fence_junglewood.png",
2002         inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
2003         wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
2004         material = "default:junglewood",
2005         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2006         sounds = default.node_sound_wood_defaults()
2007 })
2008
2009 default.register_fence("default:fence_pine_wood", {
2010         description = "Pine Fence",
2011         texture = "default_fence_pine_wood.png",
2012         inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
2013         wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
2014         material = "default:pine_wood",
2015         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2016         sounds = default.node_sound_wood_defaults()
2017 })
2018
2019 default.register_fence("default:fence_aspen_wood", {
2020         description = "Aspen Fence",
2021         texture = "default_fence_aspen_wood.png",
2022         inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
2023         wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
2024         material = "default:aspen_wood",
2025         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2026         sounds = default.node_sound_wood_defaults()
2027 })
2028
2029 minetest.register_node("default:glass", {
2030         description = "Glass",
2031         drawtype = "glasslike_framed_optional",
2032         tiles = {"default_glass.png", "default_glass_detail.png"},
2033         paramtype = "light",
2034         sunlight_propagates = true,
2035         is_ground_content = false,
2036         groups = {cracky = 3, oddly_breakable_by_hand = 3},
2037         sounds = default.node_sound_glass_defaults(),
2038 })
2039
2040 minetest.register_node("default:obsidian_glass", {
2041         description = "Obsidian Glass",
2042         drawtype = "glasslike_framed_optional",
2043         tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
2044         paramtype = "light",
2045         is_ground_content = false,
2046         sunlight_propagates = true,
2047         sounds = default.node_sound_glass_defaults(),
2048         groups = {cracky = 3},
2049 })
2050
2051
2052 minetest.register_node("default:brick", {
2053         description = "Brick Block",
2054         paramtype2 = "facedir",
2055         place_param2 = 0,
2056         tiles = {"default_brick.png"},
2057         is_ground_content = false,
2058         groups = {cracky = 3},
2059         sounds = default.node_sound_stone_defaults(),
2060 })
2061
2062
2063 minetest.register_node("default:meselamp", {
2064         description = "Mese Lamp",
2065         drawtype = "glasslike",
2066         tiles = {"default_meselamp.png"},
2067         paramtype = "light",
2068         sunlight_propagates = true,
2069         is_ground_content = false,
2070         groups = {cracky = 3, oddly_breakable_by_hand = 3},
2071         sounds = default.node_sound_glass_defaults(),
2072         light_source = default.LIGHT_MAX,
2073 })
2074
2075 minetest.register_node("default:mese_post_light", {
2076         description = "Mese Post Light",
2077         tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png",
2078                 "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png",
2079                 "default_mese_post_light_side.png", "default_mese_post_light_side.png"},
2080         wield_image = "default_mese_post_light_side.png",
2081         drawtype = "nodebox",
2082         node_box = {
2083                 type = "fixed",
2084                 fixed = {
2085                         {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
2086                 },
2087         },
2088         paramtype = "light",
2089         light_source = default.LIGHT_MAX,
2090         sunlight_propagates = true,
2091         is_ground_content = false,
2092         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2093         sounds = default.node_sound_wood_defaults(),
2094 })
2095
2096 --
2097 -- Misc
2098 --
2099
2100 minetest.register_node("default:cloud", {
2101         description = "Cloud",
2102         tiles = {"default_cloud.png"},
2103         is_ground_content = false,
2104         sounds = default.node_sound_defaults(),
2105         groups = {not_in_creative_inventory = 1},
2106 })