1 -- mods/default/nodes.lua
4 --[[ Node name convention:
6 Although many node names are in combined-word form, the required form for new
7 node names is words separated by underscores. If both forms are used in written
8 language (for example pinewood and pine wood) the underscore form should be used.
17 (1. Material 2. Cobble variant 3. Brick variant [4. Modified forms])
26 default:desert_stonebrick
29 default:sandstonebrick
36 (1. Material [2. Modified forms])
39 default:dirt_with_grass
40 default:dirt_with_grass_footsteps
41 default:dirt_with_dry_grass
42 default:dirt_with_snow
58 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits])
79 default:acacia_sapling
87 (1. In stone 2. Block)
89 default:stone_with_coal
92 default:stone_with_iron
95 default:stone_with_copper
99 default:stone_with_gold
102 default:stone_with_mese
105 default:stone_with_diamond
108 Plantlife (non-cubic)
109 ---------------------
129 (1. Source 2. Flowing)
132 default:water_flowing
134 default:river_water_source
135 default:river_water_flowing
140 Tools / "Advanced" crafting / Non-"natural"
141 -------------------------------------------
156 default:obsidian_glass
168 default:nyancat_rainbow
176 minetest.register_node("default:stone", {
177 description = "Stone",
178 tiles = {"default_stone.png"},
179 groups = {cracky = 3, stone = 1},
180 drop = 'default:cobble',
181 legacy_mineral = true,
182 sounds = default.node_sound_stone_defaults(),
185 minetest.register_node("default:cobble", {
186 description = "Cobblestone",
187 tiles = {"default_cobble.png"},
188 is_ground_content = false,
189 groups = {cracky = 3, stone = 2},
190 sounds = default.node_sound_stone_defaults(),
193 minetest.register_node("default:stonebrick", {
194 description = "Stone Brick",
195 tiles = {"default_stone_brick.png"},
196 is_ground_content = false,
197 groups = {cracky = 2, stone = 1},
198 sounds = default.node_sound_stone_defaults(),
201 minetest.register_node("default:mossycobble", {
202 description = "Mossy Cobblestone",
203 tiles = {"default_mossycobble.png"},
204 is_ground_content = false,
205 groups = {cracky = 3, stone = 1},
206 sounds = default.node_sound_stone_defaults(),
210 minetest.register_node("default:desert_stone", {
211 description = "Desert Stone",
212 tiles = {"default_desert_stone.png"},
213 groups = {cracky = 3, stone = 1},
214 drop = 'default:desert_cobble',
215 legacy_mineral = true,
216 sounds = default.node_sound_stone_defaults(),
219 minetest.register_node("default:desert_cobble", {
220 description = "Desert Cobblestone",
221 tiles = {"default_desert_cobble.png"},
222 is_ground_content = false,
223 groups = {cracky = 3, stone = 2},
224 sounds = default.node_sound_stone_defaults(),
227 minetest.register_node("default:desert_stonebrick", {
228 description = "Desert Stone Brick",
229 tiles = {"default_desert_stone_brick.png"},
230 is_ground_content = false,
231 groups = {cracky = 2, stone = 1},
232 sounds = default.node_sound_stone_defaults(),
236 minetest.register_node("default:sandstone", {
237 description = "Sandstone",
238 tiles = {"default_sandstone.png"},
239 groups = {crumbly = 2, cracky = 3},
240 sounds = default.node_sound_stone_defaults(),
243 minetest.register_node("default:sandstonebrick", {
244 description = "Sandstone Brick",
245 tiles = {"default_sandstone_brick.png"},
246 is_ground_content = false,
247 groups = {cracky = 2},
248 sounds = default.node_sound_stone_defaults(),
252 minetest.register_node("default:obsidian", {
253 description = "Obsidian",
254 tiles = {"default_obsidian.png"},
255 sounds = default.node_sound_stone_defaults(),
256 groups = {cracky = 1, level = 2},
259 minetest.register_node("default:obsidianbrick", {
260 description = "Obsidian Brick",
261 tiles = {"default_obsidian_brick.png"},
262 is_ground_content = false,
263 sounds = default.node_sound_stone_defaults(),
264 groups = {cracky = 1, level = 2},
271 minetest.register_node("default:dirt", {
272 description = "Dirt",
273 tiles = {"default_dirt.png"},
274 groups = {crumbly = 3, soil = 1},
275 sounds = default.node_sound_dirt_defaults(),
278 minetest.register_node("default:dirt_with_grass", {
279 description = "Dirt with Grass",
280 tiles = {"default_grass.png", "default_dirt.png",
281 {name = "default_dirt.png^default_grass_side.png",
282 tileable_vertical = false}},
283 groups = {crumbly = 3, soil = 1},
284 drop = 'default:dirt',
285 sounds = default.node_sound_dirt_defaults({
286 footstep = {name = "default_grass_footstep", gain = 0.25},
290 minetest.register_node("default:dirt_with_grass_footsteps", {
291 description = "Dirt with Grass and Footsteps",
292 tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
293 {name = "default_dirt.png^default_grass_side.png",
294 tileable_vertical = false}},
295 groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1},
296 drop = 'default:dirt',
297 sounds = default.node_sound_dirt_defaults({
298 footstep = {name = "default_grass_footstep", gain = 0.25},
302 minetest.register_node("default:dirt_with_dry_grass", {
303 description = "Dirt with Dry Grass",
304 tiles = {"default_dry_grass.png",
306 {name = "default_dirt.png^default_dry_grass_side.png",
307 tileable_vertical = false}},
308 groups = {crumbly = 3, soil = 1},
309 drop = 'default:dirt',
310 sounds = default.node_sound_dirt_defaults({
311 footstep = {name = "default_grass_footstep", gain = 0.4},
315 minetest.register_node("default:dirt_with_snow", {
316 description = "Dirt with Snow",
317 tiles = {"default_snow.png", "default_dirt.png",
318 {name = "default_dirt.png^default_snow_side.png",
319 tileable_vertical = false}},
320 groups = {crumbly = 3, soil = 1},
321 drop = 'default:dirt',
322 sounds = default.node_sound_dirt_defaults({
323 footstep = {name = "default_snow_footstep", gain = 0.25},
328 minetest.register_node("default:sand", {
329 description = "Sand",
330 tiles = {"default_sand.png"},
331 groups = {crumbly = 3, falling_node = 1, sand = 1},
332 sounds = default.node_sound_sand_defaults(),
335 minetest.register_node("default:desert_sand", {
336 description = "Desert Sand",
337 tiles = {"default_desert_sand.png"},
338 groups = {crumbly = 3, falling_node = 1, sand = 1},
339 sounds = default.node_sound_sand_defaults(),
343 minetest.register_node("default:gravel", {
344 description = "Gravel",
345 tiles = {"default_gravel.png"},
346 groups = {crumbly = 2, falling_node = 1},
347 sounds = default.node_sound_dirt_defaults({
348 footstep = {name = "default_gravel_footstep", gain = 0.5},
349 dug = {name = "default_gravel_footstep", gain = 1.0},
354 minetest.register_node("default:clay", {
355 description = "Clay",
356 tiles = {"default_clay.png"},
357 groups = {crumbly = 3},
358 drop = 'default:clay_lump 4',
359 sounds = default.node_sound_dirt_defaults(),
363 minetest.register_node("default:snow", {
364 description = "Snow",
365 tiles = {"default_snow.png"},
366 inventory_image = "default_snowball.png",
367 wield_image = "default_snowball.png",
370 drawtype = "nodebox",
374 {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
377 groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1},
378 sounds = default.node_sound_dirt_defaults({
379 footstep = {name = "default_snow_footstep", gain = 0.25},
380 dug = {name = "default_snow_footstep", gain = 0.75},
383 on_construct = function(pos)
385 if minetest.get_node(pos).name == "default:dirt_with_grass" then
386 minetest.set_node(pos, {name = "default:dirt_with_snow"})
391 minetest.register_node("default:snowblock", {
392 description = "Snow Block",
393 tiles = {"default_snow.png"},
394 groups = {crumbly = 3, puts_out_fire = 1},
395 sounds = default.node_sound_dirt_defaults({
396 footstep = {name = "default_snow_footstep", gain = 0.25},
397 dug = {name = "default_snow_footstep", gain = 0.75},
402 minetest.register_node("default:ice", {
404 tiles = {"default_ice.png"},
405 is_ground_content = false,
407 groups = {cracky = 3, puts_out_fire = 1},
408 sounds = default.node_sound_glass_defaults(),
415 minetest.register_node("default:tree", {
416 description = "Tree",
417 tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
418 paramtype2 = "facedir",
419 is_ground_content = false,
420 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
421 sounds = default.node_sound_wood_defaults(),
423 on_place = minetest.rotate_node
426 minetest.register_node("default:wood", {
427 description = "Wooden Planks",
428 tiles = {"default_wood.png"},
429 is_ground_content = false,
430 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
431 sounds = default.node_sound_wood_defaults(),
434 minetest.register_node("default:sapling", {
435 description = "Sapling",
436 drawtype = "plantlike",
438 tiles = {"default_sapling.png"},
439 inventory_image = "default_sapling.png",
440 wield_image = "default_sapling.png",
442 sunlight_propagates = true,
446 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
448 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
449 attached_node = 1, sapling = 1},
450 sounds = default.node_sound_leaves_defaults(),
453 minetest.register_node("default:leaves", {
454 description = "Leaves",
455 drawtype = "allfaces_optional",
458 tiles = {"default_leaves.png"},
459 special_tiles = {"default_leaves_simple.png"},
461 is_ground_content = false,
462 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
467 -- player will get sapling with 1/20 chance
468 items = {'default:sapling'},
472 -- player will get leaves only if he get no saplings,
473 -- this is because max_items is 1
474 items = {'default:leaves'},
478 sounds = default.node_sound_leaves_defaults(),
480 after_place_node = default.after_place_leaves,
483 minetest.register_node("default:apple", {
484 description = "Apple",
485 drawtype = "plantlike",
487 tiles = {"default_apple.png"},
488 inventory_image = "default_apple.png",
490 sunlight_propagates = true,
492 is_ground_content = false,
495 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
497 groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
498 leafdecay = 3, leafdecay_drop = 1},
499 on_use = minetest.item_eat(2),
500 sounds = default.node_sound_leaves_defaults(),
502 after_place_node = function(pos, placer, itemstack)
503 if placer:is_player() then
504 minetest.set_node(pos, {name = "default:apple", param2 = 1})
510 minetest.register_node("default:jungletree", {
511 description = "Jungle Tree",
512 tiles = {"default_jungletree_top.png", "default_jungletree_top.png",
513 "default_jungletree.png"},
514 paramtype2 = "facedir",
515 is_ground_content = false,
516 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
517 sounds = default.node_sound_wood_defaults(),
519 on_place = minetest.rotate_node
522 minetest.register_node("default:junglewood", {
523 description = "Junglewood Planks",
524 tiles = {"default_junglewood.png"},
525 is_ground_content = false,
526 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
527 sounds = default.node_sound_wood_defaults(),
530 minetest.register_node("default:jungleleaves", {
531 description = "Jungle Leaves",
532 drawtype = "allfaces_optional",
535 tiles = {"default_jungleleaves.png"},
536 special_tiles = {"default_jungleleaves_simple.png"},
538 is_ground_content = false,
539 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
543 {items = {'default:junglesapling'}, rarity = 20},
544 {items = {'default:jungleleaves'}}
547 sounds = default.node_sound_leaves_defaults(),
549 after_place_node = default.after_place_leaves,
552 minetest.register_node("default:junglesapling", {
553 description = "Jungle Sapling",
554 drawtype = "plantlike",
556 tiles = {"default_junglesapling.png"},
557 inventory_image = "default_junglesapling.png",
558 wield_image = "default_junglesapling.png",
560 sunlight_propagates = true,
564 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
566 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
567 attached_node = 1, sapling = 1},
568 sounds = default.node_sound_leaves_defaults(),
572 minetest.register_node("default:pine_tree", {
573 description = "Pine Tree",
574 tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
575 "default_pine_tree.png"},
576 paramtype2 = "facedir",
577 is_ground_content = false,
578 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
579 sounds = default.node_sound_wood_defaults(),
581 on_place = minetest.rotate_node
584 minetest.register_node("default:pine_wood", {
585 description = "Pine Wood Planks",
586 tiles = {"default_pine_wood.png"},
587 is_ground_content = false,
588 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
589 sounds = default.node_sound_wood_defaults(),
592 minetest.register_node("default:pine_needles",{
593 description = "Pine Needles",
594 drawtype = "allfaces_optional",
596 tiles = {"default_pine_needles.png"},
599 is_ground_content = false,
600 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
604 {items = {"default:pine_sapling"}, rarity = 20},
605 {items = {"default:pine_needles"}}
608 sounds = default.node_sound_leaves_defaults(),
610 after_place_node = default.after_place_leaves,
613 minetest.register_node("default:pine_sapling", {
614 description = "Pine Sapling",
615 drawtype = "plantlike",
617 tiles = {"default_pine_sapling.png"},
618 inventory_image = "default_pine_sapling.png",
619 wield_image = "default_pine_sapling.png",
621 sunlight_propagates = true,
625 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
627 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
628 attached_node = 1, sapling = 1},
629 sounds = default.node_sound_leaves_defaults(),
633 minetest.register_node("default:acacia_tree", {
634 description = "Acacia Tree",
635 tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
636 "default_acacia_tree.png"},
637 paramtype2 = "facedir",
638 is_ground_content = false,
639 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
640 sounds = default.node_sound_wood_defaults(),
642 on_place = minetest.rotate_node
645 minetest.register_node("default:acacia_wood", {
646 description = "Acacia Wood Planks",
647 tiles = {"default_acacia_wood.png"},
648 is_ground_content = false,
649 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
650 sounds = default.node_sound_wood_defaults(),
653 minetest.register_node("default:acacia_leaves", {
654 description = "Acacia Leaves",
655 drawtype = "allfaces_optional",
657 tiles = {"default_acacia_leaves.png"},
660 is_ground_content = false,
661 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
665 {items = {"default:acacia_sapling"}, rarity = 20},
666 {items = {"default:acacia_leaves"}}
669 sounds = default.node_sound_leaves_defaults(),
671 after_place_node = default.after_place_leaves,
674 minetest.register_node("default:acacia_sapling", {
675 description = "Acacia Tree Sapling",
676 drawtype = "plantlike",
678 tiles = {"default_acacia_sapling.png"},
679 inventory_image = "default_acacia_sapling.png",
680 wield_image = "default_acacia_sapling.png",
682 sunlight_propagates = true,
686 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
688 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
689 attached_node = 1, sapling = 1},
690 sounds = default.node_sound_leaves_defaults(),
693 minetest.register_node("default:aspen_tree", {
694 description = "Aspen Tree",
695 tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
696 "default_aspen_tree.png"},
697 paramtype2 = "facedir",
698 is_ground_content = false,
699 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
700 sounds = default.node_sound_wood_defaults(),
702 on_place = minetest.rotate_node
705 minetest.register_node("default:aspen_wood", {
706 description = "Aspen Wood Planks",
707 tiles = {"default_aspen_wood.png"},
708 is_ground_content = false,
709 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
710 sounds = default.node_sound_wood_defaults(),
713 minetest.register_node("default:aspen_leaves", {
714 description = "Aspen Leaves",
715 drawtype = "allfaces_optional",
717 tiles = {"default_aspen_leaves.png"},
720 is_ground_content = false,
721 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
725 {items = {"default:aspen_sapling"}, rarity = 20},
726 {items = {"default:aspen_leaves"}}
729 sounds = default.node_sound_leaves_defaults(),
731 after_place_node = default.after_place_leaves,
734 minetest.register_node("default:aspen_sapling", {
735 description = "Aspen Tree Sapling",
736 drawtype = "plantlike",
738 tiles = {"default_aspen_sapling.png"},
739 inventory_image = "default_aspen_sapling.png",
740 wield_image = "default_aspen_sapling.png",
742 sunlight_propagates = true,
746 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
748 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
749 attached_node = 1, sapling = 1},
750 sounds = default.node_sound_leaves_defaults(),
756 minetest.register_node("default:stone_with_coal", {
757 description = "Coal Ore",
758 tiles = {"default_stone.png^default_mineral_coal.png"},
759 groups = {cracky = 3},
760 drop = 'default:coal_lump',
761 sounds = default.node_sound_stone_defaults(),
764 minetest.register_node("default:coalblock", {
765 description = "Coal Block",
766 tiles = {"default_coal_block.png"},
767 is_ground_content = false,
768 groups = {cracky = 3},
769 sounds = default.node_sound_stone_defaults(),
773 minetest.register_node("default:stone_with_iron", {
774 description = "Iron Ore",
775 tiles = {"default_stone.png^default_mineral_iron.png"},
776 groups = {cracky = 2},
777 drop = 'default:iron_lump',
778 sounds = default.node_sound_stone_defaults(),
781 minetest.register_node("default:steelblock", {
782 description = "Steel Block",
783 tiles = {"default_steel_block.png"},
784 is_ground_content = false,
785 groups = {cracky = 1, level = 2},
786 sounds = default.node_sound_stone_defaults(),
790 minetest.register_node("default:stone_with_copper", {
791 description = "Copper Ore",
792 tiles = {"default_stone.png^default_mineral_copper.png"},
793 groups = {cracky = 2},
794 drop = 'default:copper_lump',
795 sounds = default.node_sound_stone_defaults(),
798 minetest.register_node("default:copperblock", {
799 description = "Copper Block",
800 tiles = {"default_copper_block.png"},
801 is_ground_content = false,
802 groups = {cracky = 1, level = 2},
803 sounds = default.node_sound_stone_defaults(),
806 minetest.register_node("default:bronzeblock", {
807 description = "Bronze Block",
808 tiles = {"default_bronze_block.png"},
809 is_ground_content = false,
810 groups = {cracky = 1, level = 2},
811 sounds = default.node_sound_stone_defaults(),
815 minetest.register_node("default:stone_with_mese", {
816 description = "Mese Ore",
817 tiles = {"default_stone.png^default_mineral_mese.png"},
818 groups = {cracky = 1},
819 drop = "default:mese_crystal",
820 sounds = default.node_sound_stone_defaults(),
823 minetest.register_node("default:mese", {
824 description = "Mese Block",
825 tiles = {"default_mese_block.png"},
827 groups = {cracky = 1, level = 2},
828 sounds = default.node_sound_stone_defaults(),
833 minetest.register_node("default:stone_with_gold", {
834 description = "Gold Ore",
835 tiles = {"default_stone.png^default_mineral_gold.png"},
836 groups = {cracky = 2},
837 drop = "default:gold_lump",
838 sounds = default.node_sound_stone_defaults(),
841 minetest.register_node("default:goldblock", {
842 description = "Gold Block",
843 tiles = {"default_gold_block.png"},
844 is_ground_content = false,
845 groups = {cracky = 1},
846 sounds = default.node_sound_stone_defaults(),
850 minetest.register_node("default:stone_with_diamond", {
851 description = "Diamond Ore",
852 tiles = {"default_stone.png^default_mineral_diamond.png"},
853 groups = {cracky = 1},
854 drop = "default:diamond",
855 sounds = default.node_sound_stone_defaults(),
858 minetest.register_node("default:diamondblock", {
859 description = "Diamond Block",
860 tiles = {"default_diamond_block.png"},
861 is_ground_content = false,
862 groups = {cracky = 1, level = 3},
863 sounds = default.node_sound_stone_defaults(),
867 -- Plantlife (non-cubic)
870 minetest.register_node("default:cactus", {
871 description = "Cactus",
872 tiles = {"default_cactus_top.png", "default_cactus_top.png",
873 "default_cactus_side.png"},
874 paramtype2 = "facedir",
875 groups = {snappy = 1, choppy = 3, flammable = 2},
876 sounds = default.node_sound_wood_defaults(),
877 on_place = minetest.rotate_node,
879 after_dig_node = function(pos, node, metadata, digger)
880 default.dig_up(pos, node, digger)
884 minetest.register_node("default:papyrus", {
885 description = "Papyrus",
886 drawtype = "plantlike",
887 tiles = {"default_papyrus.png"},
888 inventory_image = "default_papyrus.png",
889 wield_image = "default_papyrus.png",
891 sunlight_propagates = true,
895 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
897 groups = {snappy = 3, flammable = 2},
898 sounds = default.node_sound_leaves_defaults(),
900 after_dig_node = function(pos, node, metadata, digger)
901 default.dig_up(pos, node, digger)
905 minetest.register_node("default:dry_shrub", {
906 description = "Dry Shrub",
907 drawtype = "plantlike",
910 tiles = {"default_dry_shrub.png"},
911 inventory_image = "default_dry_shrub.png",
912 wield_image = "default_dry_shrub.png",
914 sunlight_propagates = true,
917 groups = {snappy = 3, flammable = 3, attached_node = 1},
918 sounds = default.node_sound_leaves_defaults(),
921 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
925 minetest.register_node("default:junglegrass", {
926 description = "Jungle Grass",
927 drawtype = "plantlike",
930 tiles = {"default_junglegrass.png"},
931 inventory_image = "default_junglegrass.png",
932 wield_image = "default_junglegrass.png",
934 sunlight_propagates = true,
937 groups = {snappy = 3, flammable = 2, flora = 1, attached_node = 1},
938 sounds = default.node_sound_leaves_defaults(),
941 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
946 minetest.register_node("default:grass_1", {
947 description = "Grass",
948 drawtype = "plantlike",
950 tiles = {"default_grass_1.png"},
951 -- Use texture of a taller grass stage in inventory
952 inventory_image = "default_grass_3.png",
953 wield_image = "default_grass_3.png",
955 sunlight_propagates = true,
958 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1},
959 sounds = default.node_sound_leaves_defaults(),
962 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
965 on_place = function(itemstack, placer, pointed_thing)
966 -- place a random grass node
967 local stack = ItemStack("default:grass_" .. math.random(1,5))
968 local ret = minetest.item_place(stack, placer, pointed_thing)
969 return ItemStack("default:grass_1 " ..
970 itemstack:get_count() - (1 - ret:get_count()))
975 minetest.register_node("default:grass_" .. i, {
976 description = "Grass",
977 drawtype = "plantlike",
979 tiles = {"default_grass_" .. i .. ".png"},
980 inventory_image = "default_grass_" .. i .. ".png",
981 wield_image = "default_grass_" .. i .. ".png",
983 sunlight_propagates = true,
986 drop = "default:grass_1",
987 groups = {snappy = 3, flammable = 3, flora = 1,
988 attached_node = 1, not_in_creative_inventory = 1},
989 sounds = default.node_sound_leaves_defaults(),
992 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
998 minetest.register_node("default:dry_grass_1", {
999 description = "Dry Grass",
1000 drawtype = "plantlike",
1002 tiles = {"default_dry_grass_1.png"},
1003 inventory_image = "default_dry_grass_3.png",
1004 wield_image = "default_dry_grass_3.png",
1005 paramtype = "light",
1006 sunlight_propagates = true,
1008 buildable_to = true,
1009 groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1},
1010 sounds = default.node_sound_leaves_defaults(),
1013 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1016 on_place = function(itemstack, placer, pointed_thing)
1017 -- place a random dry grass node
1018 local stack = ItemStack("default:dry_grass_" .. math.random(1, 5))
1019 local ret = minetest.item_place(stack, placer, pointed_thing)
1020 return ItemStack("default:dry_grass_1 " ..
1021 itemstack:get_count() - (1 - ret:get_count()))
1026 minetest.register_node("default:dry_grass_" .. i, {
1027 description = "Dry Grass",
1028 drawtype = "plantlike",
1030 tiles = {"default_dry_grass_" .. i .. ".png"},
1031 inventory_image = "default_dry_grass_" .. i .. ".png",
1032 wield_image = "default_dry_grass_" .. i .. ".png",
1033 paramtype = "light",
1034 sunlight_propagates = true,
1036 buildable_to = true,
1037 groups = {snappy = 3, flammable = 3, flora = 1,
1038 attached_node = 1, not_in_creative_inventory=1},
1039 drop = "default:dry_grass_1",
1040 sounds = default.node_sound_leaves_defaults(),
1043 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1052 minetest.register_node("default:water_source", {
1053 description = "Water Source",
1054 inventory_image = minetest.inventorycube("default_water.png"),
1055 drawtype = "liquid",
1058 name = "default_water_source_animated.png",
1060 type = "vertical_frames",
1068 -- New-style water source material (mostly unused)
1070 name = "default_water_source_animated.png",
1072 type = "vertical_frames",
1077 backface_culling = false,
1081 paramtype = "light",
1085 buildable_to = true,
1086 is_ground_content = false,
1089 liquidtype = "source",
1090 liquid_alternative_flowing = "default:water_flowing",
1091 liquid_alternative_source = "default:water_source",
1092 liquid_viscosity = 1,
1093 post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1094 groups = {water = 3, liquid = 3, puts_out_fire = 1},
1097 minetest.register_node("default:water_flowing", {
1098 description = "Flowing Water",
1099 inventory_image = minetest.inventorycube("default_water.png"),
1100 drawtype = "flowingliquid",
1101 tiles = {"default_water.png"},
1104 name = "default_water_flowing_animated.png",
1105 backface_culling = false,
1107 type = "vertical_frames",
1114 name = "default_water_flowing_animated.png",
1115 backface_culling = true,
1117 type = "vertical_frames",
1125 paramtype = "light",
1126 paramtype2 = "flowingliquid",
1130 buildable_to = true,
1131 is_ground_content = false,
1134 liquidtype = "flowing",
1135 liquid_alternative_flowing = "default:water_flowing",
1136 liquid_alternative_source = "default:water_source",
1137 liquid_viscosity = 1,
1138 post_effect_color = {a = 103, r = 30, g = 60, b = 90},
1139 groups = {water = 3, liquid = 3, puts_out_fire = 1,
1140 not_in_creative_inventory = 1},
1144 minetest.register_node("default:river_water_source", {
1145 description = "River Water Source",
1146 inventory_image = minetest.inventorycube("default_river_water.png"),
1147 drawtype = "liquid",
1150 name = "default_river_water_source_animated.png",
1152 type = "vertical_frames",
1161 name = "default_river_water_source_animated.png",
1163 type = "vertical_frames",
1168 backface_culling = false,
1172 paramtype = "light",
1176 buildable_to = true,
1177 is_ground_content = false,
1180 liquidtype = "source",
1181 liquid_alternative_flowing = "default:river_water_flowing",
1182 liquid_alternative_source = "default:river_water_source",
1183 liquid_viscosity = 1,
1184 liquid_renewable = false,
1186 post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1187 groups = {water = 3, liquid = 3, puts_out_fire = 1},
1190 minetest.register_node("default:river_water_flowing", {
1191 description = "Flowing River Water",
1192 inventory_image = minetest.inventorycube("default_river_water.png"),
1193 drawtype = "flowingliquid",
1194 tiles = {"default_river_water.png"},
1197 name = "default_river_water_flowing_animated.png",
1198 backface_culling = false,
1200 type = "vertical_frames",
1207 name = "default_river_water_flowing_animated.png",
1208 backface_culling = true,
1210 type = "vertical_frames",
1218 paramtype = "light",
1219 paramtype2 = "flowingliquid",
1223 buildable_to = true,
1224 is_ground_content = false,
1227 liquidtype = "flowing",
1228 liquid_alternative_flowing = "default:river_water_flowing",
1229 liquid_alternative_source = "default:river_water_source",
1230 liquid_viscosity = 1,
1231 liquid_renewable = false,
1233 post_effect_color = {a = 103, r = 30, g = 76, b = 90},
1234 groups = {water = 3, liquid = 3, puts_out_fire = 1,
1235 not_in_creative_inventory = 1},
1239 minetest.register_node("default:lava_source", {
1240 description = "Lava Source",
1241 inventory_image = minetest.inventorycube("default_lava.png"),
1242 drawtype = "liquid",
1245 name = "default_lava_source_animated.png",
1247 type = "vertical_frames",
1255 -- New-style lava source material (mostly unused)
1257 name = "default_lava_source_animated.png",
1259 type = "vertical_frames",
1264 backface_culling = false,
1267 paramtype = "light",
1268 light_source = default.LIGHT_MAX - 1,
1272 buildable_to = true,
1273 is_ground_content = false,
1276 liquidtype = "source",
1277 liquid_alternative_flowing = "default:lava_flowing",
1278 liquid_alternative_source = "default:lava_source",
1279 liquid_viscosity = 7,
1280 liquid_renewable = false,
1281 damage_per_second = 4 * 2,
1282 post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1283 groups = {lava = 3, liquid = 2, hot = 3, igniter = 1},
1286 minetest.register_node("default:lava_flowing", {
1287 description = "Flowing Lava",
1288 inventory_image = minetest.inventorycube("default_lava.png"),
1289 drawtype = "flowingliquid",
1290 tiles = {"default_lava.png"},
1293 name = "default_lava_flowing_animated.png",
1294 backface_culling = false,
1296 type = "vertical_frames",
1303 name = "default_lava_flowing_animated.png",
1304 backface_culling = true,
1306 type = "vertical_frames",
1313 paramtype = "light",
1314 paramtype2 = "flowingliquid",
1315 light_source = default.LIGHT_MAX - 1,
1319 buildable_to = true,
1320 is_ground_content = false,
1323 liquidtype = "flowing",
1324 liquid_alternative_flowing = "default:lava_flowing",
1325 liquid_alternative_source = "default:lava_source",
1326 liquid_viscosity = 7,
1327 liquid_renewable = false,
1328 damage_per_second = 4 * 2,
1329 post_effect_color = {a = 191, r = 255, g = 64, b = 0},
1330 groups = {lava = 3, liquid = 2, hot = 3, igniter = 1,
1331 not_in_creative_inventory = 1},
1335 -- Tools / "Advanced" crafting / Non-"natural"
1338 minetest.register_node("default:torch", {
1339 description = "Torch",
1340 drawtype = "torchlike",
1343 name = "default_torch_on_floor_animated.png",
1345 type = "vertical_frames",
1352 name="default_torch_on_ceiling_animated.png",
1354 type = "vertical_frames",
1361 name="default_torch_animated.png",
1363 type = "vertical_frames",
1370 inventory_image = "default_torch_on_floor.png",
1371 wield_image = "default_torch_on_floor.png",
1372 paramtype = "light",
1373 paramtype2 = "wallmounted",
1374 sunlight_propagates = true,
1375 is_ground_content = false,
1377 light_source = default.LIGHT_MAX - 1,
1379 type = "wallmounted",
1380 wall_top = {-0.1, 0.5 - 0.6, -0.1, 0.1, 0.5, 0.1},
1381 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5 + 0.6, 0.1},
1382 wall_side = {-0.5, -0.3, -0.1, -0.5 + 0.3, 0.3, 0.1},
1384 groups = {choppy = 2, dig_immediate = 3, flammable = 1, attached_node = 1},
1385 legacy_wallmounted = true,
1386 sounds = default.node_sound_defaults(),
1390 local chest_formspec =
1393 default.gui_bg_img ..
1394 default.gui_slots ..
1395 "list[current_name;main;0,0.3;8,4;]" ..
1396 "list[current_player;main;0,4.85;8,1;]" ..
1397 "list[current_player;main;0,6.08;8,3;8]" ..
1398 "listring[current_name;main]" ..
1399 "listring[current_player;main]" ..
1400 default.get_hotbar_bg(0,4.85)
1402 local function get_locked_chest_formspec(pos)
1403 local spos = pos.x .. "," .. pos.y .. "," .. pos.z
1407 default.gui_bg_img ..
1408 default.gui_slots ..
1409 "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
1410 "list[current_player;main;0,4.85;8,1;]" ..
1411 "list[current_player;main;0,6.08;8,3;8]" ..
1412 "listring[nodemeta:" .. spos .. ";main]" ..
1413 "listring[current_player;main]" ..
1414 default.get_hotbar_bg(0,4.85)
1418 local function has_locked_chest_privilege(meta, player)
1419 if player:get_player_name() ~= meta:get_string("owner") then
1425 minetest.register_node("default:chest", {
1426 description = "Chest",
1427 tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1428 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1429 paramtype2 = "facedir",
1430 groups = {choppy = 2, oddly_breakable_by_hand = 2},
1431 legacy_facedir_simple = true,
1432 is_ground_content = false,
1433 sounds = default.node_sound_wood_defaults(),
1435 on_construct = function(pos)
1436 local meta = minetest.get_meta(pos)
1437 meta:set_string("formspec", chest_formspec)
1438 meta:set_string("infotext", "Chest")
1439 local inv = meta:get_inventory()
1440 inv:set_size("main", 8*4)
1442 can_dig = function(pos,player)
1443 local meta = minetest.get_meta(pos);
1444 local inv = meta:get_inventory()
1445 return inv:is_empty("main")
1447 on_metadata_inventory_move = function(pos, from_list, from_index,
1448 to_list, to_index, count, player)
1449 minetest.log("action", player:get_player_name() ..
1450 " moves stuff in chest at " .. minetest.pos_to_string(pos))
1452 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1453 minetest.log("action", player:get_player_name() ..
1454 " moves stuff to chest at " .. minetest.pos_to_string(pos))
1456 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1457 minetest.log("action", player:get_player_name() ..
1458 " takes stuff from chest at " .. minetest.pos_to_string(pos))
1462 minetest.register_node("default:chest_locked", {
1463 description = "Locked Chest",
1464 tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1465 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1466 paramtype2 = "facedir",
1467 groups = {choppy = 2, oddly_breakable_by_hand = 2},
1468 legacy_facedir_simple = true,
1469 is_ground_content = false,
1470 sounds = default.node_sound_wood_defaults(),
1472 after_place_node = function(pos, placer)
1473 local meta = minetest.get_meta(pos)
1474 meta:set_string("owner", placer:get_player_name() or "")
1475 meta:set_string("infotext", "Locked Chest (owned by " ..
1476 meta:get_string("owner") .. ")")
1478 on_construct = function(pos)
1479 local meta = minetest.get_meta(pos)
1480 meta:set_string("infotext", "Locked Chest")
1481 meta:set_string("owner", "")
1482 local inv = meta:get_inventory()
1483 inv:set_size("main", 8 * 4)
1485 can_dig = function(pos,player)
1486 local meta = minetest.get_meta(pos);
1487 local inv = meta:get_inventory()
1488 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
1490 allow_metadata_inventory_move = function(pos, from_list, from_index,
1491 to_list, to_index, count, player)
1492 local meta = minetest.get_meta(pos)
1493 if not has_locked_chest_privilege(meta, player) then
1498 allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1499 local meta = minetest.get_meta(pos)
1500 if not has_locked_chest_privilege(meta, player) then
1503 return stack:get_count()
1505 allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1506 local meta = minetest.get_meta(pos)
1507 if not has_locked_chest_privilege(meta, player) then
1510 return stack:get_count()
1512 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1513 minetest.log("action", player:get_player_name() ..
1514 " moves stuff to locked chest at " .. minetest.pos_to_string(pos))
1516 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1517 minetest.log("action", player:get_player_name() ..
1518 " takes stuff from locked chest at " .. minetest.pos_to_string(pos))
1520 on_rightclick = function(pos, node, clicker)
1521 local meta = minetest.get_meta(pos)
1522 if has_locked_chest_privilege(meta, clicker) then
1523 minetest.show_formspec(
1524 clicker:get_player_name(),
1525 "default:chest_locked",
1526 get_locked_chest_formspec(pos)
1530 on_blast = function() end,
1534 local bookshelf_formspec =
1537 default.gui_bg_img ..
1538 default.gui_slots ..
1539 "list[context;books;0,0.3;8,2;]" ..
1540 "list[current_player;main;0,2.85;8,1;]" ..
1541 "list[current_player;main;0,4.08;8,3;8]" ..
1542 "listring[context;books]" ..
1543 "listring[current_player;main]" ..
1544 default.get_hotbar_bg(0,2.85)
1546 minetest.register_node("default:bookshelf", {
1547 description = "Bookshelf",
1548 tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1549 is_ground_content = false,
1550 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
1551 sounds = default.node_sound_wood_defaults(),
1553 on_construct = function(pos)
1554 local meta = minetest.get_meta(pos)
1555 meta:set_string("formspec", bookshelf_formspec)
1556 local inv = meta:get_inventory()
1557 inv:set_size("books", 8 * 2)
1559 can_dig = function(pos,player)
1560 local meta = minetest.get_meta(pos);
1561 local inv = meta:get_inventory()
1562 return inv:is_empty("books")
1565 allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1566 local meta = minetest.get_meta(pos)
1567 local inv = meta:get_inventory()
1568 local to_stack = inv:get_stack(listname, index)
1569 if listname == "books" then
1570 if minetest.get_item_group(stack:get_name(), "book") ~= 0
1571 and to_stack:is_empty() then
1579 allow_metadata_inventory_move = function(pos, from_list, from_index,
1580 to_list, to_index, count, player)
1581 local meta = minetest.get_meta(pos)
1582 local inv = meta:get_inventory()
1583 local stack = inv:get_stack(from_list, from_index)
1584 local to_stack = inv:get_stack(to_list, to_index)
1585 if to_list == "books" then
1586 if minetest.get_item_group(stack:get_name(), "book") ~= 0
1587 and to_stack:is_empty() then
1595 on_metadata_inventory_move = function(pos, from_list, from_index,
1596 to_list, to_index, count, player)
1597 minetest.log("action", player:get_player_name() ..
1598 " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
1600 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1601 minetest.log("action", player:get_player_name() ..
1602 " moves stuff to bookshelf at " .. minetest.pos_to_string(pos))
1604 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1605 minetest.log("action", player:get_player_name() ..
1606 " takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
1611 minetest.register_node("default:sign_wall", {
1612 description = "Sign",
1613 drawtype = "nodebox",
1614 tiles = {"default_sign.png"},
1615 inventory_image = "default_sign_wall.png",
1616 wield_image = "default_sign_wall.png",
1617 paramtype = "light",
1618 paramtype2 = "wallmounted",
1619 sunlight_propagates = true,
1620 is_ground_content = false,
1623 type = "wallmounted",
1624 wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
1625 wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
1626 wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
1628 groups = {choppy = 2, dig_immediate = 2, attached_node = 1},
1629 legacy_wallmounted = true,
1630 sounds = default.node_sound_defaults(),
1632 on_construct = function(pos)
1633 --local n = minetest.get_node(pos)
1634 local meta = minetest.get_meta(pos)
1635 meta:set_string("formspec", "field[text;;${text}]")
1636 meta:set_string("infotext", "\"\"")
1638 on_receive_fields = function(pos, formname, fields, sender)
1639 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1640 if minetest.is_protected(pos, sender:get_player_name()) then
1641 minetest.record_protection_violation(pos, sender:get_player_name())
1644 local meta = minetest.get_meta(pos)
1645 if not fields.text then return end
1646 minetest.log("action", (sender:get_player_name() or "") .. " wrote \"" ..
1647 fields.text .. "\" to sign at " .. minetest.pos_to_string(pos))
1648 meta:set_string("text", fields.text)
1649 meta:set_string("infotext", '"' .. fields.text .. '"')
1654 minetest.register_node("default:ladder", {
1655 description = "Ladder",
1656 drawtype = "signlike",
1657 tiles = {"default_ladder.png"},
1658 inventory_image = "default_ladder.png",
1659 wield_image = "default_ladder.png",
1660 paramtype = "light",
1661 paramtype2 = "wallmounted",
1662 sunlight_propagates = true,
1665 is_ground_content = false,
1667 type = "wallmounted",
1668 --wall_top = = <default>
1669 --wall_bottom = = <default>
1670 --wall_side = = <default>
1672 groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
1673 legacy_wallmounted = true,
1674 sounds = default.node_sound_wood_defaults(),
1678 local fence_texture =
1679 "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126"
1680 minetest.register_node("default:fence_wood", {
1681 description = "Wooden Fence",
1682 drawtype = "fencelike",
1683 tiles = {"default_wood.png"},
1684 inventory_image = fence_texture,
1685 wield_image = fence_texture,
1686 paramtype = "light",
1687 sunlight_propagates = true,
1688 is_ground_content = false,
1691 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
1693 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
1694 sounds = default.node_sound_wood_defaults(),
1698 minetest.register_node("default:glass", {
1699 description = "Glass",
1700 drawtype = "glasslike_framed_optional",
1701 tiles = {"default_glass.png", "default_glass_detail.png"},
1702 inventory_image = minetest.inventorycube("default_glass.png"),
1703 paramtype = "light",
1704 sunlight_propagates = true,
1705 is_ground_content = false,
1706 groups = {cracky = 3, oddly_breakable_by_hand = 3},
1707 sounds = default.node_sound_glass_defaults(),
1710 minetest.register_node("default:obsidian_glass", {
1711 description = "Obsidian Glass",
1712 drawtype = "glasslike_framed_optional",
1713 tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
1714 inventory_image = minetest.inventorycube("default_obsidian_glass.png"),
1715 paramtype = "light",
1716 is_ground_content = false,
1717 sunlight_propagates = true,
1718 sounds = default.node_sound_glass_defaults(),
1719 groups = {cracky = 3, oddly_breakable_by_hand = 3},
1723 minetest.register_node("default:rail", {
1724 description = "Rail",
1725 drawtype = "raillike",
1726 tiles = {"default_rail.png", "default_rail_curved.png",
1727 "default_rail_t_junction.png", "default_rail_crossing.png"},
1728 inventory_image = "default_rail.png",
1729 wield_image = "default_rail.png",
1730 paramtype = "light",
1731 sunlight_propagates = true,
1733 is_ground_content = false,
1736 -- but how to specify the dimensions for curved and sideways rails?
1737 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1739 groups = {bendy = 2, dig_immediate = 2, attached_node = 1,
1740 connect_to_raillike = minetest.raillike_group("rail")},
1744 minetest.register_node("default:brick", {
1745 description = "Brick Block",
1746 tiles = {"default_brick.png"},
1747 is_ground_content = false,
1748 groups = {cracky = 3},
1749 sounds = default.node_sound_stone_defaults(),
1753 minetest.register_node("default:meselamp", {
1754 description = "Mese Lamp",
1755 drawtype = "glasslike",
1756 tiles = {"default_meselamp.png"},
1757 paramtype = "light",
1758 sunlight_propagates = true,
1759 is_ground_content = false,
1760 groups = {cracky = 3, oddly_breakable_by_hand = 3},
1761 sounds = default.node_sound_glass_defaults(),
1762 light_source = default.LIGHT_MAX,
1769 minetest.register_node("default:cloud", {
1770 description = "Cloud",
1771 tiles = {"default_cloud.png"},
1772 is_ground_content = false,
1773 sounds = default.node_sound_defaults(),
1774 groups = {not_in_creative_inventory = 1},
1777 minetest.register_node("default:nyancat", {
1778 description = "Nyan Cat",
1779 tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1780 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1781 paramtype2 = "facedir",
1782 groups = {cracky = 2},
1783 is_ground_content = false,
1784 legacy_facedir_simple = true,
1785 sounds = default.node_sound_defaults(),
1788 minetest.register_node("default:nyancat_rainbow", {
1789 description = "Nyan Cat Rainbow",
1791 "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
1792 "default_nc_rb.png", "default_nc_rb.png"
1794 paramtype2 = "facedir",
1795 groups = {cracky = 2},
1796 is_ground_content = false,
1797 sounds = default.node_sound_defaults(),