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 = "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 = "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.name,
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",
2185 name = "default_water_source_animated.png",
2186 backface_culling = false,
2188 type = "vertical_frames",
2195 name = "default_water_source_animated.png",
2196 backface_culling = true,
2198 type = "vertical_frames",
2206 paramtype = "light",
2210 buildable_to = true,
2211 is_ground_content = false,
2214 liquidtype = "source",
2215 liquid_alternative_flowing = "default:water_flowing",
2216 liquid_alternative_source = "default:water_source",
2217 liquid_viscosity = 1,
2218 post_effect_color = {a = 103, r = 30, g = 60, b = 90},
2219 groups = {water = 3, liquid = 3, cools_lava = 1},
2220 sounds = default.node_sound_water_defaults(),
2223 minetest.register_node("default:water_flowing", {
2224 description = S("Flowing Water"),
2225 drawtype = "flowingliquid",
2226 tiles = {"default_water.png"},
2229 name = "default_water_flowing_animated.png",
2230 backface_culling = false,
2232 type = "vertical_frames",
2239 name = "default_water_flowing_animated.png",
2240 backface_culling = true,
2242 type = "vertical_frames",
2250 paramtype = "light",
2251 paramtype2 = "flowingliquid",
2255 buildable_to = true,
2256 is_ground_content = false,
2259 liquidtype = "flowing",
2260 liquid_alternative_flowing = "default:water_flowing",
2261 liquid_alternative_source = "default:water_source",
2262 liquid_viscosity = 1,
2263 post_effect_color = {a = 103, r = 30, g = 60, b = 90},
2264 groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
2266 sounds = default.node_sound_water_defaults(),
2270 minetest.register_node("default:river_water_source", {
2271 description = S("River Water Source"),
2272 drawtype = "liquid",
2275 name = "default_river_water_source_animated.png",
2276 backface_culling = false,
2278 type = "vertical_frames",
2285 name = "default_river_water_source_animated.png",
2286 backface_culling = true,
2288 type = "vertical_frames",
2296 paramtype = "light",
2300 buildable_to = true,
2301 is_ground_content = false,
2304 liquidtype = "source",
2305 liquid_alternative_flowing = "default:river_water_flowing",
2306 liquid_alternative_source = "default:river_water_source",
2307 liquid_viscosity = 1,
2308 -- Not renewable to avoid horizontal spread of water sources in sloping
2309 -- rivers that can cause water to overflow riverbanks and cause floods.
2310 -- River water source is instead made renewable by the 'force renew'
2311 -- option used in the 'bucket' mod by the river water bucket.
2312 liquid_renewable = false,
2314 post_effect_color = {a = 103, r = 30, g = 76, b = 90},
2315 groups = {water = 3, liquid = 3, cools_lava = 1},
2316 sounds = default.node_sound_water_defaults(),
2319 minetest.register_node("default:river_water_flowing", {
2320 description = S("Flowing River Water"),
2321 drawtype = "flowingliquid",
2322 tiles = {"default_river_water.png"},
2325 name = "default_river_water_flowing_animated.png",
2326 backface_culling = false,
2328 type = "vertical_frames",
2335 name = "default_river_water_flowing_animated.png",
2336 backface_culling = true,
2338 type = "vertical_frames",
2346 paramtype = "light",
2347 paramtype2 = "flowingliquid",
2351 buildable_to = true,
2352 is_ground_content = false,
2355 liquidtype = "flowing",
2356 liquid_alternative_flowing = "default:river_water_flowing",
2357 liquid_alternative_source = "default:river_water_source",
2358 liquid_viscosity = 1,
2359 liquid_renewable = false,
2361 post_effect_color = {a = 103, r = 30, g = 76, b = 90},
2362 groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
2364 sounds = default.node_sound_water_defaults(),
2368 minetest.register_node("default:lava_source", {
2369 description = S("Lava Source"),
2370 drawtype = "liquid",
2373 name = "default_lava_source_animated.png",
2374 backface_culling = false,
2376 type = "vertical_frames",
2383 name = "default_lava_source_animated.png",
2384 backface_culling = true,
2386 type = "vertical_frames",
2393 paramtype = "light",
2394 light_source = default.LIGHT_MAX - 1,
2398 buildable_to = true,
2399 is_ground_content = false,
2402 liquidtype = "source",
2403 liquid_alternative_flowing = "default:lava_flowing",
2404 liquid_alternative_source = "default:lava_source",
2405 liquid_viscosity = 7,
2406 liquid_renewable = false,
2407 damage_per_second = 4 * 2,
2408 post_effect_color = {a = 191, r = 255, g = 64, b = 0},
2409 groups = {lava = 3, liquid = 2, igniter = 1},
2412 minetest.register_node("default:lava_flowing", {
2413 description = S("Flowing Lava"),
2414 drawtype = "flowingliquid",
2415 tiles = {"default_lava.png"},
2418 name = "default_lava_flowing_animated.png",
2419 backface_culling = false,
2421 type = "vertical_frames",
2428 name = "default_lava_flowing_animated.png",
2429 backface_culling = true,
2431 type = "vertical_frames",
2438 paramtype = "light",
2439 paramtype2 = "flowingliquid",
2440 light_source = default.LIGHT_MAX - 1,
2444 buildable_to = true,
2445 is_ground_content = false,
2448 liquidtype = "flowing",
2449 liquid_alternative_flowing = "default:lava_flowing",
2450 liquid_alternative_source = "default:lava_source",
2451 liquid_viscosity = 7,
2452 liquid_renewable = false,
2453 damage_per_second = 4 * 2,
2454 post_effect_color = {a = 191, r = 255, g = 64, b = 0},
2455 groups = {lava = 3, liquid = 2, igniter = 1,
2456 not_in_creative_inventory = 1},
2460 -- Tools / "Advanced" crafting / Non-"natural"
2463 local bookshelf_formspec =
2465 "list[context;books;0,0.3;8,2;]" ..
2466 "list[current_player;main;0,2.85;8,1;]" ..
2467 "list[current_player;main;0,4.08;8,3;8]" ..
2468 "listring[context;books]" ..
2469 "listring[current_player;main]" ..
2470 default.get_hotbar_bg(0,2.85)
2472 local function update_bookshelf(pos)
2473 local meta = minetest.get_meta(pos)
2474 local inv = meta:get_inventory()
2475 local invlist = inv:get_list("books")
2477 local formspec = bookshelf_formspec
2478 -- Inventory slots overlay
2479 local bx, by = 0, 0.3
2480 local n_written, n_empty = 0, 0
2486 local stack = invlist[i]
2487 if stack:is_empty() then
2488 formspec = formspec ..
2489 "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
2491 local metatable = stack:get_meta():to_table() or {}
2492 if metatable.fields and metatable.fields.text then
2493 n_written = n_written + stack:get_count()
2495 n_empty = n_empty + stack:get_count()
2500 meta:set_string("formspec", formspec)
2501 if n_written + n_empty == 0 then
2502 meta:set_string("infotext", S("Empty Bookshelf"))
2504 meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty))
2508 minetest.register_node("default:bookshelf", {
2509 description = S("Bookshelf"),
2510 tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
2511 "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
2512 paramtype2 = "facedir",
2513 is_ground_content = false,
2514 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2515 sounds = default.node_sound_wood_defaults(),
2517 on_construct = function(pos)
2518 local meta = minetest.get_meta(pos)
2519 local inv = meta:get_inventory()
2520 inv:set_size("books", 8 * 2)
2521 update_bookshelf(pos)
2523 can_dig = function(pos,player)
2524 local inv = minetest.get_meta(pos):get_inventory()
2525 return inv:is_empty("books")
2527 allow_metadata_inventory_put = function(pos, listname, index, stack)
2528 if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
2529 return stack:get_count()
2533 on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
2534 minetest.log("action", player:get_player_name() ..
2535 " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
2536 update_bookshelf(pos)
2538 on_metadata_inventory_put = function(pos, listname, index, stack, player)
2539 minetest.log("action", player:get_player_name() ..
2540 " puts stuff to bookshelf at " .. minetest.pos_to_string(pos))
2541 update_bookshelf(pos)
2543 on_metadata_inventory_take = function(pos, listname, index, stack, player)
2544 minetest.log("action", player:get_player_name() ..
2545 " takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
2546 update_bookshelf(pos)
2548 on_blast = function(pos)
2550 default.get_inventory_drops(pos, "books", drops)
2551 drops[#drops+1] = "default:bookshelf"
2552 minetest.remove_node(pos)
2557 local function register_sign(material, desc, def)
2558 minetest.register_node("default:sign_wall_" .. material, {
2559 description = S("@1 Sign", desc),
2560 drawtype = "nodebox",
2561 tiles = {"default_sign_wall_" .. material .. ".png"},
2562 inventory_image = "default_sign_" .. material .. ".png",
2563 wield_image = "default_sign_" .. material .. ".png",
2564 paramtype = "light",
2565 paramtype2 = "wallmounted",
2566 sunlight_propagates = true,
2567 is_ground_content = false,
2570 type = "wallmounted",
2571 wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
2572 wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
2573 wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
2575 groups = def.groups,
2576 legacy_wallmounted = true,
2577 sounds = def.sounds,
2579 on_construct = function(pos)
2580 --local n = minetest.get_node(pos)
2581 local meta = minetest.get_meta(pos)
2582 meta:set_string("formspec", "field[text;;${text}]")
2584 on_receive_fields = function(pos, formname, fields, sender)
2585 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
2586 local player_name = sender:get_player_name()
2587 if minetest.is_protected(pos, player_name) then
2588 minetest.record_protection_violation(pos, player_name)
2591 local text = fields.text
2595 if string.len(text) > 512 then
2596 minetest.chat_send_player(player_name, S("Text too long"))
2599 minetest.log("action", (player_name or "") .. " wrote \"" ..
2600 text .. "\" to sign at " .. minetest.pos_to_string(pos))
2601 local meta = minetest.get_meta(pos)
2602 meta:set_string("text", text)
2603 meta:set_string("infotext", '"' .. text .. '"')
2608 register_sign("wood", S("Wooden"), {
2609 sounds = default.node_sound_wood_defaults(),
2610 groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3}
2613 register_sign("steel", S("Steel"), {
2614 sounds = default.node_sound_metal_defaults(),
2615 groups = {cracky = 2, attached_node = 1}
2618 minetest.register_node("default:ladder_wood", {
2619 description = S("Wooden Ladder"),
2620 drawtype = "signlike",
2621 tiles = {"default_ladder_wood.png"},
2622 inventory_image = "default_ladder_wood.png",
2623 wield_image = "default_ladder_wood.png",
2624 paramtype = "light",
2625 paramtype2 = "wallmounted",
2626 sunlight_propagates = true,
2629 is_ground_content = false,
2631 type = "wallmounted",
2632 --wall_top = = <default>
2633 --wall_bottom = = <default>
2634 --wall_side = = <default>
2636 groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
2637 legacy_wallmounted = true,
2638 sounds = default.node_sound_wood_defaults(),
2641 minetest.register_node("default:ladder_steel", {
2642 description = S("Steel Ladder"),
2643 drawtype = "signlike",
2644 tiles = {"default_ladder_steel.png"},
2645 inventory_image = "default_ladder_steel.png",
2646 wield_image = "default_ladder_steel.png",
2647 paramtype = "light",
2648 paramtype2 = "wallmounted",
2649 sunlight_propagates = true,
2652 is_ground_content = false,
2654 type = "wallmounted",
2655 --wall_top = = <default>
2656 --wall_bottom = = <default>
2657 --wall_side = = <default>
2659 groups = {cracky = 2},
2660 sounds = default.node_sound_metal_defaults(),
2663 default.register_fence("default:fence_wood", {
2664 description = S("Apple Wood Fence"),
2665 texture = "default_fence_wood.png",
2666 inventory_image = "default_fence_overlay.png^default_wood.png^" ..
2667 "default_fence_overlay.png^[makealpha:255,126,126",
2668 wield_image = "default_fence_overlay.png^default_wood.png^" ..
2669 "default_fence_overlay.png^[makealpha:255,126,126",
2670 material = "default:wood",
2671 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2672 sounds = default.node_sound_wood_defaults()
2675 default.register_fence("default:fence_acacia_wood", {
2676 description = S("Acacia Wood Fence"),
2677 texture = "default_fence_acacia_wood.png",
2678 inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
2679 "default_fence_overlay.png^[makealpha:255,126,126",
2680 wield_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
2681 "default_fence_overlay.png^[makealpha:255,126,126",
2682 material = "default:acacia_wood",
2683 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2684 sounds = default.node_sound_wood_defaults()
2687 default.register_fence("default:fence_junglewood", {
2688 description = S("Jungle Wood Fence"),
2689 texture = "default_fence_junglewood.png",
2690 inventory_image = "default_fence_overlay.png^default_junglewood.png^" ..
2691 "default_fence_overlay.png^[makealpha:255,126,126",
2692 wield_image = "default_fence_overlay.png^default_junglewood.png^" ..
2693 "default_fence_overlay.png^[makealpha:255,126,126",
2694 material = "default:junglewood",
2695 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2696 sounds = default.node_sound_wood_defaults()
2699 default.register_fence("default:fence_pine_wood", {
2700 description = S("Pine Wood Fence"),
2701 texture = "default_fence_pine_wood.png",
2702 inventory_image = "default_fence_overlay.png^default_pine_wood.png^" ..
2703 "default_fence_overlay.png^[makealpha:255,126,126",
2704 wield_image = "default_fence_overlay.png^default_pine_wood.png^" ..
2705 "default_fence_overlay.png^[makealpha:255,126,126",
2706 material = "default:pine_wood",
2707 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2708 sounds = default.node_sound_wood_defaults()
2711 default.register_fence("default:fence_aspen_wood", {
2712 description = S("Aspen Wood Fence"),
2713 texture = "default_fence_aspen_wood.png",
2714 inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
2715 "default_fence_overlay.png^[makealpha:255,126,126",
2716 wield_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
2717 "default_fence_overlay.png^[makealpha:255,126,126",
2718 material = "default:aspen_wood",
2719 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2720 sounds = default.node_sound_wood_defaults()
2723 default.register_fence_rail("default:fence_rail_wood", {
2724 description = S("Apple Wood Fence Rail"),
2725 texture = "default_fence_rail_wood.png",
2726 inventory_image = "default_fence_rail_overlay.png^default_wood.png^" ..
2727 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2728 wield_image = "default_fence_rail_overlay.png^default_wood.png^" ..
2729 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2730 material = "default:wood",
2731 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2732 sounds = default.node_sound_wood_defaults()
2735 default.register_fence_rail("default:fence_rail_acacia_wood", {
2736 description = S("Acacia Wood Fence Rail"),
2737 texture = "default_fence_rail_acacia_wood.png",
2738 inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
2739 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2740 wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
2741 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2742 material = "default:acacia_wood",
2743 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2744 sounds = default.node_sound_wood_defaults()
2747 default.register_fence_rail("default:fence_rail_junglewood", {
2748 description = S("Jungle Wood Fence Rail"),
2749 texture = "default_fence_rail_junglewood.png",
2750 inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
2751 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2752 wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
2753 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2754 material = "default:junglewood",
2755 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2756 sounds = default.node_sound_wood_defaults()
2759 default.register_fence_rail("default:fence_rail_pine_wood", {
2760 description = S("Pine Wood Fence Rail"),
2761 texture = "default_fence_rail_pine_wood.png",
2762 inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
2763 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2764 wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
2765 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2766 material = "default:pine_wood",
2767 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2768 sounds = default.node_sound_wood_defaults()
2771 default.register_fence_rail("default:fence_rail_aspen_wood", {
2772 description = S("Aspen Wood Fence Rail"),
2773 texture = "default_fence_rail_aspen_wood.png",
2774 inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
2775 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2776 wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
2777 "default_fence_rail_overlay.png^[makealpha:255,126,126",
2778 material = "default:aspen_wood",
2779 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
2780 sounds = default.node_sound_wood_defaults()
2783 minetest.register_node("default:glass", {
2784 description = S("Glass"),
2785 drawtype = "glasslike_framed_optional",
2786 tiles = {"default_glass.png", "default_glass_detail.png"},
2787 paramtype = "light",
2788 paramtype2 = "glasslikeliquidlevel",
2789 sunlight_propagates = true,
2790 is_ground_content = false,
2791 groups = {cracky = 3, oddly_breakable_by_hand = 3},
2792 sounds = default.node_sound_glass_defaults(),
2795 minetest.register_node("default:obsidian_glass", {
2796 description = S("Obsidian Glass"),
2797 drawtype = "glasslike_framed_optional",
2798 tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
2799 paramtype = "light",
2800 paramtype2 = "glasslikeliquidlevel",
2801 is_ground_content = false,
2802 sunlight_propagates = true,
2803 sounds = default.node_sound_glass_defaults(),
2804 groups = {cracky = 3},
2808 minetest.register_node("default:brick", {
2809 description = S("Brick Block"),
2810 paramtype2 = "facedir",
2812 tiles = {"default_brick.png"},
2813 is_ground_content = false,
2814 groups = {cracky = 3},
2815 sounds = default.node_sound_stone_defaults(),
2819 minetest.register_node("default:meselamp", {
2820 description = S("Mese Lamp"),
2821 drawtype = "glasslike",
2822 tiles = {"default_meselamp.png"},
2823 paramtype = "light",
2824 sunlight_propagates = true,
2825 is_ground_content = false,
2826 groups = {cracky = 3, oddly_breakable_by_hand = 3},
2827 sounds = default.node_sound_glass_defaults(),
2828 light_source = default.LIGHT_MAX,
2831 minetest.register_node("default:mese_post_light", {
2832 description = S("Mese Post Light"),
2833 tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png",
2834 "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png",
2835 "default_mese_post_light_side.png", "default_mese_post_light_side.png"},
2836 wield_image = "default_mese_post_light_side.png",
2837 drawtype = "nodebox",
2841 {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
2844 paramtype = "light",
2845 light_source = default.LIGHT_MAX,
2846 sunlight_propagates = true,
2847 is_ground_content = false,
2848 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
2849 sounds = default.node_sound_wood_defaults(),
2856 minetest.register_node("default:cloud", {
2857 description = S("Cloud"),
2858 tiles = {"default_cloud.png"},
2859 is_ground_content = false,
2860 sounds = default.node_sound_defaults(),
2861 groups = {not_in_creative_inventory = 1},
2865 -- register trees for leafdecay
2868 if minetest.get_mapgen_setting("mg_name") == "v6" then
2869 default.register_leafdecay({
2870 trunks = {"default:tree"},
2871 leaves = {"default:apple", "default:leaves"},
2875 default.register_leafdecay({
2876 trunks = {"default:jungletree"},
2877 leaves = {"default:jungleleaves"},
2881 default.register_leafdecay({
2882 trunks = {"default:tree"},
2883 leaves = {"default:apple", "default:leaves"},
2887 default.register_leafdecay({
2888 trunks = {"default:jungletree"},
2889 leaves = {"default:jungleleaves"},
2894 default.register_leafdecay({
2895 trunks = {"default:pine_tree"},
2896 leaves = {"default:pine_needles"},
2900 default.register_leafdecay({
2901 trunks = {"default:acacia_tree"},
2902 leaves = {"default:acacia_leaves"},
2906 default.register_leafdecay({
2907 trunks = {"default:aspen_tree"},
2908 leaves = {"default:aspen_leaves"},
2912 default.register_leafdecay({
2913 trunks = {"default:bush_stem"},
2914 leaves = {"default:bush_leaves"},
2918 default.register_leafdecay({
2919 trunks = {"default:acacia_bush_stem"},
2920 leaves = {"default:acacia_bush_leaves"},
2924 default.register_leafdecay({
2925 trunks = {"default:pine_bush_stem"},
2926 leaves = {"default:pine_bush_needles"},