1 -- mods/default/nodes.lua
3 -- support for MT game translation.
4 local S = default.get_translator
6 --[[ Node name convention:
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.
19 (1. Material 2. Cobble variant 3. Brick variant 4. Modified forms)
29 default:desert_stonebrick
30 default:desert_stone_block
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
44 default:obsidian_block
48 (1. Material 2. Modified forms)
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
58 default:dry_dirt_with_dry_grass
61 default:permafrost_with_stones
62 default:permafrost_with_moss
79 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits)
91 default:emergent_jungle_sapling
100 default:acacia_leaves
101 default:acacia_sapling
106 default:aspen_sapling
110 (1. In stone 2. Blocks)
112 default:stone_with_coal
115 default:stone_with_iron
118 default:stone_with_copper
121 default:stone_with_tin
126 default:stone_with_gold
129 default:stone_with_mese
132 default:stone_with_diamond
139 default:large_cactus_seedling
161 default:marram_grass_1
162 default:marram_grass_2
163 default:marram_grass_3
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
178 default:sand_with_kelp
185 default:coral_skeleton
189 (1. Source 2. Flowing)
192 default:water_flowing
194 default:river_water_source
195 default:river_water_flowing
200 Tools / "Advanced" crafting / Non-"natural"
201 -------------------------------------------
205 default:sign_wall_wood
206 default:sign_wall_steel
212 default:fence_acacia_wood
213 default:fence_junglewood
214 default:fence_pine_wood
215 default:fence_aspen_wood
218 default:obsidian_glass
223 default:mese_post_light
232 -- Required wrapper to allow customization of default.after_place_leaves
233 local function after_place_leaves(...)
234 return default.after_place_leaves(...)
237 -- Required wrapper to allow customization of default.grow_sapling
238 local function grow_sapling(...)
239 return default.grow_sapling(...)
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(),
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(),
263 minetest.register_node("default:stonebrick", {
264 description = S("Stone Brick"),
265 paramtype2 = "facedir",
267 tiles = {"default_stone_brick.png"},
268 is_ground_content = false,
269 groups = {cracky = 2, stone = 1},
270 sounds = default.node_sound_stone_defaults(),
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(),
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(),
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(),
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(),
307 minetest.register_node("default:desert_stonebrick", {
308 description = S("Desert Stone Brick"),
309 paramtype2 = "facedir",
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(),
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(),
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(),
332 minetest.register_node("default:sandstonebrick", {
333 description = S("Sandstone Brick"),
334 paramtype2 = "facedir",
336 tiles = {"default_sandstone_brick.png"},
337 is_ground_content = false,
338 groups = {cracky = 2},
339 sounds = default.node_sound_stone_defaults(),
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(),
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(),
357 minetest.register_node("default:desert_sandstone_brick", {
358 description = S("Desert Sandstone Brick"),
359 paramtype2 = "facedir",
361 tiles = {"default_desert_sandstone_brick.png"},
362 is_ground_content = false,
363 groups = {cracky = 2},
364 sounds = default.node_sound_stone_defaults(),
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(),
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(),
382 minetest.register_node("default:silver_sandstone_brick", {
383 description = S("Silver Sandstone Brick"),
384 paramtype2 = "facedir",
386 tiles = {"default_silver_sandstone_brick.png"},
387 is_ground_content = false,
388 groups = {cracky = 2},
389 sounds = default.node_sound_stone_defaults(),
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(),
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},
407 minetest.register_node("default:obsidianbrick", {
408 description = S("Obsidian Brick"),
409 paramtype2 = "facedir",
411 tiles = {"default_obsidian_brick.png"},
412 is_ground_content = false,
413 sounds = default.node_sound_stone_defaults(),
414 groups = {cracky = 1, level = 2},
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},
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(),
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},
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},
460 minetest.register_node("default:dirt_with_dry_grass", {
461 description = S("Dirt with Dry Grass"),
462 tiles = {"default_dry_grass.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},
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},
485 minetest.register_node("default:dirt_with_rainforest_litter", {
486 description = S("Dirt with Rainforest Litter"),
488 "default_rainforest_litter.png",
490 {name = "default_dirt.png^default_rainforest_litter_side.png",
491 tileable_vertical = false}
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},
500 minetest.register_node("default:dirt_with_coniferous_litter", {
501 description = S("Dirt with Coniferous Litter"),
503 "default_coniferous_litter.png",
505 {name = "default_dirt.png^default_coniferous_litter_side.png",
506 tileable_vertical = false}
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},
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(),
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},
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(),
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(),
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},
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(),
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(),
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(),
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(),
591 {items = {"default:flint"}, rarity = 16},
592 {items = {"default:gravel"}}
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(),
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",
614 drawtype = "nodebox",
618 {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
624 {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5},
627 groups = {crumbly = 3, falling_node = 1, snowy = 1},
628 sounds = default.node_sound_snow_defaults(),
630 on_construct = function(pos)
632 if minetest.get_node(pos).name == "default:dirt_with_grass" then
633 minetest.set_node(pos, {name = "default:dirt_with_snow"})
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(),
644 on_construct = function(pos)
646 if minetest.get_node(pos).name == "default:dirt_with_grass" then
647 minetest.set_node(pos, {name = "default:dirt_with_snow"})
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,
658 groups = {cracky = 3, cools_lava = 1, slippery = 3},
659 sounds = default.node_sound_glass_defaults(),
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"},
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(),
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(),
685 on_place = minetest.rotate_node
688 minetest.register_node("default:wood", {
689 description = S("Apple Wood Planks"),
690 paramtype2 = "facedir",
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(),
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",
705 sunlight_propagates = true,
707 on_timer = grow_sapling,
710 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
712 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
713 attached_node = 1, sapling = 1},
714 sounds = default.node_sound_leaves_defaults(),
716 on_construct = function(pos)
717 minetest.get_node_timer(pos):start(math.random(300, 1500))
720 on_place = function(itemstack, placer, pointed_thing)
721 itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
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
734 minetest.register_node("default:leaves", {
735 description = S("Apple Tree Leaves"),
736 drawtype = "allfaces_optional",
738 tiles = {"default_leaves.png"},
739 special_tiles = {"default_leaves_simple.png"},
741 is_ground_content = false,
742 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
747 -- player will get sapling with 1/20 chance
748 items = {"default:sapling"},
752 -- player will get leaves only if he get no saplings,
753 -- this is because max_items is 1
754 items = {"default:leaves"},
758 sounds = default.node_sound_leaves_defaults(),
760 after_place_node = after_place_leaves,
763 minetest.register_node("default:apple", {
764 description = S("Apple"),
765 drawtype = "plantlike",
766 tiles = {"default_apple.png"},
767 inventory_image = "default_apple.png",
769 sunlight_propagates = true,
771 is_ground_content = false,
774 fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16}
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(),
781 after_place_node = function(pos, placer, itemstack)
782 minetest.set_node(pos, {name = "default:apple", param2 = 1})
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))
793 minetest.register_node("default:apple_mark", {
794 description = S("Apple Marker"),
795 drawtype = "airlike",
797 sunlight_propagates = true,
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)
810 minetest.set_node(pos, {name = "default:apple"})
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(),
825 on_place = minetest.rotate_node
828 minetest.register_node("default:junglewood", {
829 description = S("Jungle Wood Planks"),
830 paramtype2 = "facedir",
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(),
838 minetest.register_node("default:jungleleaves", {
839 description = S("Jungle Tree Leaves"),
840 drawtype = "allfaces_optional",
842 tiles = {"default_jungleleaves.png"},
843 special_tiles = {"default_jungleleaves_simple.png"},
845 is_ground_content = false,
846 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
850 {items = {"default:junglesapling"}, rarity = 20},
851 {items = {"default:jungleleaves"}}
854 sounds = default.node_sound_leaves_defaults(),
856 after_place_node = after_place_leaves,
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",
866 sunlight_propagates = true,
868 on_timer = grow_sapling,
871 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
873 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
874 attached_node = 1, sapling = 1},
875 sounds = default.node_sound_leaves_defaults(),
877 on_construct = function(pos)
878 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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",
902 sunlight_propagates = true,
904 on_timer = grow_sapling,
907 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
909 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
910 attached_node = 1, sapling = 1},
911 sounds = default.node_sound_leaves_defaults(),
913 on_construct = function(pos)
914 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
940 on_place = minetest.rotate_node
943 minetest.register_node("default:pine_wood", {
944 description = S("Pine Wood Planks"),
945 paramtype2 = "facedir",
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(),
953 minetest.register_node("default:pine_needles",{
954 description = S("Pine Needles"),
955 drawtype = "allfaces_optional",
956 tiles = {"default_pine_needles.png"},
959 is_ground_content = false,
960 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
964 {items = {"default:pine_sapling"}, rarity = 20},
965 {items = {"default:pine_needles"}}
968 sounds = default.node_sound_leaves_defaults(),
970 after_place_node = after_place_leaves,
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",
980 sunlight_propagates = true,
982 on_timer = grow_sapling,
985 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
987 groups = {snappy = 2, dig_immediate = 3, flammable = 3,
988 attached_node = 1, sapling = 1},
989 sounds = default.node_sound_leaves_defaults(),
991 on_construct = function(pos)
992 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
1019 on_place = minetest.rotate_node
1022 minetest.register_node("default:acacia_wood", {
1023 description = S("Acacia Wood Planks"),
1024 paramtype2 = "facedir",
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(),
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"},
1038 paramtype = "light",
1039 is_ground_content = false,
1040 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
1044 {items = {"default:acacia_sapling"}, rarity = 20},
1045 {items = {"default:acacia_leaves"}}
1048 sounds = default.node_sound_leaves_defaults(),
1050 after_place_node = after_place_leaves,
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,
1062 on_timer = grow_sapling,
1065 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
1067 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1068 attached_node = 1, sapling = 1},
1069 sounds = default.node_sound_leaves_defaults(),
1071 on_construct = function(pos)
1072 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
1098 on_place = minetest.rotate_node
1101 minetest.register_node("default:aspen_wood", {
1102 description = S("Aspen Wood Planks"),
1103 paramtype2 = "facedir",
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(),
1111 minetest.register_node("default:aspen_leaves", {
1112 description = S("Aspen Tree Leaves"),
1113 drawtype = "allfaces_optional",
1114 tiles = {"default_aspen_leaves.png"},
1116 paramtype = "light",
1117 is_ground_content = false,
1118 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
1122 {items = {"default:aspen_sapling"}, rarity = 20},
1123 {items = {"default:aspen_leaves"}}
1126 sounds = default.node_sound_leaves_defaults(),
1128 after_place_node = after_place_leaves,
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,
1140 on_timer = grow_sapling,
1143 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}
1145 groups = {snappy = 2, dig_immediate = 3, flammable = 3,
1146 attached_node = 1, sapling = 1},
1147 sounds = default.node_sound_leaves_defaults(),
1149 on_construct = function(pos)
1150 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
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(),
1300 -- Plantlife (non-cubic)
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,
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,
1325 -5 / 16, -0.5, -5 / 16,
1329 groups = {choppy = 3, dig_immediate = 3, attached_node = 1},
1330 sounds = default.node_sound_wood_defaults(),
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},
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))
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)
1365 if minetest.get_item_group(node_under.name, "sand") == 0 then
1367 minetest.remove_node(pos)
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)
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)
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,
1395 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
1397 groups = {snappy = 3, flammable = 2},
1398 sounds = default.node_sound_leaves_defaults(),
1400 after_dig_node = function(pos, node, metadata, digger)
1401 default.dig_up(pos, node, digger)
1405 minetest.register_node("default:dry_shrub", {
1406 description = S("Dry Shrub"),
1407 drawtype = "plantlike",
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",
1415 sunlight_propagates = true,
1417 buildable_to = true,
1418 groups = {snappy = 3, flammable = 3, attached_node = 1},
1419 sounds = default.node_sound_leaves_defaults(),
1422 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16},
1426 minetest.register_node("default:junglegrass", {
1427 description = S("Jungle Grass"),
1428 drawtype = "plantlike",
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,
1437 buildable_to = true,
1438 groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1},
1439 sounds = default.node_sound_leaves_defaults(),
1442 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
1447 minetest.register_node("default:grass_1", {
1448 description = S("Grass"),
1449 drawtype = "plantlike",
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,
1458 buildable_to = true,
1459 groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
1460 sounds = default.node_sound_leaves_defaults(),
1463 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
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()))
1476 minetest.register_node("default:grass_" .. i, {
1477 description = S("Grass"),
1478 drawtype = "plantlike",
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,
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(),
1493 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
1499 minetest.register_node("default:dry_grass_1", {
1500 description = S("Dry Grass"),
1501 drawtype = "plantlike",
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,
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(),
1515 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
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()))
1528 minetest.register_node("default:dry_grass_" .. i, {
1529 description = S("Dry Grass"),
1530 drawtype = "plantlike",
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,
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(),
1545 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16},
1551 minetest.register_node("default:fern_1", {
1552 description = S("Fern"),
1553 drawtype = "plantlike",
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,
1561 buildable_to = true,
1562 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1},
1563 sounds = default.node_sound_leaves_defaults(),
1566 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
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()))
1579 minetest.register_node("default:fern_" .. i, {
1580 description = S("Fern"),
1581 drawtype = "plantlike",
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,
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(),
1597 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
1603 minetest.register_node("default:marram_grass_1", {
1604 description = S("Marram Grass"),
1605 drawtype = "plantlike",
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,
1613 buildable_to = true,
1614 groups = {snappy = 3, flammable = 3, attached_node = 1},
1615 sounds = default.node_sound_leaves_defaults(),
1618 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
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()))
1631 minetest.register_node("default:marram_grass_" .. i, {
1632 description = S("Marram Grass"),
1633 drawtype = "plantlike",
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,
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(),
1648 fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
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(),
1667 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1671 minetest.register_node("default:bush_leaves", {
1672 description = S("Bush Leaves"),
1673 drawtype = "allfaces_optional",
1675 tiles = {"default_leaves_simple.png"},
1676 paramtype = "light",
1677 groups = {snappy = 3, flammable = 2, leaves = 1},
1681 {items = {"default:bush_sapling"}, rarity = 5},
1682 {items = {"default:bush_leaves"}}
1685 sounds = default.node_sound_leaves_defaults(),
1687 after_place_node = after_place_leaves,
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,
1699 on_timer = grow_sapling,
1702 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1704 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1705 attached_node = 1, sapling = 1},
1706 sounds = default.node_sound_leaves_defaults(),
1708 on_construct = function(pos)
1709 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
1725 minetest.register_node("default:blueberry_bush_leaves_with_berries", {
1726 description = S("Blueberry Bush Leaves with Berries"),
1727 drawtype = "allfaces_optional",
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",
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))
1742 minetest.register_node("default:blueberry_bush_leaves", {
1743 description = S("Blueberry Bush Leaves"),
1744 drawtype = "allfaces_optional",
1746 tiles = {"default_blueberry_bush_leaves.png"},
1747 paramtype = "light",
1748 groups = {snappy = 3, flammable = 2, leaves = 1},
1752 {items = {"default:blueberry_bush_sapling"}, rarity = 5},
1753 {items = {"default:blueberry_bush_leaves"}}
1756 sounds = default.node_sound_leaves_defaults(),
1758 on_timer = function(pos, elapsed)
1759 if minetest.get_node_light(pos) < 11 then
1760 minetest.get_node_timer(pos):start(200)
1762 minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"})
1766 after_place_node = after_place_leaves,
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,
1778 on_timer = grow_sapling,
1781 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1783 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1784 attached_node = 1, sapling = 1},
1785 sounds = default.node_sound_leaves_defaults(),
1787 on_construct = function(pos)
1788 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
1817 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1821 minetest.register_node("default:acacia_bush_leaves", {
1822 description = S("Acacia Bush Leaves"),
1823 drawtype = "allfaces_optional",
1825 tiles = {"default_acacia_leaves_simple.png"},
1826 paramtype = "light",
1827 groups = {snappy = 3, flammable = 2, leaves = 1},
1831 {items = {"default:acacia_bush_sapling"}, rarity = 5},
1832 {items = {"default:acacia_bush_leaves"}}
1835 sounds = default.node_sound_leaves_defaults(),
1837 after_place_node = after_place_leaves,
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,
1849 on_timer = grow_sapling,
1852 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16}
1854 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1855 attached_node = 1, sapling = 1},
1856 sounds = default.node_sound_leaves_defaults(),
1858 on_construct = function(pos)
1859 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
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(),
1888 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
1892 minetest.register_node("default:pine_bush_needles", {
1893 description = S("Pine Bush Needles"),
1894 drawtype = "allfaces_optional",
1896 tiles = {"default_pine_needles.png"},
1897 paramtype = "light",
1898 groups = {snappy = 3, flammable = 2, leaves = 1},
1902 {items = {"default:pine_bush_sapling"}, rarity = 5},
1903 {items = {"default:pine_bush_needles"}}
1906 sounds = default.node_sound_leaves_defaults(),
1908 after_place_node = after_place_leaves,
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,
1920 on_timer = grow_sapling,
1923 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
1925 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
1926 attached_node = 1, sapling = 1},
1927 sounds = default.node_sound_leaves_defaults(),
1929 on_construct = function(pos)
1930 minetest.get_node_timer(pos):start(math.random(300, 1500))
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
1946 minetest.register_node("default:sand_with_kelp", {
1947 description = S("Kelp"),
1948 drawtype = "plantlike_rooted",
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},
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},
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},
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)
1982 local pos = pointed_thing.under
1983 if minetest.get_node(pos).name ~= "default:sand" then
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()
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()
2004 minetest.chat_send_player(player_name, "Node is protected")
2005 minetest.record_protection_violation(pos, player_name)
2012 after_destruct = function(pos, oldnode)
2013 minetest.set_node(pos, {name = "default:sand"})
2022 local function coral_on_place(itemstack, placer, pointed_thing)
2023 if pointed_thing.type ~= "node" or not placer then
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]
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
2038 if node_under.name ~= "default:coral_skeleton" or
2039 minetest.get_node(pos_above).name ~= "default:water_source" then
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)
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()
2062 minetest.register_node("default:coral_green", {
2063 description = S("Green Coral"),
2064 drawtype = "plantlike_rooted",
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},
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},
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},
2085 on_place = coral_on_place,
2087 after_destruct = function(pos, oldnode)
2088 minetest.set_node(pos, {name = "default:coral_skeleton"})
2092 minetest.register_node("default:coral_pink", {
2093 description = S("Pink Coral"),
2094 drawtype = "plantlike_rooted",
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},
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},
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},
2115 on_place = coral_on_place,
2117 after_destruct = function(pos, oldnode)
2118 minetest.set_node(pos, {name = "default:coral_skeleton"})
2122 minetest.register_node("default:coral_cyan", {
2123 description = S("Cyan Coral"),
2124 drawtype = "plantlike_rooted",
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},
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},
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},
2145 on_place = coral_on_place,
2147 after_destruct = function(pos, oldnode)
2148 minetest.set_node(pos, {name = "default:coral_skeleton"})
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(),
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(),
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(),
2180 minetest.register_node("default:water_source", {
2181 description = S("Water Source"),
2182 drawtype = "liquid",
2186 name = "default_water_source_animated.png",
2187 backface_culling = false,
2189 type = "vertical_frames",
2196 name = "default_water_source_animated.png",
2197 backface_culling = true,
2199 type = "vertical_frames",
2207 paramtype = "light",
2211 buildable_to = true,
2212 is_ground_content = false,
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(),
2224 minetest.register_node("default:water_flowing", {
2225 description = S("Flowing Water"),
2226 drawtype = "flowingliquid",
2228 tiles = {"default_water.png"},
2231 name = "default_water_flowing_animated.png",
2232 backface_culling = false,
2234 type = "vertical_frames",
2241 name = "default_water_flowing_animated.png",
2242 backface_culling = true,
2244 type = "vertical_frames",
2252 paramtype = "light",
2253 paramtype2 = "flowingliquid",
2257 buildable_to = true,
2258 is_ground_content = false,
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,
2268 sounds = default.node_sound_water_defaults(),
2272 minetest.register_node("default:river_water_source", {
2273 description = S("River Water Source"),
2274 drawtype = "liquid",
2277 name = "default_river_water_source_animated.png",
2278 backface_culling = false,
2280 type = "vertical_frames",
2287 name = "default_river_water_source_animated.png",
2288 backface_culling = true,
2290 type = "vertical_frames",
2298 paramtype = "light",
2302 buildable_to = true,
2303 is_ground_content = false,
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,
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(),
2321 minetest.register_node("default:river_water_flowing", {
2322 description = S("Flowing River Water"),
2323 drawtype = "flowingliquid",
2324 tiles = {"default_river_water.png"},
2327 name = "default_river_water_flowing_animated.png",
2328 backface_culling = false,
2330 type = "vertical_frames",
2337 name = "default_river_water_flowing_animated.png",
2338 backface_culling = true,
2340 type = "vertical_frames",
2348 paramtype = "light",
2349 paramtype2 = "flowingliquid",
2353 buildable_to = true,
2354 is_ground_content = false,
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,
2363 post_effect_color = {a = 103, r = 30, g = 76, b = 90},
2364 groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
2366 sounds = default.node_sound_water_defaults(),
2370 minetest.register_node("default:lava_source", {
2371 description = S("Lava Source"),
2372 drawtype = "liquid",
2375 name = "default_lava_source_animated.png",
2376 backface_culling = false,
2378 type = "vertical_frames",
2385 name = "default_lava_source_animated.png",
2386 backface_culling = true,
2388 type = "vertical_frames",
2395 paramtype = "light",
2396 light_source = default.LIGHT_MAX - 1,
2400 buildable_to = true,
2401 is_ground_content = false,
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},
2414 minetest.register_node("default:lava_flowing", {
2415 description = S("Flowing Lava"),
2416 drawtype = "flowingliquid",
2417 tiles = {"default_lava.png"},
2420 name = "default_lava_flowing_animated.png",
2421 backface_culling = false,
2423 type = "vertical_frames",
2430 name = "default_lava_flowing_animated.png",
2431 backface_culling = true,
2433 type = "vertical_frames",
2440 paramtype = "light",
2441 paramtype2 = "flowingliquid",
2442 light_source = default.LIGHT_MAX - 1,
2446 buildable_to = true,
2447 is_ground_content = false,
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},
2462 -- Tools / "Advanced" crafting / Non-"natural"
2465 local bookshelf_formspec =
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)
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")
2479 local formspec = bookshelf_formspec
2480 -- Inventory slots overlay
2481 local bx, by = 0, 0.3
2482 local n_written, n_empty = 0, 0
2488 local stack = invlist[i]
2489 if stack:is_empty() then
2490 formspec = formspec ..
2491 "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
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()
2497 n_empty = n_empty + stack:get_count()
2502 meta:set_string("formspec", formspec)
2503 if n_written + n_empty == 0 then
2504 meta:set_string("infotext", S("Empty Bookshelf"))
2506 meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty))
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(),
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)
2525 can_dig = function(pos,player)
2526 local inv = minetest.get_meta(pos):get_inventory()
2527 return inv:is_empty("books")
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()
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)
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)
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)
2550 on_blast = function(pos)
2552 default.get_inventory_drops(pos, "books", drops)
2553 drops[#drops+1] = "default:bookshelf"
2554 minetest.remove_node(pos)
2559 local function register_sign(material, desc, def)
2560 minetest.register_node("default:sign_wall_" .. material, {
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,
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},
2577 groups = def.groups,
2578 legacy_wallmounted = true,
2579 sounds = def.sounds,
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}]")
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)
2593 local text = fields.text
2597 if string.len(text) > 512 then
2598 minetest.chat_send_player(player_name, S("Text too long"))
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)
2607 meta:set_string("infotext", S('"@1"', text))
2609 meta:set_string("infotext", '')
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}
2620 register_sign("steel", S("Steel Sign"), {
2621 sounds = default.node_sound_metal_defaults(),
2622 groups = {cracky = 2, attached_node = 1}
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,
2636 is_ground_content = false,
2638 type = "wallmounted",
2639 --wall_top = = <default>
2640 --wall_bottom = = <default>
2641 --wall_side = = <default>
2643 groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
2644 legacy_wallmounted = true,
2645 sounds = default.node_sound_wood_defaults(),
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,
2659 is_ground_content = false,
2661 type = "wallmounted",
2662 --wall_top = = <default>
2663 --wall_bottom = = <default>
2664 --wall_side = = <default>
2666 groups = {cracky = 2},
2667 sounds = default.node_sound_metal_defaults(),
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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(),
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},
2815 minetest.register_node("default:brick", {
2816 description = S("Brick Block"),
2817 paramtype2 = "facedir",
2819 tiles = {"default_brick.png"},
2820 is_ground_content = false,
2821 groups = {cracky = 3},
2822 sounds = default.node_sound_stone_defaults(),
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,
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",
2848 {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
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(),
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},
2872 -- register trees for leafdecay
2875 if minetest.get_mapgen_setting("mg_name") == "v6" then
2876 default.register_leafdecay({
2877 trunks = {"default:tree"},
2878 leaves = {"default:apple", "default:leaves"},
2882 default.register_leafdecay({
2883 trunks = {"default:jungletree"},
2884 leaves = {"default:jungleleaves"},
2888 default.register_leafdecay({
2889 trunks = {"default:tree"},
2890 leaves = {"default:apple", "default:leaves"},
2894 default.register_leafdecay({
2895 trunks = {"default:jungletree"},
2896 leaves = {"default:jungleleaves"},
2901 default.register_leafdecay({
2902 trunks = {"default:pine_tree"},
2903 leaves = {"default:pine_needles"},
2907 default.register_leafdecay({
2908 trunks = {"default:acacia_tree"},
2909 leaves = {"default:acacia_leaves"},
2913 default.register_leafdecay({
2914 trunks = {"default:aspen_tree"},
2915 leaves = {"default:aspen_leaves"},
2919 default.register_leafdecay({
2920 trunks = {"default:bush_stem"},
2921 leaves = {"default:bush_leaves"},
2925 default.register_leafdecay({
2926 trunks = {"default:acacia_bush_stem"},
2927 leaves = {"default:acacia_bush_leaves"},
2931 default.register_leafdecay({
2932 trunks = {"default:pine_bush_stem"},
2933 leaves = {"default:pine_bush_needles"},