c752d3bf0028ebcd6b077b6947073eea55e5128c
[oweals/minetest_game.git] / mods / default / nodes.lua
1 -- mods/default/nodes.lua
2
3 -- support for MT game translation.
4 local S = default.get_translator
5
6 --[[ Node name convention:
7
8 Although many node names are in combined-word form, the required form for new
9 node names is words separated by underscores. If both forms are used in written
10 language (for example pinewood and pine wood) the underscore form should be used.
11
12 --]]
13
14
15 --[[ Index:
16
17 Stone
18 -----
19 (1. Material 2. Cobble variant 3. Brick variant 4. Modified forms)
20
21 default:stone
22 default:cobble
23 default:stonebrick
24 default:stone_block
25 default:mossycobble
26
27 default:desert_stone
28 default:desert_cobble
29 default:desert_stonebrick
30 default:desert_stone_block
31
32 default:sandstone
33 default:sandstonebrick
34 default:sandstone_block
35 default:desert_sandstone
36 default:desert_sandstone_brick
37 default:desert_sandstone_block
38 default:silver_sandstone
39 default:silver_sandstone_brick
40 default:silver_sandstone_block
41
42 default:obsidian
43 default:obsidianbrick
44 default:obsidian_block
45
46 Soft / Non-Stone
47 ----------------
48 (1. Material 2. Modified forms)
49
50 default:dirt
51 default:dirt_with_grass
52 default:dirt_with_grass_footsteps
53 default:dirt_with_dry_grass
54 default:dirt_with_snow
55 default:dirt_with_rainforest_litter
56 default:dirt_with_coniferous_litter
57 default:dry_dirt
58 default:dry_dirt_with_dry_grass
59
60 default:permafrost
61 default:permafrost_with_stones
62 default:permafrost_with_moss
63
64 default:sand
65 default:desert_sand
66 default:silver_sand
67
68 default:gravel
69
70 default:clay
71
72 default:snow
73 default:snowblock
74 default:ice
75 default:cave_ice
76
77 Trees
78 -----
79 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits)
80
81 default:tree
82 default:wood
83 default:leaves
84 default:sapling
85 default:apple
86
87 default:jungletree
88 default:junglewood
89 default:jungleleaves
90 default:junglesapling
91 default:emergent_jungle_sapling
92
93 default:pine_tree
94 default:pine_wood
95 default:pine_needles
96 default:pine_sapling
97
98 default:acacia_tree
99 default:acacia_wood
100 default:acacia_leaves
101 default:acacia_sapling
102
103 default:aspen_tree
104 default:aspen_wood
105 default:aspen_leaves
106 default:aspen_sapling
107
108 Ores
109 ----
110 (1. In stone 2. Blocks)
111
112 default:stone_with_coal
113 default:coalblock
114
115 default:stone_with_iron
116 default:steelblock
117
118 default:stone_with_copper
119 default:copperblock
120
121 default:stone_with_tin
122 default:tinblock
123
124 default:bronzeblock
125
126 default:stone_with_gold
127 default:goldblock
128
129 default:stone_with_mese
130 default:mese
131
132 default:stone_with_diamond
133 default:diamondblock
134
135 Plantlife
136 ---------
137
138 default:cactus
139 default:large_cactus_seedling
140
141 default:papyrus
142 default:dry_shrub
143 default:junglegrass
144
145 default:grass_1
146 default:grass_2
147 default:grass_3
148 default:grass_4
149 default:grass_5
150
151 default:dry_grass_1
152 default:dry_grass_2
153 default:dry_grass_3
154 default:dry_grass_4
155 default:dry_grass_5
156
157 default:fern_1
158 default:fern_2
159 default:fern_3
160
161 default:marram_grass_1
162 default:marram_grass_2
163 default:marram_grass_3
164
165 default:bush_stem
166 default:bush_leaves
167 default:bush_sapling
168 default:acacia_bush_stem
169 default:acacia_bush_leaves
170 default:acacia_bush_sapling
171 default:pine_bush_stem
172 default:pine_bush_needles
173 default:pine_bush_sapling
174 default:blueberry_bush_leaves_with_berries
175 default:blueberry_bush_leaves
176 default:blueberry_bush_sapling
177
178 default:sand_with_kelp
179
180 Corals
181 ------
182
183 default:coral_brown
184 default:coral_orange
185 default:coral_skeleton
186
187 Liquids
188 -------
189 (1. Source 2. Flowing)
190
191 default:water_source
192 default:water_flowing
193
194 default:river_water_source
195 default:river_water_flowing
196
197 default:lava_source
198 default:lava_flowing
199
200 Tools / "Advanced" crafting / Non-"natural"
201 -------------------------------------------
202
203 default:bookshelf
204
205 default:sign_wall_wood
206 default:sign_wall_steel
207
208 default:ladder_wood
209 default:ladder_steel
210
211 default:fence_wood
212 default:fence_acacia_wood
213 default:fence_junglewood
214 default:fence_pine_wood
215 default:fence_aspen_wood
216
217 default:glass
218 default:obsidian_glass
219
220 default:brick
221
222 default:meselamp
223 default:mese_post_light
224
225 Misc
226 ----
227
228 default:cloud
229
230 --]]
231
232 -- Required wrapper to allow customization of default.after_place_leaves
233 local function after_place_leaves(...)
234         return default.after_place_leaves(...)
235 end
236
237 -- Required wrapper to allow customization of default.grow_sapling
238 local function grow_sapling(...)
239         return default.grow_sapling(...)
240 end
241
242 --
243 -- Stone
244 --
245
246 minetest.register_node("default:stone", {
247         description = S("Stone"),
248         tiles = {"default_stone.png"},
249         groups = {cracky = 3, stone = 1},
250         drop = "default:cobble",
251         legacy_mineral = true,
252         sounds = default.node_sound_stone_defaults(),
253 })
254
255 minetest.register_node("default:cobble", {
256         description = S("Cobblestone"),
257         tiles = {"default_cobble.png"},
258         is_ground_content = false,
259         groups = {cracky = 3, stone = 2},
260         sounds = default.node_sound_stone_defaults(),
261 })
262
263 minetest.register_node("default:stonebrick", {
264         description = S("Stone Brick"),
265         paramtype2 = "facedir",
266         place_param2 = 0,
267         tiles = {"default_stone_brick.png"},
268         is_ground_content = false,
269         groups = {cracky = 2, stone = 1},
270         sounds = default.node_sound_stone_defaults(),
271 })
272
273 minetest.register_node("default:stone_block", {
274         description = S("Stone Block"),
275         tiles = {"default_stone_block.png"},
276         is_ground_content = false,
277         groups = {cracky = 2, stone = 1},
278         sounds = default.node_sound_stone_defaults(),
279 })
280
281 minetest.register_node("default:mossycobble", {
282         description = S("Mossy Cobblestone"),
283         tiles = {"default_mossycobble.png"},
284         is_ground_content = false,
285         groups = {cracky = 3, stone = 1},
286         sounds = default.node_sound_stone_defaults(),
287 })
288
289
290 minetest.register_node("default:desert_stone", {
291         description = S("Desert Stone"),
292         tiles = {"default_desert_stone.png"},
293         groups = {cracky = 3, stone = 1},
294         drop = "default:desert_cobble",
295         legacy_mineral = true,
296         sounds = default.node_sound_stone_defaults(),
297 })
298
299 minetest.register_node("default:desert_cobble", {
300         description = S("Desert Cobblestone"),
301         tiles = {"default_desert_cobble.png"},
302         is_ground_content = false,
303         groups = {cracky = 3, stone = 2},
304         sounds = default.node_sound_stone_defaults(),
305 })
306
307 minetest.register_node("default:desert_stonebrick", {
308         description = S("Desert Stone Brick"),
309         paramtype2 = "facedir",
310         place_param2 = 0,
311         tiles = {"default_desert_stone_brick.png"},
312         is_ground_content = false,
313         groups = {cracky = 2, stone = 1},
314         sounds = default.node_sound_stone_defaults(),
315 })
316
317 minetest.register_node("default:desert_stone_block", {
318         description = S("Desert Stone Block"),
319         tiles = {"default_desert_stone_block.png"},
320         is_ground_content = false,
321         groups = {cracky = 2, stone = 1},
322         sounds = default.node_sound_stone_defaults(),
323 })
324
325 minetest.register_node("default:sandstone", {
326         description = S("Sandstone"),
327         tiles = {"default_sandstone.png"},
328         groups = {crumbly = 1, cracky = 3},
329         sounds = default.node_sound_stone_defaults(),
330 })
331
332 minetest.register_node("default:sandstonebrick", {
333         description = S("Sandstone Brick"),
334         paramtype2 = "facedir",
335         place_param2 = 0,
336         tiles = {"default_sandstone_brick.png"},
337         is_ground_content = false,
338         groups = {cracky = 2},
339         sounds = default.node_sound_stone_defaults(),
340 })
341
342 minetest.register_node("default:sandstone_block", {
343         description = S("Sandstone Block"),
344         tiles = {"default_sandstone_block.png"},
345         is_ground_content = false,
346         groups = {cracky = 2},
347         sounds = default.node_sound_stone_defaults(),
348 })
349
350 minetest.register_node("default:desert_sandstone", {
351         description = S("Desert Sandstone"),
352         tiles = {"default_desert_sandstone.png"},
353         groups = {crumbly = 1, cracky = 3},
354         sounds = default.node_sound_stone_defaults(),
355 })
356
357 minetest.register_node("default:desert_sandstone_brick", {
358         description = S("Desert Sandstone Brick"),
359         paramtype2 = "facedir",
360         place_param2 = 0,
361         tiles = {"default_desert_sandstone_brick.png"},
362         is_ground_content = false,
363         groups = {cracky = 2},
364         sounds = default.node_sound_stone_defaults(),
365 })
366
367 minetest.register_node("default:desert_sandstone_block", {
368         description = S("Desert Sandstone Block"),
369         tiles = {"default_desert_sandstone_block.png"},
370         is_ground_content = false,
371         groups = {cracky = 2},
372         sounds = default.node_sound_stone_defaults(),
373 })
374
375 minetest.register_node("default:silver_sandstone", {
376         description = S("Silver Sandstone"),
377         tiles = {"default_silver_sandstone.png"},
378         groups = {crumbly = 1, cracky = 3},
379         sounds = default.node_sound_stone_defaults(),
380 })
381
382 minetest.register_node("default:silver_sandstone_brick", {
383         description = S("Silver Sandstone Brick"),
384         paramtype2 = "facedir",
385         place_param2 = 0,
386         tiles = {"default_silver_sandstone_brick.png"},
387         is_ground_content = false,
388         groups = {cracky = 2},
389         sounds = default.node_sound_stone_defaults(),
390 })
391
392 minetest.register_node("default:silver_sandstone_block", {
393         description = S("Silver Sandstone Block"),
394         tiles = {"default_silver_sandstone_block.png"},
395         is_ground_content = false,
396         groups = {cracky = 2},
397         sounds = default.node_sound_stone_defaults(),
398 })
399
400 minetest.register_node("default:obsidian", {
401         description = S("Obsidian"),
402         tiles = {"default_obsidian.png"},
403         sounds = default.node_sound_stone_defaults(),
404         groups = {cracky = 1, level = 2},
405 })
406
407 minetest.register_node("default:obsidianbrick", {
408         description = S("Obsidian Brick"),
409         paramtype2 = "facedir",
410         place_param2 = 0,
411         tiles = {"default_obsidian_brick.png"},
412         is_ground_content = false,
413         sounds = default.node_sound_stone_defaults(),
414         groups = {cracky = 1, level = 2},
415 })
416
417 minetest.register_node("default:obsidian_block", {
418         description = S("Obsidian Block"),
419         tiles = {"default_obsidian_block.png"},
420         is_ground_content = false,
421         sounds = default.node_sound_stone_defaults(),
422         groups = {cracky = 1, level = 2},
423 })
424
425 --
426 -- Soft / Non-Stone
427 --
428
429 minetest.register_node("default:dirt", {
430         description = S("Dirt"),
431         tiles = {"default_dirt.png"},
432         groups = {crumbly = 3, soil = 1},
433         sounds = default.node_sound_dirt_defaults(),
434 })
435
436 minetest.register_node("default:dirt_with_grass", {
437         description = S("Dirt with Grass"),
438         tiles = {"default_grass.png", "default_dirt.png",
439                 {name = "default_dirt.png^default_grass_side.png",
440                         tileable_vertical = false}},
441         groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
442         drop = "default:dirt",
443         sounds = default.node_sound_dirt_defaults({
444                 footstep = {name = "default_grass_footstep", gain = 0.25},
445         }),
446 })
447
448 minetest.register_node("default:dirt_with_grass_footsteps", {
449         description = S("Dirt with Grass and Footsteps"),
450         tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
451                 {name = "default_dirt.png^default_grass_side.png",
452                         tileable_vertical = false}},
453         groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1},
454         drop = "default:dirt",
455         sounds = default.node_sound_dirt_defaults({
456                 footstep = {name = "default_grass_footstep", gain = 0.25},
457         }),
458 })
459
460 minetest.register_node("default:dirt_with_dry_grass", {
461         description = S("Dirt with Dry Grass"),
462         tiles = {"default_dry_grass.png",
463                 "default_dirt.png",
464                 {name = "default_dirt.png^default_dry_grass_side.png",
465                         tileable_vertical = false}},
466         groups = {crumbly = 3, soil = 1},
467         drop = "default:dirt",
468         sounds = default.node_sound_dirt_defaults({
469                 footstep = {name = "default_grass_footstep", gain = 0.4},
470         }),
471 })
472
473 minetest.register_node("default:dirt_with_snow", {
474         description = S("Dirt with Snow"),
475         tiles = {"default_snow.png", "default_dirt.png",
476                 {name = "default_dirt.png^default_snow_side.png",
477                         tileable_vertical = false}},
478         groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1},
479         drop = "default:dirt",
480         sounds = default.node_sound_dirt_defaults({
481                 footstep = {name = "default_snow_footstep", gain = 0.2},
482         }),
483 })
484
485 minetest.register_node("default:dirt_with_rainforest_litter", {
486         description = S("Dirt with Rainforest Litter"),
487         tiles = {
488                 "default_rainforest_litter.png",
489                 "default_dirt.png",
490                 {name = "default_dirt.png^default_rainforest_litter_side.png",
491                         tileable_vertical = false}
492         },
493         groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
494         drop = "default:dirt",
495         sounds = default.node_sound_dirt_defaults({
496                 footstep = {name = "default_grass_footstep", gain = 0.4},
497         }),
498 })
499
500 minetest.register_node("default:dirt_with_coniferous_litter", {
501         description = S("Dirt with Coniferous Litter"),
502         tiles = {
503                 "default_coniferous_litter.png",
504                 "default_dirt.png",
505                 {name = "default_dirt.png^default_coniferous_litter_side.png",
506                         tileable_vertical = false}
507         },
508         groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
509         drop = "default:dirt",
510         sounds = default.node_sound_dirt_defaults({
511                 footstep = {name = "default_grass_footstep", gain = 0.4},
512         }),
513 })
514
515 minetest.register_node("default:dry_dirt", {
516         description = S("Dry Dirt"),
517         tiles = {"default_dry_dirt.png"},
518         groups = {crumbly = 3, soil = 1},
519         sounds = default.node_sound_dirt_defaults(),
520 })
521
522 minetest.register_node("default:dry_dirt_with_dry_grass", {
523         description = S("Dry Dirt with Dry Grass"),
524         tiles = {"default_dry_grass.png", "default_dry_dirt.png",
525                 {name = "default_dry_dirt.png^default_dry_grass_side.png",
526                         tileable_vertical = false}},
527         groups = {crumbly = 3, soil = 1},
528         drop = "default:dry_dirt",
529         sounds = default.node_sound_dirt_defaults({
530                 footstep = {name = "default_grass_footstep", gain = 0.4},
531         }),
532 })
533
534 minetest.register_node("default:permafrost", {
535         description = S("Permafrost"),
536         tiles = {"default_permafrost.png"},
537         groups = {cracky = 3},
538         sounds = default.node_sound_dirt_defaults(),
539 })
540
541 minetest.register_node("default:permafrost_with_stones", {
542         description = S("Permafrost with Stones"),
543         tiles = {"default_permafrost.png^default_stones.png",
544                 "default_permafrost.png",
545                 "default_permafrost.png^default_stones_side.png"},
546         groups = {cracky = 3},
547         sounds = default.node_sound_gravel_defaults(),
548 })
549
550 minetest.register_node("default:permafrost_with_moss", {
551         description = S("Permafrost with Moss"),
552         tiles = {"default_moss.png", "default_permafrost.png",
553                 {name = "default_permafrost.png^default_moss_side.png",
554                         tileable_vertical = false}},
555         groups = {cracky = 3},
556         sounds = default.node_sound_dirt_defaults({
557                 footstep = {name = "default_grass_footstep", gain = 0.25},
558         }),
559 })
560
561 minetest.register_node("default:sand", {
562         description = S("Sand"),
563         tiles = {"default_sand.png"},
564         groups = {crumbly = 3, falling_node = 1, sand = 1},
565         sounds = default.node_sound_sand_defaults(),
566 })
567
568 minetest.register_node("default:desert_sand", {
569         description = S("Desert Sand"),
570         tiles = {"default_desert_sand.png"},
571         groups = {crumbly = 3, falling_node = 1, sand = 1},
572         sounds = default.node_sound_sand_defaults(),
573 })
574
575 minetest.register_node("default:silver_sand", {
576         description = S("Silver Sand"),
577         tiles = {"default_silver_sand.png"},
578         groups = {crumbly = 3, falling_node = 1, sand = 1},
579         sounds = default.node_sound_sand_defaults(),
580 })
581
582
583 minetest.register_node("default:gravel", {
584         description = S("Gravel"),
585         tiles = {"default_gravel.png"},
586         groups = {crumbly = 2, falling_node = 1},
587         sounds = default.node_sound_gravel_defaults(),
588         drop = {
589                 max_items = 1,
590                 items = {
591                         {items = {"default:flint"}, rarity = 16},
592                         {items = {"default:gravel"}}
593                 }
594         }
595 })
596
597 minetest.register_node("default:clay", {
598         description = S("Clay"),
599         tiles = {"default_clay.png"},
600         groups = {crumbly = 3},
601         drop = "default:clay_lump 4",
602         sounds = default.node_sound_dirt_defaults(),
603 })
604
605
606 minetest.register_node("default:snow", {
607         description = S("Snow"),
608         tiles = {"default_snow.png"},
609         inventory_image = "default_snowball.png",
610         wield_image = "default_snowball.png",
611         paramtype = "light",
612         buildable_to = true,
613         floodable = true,
614         drawtype = "nodebox",
615         node_box = {
616                 type = "fixed",
617                 fixed = {
618                         {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
619                 },
620         },
621         collision_box = {
622                 type = "fixed",
623                 fixed = {
624                         {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5},
625                 },
626         },
627         groups = {crumbly = 3, falling_node = 1, snowy = 1},
628         sounds = default.node_sound_snow_defaults(),
629
630         on_construct = function(pos)
631                 pos.y = pos.y - 1
632                 if minetest.get_node(pos).name == "default:dirt_with_grass" then
633                         minetest.set_node(pos, {name = "default:dirt_with_snow"})
634                 end
635         end,
636 })
637
638 minetest.register_node("default:snowblock", {
639         description = S("Snow Block"),
640         tiles = {"default_snow.png"},
641         groups = {crumbly = 3, cools_lava = 1, snowy = 1},
642         sounds = default.node_sound_snow_defaults(),
643
644         on_construct = function(pos)
645                 pos.y = pos.y - 1
646                 if minetest.get_node(pos).name == "default:dirt_with_grass" then
647                         minetest.set_node(pos, {name = "default:dirt_with_snow"})
648                 end
649         end,
650 })
651
652 -- 'is ground content = false' to avoid tunnels in sea ice or ice rivers
653 minetest.register_node("default:ice", {
654         description = S("Ice"),
655         tiles = {"default_ice.png"},
656         is_ground_content = false,
657         paramtype = "light",
658         groups = {cracky = 3, cools_lava = 1, slippery = 3},
659         sounds = default.node_sound_glass_defaults(),
660 })
661
662 -- Mapgen-placed ice with 'is ground content = true' to contain tunnels
663 minetest.register_node("default:cave_ice", {
664         description = S("Cave Ice"),
665         tiles = {"default_ice.png"},
666         paramtype = "light",
667         groups = {cracky = 3, cools_lava = 1, slippery = 3,
668                 not_in_creative_inventory = 1},
669         drop = "default:ice",
670         sounds = default.node_sound_glass_defaults(),
671 })
672
673 --
674 -- Trees
675 --
676
677 minetest.register_node("default:tree", {
678         description = S("Apple Tree"),
679         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
680         paramtype2 = "facedir",
681         is_ground_content = false,
682         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
683         sounds = default.node_sound_wood_defaults(),
684
685         on_place = minetest.rotate_node
686 })
687
688 minetest.register_node("default:wood", {
689         description = S("Apple Wood Planks"),
690         paramtype2 = "facedir",
691         place_param2 = 0,
692         tiles = {"default_wood.png"},
693         is_ground_content = false,
694         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
695         sounds = default.node_sound_wood_defaults(),
696 })
697
698 minetest.register_node("default:sapling", {
699         description = S("Apple Tree Sapling"),
700         drawtype = "plantlike",
701         tiles = {"default_sapling.png"},
702         inventory_image = "default_sapling.png",
703         wield_image = "default_sapling.png",
704         paramtype = "light",
705         sunlight_propagates = true,
706         walkable = false,
707         on_timer = grow_sapling,
708         selection_box = {
709                 type = "fixed",
710                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
711         },
712         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
713                 attached_node = 1, sapling = 1},
714         sounds = default.node_sound_leaves_defaults(),
715
716         on_construct = function(pos)
717                 minetest.get_node_timer(pos):start(math.random(300, 1500))
718         end,
719
720         on_place = function(itemstack, placer, pointed_thing)
721                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
722                         "default:sapling",
723                         -- minp, maxp to be checked, relative to sapling pos
724                         -- minp_relative.y = 1 because sapling pos has been checked
725                         {x = -3, y = 1, z = -3},
726                         {x = 3, y = 6, z = 3},
727                         -- maximum interval of interior volume check
728                         4)
729
730                 return itemstack
731         end,
732 })
733
734 minetest.register_node("default:leaves", {
735         description = S("Apple Tree Leaves"),
736         drawtype = "allfaces_optional",
737         waving = 1,
738         tiles = {"default_leaves.png"},
739         special_tiles = {"default_leaves_simple.png"},
740         paramtype = "light",
741         is_ground_content = false,
742         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
743         drop = {
744                 max_items = 1,
745                 items = {
746                         {
747                                 -- player will get sapling with 1/20 chance
748                                 items = {"default:sapling"},
749                                 rarity = 20,
750                         },
751                         {
752                                 -- player will get leaves only if he get no saplings,
753                                 -- this is because max_items is 1
754                                 items = {"default:leaves"},
755                         }
756                 }
757         },
758         sounds = default.node_sound_leaves_defaults(),
759
760         after_place_node = after_place_leaves,
761 })
762
763 minetest.register_node("default:apple", {
764         description = S("Apple"),
765         drawtype = "plantlike",
766         tiles = {"default_apple.png"},
767         inventory_image = "default_apple.png",
768         paramtype = "light",
769         sunlight_propagates = true,
770         walkable = false,
771         is_ground_content = false,
772         selection_box = {
773                 type = "fixed",
774                 fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16}
775         },
776         groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
777                 leafdecay = 3, leafdecay_drop = 1, food_apple = 1},
778         on_use = minetest.item_eat(2),
779         sounds = default.node_sound_leaves_defaults(),
780
781         after_place_node = function(pos, placer, itemstack)
782                 minetest.set_node(pos, {name = "default:apple", param2 = 1})
783         end,
784
785         after_dig_node = function(pos, oldnode, oldmetadata, digger)
786                 if oldnode.param2 == 0 then
787                         minetest.set_node(pos, {name = "default:apple_mark"})
788                         minetest.get_node_timer(pos):start(math.random(300, 1500))
789                 end
790         end,
791 })
792
793 minetest.register_node("default:apple_mark", {
794         description = S("Apple Marker"),
795         drawtype = "airlike",
796         paramtype = "light",
797         sunlight_propagates = true,
798         walkable = false,
799         pointable = false,
800         diggable = false,
801         buildable_to = true,
802         drop = "",
803         groups = {not_in_creative_inventory = 1},
804         on_timer = function(pos, elapsed)
805                 if not minetest.find_node_near(pos, 1, "default:leaves") then
806                         minetest.remove_node(pos)
807                 elseif minetest.get_node_light(pos) < 11 then
808                         minetest.get_node_timer(pos):start(200)
809                 else
810                         minetest.set_node(pos, {name = "default:apple"})
811                 end
812         end
813 })
814
815
816 minetest.register_node("default:jungletree", {
817         description = S("Jungle Tree"),
818         tiles = {"default_jungletree_top.png", "default_jungletree_top.png",
819                 "default_jungletree.png"},
820         paramtype2 = "facedir",
821         is_ground_content = false,
822         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
823         sounds = default.node_sound_wood_defaults(),
824
825         on_place = minetest.rotate_node
826 })
827
828 minetest.register_node("default:junglewood", {
829         description = S("Jungle Wood Planks"),
830         paramtype2 = "facedir",
831         place_param2 = 0,
832         tiles = {"default_junglewood.png"},
833         is_ground_content = false,
834         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
835         sounds = default.node_sound_wood_defaults(),
836 })
837
838 minetest.register_node("default:jungleleaves", {
839         description = S("Jungle Tree Leaves"),
840         drawtype = "allfaces_optional",
841         waving = 1,
842         tiles = {"default_jungleleaves.png"},
843         special_tiles = {"default_jungleleaves_simple.png"},
844         paramtype = "light",
845         is_ground_content = false,
846         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
847         drop = {
848                 max_items = 1,
849                 items = {
850                         {items = {"default:junglesapling"}, rarity = 20},
851                         {items = {"default:jungleleaves"}}
852                 }
853         },
854         sounds = default.node_sound_leaves_defaults(),
855
856         after_place_node = after_place_leaves,
857 })
858
859 minetest.register_node("default:junglesapling", {
860         description = S("Jungle Tree Sapling"),
861         drawtype = "plantlike",
862         tiles = {"default_junglesapling.png"},
863         inventory_image = "default_junglesapling.png",
864         wield_image = "default_junglesapling.png",
865         paramtype = "light",
866         sunlight_propagates = true,
867         walkable = false,
868         on_timer = grow_sapling,
869         selection_box = {
870                 type = "fixed",
871                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
872         },
873         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
874                 attached_node = 1, sapling = 1},
875         sounds = default.node_sound_leaves_defaults(),
876
877         on_construct = function(pos)
878                 minetest.get_node_timer(pos):start(math.random(300, 1500))
879         end,
880
881         on_place = function(itemstack, placer, pointed_thing)
882                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
883                         "default:junglesapling",
884                         -- minp, maxp to be checked, relative to sapling pos
885                         -- minp_relative.y = 1 because sapling pos has been checked
886                         {x = -2, y = 1, z = -2},
887                         {x = 2, y = 15, z = 2},
888                         -- maximum interval of interior volume check
889                         4)
890
891                 return itemstack
892         end,
893 })
894
895 minetest.register_node("default:emergent_jungle_sapling", {
896         description = S("Emergent Jungle Tree Sapling"),
897         drawtype = "plantlike",
898         tiles = {"default_emergent_jungle_sapling.png"},
899         inventory_image = "default_emergent_jungle_sapling.png",
900         wield_image = "default_emergent_jungle_sapling.png",
901         paramtype = "light",
902         sunlight_propagates = true,
903         walkable = false,
904         on_timer = grow_sapling,
905         selection_box = {
906                 type = "fixed",
907                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
908         },
909         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
910                 attached_node = 1, sapling = 1},
911         sounds = default.node_sound_leaves_defaults(),
912
913         on_construct = function(pos)
914                 minetest.get_node_timer(pos):start(math.random(300, 1500))
915         end,
916
917         on_place = function(itemstack, placer, pointed_thing)
918                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
919                         "default:emergent_jungle_sapling",
920                         -- minp, maxp to be checked, relative to sapling pos
921                         {x = -3, y = -5, z = -3},
922                         {x = 3, y = 31, z = 3},
923                         -- maximum interval of interior volume check
924                         4)
925
926                 return itemstack
927         end,
928 })
929
930
931 minetest.register_node("default:pine_tree", {
932         description = S("Pine Tree"),
933         tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
934                 "default_pine_tree.png"},
935         paramtype2 = "facedir",
936         is_ground_content = false,
937         groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
938         sounds = default.node_sound_wood_defaults(),
939
940         on_place = minetest.rotate_node
941 })
942
943 minetest.register_node("default:pine_wood", {
944         description = S("Pine Wood Planks"),
945         paramtype2 = "facedir",
946         place_param2 = 0,
947         tiles = {"default_pine_wood.png"},
948         is_ground_content = false,
949         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
950         sounds = default.node_sound_wood_defaults(),
951 })
952
953 minetest.register_node("default:pine_needles",{
954         description = S("Pine Needles"),
955         drawtype = "allfaces_optional",
956         tiles = {"default_pine_needles.png"},
957         waving = 1,
958         paramtype = "light",
959         is_ground_content = false,
960         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
961         drop = {
962                 max_items = 1,
963                 items = {
964                         {items = {"default:pine_sapling"}, rarity = 20},
965                         {items = {"default:pine_needles"}}
966                 }
967         },
968         sounds = default.node_sound_leaves_defaults(),
969
970         after_place_node = after_place_leaves,
971 })
972
973 minetest.register_node("default:pine_sapling", {
974         description = S("Pine Tree Sapling"),
975         drawtype = "plantlike",
976         tiles = {"default_pine_sapling.png"},
977         inventory_image = "default_pine_sapling.png",
978         wield_image = "default_pine_sapling.png",
979         paramtype = "light",
980         sunlight_propagates = true,
981         walkable = false,
982         on_timer = grow_sapling,
983         selection_box = {
984                 type = "fixed",
985                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
986         },
987         groups = {snappy = 2, dig_immediate = 3, flammable = 3,
988                 attached_node = 1, sapling = 1},
989         sounds = default.node_sound_leaves_defaults(),
990
991         on_construct = function(pos)
992                 minetest.get_node_timer(pos):start(math.random(300, 1500))
993         end,
994
995         on_place = function(itemstack, placer, pointed_thing)
996                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
997                         "default:pine_sapling",
998                         -- minp, maxp to be checked, relative to sapling pos
999                         -- minp_relative.y = 1 because sapling pos has been checked
1000                         {x = -2, y = 1, z = -2},
1001                         {x = 2, y = 14, z = 2},
1002                         -- maximum interval of interior volume check
1003                         4)
1004
1005                 return itemstack
1006         end,
1007 })
1008
1009
1010 minetest.register_node("default:acacia_tree", {
1011         description = S("Acacia Tree"),
1012         tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
1013                 "default_acacia_tree.png"},
1014         paramtype2 = "facedir",
1015         is_ground_content = false,
1016         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1017         sounds = default.node_sound_wood_defaults(),
1018
1019         on_place = minetest.rotate_node
1020 })
1021
1022 minetest.register_node("default:acacia_wood", {
1023         description = S("Acacia Wood Planks"),
1024         paramtype2 = "facedir",
1025         place_param2 = 0,
1026         tiles = {"default_acacia_wood.png"},
1027         is_ground_content = false,
1028         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
1029         sounds = default.node_sound_wood_defaults(),
1030 })
1031
1032 minetest.register_node("default:acacia_leaves", {
1033         description = S("Acacia Tree Leaves"),
1034         drawtype = "allfaces_optional",
1035         tiles = {"default_acacia_leaves.png"},
1036         special_tiles = {"default_acacia_leaves_simple.png"},
1037         waving = 1,
1038         paramtype = "light",
1039         is_ground_content = false,
1040         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
1041         drop = {
1042                 max_items = 1,
1043                 items = {
1044                         {items = {"default:acacia_sapling"}, rarity = 20},
1045                         {items = {"default:acacia_leaves"}}
1046                 }
1047         },
1048         sounds = default.node_sound_leaves_defaults(),
1049
1050         after_place_node = after_place_leaves,
1051 })
1052
1053 minetest.register_node("default:acacia_sapling", {
1054         description = S("Acacia Tree Sapling"),
1055         drawtype = "plantlike",
1056         tiles = {"default_acacia_sapling.png"},
1057         inventory_image = "default_acacia_sapling.png",
1058         wield_image = "default_acacia_sapling.png",
1059         paramtype = "light",
1060         sunlight_propagates = true,
1061         walkable = false,
1062         on_timer = grow_sapling,
1063         selection_box = {
1064                 type = "fixed",
1065                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
1066         },
1067         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1068                 attached_node = 1, sapling = 1},
1069         sounds = default.node_sound_leaves_defaults(),
1070
1071         on_construct = function(pos)
1072                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1073         end,
1074
1075         on_place = function(itemstack, placer, pointed_thing)
1076                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1077                         "default:acacia_sapling",
1078                         -- minp, maxp to be checked, relative to sapling pos
1079                         -- minp_relative.y = 1 because sapling pos has been checked
1080                         {x = -4, y = 1, z = -4},
1081                         {x = 4, y = 7, z = 4},
1082                         -- maximum interval of interior volume check
1083                         4)
1084
1085                 return itemstack
1086         end,
1087 })
1088
1089 minetest.register_node("default:aspen_tree", {
1090         description = S("Aspen Tree"),
1091         tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
1092                 "default_aspen_tree.png"},
1093         paramtype2 = "facedir",
1094         is_ground_content = false,
1095         groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
1096         sounds = default.node_sound_wood_defaults(),
1097
1098         on_place = minetest.rotate_node
1099 })
1100
1101 minetest.register_node("default:aspen_wood", {
1102         description = S("Aspen Wood Planks"),
1103         paramtype2 = "facedir",
1104         place_param2 = 0,
1105         tiles = {"default_aspen_wood.png"},
1106         is_ground_content = false,
1107         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
1108         sounds = default.node_sound_wood_defaults(),
1109 })
1110
1111 minetest.register_node("default:aspen_leaves", {
1112         description = S("Aspen Tree Leaves"),
1113         drawtype = "allfaces_optional",
1114         tiles = {"default_aspen_leaves.png"},
1115         waving = 1,
1116         paramtype = "light",
1117         is_ground_content = false,
1118         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
1119         drop = {
1120                 max_items = 1,
1121                 items = {
1122                         {items = {"default:aspen_sapling"}, rarity = 20},
1123                         {items = {"default:aspen_leaves"}}
1124                 }
1125         },
1126         sounds = default.node_sound_leaves_defaults(),
1127
1128         after_place_node = after_place_leaves,
1129 })
1130
1131 minetest.register_node("default:aspen_sapling", {
1132         description = S("Aspen Tree Sapling"),
1133         drawtype = "plantlike",
1134         tiles = {"default_aspen_sapling.png"},
1135         inventory_image = "default_aspen_sapling.png",
1136         wield_image = "default_aspen_sapling.png",
1137         paramtype = "light",
1138         sunlight_propagates = true,
1139         walkable = false,
1140         on_timer = grow_sapling,
1141         selection_box = {
1142                 type = "fixed",
1143                 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}
1144         },
1145         groups = {snappy = 2, dig_immediate = 3, flammable = 3,
1146                 attached_node = 1, sapling = 1},
1147         sounds = default.node_sound_leaves_defaults(),
1148
1149         on_construct = function(pos)
1150                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1151         end,
1152
1153         on_place = function(itemstack, placer, pointed_thing)
1154                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1155                         "default:aspen_sapling",
1156                         -- minp, maxp to be checked, relative to sapling pos
1157                         -- minp_relative.y = 1 because sapling pos has been checked
1158                         {x = -2, y = 1, z = -2},
1159                         {x = 2, y = 12, z = 2},
1160                         -- maximum interval of interior volume check
1161                         4)
1162
1163                 return itemstack
1164         end,
1165 })
1166
1167 --
1168 -- Ores
1169 --
1170
1171 minetest.register_node("default:stone_with_coal", {
1172         description = S("Coal Ore"),
1173         tiles = {"default_stone.png^default_mineral_coal.png"},
1174         groups = {cracky = 3},
1175         drop = "default:coal_lump",
1176         sounds = default.node_sound_stone_defaults(),
1177 })
1178
1179 minetest.register_node("default:coalblock", {
1180         description = S("Coal Block"),
1181         tiles = {"default_coal_block.png"},
1182         is_ground_content = false,
1183         groups = {cracky = 3},
1184         sounds = default.node_sound_stone_defaults(),
1185 })
1186
1187
1188 minetest.register_node("default:stone_with_iron", {
1189         description = S("Iron Ore"),
1190         tiles = {"default_stone.png^default_mineral_iron.png"},
1191         groups = {cracky = 2},
1192         drop = "default:iron_lump",
1193         sounds = default.node_sound_stone_defaults(),
1194 })
1195
1196 minetest.register_node("default:steelblock", {
1197         description = S("Steel Block"),
1198         tiles = {"default_steel_block.png"},
1199         is_ground_content = false,
1200         groups = {cracky = 1, level = 2},
1201         sounds = default.node_sound_metal_defaults(),
1202 })
1203
1204
1205 minetest.register_node("default:stone_with_copper", {
1206         description = S("Copper Ore"),
1207         tiles = {"default_stone.png^default_mineral_copper.png"},
1208         groups = {cracky = 2},
1209         drop = "default:copper_lump",
1210         sounds = default.node_sound_stone_defaults(),
1211 })
1212
1213 minetest.register_node("default:copperblock", {
1214         description = S("Copper Block"),
1215         tiles = {"default_copper_block.png"},
1216         is_ground_content = false,
1217         groups = {cracky = 1, level = 2},
1218         sounds = default.node_sound_metal_defaults(),
1219 })
1220
1221
1222 minetest.register_node("default:stone_with_tin", {
1223         description = S("Tin Ore"),
1224         tiles = {"default_stone.png^default_mineral_tin.png"},
1225         groups = {cracky = 2},
1226         drop = "default:tin_lump",
1227         sounds = default.node_sound_stone_defaults(),
1228 })
1229
1230 minetest.register_node("default:tinblock", {
1231         description = S("Tin Block"),
1232         tiles = {"default_tin_block.png"},
1233         is_ground_content = false,
1234         groups = {cracky = 1, level = 2},
1235         sounds = default.node_sound_metal_defaults(),
1236 })
1237
1238
1239 minetest.register_node("default:bronzeblock", {
1240         description = S("Bronze Block"),
1241         tiles = {"default_bronze_block.png"},
1242         is_ground_content = false,
1243         groups = {cracky = 1, level = 2},
1244         sounds = default.node_sound_metal_defaults(),
1245 })
1246
1247
1248 minetest.register_node("default:stone_with_mese", {
1249         description = S("Mese Ore"),
1250         tiles = {"default_stone.png^default_mineral_mese.png"},
1251         groups = {cracky = 1},
1252         drop = "default:mese_crystal",
1253         sounds = default.node_sound_stone_defaults(),
1254 })
1255
1256 minetest.register_node("default:mese", {
1257         description = S("Mese Block"),
1258         tiles = {"default_mese_block.png"},
1259         paramtype = "light",
1260         groups = {cracky = 1, level = 2},
1261         sounds = default.node_sound_stone_defaults(),
1262         light_source = 3,
1263 })
1264
1265
1266 minetest.register_node("default:stone_with_gold", {
1267         description = S("Gold Ore"),
1268         tiles = {"default_stone.png^default_mineral_gold.png"},
1269         groups = {cracky = 2},
1270         drop = "default:gold_lump",
1271         sounds = default.node_sound_stone_defaults(),
1272 })
1273
1274 minetest.register_node("default:goldblock", {
1275         description = S("Gold Block"),
1276         tiles = {"default_gold_block.png"},
1277         is_ground_content = false,
1278         groups = {cracky = 1},
1279         sounds = default.node_sound_metal_defaults(),
1280 })
1281
1282
1283 minetest.register_node("default:stone_with_diamond", {
1284         description = S("Diamond Ore"),
1285         tiles = {"default_stone.png^default_mineral_diamond.png"},
1286         groups = {cracky = 1},
1287         drop = "default:diamond",
1288         sounds = default.node_sound_stone_defaults(),
1289 })
1290
1291 minetest.register_node("default:diamondblock", {
1292         description = S("Diamond Block"),
1293         tiles = {"default_diamond_block.png"},
1294         is_ground_content = false,
1295         groups = {cracky = 1, level = 3},
1296         sounds = default.node_sound_stone_defaults(),
1297 })
1298
1299 --
1300 -- Plantlife (non-cubic)
1301 --
1302
1303 minetest.register_node("default:cactus", {
1304         description = S("Cactus"),
1305         tiles = {"default_cactus_top.png", "default_cactus_top.png",
1306                 "default_cactus_side.png"},
1307         paramtype2 = "facedir",
1308         groups = {choppy = 3},
1309         sounds = default.node_sound_wood_defaults(),
1310         on_place = minetest.rotate_node,
1311 })
1312
1313 minetest.register_node("default:large_cactus_seedling", {
1314         description = S("Large Cactus Seedling"),
1315         drawtype = "plantlike",
1316         tiles = {"default_large_cactus_seedling.png"},
1317         inventory_image = "default_large_cactus_seedling.png",
1318         wield_image = "default_large_cactus_seedling.png",
1319         paramtype = "light",
1320         sunlight_propagates = true,
1321         walkable = false,
1322         selection_box = {
1323                 type = "fixed",
1324                 fixed = {
1325                         -5 / 16, -0.5, -5 / 16,
1326                         5 / 16, 0.5, 5 / 16
1327                 }
1328         },
1329         groups = {choppy = 3, dig_immediate = 3, attached_node = 1},
1330         sounds = default.node_sound_wood_defaults(),
1331
1332         on_place = function(itemstack, placer, pointed_thing)
1333                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1334                         "default:large_cactus_seedling",
1335                         {x = -2, y = -1, z = -2},
1336                         {x = 2, y = 5, z = 2},
1337                         4)
1338
1339                 return itemstack
1340         end,
1341
1342         on_construct = function(pos)
1343                 -- Normal cactus farming adds 1 cactus node by ABM,
1344                 -- interval 12s, chance 83.
1345                 -- Consider starting with 5 cactus nodes. We make sure that growing a
1346                 -- large cactus is not a faster way to produce new cactus nodes.
1347                 -- Confirmed by experiment, when farming 5 cacti, on average 1 new
1348                 -- cactus node is added on average every
1349                 -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s.
1350                 -- Large cactus contains on average 14 cactus nodes.
1351                 -- 14 * 199.2 = 2788.8s.
1352                 -- Set random range to average to 2789s.
1353                 minetest.get_node_timer(pos):start(math.random(1859, 3719))
1354         end,
1355
1356         on_timer = function(pos)
1357                 local node_under = minetest.get_node_or_nil(
1358                         {x = pos.x, y = pos.y - 1, z = pos.z})
1359                 if not node_under then
1360                         -- Node under not yet loaded, try later
1361                         minetest.get_node_timer(pos):start(300)
1362                         return
1363                 end
1364
1365                 if minetest.get_item_group(node_under.name, "sand") == 0 then
1366                         -- Seedling dies
1367                         minetest.remove_node(pos)
1368                         return
1369                 end
1370
1371                 local light_level = minetest.get_node_light(pos)
1372                 if not light_level or light_level < 13 then
1373                         -- Too dark for growth, try later in case it's night
1374                         minetest.get_node_timer(pos):start(300)
1375                         return
1376                 end
1377
1378                 minetest.log("action", "A large cactus seedling grows into a large" ..
1379                         "cactus at ".. minetest.pos_to_string(pos))
1380                 default.grow_large_cactus(pos)
1381         end,
1382 })
1383
1384 minetest.register_node("default:papyrus", {
1385         description = S("Papyrus"),
1386         drawtype = "plantlike",
1387         tiles = {"default_papyrus.png"},
1388         inventory_image = "default_papyrus.png",
1389         wield_image = "default_papyrus.png",
1390         paramtype = "light",
1391         sunlight_propagates = true,
1392         walkable = false,
1393         selection_box = {
1394                 type = "fixed",
1395                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
1396         },
1397         groups = {snappy = 3, flammable = 2},
1398         sounds = default.node_sound_leaves_defaults(),
1399
1400         after_dig_node = function(pos, node, metadata, digger)
1401                 default.dig_up(pos, node, digger)
1402         end,
1403 })
1404
1405 minetest.register_node("default:dry_shrub", {
1406         description = S("Dry Shrub"),
1407         drawtype = "plantlike",
1408         waving = 1,
1409         tiles = {"default_dry_shrub.png"},
1410         inventory_image = "default_dry_shrub.png",
1411         wield_image = "default_dry_shrub.png",
1412         paramtype = "light",
1413         paramtype2 = "meshoptions",
1414         place_param2 = 4,
1415         sunlight_propagates = true,
1416         walkable = false,
1417         buildable_to = true,
1418         groups = {snappy = 3, flammable = 3, attached_node = 1},
1419         sounds = default.node_sound_leaves_defaults(),
1420         selection_box = {
1421                 type = "fixed",
1422                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16},
1423         },
1424 })
1425
1426 minetest.register_node("default:junglegrass", {
1427         description = S("Jungle Grass"),
1428         drawtype = "plantlike",
1429         waving = 1,
1430         visual_scale = 1.69,
1431         tiles = {"default_junglegrass.png"},
1432         inventory_image = "default_junglegrass.png",
1433         wield_image = "default_junglegrass.png",
1434         paramtype = "light",
1435         sunlight_propagates = true,
1436         walkable = false,
1437         buildable_to = true,
1438         groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1},
1439         sounds = default.node_sound_leaves_defaults(),
1440         selection_box = {
1441                 type = "fixed",
1442                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
1443         },
1444 })
1445
1446
1447 minetest.register_node("default:grass_1", {
1448         description = S("Grass"),
1449         drawtype = "plantlike",
1450         waving = 1,
1451         tiles = {"default_grass_1.png"},
1452         -- Use texture of a taller grass stage in inventory
1453         inventory_image = "default_grass_3.png",
1454         wield_image = "default_grass_3.png",
1455         paramtype = "light",
1456         sunlight_propagates = true,
1457         walkable = false,
1458         buildable_to = true,
1459         groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
1460         sounds = default.node_sound_leaves_defaults(),
1461         selection_box = {
1462                 type = "fixed",
1463                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
1464         },
1465
1466         on_place = function(itemstack, placer, pointed_thing)
1467                 -- place a random grass node
1468                 local stack = ItemStack("default:grass_" .. math.random(1,5))
1469                 local ret = minetest.item_place(stack, placer, pointed_thing)
1470                 return ItemStack("default:grass_1 " ..
1471                         itemstack:get_count() - (1 - ret:get_count()))
1472         end,
1473 })
1474
1475 for i = 2, 5 do
1476         minetest.register_node("default:grass_" .. i, {
1477                 description = S("Grass"),
1478                 drawtype = "plantlike",
1479                 waving = 1,
1480                 tiles = {"default_grass_" .. i .. ".png"},
1481                 inventory_image = "default_grass_" .. i .. ".png",
1482                 wield_image = "default_grass_" .. i .. ".png",
1483                 paramtype = "light",
1484                 sunlight_propagates = true,
1485                 walkable = false,
1486                 buildable_to = true,
1487                 drop = "default:grass_1",
1488                 groups = {snappy = 3, flora = 1, attached_node = 1,
1489                         not_in_creative_inventory = 1, grass = 1, flammable = 1},
1490                 sounds = default.node_sound_leaves_defaults(),
1491                 selection_box = {
1492                         type = "fixed",
1493                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
1494                 },
1495         })
1496 end
1497
1498
1499 minetest.register_node("default:dry_grass_1", {
1500         description = S("Dry Grass"),
1501         drawtype = "plantlike",
1502         waving = 1,
1503         tiles = {"default_dry_grass_1.png"},
1504         inventory_image = "default_dry_grass_3.png",
1505         wield_image = "default_dry_grass_3.png",
1506         paramtype = "light",
1507         sunlight_propagates = true,
1508         walkable = false,
1509         buildable_to = true,
1510         groups = {snappy = 3, flammable = 3, flora = 1,
1511                 attached_node = 1, dry_grass = 1},
1512         sounds = default.node_sound_leaves_defaults(),
1513         selection_box = {
1514                 type = "fixed",
1515                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
1516         },
1517
1518         on_place = function(itemstack, placer, pointed_thing)
1519                 -- place a random dry grass node
1520                 local stack = ItemStack("default:dry_grass_" .. math.random(1, 5))
1521                 local ret = minetest.item_place(stack, placer, pointed_thing)
1522                 return ItemStack("default:dry_grass_1 " ..
1523                         itemstack:get_count() - (1 - ret:get_count()))
1524         end,
1525 })
1526
1527 for i = 2, 5 do
1528         minetest.register_node("default:dry_grass_" .. i, {
1529                 description = S("Dry Grass"),
1530                 drawtype = "plantlike",
1531                 waving = 1,
1532                 tiles = {"default_dry_grass_" .. i .. ".png"},
1533                 inventory_image = "default_dry_grass_" .. i .. ".png",
1534                 wield_image = "default_dry_grass_" .. i .. ".png",
1535                 paramtype = "light",
1536                 sunlight_propagates = true,
1537                 walkable = false,
1538                 buildable_to = true,
1539                 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
1540                         not_in_creative_inventory=1, dry_grass = 1},
1541                 drop = "default:dry_grass_1",
1542                 sounds = default.node_sound_leaves_defaults(),
1543                 selection_box = {
1544                         type = "fixed",
1545                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16},
1546                 },
1547         })
1548 end
1549
1550
1551 minetest.register_node("default:fern_1", {
1552         description = S("Fern"),
1553         drawtype = "plantlike",
1554         waving = 1,
1555         tiles = {"default_fern_1.png"},
1556         inventory_image = "default_fern_1.png",
1557         wield_image = "default_fern_1.png",
1558         paramtype = "light",
1559         sunlight_propagates = true,
1560         walkable = false,
1561         buildable_to = true,
1562         groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1},
1563         sounds = default.node_sound_leaves_defaults(),
1564         selection_box = {
1565                 type = "fixed",
1566                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
1567         },
1568
1569         on_place = function(itemstack, placer, pointed_thing)
1570                 -- place a random fern node
1571                 local stack = ItemStack("default:fern_" .. math.random(1, 3))
1572                 local ret = minetest.item_place(stack, placer, pointed_thing)
1573                 return ItemStack("default:fern_1 " ..
1574                         itemstack:get_count() - (1 - ret:get_count()))
1575         end,
1576 })
1577
1578 for i = 2, 3 do
1579         minetest.register_node("default:fern_" .. i, {
1580                 description = S("Fern"),
1581                 drawtype = "plantlike",
1582                 waving = 1,
1583                 visual_scale = 2,
1584                 tiles = {"default_fern_" .. i .. ".png"},
1585                 inventory_image = "default_fern_" .. i .. ".png",
1586                 wield_image = "default_fern_" .. i .. ".png",
1587                 paramtype = "light",
1588                 sunlight_propagates = true,
1589                 walkable = false,
1590                 buildable_to = true,
1591                 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
1592                         not_in_creative_inventory=1},
1593                 drop = "default:fern_1",
1594                 sounds = default.node_sound_leaves_defaults(),
1595                 selection_box = {
1596                         type = "fixed",
1597                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
1598                 },
1599         })
1600 end
1601
1602
1603 minetest.register_node("default:marram_grass_1", {
1604         description = S("Marram Grass"),
1605         drawtype = "plantlike",
1606         waving = 1,
1607         tiles = {"default_marram_grass_1.png"},
1608         inventory_image = "default_marram_grass_1.png",
1609         wield_image = "default_marram_grass_1.png",
1610         paramtype = "light",
1611         sunlight_propagates = true,
1612         walkable = false,
1613         buildable_to = true,
1614         groups = {snappy = 3, flammable = 3, attached_node = 1},
1615         sounds = default.node_sound_leaves_defaults(),
1616         selection_box = {
1617                 type = "fixed",
1618                 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
1619         },
1620
1621         on_place = function(itemstack, placer, pointed_thing)
1622                 -- place a random marram grass node
1623                 local stack = ItemStack("default:marram_grass_" .. math.random(1, 3))
1624                 local ret = minetest.item_place(stack, placer, pointed_thing)
1625                 return ItemStack("default:marram_grass_1 " ..
1626                         itemstack:get_count() - (1 - ret:get_count()))
1627         end,
1628 })
1629
1630 for i = 2, 3 do
1631         minetest.register_node("default:marram_grass_" .. i, {
1632                 description = S("Marram Grass"),
1633                 drawtype = "plantlike",
1634                 waving = 1,
1635                 tiles = {"default_marram_grass_" .. i .. ".png"},
1636                 inventory_image = "default_marram_grass_" .. i .. ".png",
1637                 wield_image = "default_marram_grass_" .. i .. ".png",
1638                 paramtype = "light",
1639                 sunlight_propagates = true,
1640                 walkable = false,
1641                 buildable_to = true,
1642                 groups = {snappy = 3, flammable = 3, attached_node = 1,
1643                         not_in_creative_inventory=1},
1644                 drop = "default:marram_grass_1",
1645                 sounds = default.node_sound_leaves_defaults(),
1646                 selection_box = {
1647                         type = "fixed",
1648                         fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
1649                 },
1650         })
1651 end
1652
1653
1654 minetest.register_node("default:bush_stem", {
1655         description = S("Bush Stem"),
1656         drawtype = "plantlike",
1657         visual_scale = 1.41,
1658         tiles = {"default_bush_stem.png"},
1659         inventory_image = "default_bush_stem.png",
1660         wield_image = "default_bush_stem.png",
1661         paramtype = "light",
1662         sunlight_propagates = true,
1663         groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1664         sounds = default.node_sound_wood_defaults(),
1665         selection_box = {
1666                 type = "fixed",
1667                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1668         },
1669 })
1670
1671 minetest.register_node("default:bush_leaves", {
1672         description = S("Bush Leaves"),
1673         drawtype = "allfaces_optional",
1674         waving = 1,
1675         tiles = {"default_leaves_simple.png"},
1676         paramtype = "light",
1677         groups = {snappy = 3, flammable = 2, leaves = 1},
1678         drop = {
1679                 max_items = 1,
1680                 items = {
1681                         {items = {"default:bush_sapling"}, rarity = 5},
1682                         {items = {"default:bush_leaves"}}
1683                 }
1684         },
1685         sounds = default.node_sound_leaves_defaults(),
1686
1687         after_place_node = after_place_leaves,
1688 })
1689
1690 minetest.register_node("default:bush_sapling", {
1691         description = S("Bush Sapling"),
1692         drawtype = "plantlike",
1693         tiles = {"default_bush_sapling.png"},
1694         inventory_image = "default_bush_sapling.png",
1695         wield_image = "default_bush_sapling.png",
1696         paramtype = "light",
1697         sunlight_propagates = true,
1698         walkable = false,
1699         on_timer = grow_sapling,
1700         selection_box = {
1701                 type = "fixed",
1702                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1703         },
1704         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1705                 attached_node = 1, sapling = 1},
1706         sounds = default.node_sound_leaves_defaults(),
1707
1708         on_construct = function(pos)
1709                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1710         end,
1711
1712         on_place = function(itemstack, placer, pointed_thing)
1713                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1714                         "default:bush_sapling",
1715                         -- minp, maxp to be checked, relative to sapling pos
1716                         {x = -1, y = 0, z = -1},
1717                         {x = 1, y = 1, z = 1},
1718                         -- maximum interval of interior volume check
1719                         2)
1720
1721                 return itemstack
1722         end,
1723 })
1724
1725 minetest.register_node("default:blueberry_bush_leaves_with_berries", {
1726         description = S("Blueberry Bush Leaves with Berries"),
1727         drawtype = "allfaces_optional",
1728         waving = 1,
1729         tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"},
1730         paramtype = "light",
1731         groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3},
1732         drop = "default:blueberries",
1733         sounds = default.node_sound_leaves_defaults(),
1734         node_dig_prediction = "default:blueberry_bush_leaves",
1735
1736         after_dig_node = function(pos, oldnode, oldmetadata, digger)
1737                 minetest.set_node(pos, {name = "default:blueberry_bush_leaves"})
1738                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1739         end,
1740 })
1741
1742 minetest.register_node("default:blueberry_bush_leaves", {
1743         description = S("Blueberry Bush Leaves"),
1744         drawtype = "allfaces_optional",
1745         waving = 1,
1746         tiles = {"default_blueberry_bush_leaves.png"},
1747         paramtype = "light",
1748         groups = {snappy = 3, flammable = 2, leaves = 1},
1749         drop = {
1750                 max_items = 1,
1751                 items = {
1752                         {items = {"default:blueberry_bush_sapling"}, rarity = 5},
1753                         {items = {"default:blueberry_bush_leaves"}}
1754                 }
1755         },
1756         sounds = default.node_sound_leaves_defaults(),
1757
1758         on_timer = function(pos, elapsed)
1759                 if minetest.get_node_light(pos) < 11 then
1760                         minetest.get_node_timer(pos):start(200)
1761                 else
1762                         minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"})
1763                 end
1764         end,
1765
1766         after_place_node = after_place_leaves,
1767 })
1768
1769 minetest.register_node("default:blueberry_bush_sapling", {
1770         description = S("Blueberry Bush Sapling"),
1771         drawtype = "plantlike",
1772         tiles = {"default_blueberry_bush_sapling.png"},
1773         inventory_image = "default_blueberry_bush_sapling.png",
1774         wield_image = "default_blueberry_bush_sapling.png",
1775         paramtype = "light",
1776         sunlight_propagates = true,
1777         walkable = false,
1778         on_timer = grow_sapling,
1779         selection_box = {
1780                 type = "fixed",
1781                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1782         },
1783         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1784                 attached_node = 1, sapling = 1},
1785         sounds = default.node_sound_leaves_defaults(),
1786
1787         on_construct = function(pos)
1788                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1789         end,
1790
1791         on_place = function(itemstack, placer, pointed_thing)
1792                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1793                         "default:blueberry_bush_sapling",
1794                         -- minp, maxp to be checked, relative to sapling pos
1795                         {x = -1, y = 0, z = -1},
1796                         {x = 1, y = 1, z = 1},
1797                         -- maximum interval of interior volume check
1798                         2)
1799
1800                 return itemstack
1801         end,
1802 })
1803
1804 minetest.register_node("default:acacia_bush_stem", {
1805         description = S("Acacia Bush Stem"),
1806         drawtype = "plantlike",
1807         visual_scale = 1.41,
1808         tiles = {"default_acacia_bush_stem.png"},
1809         inventory_image = "default_acacia_bush_stem.png",
1810         wield_image = "default_acacia_bush_stem.png",
1811         paramtype = "light",
1812         sunlight_propagates = true,
1813         groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1814         sounds = default.node_sound_wood_defaults(),
1815         selection_box = {
1816                 type = "fixed",
1817                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1818         },
1819 })
1820
1821 minetest.register_node("default:acacia_bush_leaves", {
1822         description = S("Acacia Bush Leaves"),
1823         drawtype = "allfaces_optional",
1824         waving = 1,
1825         tiles = {"default_acacia_leaves_simple.png"},
1826         paramtype = "light",
1827         groups = {snappy = 3, flammable = 2, leaves = 1},
1828         drop = {
1829                 max_items = 1,
1830                 items = {
1831                         {items = {"default:acacia_bush_sapling"}, rarity = 5},
1832                         {items = {"default:acacia_bush_leaves"}}
1833                 }
1834         },
1835         sounds = default.node_sound_leaves_defaults(),
1836
1837         after_place_node = after_place_leaves,
1838 })
1839
1840 minetest.register_node("default:acacia_bush_sapling", {
1841         description = S("Acacia Bush Sapling"),
1842         drawtype = "plantlike",
1843         tiles = {"default_acacia_bush_sapling.png"},
1844         inventory_image = "default_acacia_bush_sapling.png",
1845         wield_image = "default_acacia_bush_sapling.png",
1846         paramtype = "light",
1847         sunlight_propagates = true,
1848         walkable = false,
1849         on_timer = grow_sapling,
1850         selection_box = {
1851                 type = "fixed",
1852                 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16}
1853         },
1854         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1855                 attached_node = 1, sapling = 1},
1856         sounds = default.node_sound_leaves_defaults(),
1857
1858         on_construct = function(pos)
1859                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1860         end,
1861
1862         on_place = function(itemstack, placer, pointed_thing)
1863                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1864                         "default:acacia_bush_sapling",
1865                         -- minp, maxp to be checked, relative to sapling pos
1866                         {x = -1, y = 0, z = -1},
1867                         {x = 1, y = 1, z = 1},
1868                         -- maximum interval of interior volume check
1869                         2)
1870
1871                 return itemstack
1872         end,
1873 })
1874
1875 minetest.register_node("default:pine_bush_stem", {
1876         description = S("Pine Bush Stem"),
1877         drawtype = "plantlike",
1878         visual_scale = 1.41,
1879         tiles = {"default_pine_bush_stem.png"},
1880         inventory_image = "default_pine_bush_stem.png",
1881         wield_image = "default_pine_bush_stem.png",
1882         paramtype = "light",
1883         sunlight_propagates = true,
1884         groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
1885         sounds = default.node_sound_wood_defaults(),
1886         selection_box = {
1887                 type = "fixed",
1888                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1889         },
1890 })
1891
1892 minetest.register_node("default:pine_bush_needles", {
1893         description = S("Pine Bush Needles"),
1894         drawtype = "allfaces_optional",
1895         waving = 1,
1896         tiles = {"default_pine_needles.png"},
1897         paramtype = "light",
1898         groups = {snappy = 3, flammable = 2, leaves = 1},
1899         drop = {
1900                 max_items = 1,
1901                 items = {
1902                         {items = {"default:pine_bush_sapling"}, rarity = 5},
1903                         {items = {"default:pine_bush_needles"}}
1904                 }
1905         },
1906         sounds = default.node_sound_leaves_defaults(),
1907
1908         after_place_node = after_place_leaves,
1909 })
1910
1911 minetest.register_node("default:pine_bush_sapling", {
1912         description = S("Pine Bush Sapling"),
1913         drawtype = "plantlike",
1914         tiles = {"default_pine_bush_sapling.png"},
1915         inventory_image = "default_pine_bush_sapling.png",
1916         wield_image = "default_pine_bush_sapling.png",
1917         paramtype = "light",
1918         sunlight_propagates = true,
1919         walkable = false,
1920         on_timer = grow_sapling,
1921         selection_box = {
1922                 type = "fixed",
1923                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1924         },
1925         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1926                 attached_node = 1, sapling = 1},
1927         sounds = default.node_sound_leaves_defaults(),
1928
1929         on_construct = function(pos)
1930                 minetest.get_node_timer(pos):start(math.random(300, 1500))
1931         end,
1932
1933         on_place = function(itemstack, placer, pointed_thing)
1934                 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
1935                         "default:pine_bush_sapling",
1936                         -- minp, maxp to be checked, relative to sapling pos
1937                         {x = -1, y = 0, z = -1},
1938                         {x = 1, y = 1, z = 1},
1939                         -- maximum interval of interior volume check
1940                         2)
1941
1942                 return itemstack
1943         end,
1944 })
1945
1946 minetest.register_node("default:sand_with_kelp", {
1947         description = S("Kelp"),
1948         drawtype = "plantlike_rooted",
1949         waving = 1,
1950         tiles = {"default_sand.png"},
1951         special_tiles = {{name = "default_kelp.png", tileable_vertical = true}},
1952         inventory_image = "default_kelp.png",
1953         paramtype = "light",
1954         paramtype2 = "leveled",
1955         groups = {snappy = 3},
1956         selection_box = {
1957                 type = "fixed",
1958                 fixed = {
1959                                 {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
1960                                 {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16},
1961                 },
1962         },
1963         node_dig_prediction = "default:sand",
1964         node_placement_prediction = "",
1965         sounds = default.node_sound_sand_defaults({
1966                 dig = {name = "default_dig_snappy", gain = 0.2},
1967                 dug = {name = "default_grass_footstep", gain = 0.25},
1968         }),
1969
1970         on_place = function(itemstack, placer, pointed_thing)
1971                 -- Call on_rightclick if the pointed node defines it
1972                 if pointed_thing.type == "node" and placer and
1973                                 not placer:get_player_control().sneak then
1974                         local node_ptu = minetest.get_node(pointed_thing.under)
1975                         local def_ptu = minetest.registered_nodes[node_ptu.name]
1976                         if def_ptu and def_ptu.on_rightclick then
1977                                 return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer,
1978                                         itemstack, pointed_thing)
1979                         end
1980                 end
1981
1982                 local pos = pointed_thing.under
1983                 if minetest.get_node(pos).name ~= "default:sand" then
1984                         return itemstack
1985                 end
1986
1987                 local height = math.random(4, 6)
1988                 local pos_top = {x = pos.x, y = pos.y + height, z = pos.z}
1989                 local node_top = minetest.get_node(pos_top)
1990                 local def_top = minetest.registered_nodes[node_top.name]
1991                 local player_name = placer:get_player_name()
1992
1993                 if def_top and def_top.liquidtype == "source" and
1994                                 minetest.get_item_group(node_top.name, "water") > 0 then
1995                         if not minetest.is_protected(pos, player_name) and
1996                                         not minetest.is_protected(pos_top, player_name) then
1997                                 minetest.set_node(pos, {name = "default:sand_with_kelp",
1998                                         param2 = height * 16})
1999                                 if not (creative and creative.is_enabled_for
2000                                                 and creative.is_enabled_for(player_name)) then
2001                                         itemstack:take_item()
2002                                 end
2003                         else
2004                                 minetest.chat_send_player(player_name, "Node is protected")
2005                                 minetest.record_protection_violation(pos, player_name)
2006                         end
2007                 end
2008
2009                 return itemstack
2010         end,
2011
2012         after_destruct  = function(pos, oldnode)
2013                 minetest.set_node(pos, {name = "default:sand"})
2014         end
2015 })
2016
2017
2018 --
2019 -- Corals
2020 --
2021
2022 local function coral_on_place(itemstack, placer, pointed_thing)
2023         if pointed_thing.type ~= "node" or not placer then
2024                 return itemstack
2025         end
2026
2027         local player_name = placer:get_player_name()
2028         local pos_under = pointed_thing.under
2029         local pos_above = pointed_thing.above
2030         local node_under = minetest.get_node(pos_under)
2031         local def_under = minetest.registered_nodes[node_under.name]
2032
2033         if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then
2034                 return def_under.on_rightclick(pos_under, node_under,
2035                                 placer, itemstack, pointed_thing) or itemstack
2036         end
2037
2038         if node_under.name ~= "default:coral_skeleton" or
2039                         minetest.get_node(pos_above).name ~= "default:water_source" then
2040                 return itemstack
2041         end
2042
2043         if minetest.is_protected(pos_under, player_name) or
2044                         minetest.is_protected(pos_above, player_name) then
2045                 minetest.log("action", player_name
2046                         .. " tried to place " .. itemstack:get_name()
2047                         .. " at protected position "
2048                         .. minetest.pos_to_string(pos_under))
2049                 minetest.record_protection_violation(pos_under, player_name)
2050                 return itemstack
2051         end
2052
2053         node_under.name = itemstack:get_name()
2054         minetest.set_node(pos_under, node_under)
2055         if not (creative and creative.is_enabled_for(player_name)) then
2056                 itemstack:take_item()
2057         end
2058
2059         return itemstack
2060 end
2061
2062 minetest.register_node("default:coral_green", {
2063         description = S("Green Coral"),
2064         drawtype = "plantlike_rooted",
2065         waving = 1,
2066         paramtype = "light",
2067         tiles = {"default_coral_skeleton.png"},
2068         special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}},
2069         inventory_image = "default_coral_green.png",
2070         groups = {snappy = 3},
2071         selection_box = {
2072                 type = "fixed",
2073                 fixed = {
2074                                 {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
2075                                 {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
2076                 },
2077         },
2078         node_dig_prediction = "default:coral_skeleton",
2079         node_placement_prediction = "",
2080         sounds = default.node_sound_stone_defaults({
2081                 dig = {name = "default_dig_snappy", gain = 0.2},
2082                 dug = {name = "default_grass_footstep", gain = 0.25},
2083         }),
2084
2085         on_place = coral_on_place,
2086
2087         after_destruct  = function(pos, oldnode)
2088                 minetest.set_node(pos, {name = "default:coral_skeleton"})
2089         end,
2090 })
2091
2092 minetest.register_node("default:coral_pink", {
2093         description = S("Pink Coral"),
2094         drawtype = "plantlike_rooted",
2095         waving = 1,
2096         paramtype = "light",
2097         tiles = {"default_coral_skeleton.png"},
2098         special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}},
2099         inventory_image = "default_coral_pink.png",
2100         groups = {snappy = 3},
2101         selection_box = {
2102                 type = "fixed",
2103                 fixed = {
2104                                 {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
2105                                 {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
2106                 },
2107         },
2108         node_dig_prediction = "default:coral_skeleton",
2109         node_placement_prediction = "",
2110         sounds = default.node_sound_stone_defaults({
2111                 dig = {name = "default_dig_snappy", gain = 0.2},
2112                 dug = {name = "default_grass_footstep", gain = 0.25},
2113         }),
2114
2115         on_place = coral_on_place,
2116
2117         after_destruct  = function(pos, oldnode)
2118                 minetest.set_node(pos, {name = "default:coral_skeleton"})
2119         end,
2120 })
2121
2122 minetest.register_node("default:coral_cyan", {
2123         description = S("Cyan Coral"),
2124         drawtype = "plantlike_rooted",
2125         waving = 1,
2126         paramtype = "light",
2127         tiles = {"default_coral_skeleton.png"},
2128         special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}},
2129         inventory_image = "default_coral_cyan.png",
2130         groups = {snappy = 3},
2131         selection_box = {
2132                 type = "fixed",
2133                 fixed = {
2134                                 {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
2135                                 {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
2136                 },
2137         },
2138         node_dig_prediction = "default:coral_skeleton",
2139         node_placement_prediction = "",
2140         sounds = default.node_sound_stone_defaults({
2141                 dig = {name = "default_dig_snappy", gain = 0.2},
2142                 dug = {name = "default_grass_footstep", gain = 0.25},
2143         }),
2144
2145         on_place = coral_on_place,
2146
2147         after_destruct  = function(pos, oldnode)
2148                 minetest.set_node(pos, {name = "default:coral_skeleton"})
2149         end,
2150 })
2151
2152 minetest.register_node("default:coral_brown", {
2153         description = S("Brown Coral"),
2154         tiles = {"default_coral_brown.png"},
2155         groups = {cracky = 3},
2156         drop = "default:coral_skeleton",
2157         sounds = default.node_sound_stone_defaults(),
2158 })
2159
2160 minetest.register_node("default:coral_orange", {
2161         description = S("Orange Coral"),
2162         tiles = {"default_coral_orange.png"},
2163         groups = {cracky = 3},
2164         drop = "default:coral_skeleton",
2165         sounds = default.node_sound_stone_defaults(),
2166 })
2167
2168 minetest.register_node("default:coral_skeleton", {
2169         description = S("Coral Skeleton"),
2170         tiles = {"default_coral_skeleton.png"},
2171         groups = {cracky = 3},
2172         sounds = default.node_sound_stone_defaults(),
2173 })
2174
2175
2176 --
2177 -- Liquids
2178 --
2179
2180 minetest.register_node("default:water_source", {
2181         description = S("Water Source"),
2182         drawtype = "liquid",
2183         waving = 3,
2184         tiles = {
2185                 {
2186                         name = "default_water_source_animated.png",
2187                         backface_culling = false,
2188                         animation = {
2189                                 type = "vertical_frames",
2190                                 aspect_w = 16,
2191                                 aspect_h = 16,
2192                                 length = 2.0,
2193                         },
2194                 },
2195                 {
2196                         name = "default_water_source_animated.png",
2197                         backface_culling = true,
2198                         animation = {
2199                                 type = "vertical_frames",
2200                                 aspect_w = 16,
2201                                 aspect_h = 16,
2202                                 length = 2.0,
2203                         },
2204                 },
2205         },
2206         alpha = 191,
2207         paramtype = "light",
2208         walkable = false,
2209         pointable = false,
2210         diggable = false,
2211         buildable_to = true,
2212         is_ground_content = false,
2213         drop = "",
2214         drowning = 1,
2215         liquidtype = "source",
2216         liquid_alternative_flowing = "default:water_flowing",
2217         liquid_alternative_source = "default:water_source",
2218         liquid_viscosity = 1,
2219         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
2220         groups = {water = 3, liquid = 3, cools_lava = 1},
2221         sounds = default.node_sound_water_defaults(),
2222 })
2223
2224 minetest.register_node("default:water_flowing", {
2225         description = S("Flowing Water"),
2226         drawtype = "flowingliquid",
2227         waving = 3,
2228         tiles = {"default_water.png"},
2229         special_tiles = {
2230                 {
2231                         name = "default_water_flowing_animated.png",
2232                         backface_culling = false,
2233                         animation = {
2234                                 type = "vertical_frames",
2235                                 aspect_w = 16,
2236                                 aspect_h = 16,
2237                                 length = 0.8,
2238                         },
2239                 },
2240                 {
2241                         name = "default_water_flowing_animated.png",
2242                         backface_culling = true,
2243                         animation = {
2244                                 type = "vertical_frames",
2245                                 aspect_w = 16,
2246                                 aspect_h = 16,
2247                                 length = 0.8,
2248                         },
2249                 },
2250         },
2251         alpha = 191,
2252         paramtype = "light",
2253         paramtype2 = "flowingliquid",
2254         walkable = false,
2255         pointable = false,
2256         diggable = false,
2257         buildable_to = true,
2258         is_ground_content = false,
2259         drop = "",
2260         drowning = 1,
2261         liquidtype = "flowing",
2262         liquid_alternative_flowing = "default:water_flowing",
2263         liquid_alternative_source = "default:water_source",
2264         liquid_viscosity = 1,
2265         post_effect_color = {a = 103, r = 30, g = 60, b = 90},
2266         groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
2267                 cools_lava = 1},
2268         sounds = default.node_sound_water_defaults(),
2269 })
2270
2271
2272 minetest.register_node("default:river_water_source", {
2273         description = S("River Water Source"),
2274         drawtype = "liquid",
2275         tiles = {
2276                 {
2277                         name = "default_river_water_source_animated.png",
2278                         backface_culling = false,
2279                         animation = {
2280                                 type = "vertical_frames",
2281                                 aspect_w = 16,
2282                                 aspect_h = 16,
2283                                 length = 2.0,
2284                         },
2285                 },
2286                 {
2287                         name = "default_river_water_source_animated.png",
2288                         backface_culling = true,
2289                         animation = {
2290                                 type = "vertical_frames",
2291                                 aspect_w = 16,
2292                                 aspect_h = 16,
2293                                 length = 2.0,
2294                         },
2295                 },
2296         },
2297         alpha = 160,
2298         paramtype = "light",
2299         walkable = false,
2300         pointable = false,
2301         diggable = false,
2302         buildable_to = true,
2303         is_ground_content = false,
2304         drop = "",
2305         drowning = 1,
2306         liquidtype = "source",
2307         liquid_alternative_flowing = "default:river_water_flowing",
2308         liquid_alternative_source = "default:river_water_source",
2309         liquid_viscosity = 1,
2310         -- Not renewable to avoid horizontal spread of water sources in sloping
2311         -- rivers that can cause water to overflow riverbanks and cause floods.
2312         -- River water source is instead made renewable by the 'force renew'
2313         -- option used in the 'bucket' mod by the river water bucket.
2314         liquid_renewable = false,
2315         liquid_range = 2,
2316         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
2317         groups = {water = 3, liquid = 3, cools_lava = 1},
2318         sounds = default.node_sound_water_defaults(),
2319 })
2320
2321 minetest.register_node("default:river_water_flowing", {
2322         description = S("Flowing River Water"),
2323         drawtype = "flowingliquid",
2324         tiles = {"default_river_water.png"},
2325         special_tiles = {
2326                 {
2327                         name = "default_river_water_flowing_animated.png",
2328                         backface_culling = false,
2329                         animation = {
2330                                 type = "vertical_frames",
2331                                 aspect_w = 16,
2332                                 aspect_h = 16,
2333                                 length = 0.8,
2334                         },
2335                 },
2336                 {
2337                         name = "default_river_water_flowing_animated.png",
2338                         backface_culling = true,
2339                         animation = {
2340                                 type = "vertical_frames",
2341                                 aspect_w = 16,
2342                                 aspect_h = 16,
2343                                 length = 0.8,
2344                         },
2345                 },
2346         },
2347         alpha = 160,
2348         paramtype = "light",
2349         paramtype2 = "flowingliquid",
2350         walkable = false,
2351         pointable = false,
2352         diggable = false,
2353         buildable_to = true,
2354         is_ground_content = false,
2355         drop = "",
2356         drowning = 1,
2357         liquidtype = "flowing",
2358         liquid_alternative_flowing = "default:river_water_flowing",
2359         liquid_alternative_source = "default:river_water_source",
2360         liquid_viscosity = 1,
2361         liquid_renewable = false,
2362         liquid_range = 2,
2363         post_effect_color = {a = 103, r = 30, g = 76, b = 90},
2364         groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
2365                 cools_lava = 1},
2366         sounds = default.node_sound_water_defaults(),
2367 })
2368
2369
2370 minetest.register_node("default:lava_source", {
2371         description = S("Lava Source"),
2372         drawtype = "liquid",
2373         tiles = {
2374                 {
2375                         name = "default_lava_source_animated.png",
2376                         backface_culling = false,
2377                         animation = {
2378                                 type = "vertical_frames",
2379                                 aspect_w = 16,
2380                                 aspect_h = 16,
2381                                 length = 3.0,
2382                         },
2383                 },
2384                 {
2385                         name = "default_lava_source_animated.png",
2386                         backface_culling = true,
2387                         animation = {
2388                                 type = "vertical_frames",
2389                                 aspect_w = 16,
2390                                 aspect_h = 16,
2391                                 length = 3.0,
2392                         },
2393                 },
2394         },
2395         paramtype = "light",
2396         light_source = default.LIGHT_MAX - 1,
2397         walkable = false,
2398         pointable = false,
2399         diggable = false,
2400         buildable_to = true,
2401         is_ground_content = false,
2402         drop = "",
2403         drowning = 1,
2404         liquidtype = "source",
2405         liquid_alternative_flowing = "default:lava_flowing",
2406         liquid_alternative_source = "default:lava_source",
2407         liquid_viscosity = 7,
2408         liquid_renewable = false,
2409         damage_per_second = 4 * 2,
2410         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
2411         groups = {lava = 3, liquid = 2, igniter = 1},
2412 })
2413
2414 minetest.register_node("default:lava_flowing", {
2415         description = S("Flowing Lava"),
2416         drawtype = "flowingliquid",
2417         tiles = {"default_lava.png"},
2418         special_tiles = {
2419                 {
2420                         name = "default_lava_flowing_animated.png",
2421                         backface_culling = false,
2422                         animation = {
2423                                 type = "vertical_frames",
2424                                 aspect_w = 16,
2425                                 aspect_h = 16,
2426                                 length = 3.3,
2427                         },
2428                 },
2429                 {
2430                         name = "default_lava_flowing_animated.png",
2431                         backface_culling = true,
2432                         animation = {
2433                                 type = "vertical_frames",
2434                                 aspect_w = 16,
2435                                 aspect_h = 16,
2436                                 length = 3.3,
2437                         },
2438                 },
2439         },
2440         paramtype = "light",
2441         paramtype2 = "flowingliquid",
2442         light_source = default.LIGHT_MAX - 1,
2443         walkable = false,
2444         pointable = false,
2445         diggable = false,
2446         buildable_to = true,
2447         is_ground_content = false,
2448         drop = "",
2449         drowning = 1,
2450         liquidtype = "flowing",
2451         liquid_alternative_flowing = "default:lava_flowing",
2452         liquid_alternative_source = "default:lava_source",
2453         liquid_viscosity = 7,
2454         liquid_renewable = false,
2455         damage_per_second = 4 * 2,
2456         post_effect_color = {a = 191, r = 255, g = 64, b = 0},
2457         groups = {lava = 3, liquid = 2, igniter = 1,
2458                 not_in_creative_inventory = 1},
2459 })
2460
2461 --
2462 -- Tools / "Advanced" crafting / Non-"natural"
2463 --
2464
2465 local bookshelf_formspec =
2466         "size[8,7;]" ..
2467         "list[context;books;0,0.3;8,2;]" ..
2468         "list[current_player;main;0,2.85;8,1;]" ..
2469         "list[current_player;main;0,4.08;8,3;8]" ..
2470         "listring[context;books]" ..
2471         "listring[current_player;main]" ..
2472         default.get_hotbar_bg(0,2.85)
2473
2474 local function update_bookshelf(pos)
2475         local meta = minetest.get_meta(pos)
2476         local inv = meta:get_inventory()
2477         local invlist = inv:get_list("books")
2478
2479         local formspec = bookshelf_formspec
2480         -- Inventory slots overlay
2481         local bx, by = 0, 0.3
2482         local n_written, n_empty = 0, 0
2483         for i = 1, 16 do
2484                 if i == 9 then
2485                         bx = 0
2486                         by = by + 1
2487                 end
2488                 local stack = invlist[i]
2489                 if stack:is_empty() then
2490                         formspec = formspec ..
2491                                 "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
2492                 else
2493                         local metatable = stack:get_meta():to_table() or {}
2494                         if metatable.fields and metatable.fields.text then
2495                                 n_written = n_written + stack:get_count()
2496                         else
2497                                 n_empty = n_empty + stack:get_count()
2498                         end
2499                 end
2500                 bx = bx + 1
2501         end
2502         meta:set_string("formspec", formspec)
2503         if n_written + n_empty == 0 then
2504                 meta:set_string("infotext", S("Empty Bookshelf"))
2505         else
2506                 meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty))
2507         end
2508 end
2509
2510 minetest.register_node("default:bookshelf", {
2511         description = S("Bookshelf"),
2512         tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
2513                 "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
2514         paramtype2 = "facedir",
2515         is_ground_content = false,
2516         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2517         sounds = default.node_sound_wood_defaults(),
2518
2519         on_construct = function(pos)
2520                 local meta = minetest.get_meta(pos)
2521                 local inv = meta:get_inventory()
2522                 inv:set_size("books", 8 * 2)
2523                 update_bookshelf(pos)
2524         end,
2525         can_dig = function(pos,player)
2526                 local inv = minetest.get_meta(pos):get_inventory()
2527                 return inv:is_empty("books")
2528         end,
2529         allow_metadata_inventory_put = function(pos, listname, index, stack)
2530                 if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
2531                         return stack:get_count()
2532                 end
2533                 return 0
2534         end,
2535         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
2536                 minetest.log("action", player:get_player_name() ..
2537                         " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
2538                 update_bookshelf(pos)
2539         end,
2540         on_metadata_inventory_put = function(pos, listname, index, stack, player)
2541                 minetest.log("action", player:get_player_name() ..
2542                         " puts stuff to bookshelf at " .. minetest.pos_to_string(pos))
2543                 update_bookshelf(pos)
2544         end,
2545         on_metadata_inventory_take = function(pos, listname, index, stack, player)
2546                 minetest.log("action", player:get_player_name() ..
2547                         " takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
2548                 update_bookshelf(pos)
2549         end,
2550         on_blast = function(pos)
2551                 local drops = {}
2552                 default.get_inventory_drops(pos, "books", drops)
2553                 drops[#drops+1] = "default:bookshelf"
2554                 minetest.remove_node(pos)
2555                 return drops
2556         end,
2557 })
2558
2559 local function register_sign(material, desc, def)
2560         minetest.register_node("default:sign_wall_" .. material, {
2561                 description = desc,
2562                 drawtype = "nodebox",
2563                 tiles = {"default_sign_wall_" .. material .. ".png"},
2564                 inventory_image = "default_sign_" .. material .. ".png",
2565                 wield_image = "default_sign_" .. material .. ".png",
2566                 paramtype = "light",
2567                 paramtype2 = "wallmounted",
2568                 sunlight_propagates = true,
2569                 is_ground_content = false,
2570                 walkable = false,
2571                 node_box = {
2572                         type = "wallmounted",
2573                         wall_top    = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
2574                         wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
2575                         wall_side   = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
2576                 },
2577                 groups = def.groups,
2578                 legacy_wallmounted = true,
2579                 sounds = def.sounds,
2580
2581                 on_construct = function(pos)
2582                         --local n = minetest.get_node(pos)
2583                         local meta = minetest.get_meta(pos)
2584                         meta:set_string("formspec", "field[text;;${text}]")
2585                 end,
2586                 on_receive_fields = function(pos, formname, fields, sender)
2587                         --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
2588                         local player_name = sender:get_player_name()
2589                         if minetest.is_protected(pos, player_name) then
2590                                 minetest.record_protection_violation(pos, player_name)
2591                                 return
2592                         end
2593                         local text = fields.text
2594                         if not text then
2595                                 return
2596                         end
2597                         if string.len(text) > 512 then
2598                                 minetest.chat_send_player(player_name, S("Text too long"))
2599                                 return
2600                         end
2601                         minetest.log("action", (player_name or "") .. " wrote \"" ..
2602                                 text .. "\" to sign at " .. minetest.pos_to_string(pos))
2603                         local meta = minetest.get_meta(pos)
2604                         meta:set_string("text", text)
2605
2606                         if #text > 0 then
2607                                 meta:set_string("infotext", S('"@1"', text))
2608                         else
2609                                 meta:set_string("infotext", '')
2610                         end
2611                 end,
2612         })
2613 end
2614
2615 register_sign("wood", S("Wooden Sign"), {
2616         sounds = default.node_sound_wood_defaults(),
2617         groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3}
2618 })
2619
2620 register_sign("steel", S("Steel Sign"), {
2621         sounds = default.node_sound_metal_defaults(),
2622         groups = {cracky = 2, attached_node = 1}
2623 })
2624
2625 minetest.register_node("default:ladder_wood", {
2626         description = S("Wooden Ladder"),
2627         drawtype = "signlike",
2628         tiles = {"default_ladder_wood.png"},
2629         inventory_image = "default_ladder_wood.png",
2630         wield_image = "default_ladder_wood.png",
2631         paramtype = "light",
2632         paramtype2 = "wallmounted",
2633         sunlight_propagates = true,
2634         walkable = false,
2635         climbable = true,
2636         is_ground_content = false,
2637         selection_box = {
2638                 type = "wallmounted",
2639                 --wall_top = = <default>
2640                 --wall_bottom = = <default>
2641                 --wall_side = = <default>
2642         },
2643         groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
2644         legacy_wallmounted = true,
2645         sounds = default.node_sound_wood_defaults(),
2646 })
2647
2648 minetest.register_node("default:ladder_steel", {
2649         description = S("Steel Ladder"),
2650         drawtype = "signlike",
2651         tiles = {"default_ladder_steel.png"},
2652         inventory_image = "default_ladder_steel.png",
2653         wield_image = "default_ladder_steel.png",
2654         paramtype = "light",
2655         paramtype2 = "wallmounted",
2656         sunlight_propagates = true,
2657         walkable = false,
2658         climbable = true,
2659         is_ground_content = false,
2660         selection_box = {
2661                 type = "wallmounted",
2662                 --wall_top = = <default>
2663                 --wall_bottom = = <default>
2664                 --wall_side = = <default>
2665         },
2666         groups = {cracky = 2},
2667         sounds = default.node_sound_metal_defaults(),
2668 })
2669
2670 default.register_fence("default:fence_wood", {
2671         description = S("Apple Wood Fence"),
2672         texture = "default_fence_wood.png",
2673         inventory_image = "default_fence_overlay.png^default_wood.png^" ..
2674                                 "default_fence_overlay.png^[makealpha:255,126,126",
2675         wield_image = "default_fence_overlay.png^default_wood.png^" ..
2676                                 "default_fence_overlay.png^[makealpha:255,126,126",
2677         material = "default:wood",
2678         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2679         sounds = default.node_sound_wood_defaults()
2680 })
2681
2682 default.register_fence("default:fence_acacia_wood", {
2683         description = S("Acacia Wood Fence"),
2684         texture = "default_fence_acacia_wood.png",
2685         inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
2686                                 "default_fence_overlay.png^[makealpha:255,126,126",
2687         wield_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
2688                                 "default_fence_overlay.png^[makealpha:255,126,126",
2689         material = "default:acacia_wood",
2690         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2691         sounds = default.node_sound_wood_defaults()
2692 })
2693
2694 default.register_fence("default:fence_junglewood", {
2695         description = S("Jungle Wood Fence"),
2696         texture = "default_fence_junglewood.png",
2697         inventory_image = "default_fence_overlay.png^default_junglewood.png^" ..
2698                                 "default_fence_overlay.png^[makealpha:255,126,126",
2699         wield_image = "default_fence_overlay.png^default_junglewood.png^" ..
2700                                 "default_fence_overlay.png^[makealpha:255,126,126",
2701         material = "default:junglewood",
2702         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2703         sounds = default.node_sound_wood_defaults()
2704 })
2705
2706 default.register_fence("default:fence_pine_wood", {
2707         description = S("Pine Wood Fence"),
2708         texture = "default_fence_pine_wood.png",
2709         inventory_image = "default_fence_overlay.png^default_pine_wood.png^" ..
2710                                 "default_fence_overlay.png^[makealpha:255,126,126",
2711         wield_image = "default_fence_overlay.png^default_pine_wood.png^" ..
2712                                 "default_fence_overlay.png^[makealpha:255,126,126",
2713         material = "default:pine_wood",
2714         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2715         sounds = default.node_sound_wood_defaults()
2716 })
2717
2718 default.register_fence("default:fence_aspen_wood", {
2719         description = S("Aspen Wood Fence"),
2720         texture = "default_fence_aspen_wood.png",
2721         inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
2722                                 "default_fence_overlay.png^[makealpha:255,126,126",
2723         wield_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
2724                                 "default_fence_overlay.png^[makealpha:255,126,126",
2725         material = "default:aspen_wood",
2726         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2727         sounds = default.node_sound_wood_defaults()
2728 })
2729
2730 default.register_fence_rail("default:fence_rail_wood", {
2731         description = S("Apple Wood Fence Rail"),
2732         texture = "default_fence_rail_wood.png",
2733         inventory_image = "default_fence_rail_overlay.png^default_wood.png^" ..
2734                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2735         wield_image = "default_fence_rail_overlay.png^default_wood.png^" ..
2736                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2737         material = "default:wood",
2738         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2739         sounds = default.node_sound_wood_defaults()
2740 })
2741
2742 default.register_fence_rail("default:fence_rail_acacia_wood", {
2743         description = S("Acacia Wood Fence Rail"),
2744         texture = "default_fence_rail_acacia_wood.png",
2745         inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
2746                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2747         wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
2748                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2749         material = "default:acacia_wood",
2750         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2751         sounds = default.node_sound_wood_defaults()
2752 })
2753
2754 default.register_fence_rail("default:fence_rail_junglewood", {
2755         description = S("Jungle Wood Fence Rail"),
2756         texture = "default_fence_rail_junglewood.png",
2757         inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
2758                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2759         wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
2760                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2761         material = "default:junglewood",
2762         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2763         sounds = default.node_sound_wood_defaults()
2764 })
2765
2766 default.register_fence_rail("default:fence_rail_pine_wood", {
2767         description = S("Pine Wood Fence Rail"),
2768         texture = "default_fence_rail_pine_wood.png",
2769         inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
2770                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2771         wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
2772                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2773         material = "default:pine_wood",
2774         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2775         sounds = default.node_sound_wood_defaults()
2776 })
2777
2778 default.register_fence_rail("default:fence_rail_aspen_wood", {
2779         description = S("Aspen Wood Fence Rail"),
2780         texture = "default_fence_rail_aspen_wood.png",
2781         inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
2782                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2783         wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
2784                                 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2785         material = "default:aspen_wood",
2786         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
2787         sounds = default.node_sound_wood_defaults()
2788 })
2789
2790 minetest.register_node("default:glass", {
2791         description = S("Glass"),
2792         drawtype = "glasslike_framed_optional",
2793         tiles = {"default_glass.png", "default_glass_detail.png"},
2794         paramtype = "light",
2795         paramtype2 = "glasslikeliquidlevel",
2796         sunlight_propagates = true,
2797         is_ground_content = false,
2798         groups = {cracky = 3, oddly_breakable_by_hand = 3},
2799         sounds = default.node_sound_glass_defaults(),
2800 })
2801
2802 minetest.register_node("default:obsidian_glass", {
2803         description = S("Obsidian Glass"),
2804         drawtype = "glasslike_framed_optional",
2805         tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
2806         paramtype = "light",
2807         paramtype2 = "glasslikeliquidlevel",
2808         is_ground_content = false,
2809         sunlight_propagates = true,
2810         sounds = default.node_sound_glass_defaults(),
2811         groups = {cracky = 3},
2812 })
2813
2814
2815 minetest.register_node("default:brick", {
2816         description = S("Brick Block"),
2817         paramtype2 = "facedir",
2818         place_param2 = 0,
2819         tiles = {"default_brick.png"},
2820         is_ground_content = false,
2821         groups = {cracky = 3},
2822         sounds = default.node_sound_stone_defaults(),
2823 })
2824
2825
2826 minetest.register_node("default:meselamp", {
2827         description = S("Mese Lamp"),
2828         drawtype = "glasslike",
2829         tiles = {"default_meselamp.png"},
2830         paramtype = "light",
2831         sunlight_propagates = true,
2832         is_ground_content = false,
2833         groups = {cracky = 3, oddly_breakable_by_hand = 3},
2834         sounds = default.node_sound_glass_defaults(),
2835         light_source = default.LIGHT_MAX,
2836 })
2837
2838 minetest.register_node("default:mese_post_light", {
2839         description = S("Mese Post Light"),
2840         tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png",
2841                 "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png",
2842                 "default_mese_post_light_side.png", "default_mese_post_light_side.png"},
2843         wield_image = "default_mese_post_light_side.png",
2844         drawtype = "nodebox",
2845         node_box = {
2846                 type = "fixed",
2847                 fixed = {
2848                         {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
2849                 },
2850         },
2851         paramtype = "light",
2852         light_source = default.LIGHT_MAX,
2853         sunlight_propagates = true,
2854         is_ground_content = false,
2855         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2856         sounds = default.node_sound_wood_defaults(),
2857 })
2858
2859 --
2860 -- Misc
2861 --
2862
2863 minetest.register_node("default:cloud", {
2864         description = S("Cloud"),
2865         tiles = {"default_cloud.png"},
2866         is_ground_content = false,
2867         sounds = default.node_sound_defaults(),
2868         groups = {not_in_creative_inventory = 1},
2869 })
2870
2871 --
2872 -- register trees for leafdecay
2873 --
2874
2875 if minetest.get_mapgen_setting("mg_name") == "v6" then
2876         default.register_leafdecay({
2877                 trunks = {"default:tree"},
2878                 leaves = {"default:apple", "default:leaves"},
2879                 radius = 2,
2880         })
2881
2882         default.register_leafdecay({
2883                 trunks = {"default:jungletree"},
2884                 leaves = {"default:jungleleaves"},
2885                 radius = 3,
2886         })
2887 else
2888         default.register_leafdecay({
2889                 trunks = {"default:tree"},
2890                 leaves = {"default:apple", "default:leaves"},
2891                 radius = 3,
2892         })
2893
2894         default.register_leafdecay({
2895                 trunks = {"default:jungletree"},
2896                 leaves = {"default:jungleleaves"},
2897                 radius = 2,
2898         })
2899 end
2900
2901 default.register_leafdecay({
2902         trunks = {"default:pine_tree"},
2903         leaves = {"default:pine_needles"},
2904         radius = 3,
2905 })
2906
2907 default.register_leafdecay({
2908         trunks = {"default:acacia_tree"},
2909         leaves = {"default:acacia_leaves"},
2910         radius = 2,
2911 })
2912
2913 default.register_leafdecay({
2914         trunks = {"default:aspen_tree"},
2915         leaves = {"default:aspen_leaves"},
2916         radius = 3,
2917 })
2918
2919 default.register_leafdecay({
2920         trunks = {"default:bush_stem"},
2921         leaves = {"default:bush_leaves"},
2922         radius = 1,
2923 })
2924
2925 default.register_leafdecay({
2926         trunks = {"default:acacia_bush_stem"},
2927         leaves = {"default:acacia_bush_leaves"},
2928         radius = 1,
2929 })
2930
2931 default.register_leafdecay({
2932         trunks = {"default:pine_bush_stem"},
2933         leaves = {"default:pine_bush_needles"},
2934         radius = 1,
2935 })